diff options
author | David Shah <dave@ds0.me> | 2019-11-22 09:21:35 +0000 |
---|---|---|
committer | David Shah <dave@ds0.me> | 2020-02-02 16:12:33 +0000 |
commit | 7e741714df62338a2037d24721ef99ca8a0c6763 (patch) | |
tree | 84a5200af6af1219450f7cbd43d3639b48f99f33 /passes/hierarchy | |
parent | a210675d71b30e97bad728d7f418c14ea0eb28ba (diff) | |
download | yosys-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.cc | 21 |
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()) { |