From 04ac02573443d7a681dffd8d403c5d5017d9f5ae Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 4 Jul 2025 11:09:33 +0200 Subject: [PATCH] look at C_I when doing inversion --- himbaechel/uarch/gatemate/bitstream.cc | 48 ++++++++++++++------------ 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/himbaechel/uarch/gatemate/bitstream.cc b/himbaechel/uarch/gatemate/bitstream.cc index 3c2aa4dd..f51d7aeb 100644 --- a/himbaechel/uarch/gatemate/bitstream.cc +++ b/himbaechel/uarch/gatemate/bitstream.cc @@ -81,12 +81,12 @@ struct BitstreamBackend return invert; } - void update_cpe_lt(CellInfo *cell, IdString port, IdString init, dict ¶ms) + void update_cpe_lt(CellInfo *cell, IdString port, IdString init, dict ¶ms, bool even) { unsigned init_val = int_or_default(params, init); bool invert = need_inversion(cell, port); if (invert) { - if (port.in(id_IN1, id_IN3, id_IN5, id_IN7)) + if (even) init_val = (init_val & 0b1010) >> 1 | (init_val & 0b0101) << 1; else init_val = (init_val & 0b0011) << 2 | (init_val & 0b1100) >> 2; @@ -281,18 +281,22 @@ struct BitstreamBackend dict params = cell.second->params; Loc l = ctx->getBelLocation(cell.second->bel); params.erase(id_L2T4_UPPER); + int c_i1 = int_or_default(params, id_C_I1, 0); + int c_i2 = int_or_default(params, id_C_I2, 0); + int c_i3 = int_or_default(params, id_C_I3, 0); + int c_i4 = int_or_default(params, id_C_I4, 0); if (cell.second->type.in(id_CPE_L2T4, id_CPE_LT_L, id_CPE_LT_U)) { if (l.z == CPE_LT_U_Z) { - update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L00, params); - update_cpe_lt(cell.second.get(), id_IN2, id_INIT_L00, params); - update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L01, params); - update_cpe_lt(cell.second.get(), id_IN4, id_INIT_L01, params); + update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L00, params, true); + update_cpe_lt(cell.second.get(), c_i1 ? id_PINY1 : id_IN2, id_INIT_L00, params, false); + update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L01, params, true); + update_cpe_lt(cell.second.get(), c_i2 ? id_CINX : id_IN4, id_INIT_L01, params, false); } else { // These will be renamed later - update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L00, params); - update_cpe_lt(cell.second.get(), id_IN2, id_INIT_L00, params); - update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L01, params); - update_cpe_lt(cell.second.get(), id_IN4, id_INIT_L01, params); + update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L00, params, true); + update_cpe_lt(cell.second.get(), c_i3 ? id_PINY1 : id_IN2, id_INIT_L00, params, false); + update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L01, params, true); + update_cpe_lt(cell.second.get(), c_i4 ? id_PINX : id_IN4, id_INIT_L01, params, false); } } if (l.z == CPE_LT_FULL_Z) { @@ -302,19 +306,19 @@ struct BitstreamBackend update_cpe_mux(cell.second.get(), id_IN2, id_INIT_L11, 1, params); update_cpe_mux(cell.second.get(), id_IN3, id_INIT_L11, 2, params); update_cpe_mux(cell.second.get(), id_IN4, id_INIT_L11, 3, params); - update_cpe_lt(cell.second.get(), id_IN5, id_INIT_L02, params); - update_cpe_lt(cell.second.get(), id_IN6, id_INIT_L02, params); - update_cpe_lt(cell.second.get(), id_IN7, id_INIT_L03, params); - update_cpe_lt(cell.second.get(), id_IN8, id_INIT_L03, params); + update_cpe_lt(cell.second.get(), id_IN5, id_INIT_L02, params,true); + update_cpe_lt(cell.second.get(), c_i3 ? id_PINY1 : id_IN6, id_INIT_L02, params,false); + update_cpe_lt(cell.second.get(), id_IN7, id_INIT_L03, params,true); + update_cpe_lt(cell.second.get(), c_i4 ? id_PINX : id_IN8, id_INIT_L03, params,false); } else { - update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L00, params); - update_cpe_lt(cell.second.get(), id_IN2, id_INIT_L00, params); - update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L01, params); - update_cpe_lt(cell.second.get(), id_IN4, id_INIT_L01, params); - update_cpe_lt(cell.second.get(), id_IN5, id_INIT_L02, params); - update_cpe_lt(cell.second.get(), id_IN6, id_INIT_L02, params); - update_cpe_lt(cell.second.get(), id_IN7, id_INIT_L03, params); - update_cpe_lt(cell.second.get(), id_IN8, id_INIT_L03, params); + update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L00, params,true); + update_cpe_lt(cell.second.get(), c_i1 ? id_PINY1 : id_IN2, id_INIT_L00, params,false); + update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L01, params,true); + update_cpe_lt(cell.second.get(), c_i2 ? id_CINX : id_IN4, id_INIT_L01, params,false); + update_cpe_lt(cell.second.get(), id_IN5, id_INIT_L02, params,true); + update_cpe_lt(cell.second.get(), c_i3 ? id_PINY1 : id_IN6, id_INIT_L02, params,false); + update_cpe_lt(cell.second.get(), id_IN7, id_INIT_L03, params,true); + update_cpe_lt(cell.second.get(), c_i4 ? id_PINX : id_IN8, id_INIT_L03, params,false); } } }