From 30918d4e6749d652f031f7522bc054479fca9cb7 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Thu, 2 Apr 2026 12:56:09 -0300 Subject: [PATCH 1/2] grt: add prevent division by zero and overflow when computing resistance cost Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/utility.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index b0abf16a83..9c8d2dc126 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -533,8 +533,18 @@ int FastRouteCore::getWireCost(const int layer, const int length, FrNet* net) odb::dbTechLayer* default_layer = getTechLayer(0, false); - double default_resistance = default_layer->getResistance(); - float final_resistance = getWireResistance(layer, length, net); + const double default_resistance = default_layer->getResistance(); + // Prevent division by zero when layer resistance is not defined. + if (default_resistance <= 0.0) { + return 0; + } + + const float final_resistance = getWireResistance(layer, length, net); + // Prevent int overflow when final_resistance is BIG_INT (i.e., layer is out + // of net layer range). + if (final_resistance >= BIG_INT) { + return BIG_INT; + } return std::ceil(final_resistance / default_resistance); } @@ -569,8 +579,13 @@ int FastRouteCore::getViaCost(const int from_layer, const int to_layer) } // Calculate total resistance - float total_via_resistance = getViaResistance(from_layer, to_layer); - float default_res = getTechLayer(0, true)->getResistance(); + const float default_res = getTechLayer(0, true)->getResistance(); + // Prevent division by zero when layer resistance is not defined. + if (default_res <= 0.0) { + return 0; + } + + const float total_via_resistance = getViaResistance(from_layer, to_layer); return std::ceil(total_via_resistance / default_res); } From 8d280038d577224542277ae2621942d50f619066 Mon Sep 17 00:00:00 2001 From: Eder Monteiro Date: Thu, 2 Apr 2026 23:20:31 -0300 Subject: [PATCH 2/2] grt: apply gemini suggestions Signed-off-by: Eder Monteiro --- src/grt/src/fastroute/src/utility.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/grt/src/fastroute/src/utility.cpp b/src/grt/src/fastroute/src/utility.cpp index 9c8d2dc126..d4029c1c2e 100644 --- a/src/grt/src/fastroute/src/utility.cpp +++ b/src/grt/src/fastroute/src/utility.cpp @@ -540,13 +540,8 @@ int FastRouteCore::getWireCost(const int layer, const int length, FrNet* net) } const float final_resistance = getWireResistance(layer, length, net); - // Prevent int overflow when final_resistance is BIG_INT (i.e., layer is out - // of net layer range). - if (final_resistance >= BIG_INT) { - return BIG_INT; - } - - return std::ceil(final_resistance / default_resistance); + const double cost = std::ceil(final_resistance / default_resistance); + return static_cast(std::min(cost, BIG_INT)); } // Get via resistance in ohms going from layer A to layer B @@ -586,8 +581,8 @@ int FastRouteCore::getViaCost(const int from_layer, const int to_layer) } const float total_via_resistance = getViaResistance(from_layer, to_layer); - - return std::ceil(total_via_resistance / default_res); + const double cost = std::ceil(total_via_resistance / default_res); + return static_cast(std::min(cost, BIG_INT)); } void FastRouteCore::updateWorstMetrics(FrNet* net)