From 96e776fbfcbc7f4c44288f994d4446bbacb3c3b1 Mon Sep 17 00:00:00 2001 From: nella Date: Wed, 12 Aug 2026 09:21:48 +0200 Subject: [PATCH] Single driver lookup in bitsim. --- passes/opt/opt_dff.cc | 57 ++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/passes/opt/opt_dff.cc b/passes/opt/opt_dff.cc index 4e4619d1f..cf65f6663 100644 --- a/passes/opt/opt_dff.cc +++ b/passes/opt/opt_dff.cc @@ -84,42 +84,39 @@ struct BitSim { } evals_left--; + // pre-seed to break combinational loops sim_vals[mapped] = 0; uint64_t res = 0; - if (!modwalker.has_drivers(mapped)) { + auto drv = modwalker.signal_drivers.find(mapped); + if (drv == modwalker.signal_drivers.end() || drv->second.empty()) { res = next_rand(); } else { - auto &drivers = modwalker.signal_drivers[mapped]; - if (drivers.empty()) { - res = next_rand(); - } else { - auto driver = *drivers.begin(); - Cell *cell = driver.cell; + auto driver = *drv->second.begin(); + Cell *cell = driver.cell; - if (cell->is_builtin_ff()) { - res = next_rand(); - } else if (cell->type == ID($_AND_)) { - res = eval_bit(cell->getPort(ID::A)[0], depth+1) & eval_bit(cell->getPort(ID::B)[0], depth+1); - } else if (cell->type == ID($_OR_)) { - res = eval_bit(cell->getPort(ID::A)[0], depth+1) | eval_bit(cell->getPort(ID::B)[0], depth+1); - } else if (cell->type == ID($_XOR_)) { - res = eval_bit(cell->getPort(ID::A)[0], depth+1) ^ eval_bit(cell->getPort(ID::B)[0], depth+1); - } else if (cell->type == ID($_NOT_)) { - res = ~eval_bit(cell->getPort(ID::A)[0], depth+1); - } else if (cell->type == ID($_MUX_)) { - uint64_t s = eval_bit(cell->getPort(ID::S)[0], depth+1); - uint64_t a = eval_bit(cell->getPort(ID::A)[0], depth+1); - uint64_t b = eval_bit(cell->getPort(ID::B)[0], depth+1); - res = (a & ~s) | (b & s); - } else if (cell->type == ID($mux)) { - uint64_t s = eval_bit(cell->getPort(ID::S)[0], depth+1); - uint64_t a = eval_bit(cell->getPort(ID::A)[driver.offset], depth+1); - uint64_t b = eval_bit(cell->getPort(ID::B)[driver.offset], depth+1); - res = (a & ~s) | (b & s); - } else { - res = next_rand(); - } + if (cell->is_builtin_ff()) { + res = next_rand(); + } else if (cell->type == ID($_AND_)) { + res = eval_bit(cell->getPort(ID::A)[0], depth+1) & eval_bit(cell->getPort(ID::B)[0], depth+1); + } else if (cell->type == ID($_OR_)) { + res = eval_bit(cell->getPort(ID::A)[0], depth+1) | eval_bit(cell->getPort(ID::B)[0], depth+1); + } else if (cell->type == ID($_XOR_)) { + res = eval_bit(cell->getPort(ID::A)[0], depth+1) ^ eval_bit(cell->getPort(ID::B)[0], depth+1); + } else if (cell->type == ID($_NOT_)) { + res = ~eval_bit(cell->getPort(ID::A)[0], depth+1); + } else if (cell->type == ID($_MUX_)) { + uint64_t s = eval_bit(cell->getPort(ID::S)[0], depth+1); + uint64_t a = eval_bit(cell->getPort(ID::A)[0], depth+1); + uint64_t b = eval_bit(cell->getPort(ID::B)[0], depth+1); + res = (a & ~s) | (b & s); + } else if (cell->type == ID($mux)) { + uint64_t s = eval_bit(cell->getPort(ID::S)[0], depth+1); + uint64_t a = eval_bit(cell->getPort(ID::A)[driver.offset], depth+1); + uint64_t b = eval_bit(cell->getPort(ID::B)[driver.offset], depth+1); + res = (a & ~s) | (b & s); + } else { + res = next_rand(); } }