From 61abc8f72f75753327fc8ea64fd30af54fbffecf Mon Sep 17 00:00:00 2001 From: Yihang Yang Date: Fri, 14 Jul 2023 20:33:09 -0400 Subject: [PATCH] make it an option to disable cell orientation flipping --- dali/application/dali_standalone.cc | 2 ++ dali/dali.cc | 7 +++++++ dali/dali.h | 1 + dali/placer/legalizer/LGTetrisEx.cc | 8 ++++++++ dali/placer/legalizer/LGTetrisEx.h | 2 ++ .../well_legalizer/stdclusterwelllegalizer.cc | 14 +++++++++----- .../well_legalizer/stdclusterwelllegalizer.h | 3 +++ 7 files changed, 32 insertions(+), 5 deletions(-) diff --git a/dali/application/dali_standalone.cc b/dali/application/dali_standalone.cc index 1dddae38..8aa8c63d 100644 --- a/dali/application/dali_standalone.cc +++ b/dali/application/dali_standalone.cc @@ -180,6 +180,8 @@ int main(int argc, char *argv[]) { } } else if (arg == "-disable_welltap") { config_set_int("dali.disable_welltap", 1); + } else if (arg == "-disable_cell_flip"){ + config_set_int("dali.disable_cell_flip", 1); } else if (arg == "-disable_io_place") { config_set_int("dali.disable_io_place", 1); } else if (arg == "-export_well_cluster_matlab") { diff --git a/dali/dali.cc b/dali/dali.cc index b46d2ce9..eac406ce 100644 --- a/dali/dali.cc +++ b/dali/dali.cc @@ -148,6 +148,11 @@ void Dali::LoadParamsFromConfig() { disable_welltap_ = config_get_int(param_name.c_str()) == 1; } + param_name = prefix_ + "disable_cell_flip"; + if (config_exists(param_name.c_str())) { + disable_cell_flip_ = config_get_int(param_name.c_str()) == 1; + } + param_name = prefix_ + "max_row_width"; if (config_exists(param_name.c_str())) { max_row_width_ = config_get_real(param_name.c_str()); @@ -355,10 +360,12 @@ bool Dali::StartPlacement(double density, int number_of_threads) { if (!disable_legalization_) { if (is_standard_cell_) { legalizer_.TakeOver(&gb_placer_); + legalizer_.disable_cell_flip_ = disable_cell_flip_, legalizer_.StartPlacement(); } else { well_legalizer_.TakeOver(&gb_placer_); well_legalizer_.disable_welltap_ = disable_welltap_; + well_legalizer_.disable_cell_flip_ = disable_cell_flip_, well_legalizer_.SetStripePartitionMode(static_cast(well_legalization_mode_)); well_legalizer_.StartPlacement(); if (export_well_cluster_matlab_) { diff --git a/dali/dali.h b/dali/dali.h index a50a50d1..60366b64 100644 --- a/dali/dali.h +++ b/dali/dali.h @@ -108,6 +108,7 @@ class Dali { int io_metal_layer_ = 0; bool export_well_cluster_matlab_ = false; bool disable_welltap_ = false; + bool disable_cell_flip_ = false; double max_row_width_ = 0; bool is_standard_cell_ = false; bool enable_filler_cell_ = false; diff --git a/dali/placer/legalizer/LGTetrisEx.cc b/dali/placer/legalizer/LGTetrisEx.cc index 7a22c8d0..a322f9df 100644 --- a/dali/placer/legalizer/LGTetrisEx.cc +++ b/dali/placer/legalizer/LGTetrisEx.cc @@ -327,6 +327,11 @@ bool LGTetrisEx::IsFitToRow(int row_id, Block &block) const { } bool LGTetrisEx::ShouldOrientN(int row_id, Block &block) const { + // if cell flip is disabled, then cell orientation is always N + if (disable_cell_flip_) { + return true; + } + auto well_ptr = block.TypePtr()->WellPtr(); bool is_gnd_bottom = true; if (well_ptr == nullptr) { @@ -1123,6 +1128,9 @@ bool LGTetrisEx::StartPlacement() { if (is_success) { ExportRowsToCircuit(); } + + // TODO: local reordering + PrintEndStatement("LGTetrisEx Legalization", is_success); return true; diff --git a/dali/placer/legalizer/LGTetrisEx.h b/dali/placer/legalizer/LGTetrisEx.h index d2cb86b7..b73af6e6 100644 --- a/dali/placer/legalizer/LGTetrisEx.h +++ b/dali/placer/legalizer/LGTetrisEx.h @@ -97,6 +97,8 @@ class LGTetrisEx : public Placer { bool legalize_from_left_; + bool disable_cell_flip_ = false; + size_t cur_iter_; size_t max_iter_; diff --git a/dali/placer/well_legalizer/stdclusterwelllegalizer.cc b/dali/placer/well_legalizer/stdclusterwelllegalizer.cc index 5892b78c..3da08b06 100644 --- a/dali/placer/well_legalizer/stdclusterwelllegalizer.cc +++ b/dali/placer/well_legalizer/stdclusterwelllegalizer.cc @@ -1022,11 +1022,15 @@ bool StdClusterWellLegalizer::StartPlacement() { //circuit_ptr_->GenMATLABWellTable("clu", false); //GenMatlabClusterTable("clu_result"); - BOOST_LOG_TRIVIAL(info) << "Flip cluster orientation\n"; - UpdateClusterOrient(); - ReportHPWL(); - //circuit_ptr_->GenMATLABWellTable("ori", false); - //GenMatlabClusterTable("ori_result"); + if (disable_cell_flip_) { + BOOST_LOG_TRIVIAL(info) << "Skip flipping cluster orientation\n"; + } else { + BOOST_LOG_TRIVIAL(info) << "Flip cluster orientation\n"; + UpdateClusterOrient(); + ReportHPWL(); + //circuit_ptr_->GenMATLABWellTable("ori", false); + //GenMatlabClusterTable("ori_result"); + } BOOST_LOG_TRIVIAL(info) << "Perform local reordering\n"; for (int i = 0; i < 6; ++i) { diff --git a/dali/placer/well_legalizer/stdclusterwelllegalizer.h b/dali/placer/well_legalizer/stdclusterwelllegalizer.h index a4ffa493..fad1ac4d 100644 --- a/dali/placer/well_legalizer/stdclusterwelllegalizer.h +++ b/dali/placer/well_legalizer/stdclusterwelllegalizer.h @@ -119,6 +119,9 @@ class StdClusterWellLegalizer : public Placer { int well_tap_cell_width_; int well_spacing_; + /**** cell orientation ****/ + bool disable_cell_flip_ = false; + /**** stripe parameters ****/ int stripe_mode_ = 0; DefaultSpacePartitioner space_partitioner_;