patch: don't track root cell deletions for perf

This commit is contained in:
Emil J. Tywoniak 2026-05-30 01:37:49 +02:00
parent e2a77db87a
commit a689cdc6ed
2 changed files with 8 additions and 3 deletions

View File

@ -88,7 +88,7 @@ struct SrcCollector {
}
};
void Patch::gc(Cell* old_cell) {
void Patch::gc(Cell* old_cell, bool track) {
log_debug("gc %s\n", old_cell->name);
if (old_cell->type.in(ID($input_port), ID($output_port), ID($public)))
return;
@ -119,9 +119,13 @@ void Patch::gc(Cell* old_cell) {
}
}
log_debug("\tremove %s\n", old_cell->name);
// Only track recursively-removed cells. The top-level patched cell is the
// caller's current iteration variable and won't be re-encountered.
if (track && removed_cells)
removed_cells->insert(old_cell);
old_cell->module->remove(old_cell);
for (auto input : inputs)
gc(input);
gc(input, /*track=*/true);
}
Wire* Patch::commit_wire(std::unique_ptr<Wire> wire) {

View File

@ -10,7 +10,7 @@ YOSYS_NAMESPACE_BEGIN
struct RTLIL::Patch : public CellAdderMixin<RTLIL::Patch>
{
private:
void gc(Cell* old_cell);
void gc(Cell* old_cell, bool track = false);
protected:
void add(RTLIL::Wire *wire);
@ -25,6 +25,7 @@ protected:
public:
Module* mod;
SigMap* map;
pool<Cell*>* removed_cells = nullptr;
vector<std::unique_ptr<Wire>> wires_ = {};
vector<std::unique_ptr<Cell>> cells_ = {};