From: Clifford Wolf Date: Wed, 4 Feb 2015 15:34:06 +0000 (+0100) Subject: Fixed opt_clean performance bug X-Git-Tag: yosys-0.5~28 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8805c24640d881ae9b29552fc860cff08f9adaff;p=yosys.git Fixed opt_clean performance bug --- diff --git a/passes/opt/opt_clean.cc b/passes/opt/opt_clean.cc index 447b7870f..6a7e6051d 100644 --- a/passes/opt/opt_clean.cc +++ b/passes/opt/opt_clean.cc @@ -33,53 +33,53 @@ using RTLIL::id2cstr; CellTypes ct, ct_reg, ct_all; int count_rm_cells, count_rm_wires; -void rmunused_module_cells(RTLIL::Module *module, bool verbose) +void rmunused_module_cells(Module *module, bool verbose) { SigMap sigmap(module); - std::set> queue, unused; + pool queue, unused; + dict> wire2driver; - SigSet wire2driver; for (auto &it : module->cells_) { - RTLIL::Cell *cell = it.second; + Cell *cell = it.second; for (auto &it2 : cell->connections()) { if (!ct.cell_input(cell->type, it2.first)) - wire2driver.insert(sigmap(it2.second), cell); + for (auto bit : sigmap(it2.second)) + if (bit.wire != nullptr) + wire2driver[bit].insert(cell); } if (cell->type == "$memwr" || cell->type == "$assert" || cell->has_keep_attr()) queue.insert(cell); - unused.insert(cell); + else + unused.insert(cell); } for (auto &it : module->wires_) { - RTLIL::Wire *wire = it.second; + Wire *wire = it.second; if (wire->port_output || wire->get_bool_attribute("\\keep")) { - pool cell_list; - wire2driver.find(sigmap(wire), cell_list); - for (auto cell : cell_list) - queue.insert(cell); + for (auto bit : sigmap(wire)) + for (auto c : wire2driver[bit]) + queue.insert(c), unused.erase(c); } } while (!queue.empty()) { - std::set> new_queue; + pool bits; for (auto cell : queue) - unused.erase(cell); - for (auto cell : queue) { - for (auto &it : cell->connections()) { - if (!ct.cell_output(cell->type, it.first)) { - pool cell_list; - wire2driver.find(sigmap(it.second), cell_list); - for (auto c : cell_list) { - if (unused.count(c)) - new_queue.insert(c); - } - } - } - } - queue.swap(new_queue); + for (auto &it : cell->connections()) + if (!ct.cell_output(cell->type, it.first)) + for (auto bit : sigmap(it.second)) + bits.insert(bit); + + queue.clear(); + for (auto bit : bits) + for (auto c : wire2driver[bit]) + if (unused.count(c)) + queue.insert(c), unused.erase(c); } + unused.sort(RTLIL::sort_by_name_id()); + for (auto cell : unused) { if (verbose) log(" removing unused `%s' cell `%s'.\n", cell->type.c_str(), cell->name.c_str());