opt_merge: Remove and reinsert init when connecting nets.
authorMarcelina Kościelnicka <mwk@0x04.net>
Sun, 22 Aug 2021 15:01:58 +0000 (17:01 +0200)
committerMarcelina Kościelnicka <mwk@0x04.net>
Sun, 22 Aug 2021 16:34:11 +0000 (18:34 +0200)
Mutating the SigMap by adding a new connection will throw off FfInitVals
index.  Work around this by removing the relevant init values from index
whenever we connect nets, then re-add the new init value.

Should fix #2920.

passes/opt/opt_merge.cc

index d9861f49b081677b6da56b3f5c56876729c72732..115eb97a92366eb24c9bca4cd84943a8962a6368 100644 (file)
@@ -282,11 +282,12 @@ struct OptMergeWorker
                                                                RTLIL::SigSpec other_sig = r.first->second->getPort(it.first);
                                                                log_debug("    Redirecting output %s: %s = %s\n", it.first.c_str(),
                                                                                log_signal(it.second), log_signal(other_sig));
+                                                               Const init = initvals(other_sig);
+                                                               initvals.remove_init(it.second);
+                                                               initvals.remove_init(other_sig);
                                                                module->connect(RTLIL::SigSig(it.second, other_sig));
                                                                assign_map.add(it.second, other_sig);
-
-                                                               if (it.first == ID::Q && RTLIL::builtin_ff_cell_types().count(cell->type))
-                                                                       initvals.remove_init(it.second);
+                                                               initvals.set_init(other_sig, init);
                                                        }
                                                }
                                                log_debug("    Removing %s cell `%s' from module `%s'.\n", cell->type.c_str(), cell->name.c_str(), module->name.c_str());