aboutsummaryrefslogtreecommitdiffstats
path: root/passes/hierarchy
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2019-11-22 09:21:35 +0000
committerDavid Shah <dave@ds0.me>2020-02-02 16:12:33 +0000
commit7e741714df62338a2037d24721ef99ca8a0c6763 (patch)
tree84a5200af6af1219450f7cbd43d3639b48f99f33 /passes/hierarchy
parenta210675d71b30e97bad728d7f418c14ea0eb28ba (diff)
downloadyosys-7e741714df62338a2037d24721ef99ca8a0c6763.tar.gz
yosys-7e741714df62338a2037d24721ef99ca8a0c6763.tar.bz2
yosys-7e741714df62338a2037d24721ef99ca8a0c6763.zip
hierarchy: Correct handling of wildcard port connections with default values
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'passes/hierarchy')
-rw-r--r--passes/hierarchy/hierarchy.cc21
1 files changed, 14 insertions, 7 deletions
diff --git a/passes/hierarchy/hierarchy.cc b/passes/hierarchy/hierarchy.cc
index 0704c2651..c298a6600 100644
--- a/passes/hierarchy/hierarchy.cc
+++ b/passes/hierarchy/hierarchy.cc
@@ -983,6 +983,15 @@ struct HierarchyPass : public Pass {
}
}
+ // Determine default values
+ dict<IdString, dict<IdString, Const>> defaults_db;
+ if (!nodefaults)
+ {
+ for (auto module : design->modules())
+ for (auto wire : module->wires())
+ if (wire->port_input && wire->attributes.count("\\defaultvalue"))
+ defaults_db[module->name][wire->name] = wire->attributes.at("\\defaultvalue");
+ }
// Process SV implicit port connections
std::set<Module*> blackbox_derivatives;
std::vector<Module*> design_modules = design->modules();
@@ -1019,6 +1028,11 @@ struct HierarchyPass : public Pass {
continue;
// Make sure a wire of correct name exists in the parent
Wire* parent_wire = find_implicit_port_wire(module, cell, wire->name.str());
+
+ // Missing wires are OK when a default value is set
+ if (!nodefaults && parent_wire == nullptr && defaults_db.count(cell->type) && defaults_db.at(cell->type).count(wire->name))
+ continue;
+
if (parent_wire == nullptr)
log_error("No matching wire for implicit port connection `%s' of cell %s.%s (%s).\n",
RTLIL::id2cstr(wire->name), RTLIL::id2cstr(module->name), RTLIL::id2cstr(cell->name), RTLIL::id2cstr(cell->type));
@@ -1034,13 +1048,6 @@ struct HierarchyPass : public Pass {
if (!nodefaults)
{
- dict<IdString, dict<IdString, Const>> defaults_db;
-
- for (auto module : design->modules())
- for (auto wire : module->wires())
- if (wire->port_input && wire->attributes.count("\\defaultvalue"))
- defaults_db[module->name][wire->name] = wire->attributes.at("\\defaultvalue");
-
for (auto module : design->modules())
for (auto cell : module->cells())
{