diff --git a/src/grt/include/grt/GlobalRouter.h b/src/grt/include/grt/GlobalRouter.h index 124833ddd34..fc7ac93efe0 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 095a83053dc..5bd8867b94b 100644 --- a/src/grt/src/GlobalRouter.cpp +++ b/src/grt/src/GlobalRouter.cpp @@ -448,6 +448,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()) { @@ -504,7 +506,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(), @@ -523,7 +525,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..f0e8719e722 100644 --- a/src/grt/src/GlobalRouter.tcl +++ b/src/grt/src/GlobalRouter.tcl @@ -241,11 +241,14 @@ 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] \ + [-allow_congestion]} 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 -allow_congestion} if { [ord::get_db_block] == "NULL" } { utl::error GRT 104 "No design block found." } @@ -285,6 +288,16 @@ 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)] + + 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 +306,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." }