From 8f5b8cb46c4715b9e8a9c03fe45b230660d1a62e Mon Sep 17 00:00:00 2001 From: AdvaySingh1 Date: Fri, 20 Feb 2026 11:34:08 -0800 Subject: [PATCH 1/2] Added is_clock_gated attr to flops created via clockgate.cc pass --- kernel/constids.inc | 1 + passes/techmap/clockgate.cc | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/kernel/constids.inc b/kernel/constids.inc index c99aa788d..e567e2af9 100644 --- a/kernel/constids.inc +++ b/kernel/constids.inc @@ -906,6 +906,7 @@ X(interface_type) X(interfaces_replaced_in_module) X(invertible_pin) X(iopad_external_pin) +X(is_clock_gated) X(is_inferred) X(is_interface) X(it) diff --git a/passes/techmap/clockgate.cc b/passes/techmap/clockgate.cc index 01ab2e771..6a5f95d5b 100644 --- a/passes/techmap/clockgate.cc +++ b/passes/techmap/clockgate.cc @@ -428,7 +428,8 @@ struct ClockgatePass : public Pass { ff.sig_clk = (*it).second.new_net; // Rebuild the flop - (void)ff.emit(); + Cell *new_ff = ff.emit(); + new_ff->set_bool_attribute(ID::is_clock_gated); gated_flop_count++; } From 2f276d072309fb16675565beb6546135881d7650 Mon Sep 17 00:00:00 2001 From: tondapusili Date: Wed, 25 Feb 2026 12:15:46 -0800 Subject: [PATCH 2/2] Added log flushes after each negopt pass for clearer logging --- passes/silimate/negopt.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/passes/silimate/negopt.cc b/passes/silimate/negopt.cc index 334348987..e3066b9b7 100644 --- a/passes/silimate/negopt.cc +++ b/passes/silimate/negopt.cc @@ -81,33 +81,47 @@ struct NegoptPass : public Pass { run_post = true; } + constexpr int max_iterations = 100; + for (auto module : design->selected_modules()) { if (run_pre) { did_something = true; - while (did_something) { + for (int iter = 0; iter < max_iterations && did_something; iter++) { did_something = false; peepopt_pm pm(module); pm.setup(module->selected_cells()); pm.run_manual2sub(); // Reduce manual 2's complement to subtraction first + log_flush(); pm.run_sub2neg(); + log_flush(); pm.run_negexpand(); + log_flush(); pm.run_negneg(); + log_flush(); pm.run_negmux(); + log_flush(); } + if (did_something) + log_warning("NEGOPT pre reached max iterations (%d) in module %s without convergence.\n", max_iterations, log_id(module)); } if (run_post) { did_something = true; - while (did_something) { + for (int iter = 0; iter < max_iterations && did_something; iter++) { did_something = false; peepopt_pm pm(module); pm.setup(module->selected_cells()); pm.run_negrebuild(); + log_flush(); pm.run_muxneg(); + log_flush(); pm.run_neg2sub(); + log_flush(); } + if (did_something) + log_warning("NEGOPT post reached max iterations (%d) in module %s without convergence.\n", max_iterations, log_id(module)); } } }