aboutsummaryrefslogtreecommitdiffstats
path: root/passes/techmap
diff options
context:
space:
mode:
authorMarcin Koƛcielnicki <mwk@0x04.net>2020-03-30 15:35:31 +0200
committerMarcelina Koƛcielnicka <mwk@0x04.net>2020-04-02 18:15:04 +0200
commit2d3753d730c99ab2c0253be119b04cec413e10ba (patch)
tree63f610df90eb4e47a526c9096e5a2a5e6eadbf9e /passes/techmap
parent22ef5701c0e0c8ff75ed1f3e4627b783ec192756 (diff)
downloadyosys-2d3753d730c99ab2c0253be119b04cec413e10ba.tar.gz
yosys-2d3753d730c99ab2c0253be119b04cec413e10ba.tar.bz2
yosys-2d3753d730c99ab2c0253be119b04cec413e10ba.zip
iopadmap: Fix z assignment to inout port
Fixes #1841.
Diffstat (limited to 'passes/techmap')
-rw-r--r--passes/techmap/iopadmap.cc16
1 files changed, 15 insertions, 1 deletions
diff --git a/passes/techmap/iopadmap.cc b/passes/techmap/iopadmap.cc
index 8b1862237..f754aecb8 100644
--- a/passes/techmap/iopadmap.cc
+++ b/passes/techmap/iopadmap.cc
@@ -229,11 +229,13 @@ struct IopadmapPass : public Pass {
for (auto module : design->selected_modules())
{
dict<Wire *, dict<int, pair<Cell *, IdString>>> rewrite_bits;
+ pool<SigSig> remove_conns;
if (!toutpad_celltype.empty() || !tinoutpad_celltype.empty())
{
dict<SigBit, Cell *> tbuf_bits;
pool<SigBit> driven_bits;
+ dict<SigBit, SigSig> z_conns;
// Gather tristate buffers and always-on drivers.
for (auto cell : module->cells())
@@ -252,8 +254,10 @@ struct IopadmapPass : public Pass {
for (int i = 0; i < GetSize(conn.first); i++) {
SigBit dstbit = conn.first[i];
SigBit srcbit = conn.second[i];
- if (!srcbit.wire && srcbit.data == State::Sz)
+ if (!srcbit.wire && srcbit.data == State::Sz) {
+ z_conns[dstbit] = conn;
continue;
+ }
driven_bits.insert(dstbit);
}
@@ -302,6 +306,8 @@ struct IopadmapPass : public Pass {
// enable.
en_sig = SigBit(State::S0);
data_sig = SigBit(State::Sx);
+ if (z_conns.count(wire_bit))
+ remove_conns.insert(z_conns[wire_bit]);
}
if (wire->port_input)
@@ -454,6 +460,14 @@ struct IopadmapPass : public Pass {
}
}
+ if (!remove_conns.empty()) {
+ std::vector<SigSig> new_conns;
+ for (auto &conn : module->connections())
+ if (!remove_conns.count(conn))
+ new_conns.push_back(conn);
+ module->new_connections(new_conns);
+ }
+
for (auto &it : rewrite_bits) {
RTLIL::Wire *wire = it.first;
RTLIL::Wire *new_wire = module->addWire(