aboutsummaryrefslogtreecommitdiffstats
path: root/passes
diff options
context:
space:
mode:
authorrafaeltp <rafaeltp@soe.ucsc.edu>2018-10-20 17:50:21 -0700
committerrafaeltp <rafaeltp@soe.ucsc.edu>2018-10-20 17:50:21 -0700
commit0ad4321781a53210c42e3450b23f289bc0a35c99 (patch)
treec468d4ab61be90da9c12c247be8a675be9c41d18 /passes
parentf25d0de6f80233b0af02067bea839bff19f62a3c (diff)
downloadyosys-0ad4321781a53210c42e3450b23f289bc0a35c99.tar.gz
yosys-0ad4321781a53210c42e3450b23f289bc0a35c99.tar.bz2
yosys-0ad4321781a53210c42e3450b23f289bc0a35c99.zip
solves #675
Diffstat (limited to 'passes')
-rw-r--r--passes/equiv/equiv_make.cc28
1 files changed, 17 insertions, 11 deletions
diff --git a/passes/equiv/equiv_make.cc b/passes/equiv/equiv_make.cc
index 66ee28aff..8489abe7c 100644
--- a/passes/equiv/equiv_make.cc
+++ b/passes/equiv/equiv_make.cc
@@ -290,22 +290,28 @@ struct EquivMakeWorker
init_bit2driven();
- pool<Cell*> visited_cells;
+ pool<Cell*> visited_cells;
for (auto c : cells_list)
for (auto &conn : c->connections())
if (!ct.cell_output(c->type, conn.first)) {
SigSpec old_sig = assign_map(conn.second);
SigSpec new_sig = rd_signal_map(old_sig);
-
- visited_cells.clear();
- if (old_sig != new_sig) {
- if (check_signal_in_fanout(visited_cells, old_sig, new_sig))
- continue;
- log("Changing input %s of cell %s (%s): %s -> %s\n",
- log_id(conn.first), log_id(c), log_id(c->type),
- log_signal(old_sig), log_signal(new_sig));
- c->setPort(conn.first, new_sig);
+ if(old_sig != new_sig) {
+ for(auto & old_bit : old_sig.bits()) {
+ SigBit new_bit = new_sig.bits()[old_bit.offset];
+
+ visited_cells.clear();
+ if (old_bit != new_bit) {
+ if (check_signal_in_fanout(visited_cells, old_bit, new_bit))
+ continue;
+
+ log("Changing input %s of cell %s (%s): %s -> %s\n",
+ log_id(conn.first), log_id(c), log_id(c->type),
+ log_signal(old_bit), log_signal(new_bit));
+ c->setPort(conn.first, new_bit);
+ }
+ }
}
}
@@ -412,7 +418,7 @@ struct EquivMakeWorker
}
}
- bool check_signal_in_fanout(pool<Cell*> & visited_cells, SigBit source_bit, SigBit target_bit)
+ bool check_signal_in_fanout(pool<Cell*> & visited_cells, SigSpec source_bit, SigSpec target_bit)
{
if (source_bit == target_bit)
return true;