1
0
mirror of https://github.com/YosysHQ/nextpnr.git synced 2026-02-17 05:07:37 +00:00

Add lut tree tests for future improvements

This commit is contained in:
Miodrag Milanovic
2025-04-24 11:45:23 +02:00
parent 39f020b033
commit bf7eb65dea
2 changed files with 92 additions and 0 deletions

View File

@@ -34,3 +34,94 @@ TEST_F(GateMateTest, pack_constants)
packer.remove_constants();
ASSERT_EQ(ctx->cells.size(), 0LU);
}
// LUT[1:0] Function
// ==============================
// 00 Constant 0
// 01 NOT A (inverts input)
// 10 A (passes input)
// 11 Constant 1
TEST_F(GateMateTest, remove_lut1_zero)
{
CellInfo *lut1 = create_cell_ptr(id_CC_LUT1, "lut");
lut1->params[id_INIT] = Property(0b00, 2);
CellInfo *obuf = create_cell_ptr(id_CC_OBUF, "obuf");
direct_connect(lut1, id_O, obuf, id_A);
ASSERT_EQ(ctx->cells.size(), 1LU);
ctx->uarch->pack();
ASSERT_EQ(ctx->cells.size(), 1LU);
}
TEST_F(GateMateTest, remove_lut1_one)
{
CellInfo *lut1 = create_cell_ptr(id_CC_LUT1, "lut");
lut1->params[id_INIT] = Property(0b11, 2);
CellInfo *obuf = create_cell_ptr(id_CC_OBUF, "obuf");
direct_connect(lut1, id_O, obuf, id_A);
ASSERT_EQ(ctx->cells.size(), 2LU);
ctx->uarch->pack();
ASSERT_EQ(ctx->cells.size(), 1LU);
}
TEST_F(GateMateTest, remove_lut1_pass)
{
CellInfo *lut1 = create_cell_ptr(id_CC_LUT1, "lut");
lut1->params[id_INIT] = Property(0b10, 2);
CellInfo *obuf = create_cell_ptr(id_CC_OBUF, "obuf");
CellInfo *ibuf = create_cell_ptr(id_CC_IBUF, "ibuf");
direct_connect(ibuf, id_Y, lut1, id_I0);
direct_connect(lut1, id_O, obuf, id_A);
ASSERT_EQ(ctx->cells.size(), 3LU);
ctx->uarch->pack();
// Expect IBUF -> CPE -> OBUF
// LUT removed, but CPE for driving OBUF added
ASSERT_EQ(ctx->cells.size(), 3LU);
}
TEST_F(GateMateTest, remove_lut1_inv)
{
CellInfo *lut1 = create_cell_ptr(id_CC_LUT1, "lut");
lut1->params[id_INIT] = Property(0b01, 2);
CellInfo *obuf = create_cell_ptr(id_CC_OBUF, "obuf");
CellInfo *ibuf = create_cell_ptr(id_CC_IBUF, "ibuf");
direct_connect(ibuf, id_Y, lut1, id_I0);
direct_connect(lut1, id_O, obuf, id_A);
ASSERT_EQ(ctx->cells.size(), 3LU);
ctx->uarch->pack();
// Expect IBUF -> CPE -> OBUF
// LUT merged, but CPE for driving OBUF added
ASSERT_EQ(ctx->cells.size(), 3LU);
}
TEST_F(GateMateTest, remove_lut1_not_driven)
{
CellInfo *lut1 = create_cell_ptr(id_CC_LUT1, "lut");
lut1->params[id_INIT] = Property(0b01, 2);
CellInfo *obuf = create_cell_ptr(id_CC_OBUF, "obuf");
CellInfo *ibuf = create_cell_ptr(id_CC_IBUF, "ibuf");
NetInfo *net_in = ctx->createNet(ctx->id("in"));
ibuf->connectPort(id_Y, net_in);
lut1->connectPort(id_I0, net_in);
obuf->connectPort(id_A, net_in);
ASSERT_EQ(ctx->cells.size(), 3LU);
ctx->uarch->pack();
// Expect IBUF -> CPE -> OBUF
// LUT1 removed as not used, but CPE for driving OBUF added
ASSERT_EQ(ctx->cells.size(), 3LU);
}

View File

@@ -30,6 +30,7 @@ void GateMateTest::SetUp()
{
init_share_dirname();
chipArgs.device = "CCGM1A1";
chipArgs.options.emplace("allow-unconstrained", "");
ctx = new Context(chipArgs);
ctx->uarch->init(ctx);
ctx->late_init();