diff --git a/himbaechel/uarch/gatemate/tests/lut.cc b/himbaechel/uarch/gatemate/tests/lut.cc index 3c7b5f62..7f3c75a8 100644 --- a/himbaechel/uarch/gatemate/tests/lut.cc +++ b/himbaechel/uarch/gatemate/tests/lut.cc @@ -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); +} diff --git a/himbaechel/uarch/gatemate/tests/testing.cc b/himbaechel/uarch/gatemate/tests/testing.cc index b66ffacd..4306e657 100644 --- a/himbaechel/uarch/gatemate/tests/testing.cc +++ b/himbaechel/uarch/gatemate/tests/testing.cc @@ -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();