diff --git a/passes/cmds/setundef.cc b/passes/cmds/setundef.cc index cdd7f3446..99a223bdc 100644 --- a/passes/cmds/setundef.cc +++ b/passes/cmds/setundef.cc @@ -364,11 +364,19 @@ struct SetundefPass : public Pass { pool ffbits; pool initwires; - for (auto cell : module->selected_cells()) + for (auto cell : module->cells()) { if (!cell->is_builtin_ff()) continue; + bool cell_selected = design->selected(module, cell); + bool wire_selected = false; + for (auto bit : sigmap(cell->getPort(ID::Q))) + if (bit.wire && design->selected(module, bit.wire)) + wire_selected = true; + if (!cell_selected && !wire_selected) + continue; + for (auto bit : sigmap(cell->getPort(ID::Q))) ffbits.insert(bit); } diff --git a/tests/various/setundef_selection.ys b/tests/various/setundef_selection.ys index 67df8bed9..64713a742 100644 --- a/tests/various/setundef_selection.ys +++ b/tests/various/setundef_selection.ys @@ -7,21 +7,26 @@ endmodule EOT setundef -zero w:a sat -prove a 0 +sat -enable_undef -prove b 0 -falsify design -reset # Test that setundef -undriven -zero respects wire selection -read_verilog <