diff --git a/passes/techmap/muxcover.cc b/passes/techmap/muxcover.cc index 719a346d8..8d26d376c 100644 --- a/passes/techmap/muxcover.cc +++ b/passes/techmap/muxcover.cc @@ -135,10 +135,15 @@ struct MuxcoverWorker pool wavefront; wavefront.insert(rootsig); + bool has_loop = false; while (!wavefront.empty()) { SigBit bit = wavefront.pop(); if (sig_to_mux.count(bit) && (bit == rootsig || !roots.count(bit))) { + if (tree.muxes.count(bit)) { + has_loop = true; + break; + } Cell *c = sig_to_mux.at(bit); tree.muxes[bit] = c; wavefront.insert(sigmap(c->getPort(ID::A))); @@ -146,6 +151,11 @@ struct MuxcoverWorker } } + if (has_loop) { + log(" Skipping tree at root %s: contains a logic loop.\n", log_signal(tree.root)); + continue; + } + if (!tree.muxes.empty()) { log(" Found tree with %d MUXes at root %s.\n", GetSize(tree.muxes), log_signal(tree.root)); tree_list.push_back(tree); diff --git a/tests/various/muxcover_loop.ys b/tests/various/muxcover_loop.ys new file mode 100644 index 000000000..41462e930 --- /dev/null +++ b/tests/various/muxcover_loop.ys @@ -0,0 +1,35 @@ +read_verilog <