From 913ac04764dfdeebc9f965e4cae889098062faf6 Mon Sep 17 00:00:00 2001 From: Krystine Sherwin <93062060+KrystalDelusion@users.noreply.github.com> Date: Fri, 7 Mar 2025 10:12:29 +1300 Subject: [PATCH] hierarchy: Derive abstract cells in top mod Previously abstract cells would only be derived if there was no top module declared, this means that `-check` would miss certain kinds of errors that it would normally detect. This fixes #4927. --- passes/hierarchy/hierarchy.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/passes/hierarchy/hierarchy.cc b/passes/hierarchy/hierarchy.cc index 8372c0339..c1edf90fc 100644 --- a/passes/hierarchy/hierarchy.cc +++ b/passes/hierarchy/hierarchy.cc @@ -1066,6 +1066,17 @@ struct HierarchyPass : public Pass { mod->attributes[ID::initial_top] = RTLIL::Const(1); else mod->attributes.erase(ID::initial_top); + + std::vector abstract_ids; + for (auto cell : top_mod->cells()) { + IdString abstract_id = "$abstract" + cell->type.str(); + if (design->module(cell->type) == nullptr && design->module(abstract_id)) + abstract_ids.push_back(abstract_id); + } + for (auto abstract_id : abstract_ids) + design->module(abstract_id)->derive(design, {}); + for (auto abstract_id : abstract_ids) + design->remove(design->module(abstract_id)); } bool did_something = true;