mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #1330 from YosysHQ/clifford/fix1145
Add flatten handling of pre-existing wires as created by interfaces
This commit is contained in:
commit
82784c279d
|
@ -332,6 +332,10 @@ Verilog Attributes and non-standard features
|
||||||
that represent module parameters or localparams (when the HDL front-end
|
that represent module parameters or localparams (when the HDL front-end
|
||||||
is run in ``-pwires`` mode).
|
is run in ``-pwires`` mode).
|
||||||
|
|
||||||
|
- Wires marked with the ``hierconn`` attribute are connected to wires with the
|
||||||
|
same name (format ``cell_name.identifier``) when they are imported from
|
||||||
|
sub-modules by ``flatten``.
|
||||||
|
|
||||||
- The ``clkbuf_driver`` attribute can be set on an output port of a blackbox
|
- The ``clkbuf_driver`` attribute can be set on an output port of a blackbox
|
||||||
module to mark it as a clock buffer output, and thus prevent ``clkbufmap``
|
module to mark it as a clock buffer output, and thus prevent ``clkbufmap``
|
||||||
from inserting another clock buffer on a net driven by such output.
|
from inserting another clock buffer on a net driven by such output.
|
||||||
|
|
|
@ -205,13 +205,30 @@ struct TechmapWorker
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<RTLIL::IdString, RTLIL::IdString> positional_ports;
|
std::map<RTLIL::IdString, RTLIL::IdString> positional_ports;
|
||||||
|
dict<Wire*, IdString> temp_renamed_wires;
|
||||||
|
|
||||||
for (auto &it : tpl->wires_) {
|
for (auto &it : tpl->wires_) {
|
||||||
if (it.second->port_id > 0)
|
if (it.second->port_id > 0)
|
||||||
positional_ports[stringf("$%d", it.second->port_id)] = it.first;
|
positional_ports[stringf("$%d", it.second->port_id)] = it.first;
|
||||||
IdString w_name = it.second->name;
|
IdString w_name = it.second->name;
|
||||||
apply_prefix(cell->name, w_name);
|
apply_prefix(cell->name, w_name);
|
||||||
RTLIL::Wire *w = module->addWire(w_name, it.second);
|
RTLIL::Wire *w = module->wire(w_name);
|
||||||
|
if (w != nullptr) {
|
||||||
|
if (!flatten_mode || !w->get_bool_attribute(ID(hierconn))) {
|
||||||
|
temp_renamed_wires[w] = w->name;
|
||||||
|
module->rename(w, NEW_ID);
|
||||||
|
w = nullptr;
|
||||||
|
} else {
|
||||||
|
w->attributes.erase(ID(hierconn));
|
||||||
|
if (GetSize(w) < GetSize(it.second)) {
|
||||||
|
log_warning("Widening signal %s.%s to match size of %s.%s (via %s.%s).\n", log_id(module), log_id(w),
|
||||||
|
log_id(tpl), log_id(it.second), log_id(module), log_id(cell));
|
||||||
|
w->width = GetSize(it.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (w == nullptr) {
|
||||||
|
w = module->addWire(w_name, it.second);
|
||||||
w->port_input = false;
|
w->port_input = false;
|
||||||
w->port_output = false;
|
w->port_output = false;
|
||||||
w->port_id = 0;
|
w->port_id = 0;
|
||||||
|
@ -219,6 +236,7 @@ struct TechmapWorker
|
||||||
w->attributes.clear();
|
w->attributes.clear();
|
||||||
if (w->attributes.count(ID(src)))
|
if (w->attributes.count(ID(src)))
|
||||||
w->add_strpool_attribute(ID(src), extra_src_attrs);
|
w->add_strpool_attribute(ID(src), extra_src_attrs);
|
||||||
|
}
|
||||||
design->select(module, w);
|
design->select(module, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,6 +398,16 @@ struct TechmapWorker
|
||||||
}
|
}
|
||||||
|
|
||||||
module->remove(cell);
|
module->remove(cell);
|
||||||
|
|
||||||
|
for (auto &it : temp_renamed_wires)
|
||||||
|
{
|
||||||
|
Wire *w = it.first;
|
||||||
|
IdString name = it.second;
|
||||||
|
IdString altname = module->uniquify(name);
|
||||||
|
Wire *other_w = module->wire(name);
|
||||||
|
module->rename(other_w, altname);
|
||||||
|
module->rename(w, name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool techmap_module(RTLIL::Design *design, RTLIL::Module *module, RTLIL::Design *map, std::set<RTLIL::Cell*> &handled_cells,
|
bool techmap_module(RTLIL::Design *design, RTLIL::Module *module, RTLIL::Design *map, std::set<RTLIL::Cell*> &handled_cells,
|
||||||
|
|
Loading…
Reference in New Issue