From aeb0ba4e547f10387cb7e62bd25cf4c5fe410ade Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 23 Jun 2025 09:46:18 +0200 Subject: [PATCH] Cleanups --- himbaechel/uarch/gatemate/bitstream.cc | 53 ++++++++++++++------------ himbaechel/uarch/gatemate/cells.cc | 8 ++-- himbaechel/uarch/gatemate/constids.inc | 2 +- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/himbaechel/uarch/gatemate/bitstream.cc b/himbaechel/uarch/gatemate/bitstream.cc index 5ac16a87..faf39b2d 100644 --- a/himbaechel/uarch/gatemate/bitstream.cc +++ b/himbaechel/uarch/gatemate/bitstream.cc @@ -106,10 +106,8 @@ struct BitstreamBackend void update_cpe_mux(CellInfo *cell, IdString port, IdString param, int bit, dict ¶ms) { // Mux inversion data is contained in other CPE half - Loc l = ctx->getBelLocation(cell->bel); - CellInfo *cell_u = ctx->getBoundBelCell(ctx->getBelByLocation(Loc(l.x, l.y, 0))); unsigned init_val = int_or_default(params, param); - bool invert = need_inversion(cell_u, port); + bool invert = need_inversion(cell, port); if (invert) { int old = (init_val >> bit) & 1; int val = (init_val & (~(1 << bit) & 0xf)) | ((!old) << bit); @@ -258,36 +256,41 @@ struct BitstreamBackend { // Update configuration bits based on signal inversion dict params = cell.second->params; - uint8_t func = int_or_default(cell.second->params, id_C_FUNCTION, 0); Loc l = ctx->getBelLocation(cell.second->bel); - if (l.z==0 && func != C_MX4) { - 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); + if (cell.second->type.in(id_CPE_L2T4, id_CPE_CI)) { + if (l.z==0) { + 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); + } else { + update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L02, params); + update_cpe_lt(cell.second.get(), id_IN2, id_INIT_L02, params); + update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L03, params); + update_cpe_lt(cell.second.get(), id_IN4, id_INIT_L03, params); + } } - if (l.z==1) { - update_cpe_lt(cell.second.get(), id_IN1, id_INIT_L02, params); - update_cpe_lt(cell.second.get(), id_IN2, id_INIT_L02, params); - update_cpe_lt(cell.second.get(), id_IN3, id_INIT_L03, params); - update_cpe_lt(cell.second.get(), id_IN4, id_INIT_L03, params); - if (func == C_MX4) { + if (l.z==7) { + if (cell.second->type.in(id_CPE_MX4)) { update_cpe_mux(cell.second.get(), id_IN1, id_INIT_L11, 0, params); 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); + } 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); } } - if (l.z==7) { - 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); - } if (cell.second->type.in(id_CPE_FF)) { update_cpe_inv(cell.second.get(), id_CLK, id_C_CPE_CLK, params); diff --git a/himbaechel/uarch/gatemate/cells.cc b/himbaechel/uarch/gatemate/cells.cc index 396eb884..40d7dbfd 100644 --- a/himbaechel/uarch/gatemate/cells.cc +++ b/himbaechel/uarch/gatemate/cells.cc @@ -34,10 +34,10 @@ CellInfo *GateMatePacker::create_cell_ptr(IdString type, IdString name) cell->ports[id].type = dir; }; if (type.in(id_CPE_LT, id_CPE_LT_U, id_CPE_LT_L, id_CPE_L2T4, id_CPE_L2T5_U, id_CPE_L2T5_L, id_CPE_CI)) { - add_port(id_I1, PORT_IN); - add_port(id_I2, PORT_IN); - add_port(id_I3, PORT_IN); - add_port(id_I4, PORT_IN); + add_port(id_IN1, PORT_IN); + add_port(id_IN2, PORT_IN); + add_port(id_IN3, PORT_IN); + add_port(id_IN4, PORT_IN); add_port(id_OUT, PORT_OUT); if (type.in(id_CPE_LT_L, id_CPE_L2T5_L, id_CPE_CI)) { add_port(id_COUTY1, PORT_OUT); diff --git a/himbaechel/uarch/gatemate/constids.inc b/himbaechel/uarch/gatemate/constids.inc index c047c216..aa1024dd 100644 --- a/himbaechel/uarch/gatemate/constids.inc +++ b/himbaechel/uarch/gatemate/constids.inc @@ -2235,4 +2235,4 @@ X(CPE_MX4) X(CPE_EN_CIN) X(CPE_CONCAT) X(CPE_ADDCIN) -X(CPE_CI) \ No newline at end of file +X(CPE_CI)