From f6cff6c8a40450abe3e4c5ae5fa7eb5a16146483 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Mon, 29 Dec 2025 17:05:31 +0000 Subject: [PATCH 1/2] grt: add flags to restrict the use of jumpers and diodes in repair antennas Signed-off-by: luis201420 --- src/grt/include/grt/GlobalRouter.h | 2 ++ src/grt/src/GlobalRouter.cpp | 6 ++++-- src/grt/src/GlobalRouter.i | 4 ++-- src/grt/src/GlobalRouter.tcl | 15 ++++++++++++--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/grt/include/grt/GlobalRouter.h b/src/grt/include/grt/GlobalRouter.h index 6eb79887b44..2385633e0e8 100644 --- a/src/grt/include/grt/GlobalRouter.h +++ b/src/grt/include/grt/GlobalRouter.h @@ -201,6 +201,8 @@ class GlobalRouter int repairAntennas(odb::dbMTerm* diode_mterm, int iterations, float ratio_margin, + bool jumper_only, + bool diode_only, int num_threads = 1); void updateResources(const int& init_x, const int& init_y, diff --git a/src/grt/src/GlobalRouter.cpp b/src/grt/src/GlobalRouter.cpp index 4240a9c92cc..bb74d246296 100644 --- a/src/grt/src/GlobalRouter.cpp +++ b/src/grt/src/GlobalRouter.cpp @@ -446,6 +446,8 @@ void GlobalRouter::updateDbCongestion() int GlobalRouter::repairAntennas(odb::dbMTerm* diode_mterm, int iterations, float ratio_margin, + bool jumper_only, + bool diode_only, const int num_threads) { if (!initialized_ || haveDetailedRoutes()) { @@ -502,7 +504,7 @@ int GlobalRouter::repairAntennas(odb::dbMTerm* diode_mterm, // if run in GRT and it need run jumper insertion std::vector nets_with_jumpers; if (!haveDetailedRoutes(nets_to_repair) - && repair_antennas_->hasNewViolations()) { + && repair_antennas_->hasNewViolations() && !diode_only) { // Run jumper insertion and clean repair_antennas_->jumperInsertion(routes_, grid_->getTileSize(), @@ -521,7 +523,7 @@ int GlobalRouter::repairAntennas(odb::dbMTerm* diode_mterm, num_threads); updateDbCongestion(); } - if (violations) { + if (violations && !jumper_only) { IncrementalGRoute incr_groute(this, block_); repair_antennas_->repairAntennas(diode_mterm); total_diodes_count_ += repair_antennas_->getDiodesCount(); diff --git a/src/grt/src/GlobalRouter.i b/src/grt/src/GlobalRouter.i index 1009998b012..d21da811ded 100644 --- a/src/grt/src/GlobalRouter.i +++ b/src/grt/src/GlobalRouter.i @@ -165,10 +165,10 @@ route_layer_lengths(odb::dbNet* db_net) } int -repair_antennas(odb::dbMTerm* diode_mterm, int iterations, float ratio_margin) +repair_antennas(odb::dbMTerm* diode_mterm, int iterations, float ratio_margin, bool jumper_only, bool diode_only) { const int num_threads = ord::OpenRoad::openRoad()->getThreadCount(); - return getGlobalRouter()->repairAntennas(diode_mterm, iterations, ratio_margin, num_threads); + return getGlobalRouter()->repairAntennas(diode_mterm, iterations, ratio_margin, jumper_only, diode_only, num_threads); } void diff --git a/src/grt/src/GlobalRouter.tcl b/src/grt/src/GlobalRouter.tcl index 71838dd0272..a67e7a01a12 100644 --- a/src/grt/src/GlobalRouter.tcl +++ b/src/grt/src/GlobalRouter.tcl @@ -241,11 +241,13 @@ proc global_route { args } { sta::define_cmd_args "repair_antennas" { diode_cell \ [-iterations iterations] \ - [-ratio_margin ratio_margin]} + [-ratio_margin ratio_margin] \ + [-jumper_only] \ + [-diode_only]} proc repair_antennas { args } { sta::parse_key_args "repair_antennas" args \ - keys {-iterations -ratio_margin} flags {} + keys {-iterations -ratio_margin} flags {-jumper_only -diode_only} if { [ord::get_db_block] == "NULL" } { utl::error GRT 104 "No design block found." } @@ -285,6 +287,13 @@ proc repair_antennas { args } { sta::check_positive_integer "-iterations" $iterations } + set jumper_only [info exists flags(-jumper_only)] + set diode_only [info exists flags(-diode_only)] + + if { $jumper_only && $diode_only } { + utl::error GRT 294 "Only use either -jumper_only or -diode_only flag" + } + set ratio_margin 0 if { [info exists keys(-ratio_margin)] } { set ratio_margin $keys(-ratio_margin) @@ -293,7 +302,7 @@ proc repair_antennas { args } { } } - return [grt::repair_antennas $diode_mterm $iterations $ratio_margin] + return [grt::repair_antennas $diode_mterm $iterations $ratio_margin $jumper_only $diode_only] } else { utl::error GRT 45 "Run global_route before repair_antennas." } From 01377be8d52b62690a28a42ac66e7f9593c408d4 Mon Sep 17 00:00:00 2001 From: luis201420 Date: Mon, 29 Dec 2025 17:11:37 +0000 Subject: [PATCH 2/2] grt: add the allow_congestion flag to the repair_antennas command Signed-off-by: luis201420 --- src/grt/src/GlobalRouter.tcl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/grt/src/GlobalRouter.tcl b/src/grt/src/GlobalRouter.tcl index a67e7a01a12..f0e8719e722 100644 --- a/src/grt/src/GlobalRouter.tcl +++ b/src/grt/src/GlobalRouter.tcl @@ -243,11 +243,12 @@ sta::define_cmd_args "repair_antennas" { diode_cell \ [-iterations iterations] \ [-ratio_margin ratio_margin] \ [-jumper_only] \ - [-diode_only]} + [-diode_only] \ + [-allow_congestion]} proc repair_antennas { args } { sta::parse_key_args "repair_antennas" args \ - keys {-iterations -ratio_margin} flags {-jumper_only -diode_only} + keys {-iterations -ratio_margin} flags {-jumper_only -diode_only -allow_congestion} if { [ord::get_db_block] == "NULL" } { utl::error GRT 104 "No design block found." } @@ -287,6 +288,9 @@ proc repair_antennas { args } { sta::check_positive_integer "-iterations" $iterations } + set allow_congestion [info exists flags(-allow_congestion)] + grt::set_allow_congestion $allow_congestion + set jumper_only [info exists flags(-jumper_only)] set diode_only [info exists flags(-diode_only)]