From 17d45796a688b5a48caee40c76c7b8af69a8e031 Mon Sep 17 00:00:00 2001 From: "N. Engelhardt" Date: Wed, 15 Jan 2025 15:25:35 +0100 Subject: [PATCH 1/3] ModuleHdlnameIndex: handle objects with private name and hdlname attribute --- kernel/scopeinfo.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/kernel/scopeinfo.h b/kernel/scopeinfo.h index 703dc315f90..45d867b6207 100644 --- a/kernel/scopeinfo.h +++ b/kernel/scopeinfo.h @@ -337,12 +337,12 @@ template std::vector parse_hdlname(const O* object) { std::vector path; - if (!object->name.isPublic()) - return path; for (auto const &item : object->get_hdlname_attribute()) path.push_back("\\" + item); - if (path.empty()) + if (path.empty() && object->name.isPublic()) path.push_back(object->name); + if (!path.empty() && !(object->name.isPublic() || object->name.begins_with("$paramod") || object->name.begins_with("$abstract"))) + path.pop_back(); return path; } @@ -351,17 +351,22 @@ std::pair, IdString> parse_scopename(const O* object) { std::vector path; IdString trailing = object->name; - if (object->name.isPublic()) { + if (object->name.isPublic() || object->name.begins_with("$paramod") || object->name.begins_with("$abstract")) { for (auto const &item : object->get_hdlname_attribute()) path.push_back("\\" + item); if (!path.empty()) { trailing = path.back(); path.pop_back(); } + } else if (object->has_attribute(ID::hdlname)) { + for (auto const &item : object->get_hdlname_attribute()) + path.push_back("\\" + item); + if (!path.empty()) { + path.pop_back(); + } } else { for (auto const &item : split_tokens(object->get_string_attribute(ID(scopename)), " ")) path.push_back("\\" + item); - } return {path, trailing}; } From d640157ec4b4574f5bda6a10d2f6ddec6ee09585 Mon Sep 17 00:00:00 2001 From: "N. Engelhardt" Date: Wed, 15 Jan 2025 15:56:42 +0100 Subject: [PATCH 2/3] fix some cases of hdlname being added to objects with private names --- frontends/verific/verific.cc | 3 ++- passes/fsm/fsm_extract.cc | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/frontends/verific/verific.cc b/frontends/verific/verific.cc index 8f1b07b100e..cdd0ed80297 100644 --- a/frontends/verific/verific.cc +++ b/frontends/verific/verific.cc @@ -1464,7 +1464,8 @@ void VerificImporter::import_netlist(RTLIL::Design *design, Netlist *nl, std::ma log("Importing module %s.\n", RTLIL::id2cstr(module->name)); } import_attributes(module->attributes, nl, nl); - module->set_string_attribute(ID::hdlname, nl->CellBaseName()); + if (module->name.isPublic()) + module->set_string_attribute(ID::hdlname, nl->CellBaseName()); module->set_string_attribute(ID(library), nl->Owner()->Owner()->Name()); #ifdef VERIFIC_VHDL_SUPPORT if (nl->IsFromVhdl()) { diff --git a/passes/fsm/fsm_extract.cc b/passes/fsm/fsm_extract.cc index 6114dd34bdd..17675b4021f 100644 --- a/passes/fsm/fsm_extract.cc +++ b/passes/fsm/fsm_extract.cc @@ -377,6 +377,10 @@ static void extract_fsm(RTLIL::Wire *wire) fsm_cell->setPort(ID::CTRL_OUT, ctrl_out); fsm_cell->parameters[ID::NAME] = RTLIL::Const(wire->name.str()); fsm_cell->attributes = wire->attributes; + if(fsm_cell->attributes.count(ID::hdlname)) { + fsm_cell->attributes[ID(scopename)] = fsm_cell->attributes[ID::hdlname]; + fsm_cell->attributes.erase(ID::hdlname); + } fsm_data.copy_to_cell(fsm_cell); // rename original state wire @@ -385,6 +389,10 @@ static void extract_fsm(RTLIL::Wire *wire) wire->attributes.erase(ID::fsm_encoding); wire->name = stringf("$fsm$oldstate%s", wire->name.c_str()); module->wires_[wire->name] = wire; + if(wire->attributes.count(ID::hdlname)) { + wire->attributes[ID(scopename)] = wire->attributes[ID::hdlname]; + wire->attributes.erase(ID::hdlname); + } // unconnect control outputs from old drivers From a5ba1d2ebafd6a3c5e65d238811f59db55414b10 Mon Sep 17 00:00:00 2001 From: "N. Engelhardt" Date: Thu, 16 Jan 2025 12:57:08 +0100 Subject: [PATCH 3/3] fix bugs in handling last id in hdlname to scopename conversion --- kernel/scopeinfo.h | 4 +++- passes/fsm/fsm_extract.cc | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/kernel/scopeinfo.h b/kernel/scopeinfo.h index 45d867b6207..3bc1a8162dd 100644 --- a/kernel/scopeinfo.h +++ b/kernel/scopeinfo.h @@ -341,8 +341,10 @@ std::vector parse_hdlname(const O* object) path.push_back("\\" + item); if (path.empty() && object->name.isPublic()) path.push_back(object->name); - if (!path.empty() && !(object->name.isPublic() || object->name.begins_with("$paramod") || object->name.begins_with("$abstract"))) + if (!path.empty() && !(object->name.isPublic() || object->name.begins_with("$paramod") || object->name.begins_with("$abstract"))) { path.pop_back(); + path.push_back(object->name); + } return path; } diff --git a/passes/fsm/fsm_extract.cc b/passes/fsm/fsm_extract.cc index 17675b4021f..143ae7b54f1 100644 --- a/passes/fsm/fsm_extract.cc +++ b/passes/fsm/fsm_extract.cc @@ -378,7 +378,10 @@ static void extract_fsm(RTLIL::Wire *wire) fsm_cell->parameters[ID::NAME] = RTLIL::Const(wire->name.str()); fsm_cell->attributes = wire->attributes; if(fsm_cell->attributes.count(ID::hdlname)) { - fsm_cell->attributes[ID(scopename)] = fsm_cell->attributes[ID::hdlname]; + auto hdlname = fsm_cell->get_hdlname_attribute(); + hdlname.pop_back(); + fsm_cell->set_hdlname_attribute(hdlname); + fsm_cell->set_string_attribute(ID(scopename), fsm_cell->get_string_attribute(ID::hdlname)); fsm_cell->attributes.erase(ID::hdlname); } fsm_data.copy_to_cell(fsm_cell); @@ -390,7 +393,10 @@ static void extract_fsm(RTLIL::Wire *wire) wire->name = stringf("$fsm$oldstate%s", wire->name.c_str()); module->wires_[wire->name] = wire; if(wire->attributes.count(ID::hdlname)) { - wire->attributes[ID(scopename)] = wire->attributes[ID::hdlname]; + auto hdlname = wire->get_hdlname_attribute(); + hdlname.pop_back(); + wire->set_hdlname_attribute(hdlname); + wire->set_string_attribute(ID(scopename), wire->get_string_attribute(ID::hdlname)); wire->attributes.erase(ID::hdlname); }