From 27d3f41ea62b405859666b4278b3b3ca48247bf3 Mon Sep 17 00:00:00 2001 From: Akash Levy Date: Tue, 17 Dec 2024 14:18:51 -0800 Subject: [PATCH] Keep track of new cells in opt_dff and don't rename if only one cell is sliced --- passes/opt/opt_dff.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/passes/opt/opt_dff.cc b/passes/opt/opt_dff.cc index 905aa0c15..41bd5291b 100644 --- a/passes/opt/opt_dff.cc +++ b/passes/opt/opt_dff.cc @@ -594,6 +594,7 @@ struct OptDffWorker // Try to merge sync resets. std::map> groups; std::vector remaining_indices; + std::vector new_cells; Const val_srst; for (int i = 0 ; i < ff.width; i++) { @@ -654,14 +655,19 @@ struct OptDffWorker if (new_ff.has_ce) new_ff.ce_over_srst = true; Cell *new_cell = new_ff.emit(); - if (new_cell) + if (new_cell) { + new_cells.push_back(new_cell); dff_cells.push_back(new_cell); + } log("Adding SRST signal on %s (%s) from module %s (D = %s, Q = %s, rval = %s).\n", log_id(cell), log_id(cell->type), log_id(module), log_signal(new_ff.sig_d), log_signal(new_ff.sig_q), log_signal(new_ff.val_srst)); } if (remaining_indices.empty()) { + IdString cell_name = cell->name; module->remove(cell); + if (GetSize(new_cells) == 1) + module->rename(new_cells[0], cell_name); did_something = true; continue; } else if (GetSize(remaining_indices) != ff.width) { @@ -674,6 +680,7 @@ struct OptDffWorker // Try to merge enables. std::map, std::vector> groups; std::vector remaining_indices; + std::vector new_cells; for (int i = 0 ; i < ff.width; i++) { // First, eat up as many simple muxes as possible. @@ -717,14 +724,19 @@ struct OptDffWorker new_ff.pol_ce = en.second; new_ff.ce_over_srst = false; Cell *new_cell = new_ff.emit(); - if (new_cell) + if (new_cell) { dff_cells.push_back(new_cell); + new_cells.push_back(new_cell); + } log("Adding EN signal on %s (%s) from module %s (D = %s, Q = %s).\n", log_id(cell), log_id(cell->type), log_id(module), log_signal(new_ff.sig_d), log_signal(new_ff.sig_q)); } if (remaining_indices.empty()) { + IdString cell_name = cell->name; module->remove(cell); + if (GetSize(new_cells) == 1) + module->rename(new_cells[0], cell_name); did_something = true; continue; } else if (GetSize(remaining_indices) != ff.width) {