Cope with an output having same name as an input (i.e. CO)

This commit is contained in:
Eddie Hung 2019-04-12 12:27:07 -07:00
parent f77da46a87
commit 1c6f0cffd9
1 changed files with 23 additions and 5 deletions

View File

@ -460,12 +460,30 @@ next_line:
log_assert(wire);
log_assert(wire->port_output);
if (index == 0)
module->rename(wire, escaped_symbol);
if (index == 0) {
// Cope with the fact that a CO might be identical
// to a PO (necessary due to ABC); in those cases
// simply connect the latter to the former
RTLIL::Wire* existing = module->wire(escaped_symbol);
if (!existing)
module->rename(wire, escaped_symbol);
else {
wire->port_output = false;
module->connect(wire, existing);
}
}
else if (index > 0) {
module->rename(wire, stringf("%s[%d]", escaped_symbol.c_str(), index));
if (wideports)
wideports_cache[escaped_symbol] = std::max(wideports_cache[escaped_symbol], index);
std::string indexed_name = stringf("%s[%d]", escaped_symbol.c_str(), index);
RTLIL::Wire* existing = module->wire(indexed_name);
if (!existing) {
module->rename(wire, indexed_name);
if (wideports)
wideports_cache[escaped_symbol] = std::max(wideports_cache[escaped_symbol], index);
}
else {
module->connect(wire, existing);
wire->port_output = false;
}
}
}
else