From c5d4b435bdb692b8ca0e4eb1dd84f9b4418f3031 Mon Sep 17 00:00:00 2001 From: "Emil J. Tywoniak" Date: Tue, 17 Mar 2026 17:29:23 +0100 Subject: [PATCH] check: stitch info about $connect ports together for driver analysis --- passes/cmds/check.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/passes/cmds/check.cc b/passes/cmds/check.cc index 5b89b00b2..d1aedeedd 100644 --- a/passes/cmds/check.cc +++ b/passes/cmds/check.cc @@ -267,6 +267,27 @@ struct CheckPass : public Pass { cell_allowed:; } + if (cell->type == ID($connect)) { + // Inefficient, but rare case in sane design + auto sig_a = cell->getPort(ID::A); + auto sig_b = cell->getPort(ID::B); + for (int i = 0; i < sig_a.size(); i++) { + int count_a = wire_drivers_count[sig_a[i]]; + int count_b = wire_drivers_count[sig_b[i]]; + wire_drivers_count[sig_a[i]] += count_b; + wire_drivers_count[sig_b[i]] += count_a; + auto& drivers_a = wire_drivers[sig_a[i]]; + auto& drivers_b = wire_drivers[sig_b[i]]; + vector drivers; + drivers.reserve(std::max(drivers_a.size(), drivers_b.size())); + for (auto driver : drivers_a) + drivers.push_back(driver); + for (auto driver : drivers_b) + drivers.push_back(driver); + drivers_a = drivers; + drivers_b = drivers; + } + } for (auto &conn : cell->connections()) { bool input = cell->input(conn.first); bool output = cell->output(conn.first);