diff --git a/himbaechel/uarch/gatemate/pack.cc b/himbaechel/uarch/gatemate/pack.cc index 1b44421e..90981b4d 100644 --- a/himbaechel/uarch/gatemate/pack.cc +++ b/himbaechel/uarch/gatemate/pack.cc @@ -176,6 +176,50 @@ void GateMatePacker::optimize_lut() flush_cells(); } +void GateMatePacker::optimize_mx() +{ + for (auto &cell : ctx->cells) { + CellInfo &ci = *cell.second; + if (!ci.type.in(id_CC_MX2, id_CC_MX4)) + continue; + NetInfo *y_net = ci.getPort(id_Y); + if (!y_net) { + count_cell(ci); + continue; + } + if (ci.type == id_CC_MX2) { + if (ci.getPort(id_S0) == gnd_net) { + move_connections(y_net, ci.getPort(id_D0)); + count_cell(ci); + continue; + } else if (ci.getPort(id_S0) == vcc_net) { + move_connections(y_net, ci.getPort(id_D1)); + count_cell(ci); + continue; + } + } else { + if ((ci.getPort(id_S1) == gnd_net) && (ci.getPort(id_S0) == gnd_net)) { + move_connections(y_net, ci.getPort(id_D0)); + count_cell(ci); + continue; + } else if ((ci.getPort(id_S1) == gnd_net) && (ci.getPort(id_S0) == vcc_net)) { + move_connections(y_net, ci.getPort(id_D1)); + count_cell(ci); + continue; + } else if ((ci.getPort(id_S1) == vcc_net) && (ci.getPort(id_S0) == gnd_net)) { + move_connections(y_net, ci.getPort(id_D2)); + count_cell(ci); + continue; + } else if ((ci.getPort(id_S1) == vcc_net) && (ci.getPort(id_S0) == vcc_net)) { + move_connections(y_net, ci.getPort(id_D3)); + count_cell(ci); + continue; + } + } + } + flush_cells(); +} + void GateMatePacker::optimize_ff() { for (auto &cell : ctx->cells) { @@ -237,6 +281,7 @@ void GateMatePacker::cleanup() count = 0; disconnect_not_used(); optimize_lut(); + optimize_mx(); optimize_ff(); for (auto c : count_per_type) log_info(" %6d %s cells removed (iteration %d)\n", c.second, c.first.c_str(ctx), i); diff --git a/himbaechel/uarch/gatemate/pack.h b/himbaechel/uarch/gatemate/pack.h index ee837d9d..403eaa3c 100644 --- a/himbaechel/uarch/gatemate/pack.h +++ b/himbaechel/uarch/gatemate/pack.h @@ -78,6 +78,7 @@ struct GateMatePacker void disconnect_not_used(); void optimize_lut(); + void optimize_mx(); void optimize_ff(); void count_cell(CellInfo &ci); void move_connections(NetInfo *from_net, NetInfo *to_net);