From e95e3a7183f06d60bc5247855cb9c1c97a71f981 Mon Sep 17 00:00:00 2001 From: bnmfw Date: Wed, 27 May 2026 19:54:21 +0000 Subject: [PATCH 1/2] drt: access point sorting is done on the preffered direction of the instance Signed-off-by: bnmfw --- src/drt/src/pa/FlexPA.h | 1 + src/drt/src/pa/FlexPA_acc_pattern.cpp | 29 +++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/drt/src/pa/FlexPA.h b/src/drt/src/pa/FlexPA.h index 605256f8162..3b934d86954 100644 --- a/src/drt/src/pa/FlexPA.h +++ b/src/drt/src/pa/FlexPA.h @@ -721,6 +721,7 @@ class FlexPA * * @param unique_inst unique inst */ + bool instPrefersHorizontal(frInst* unique_inst); void prepPatternInst(frInst* unique_inst); /** diff --git a/src/drt/src/pa/FlexPA_acc_pattern.cpp b/src/drt/src/pa/FlexPA_acc_pattern.cpp index 2afccc8f96d..fe66a9749d6 100644 --- a/src/drt/src/pa/FlexPA_acc_pattern.cpp +++ b/src/drt/src/pa/FlexPA_acc_pattern.cpp @@ -82,14 +82,39 @@ void FlexPA::addToInstsSet(frInst* inst) insts_set_.insert(inst); } +bool FlexPA::instPrefersHorizontal(frInst* unique_inst) +{ + const int pin_access_idx = unique_inst->getPinAccessIdx(); + // Positive if most access points are on Horizontal layers, Negative if on + // Vertical Layers + int layer_direction_bias = 0; + const auto tech = getDesign()->getTech(); + for (auto& inst_term : unique_inst->getInstTerms()) { + if (isSkipInstTerm(inst_term.get())) { + continue; + } + for (auto& pin : inst_term->getTerm()->getPins()) { + for (auto& ap : pin->getPinAccess(pin_access_idx)->getAccessPoints()) { + if (tech->getLayer(ap->getLayerNum())->isHorizontal()) { + layer_direction_bias++; + } else { + layer_direction_bias--; + } + } + } + } + return layer_direction_bias >= 0; +} + void FlexPA::prepPatternInst(frInst* unique_inst) { - int num_valid_pattern = prepPatternInstHelper(unique_inst, true); + const bool prefer_x = !instPrefersHorizontal(unique_inst); + int num_valid_pattern = prepPatternInstHelper(unique_inst, prefer_x); if (num_valid_pattern > 0) { return; } - num_valid_pattern = prepPatternInstHelper(unique_inst, false); + num_valid_pattern = prepPatternInstHelper(unique_inst, !prefer_x); if (num_valid_pattern == 0) { logger_->warn(DRT, From 8921ce2b920ce027b2476b40cbcc8a79e999ee2d Mon Sep 17 00:00:00 2001 From: bnmfw Date: Wed, 3 Jun 2026 04:37:00 +0000 Subject: [PATCH 2/2] drt: pin_acc_idx guard Signed-off-by: bnmfw --- src/drt/src/pa/FlexPA_acc_pattern.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/drt/src/pa/FlexPA_acc_pattern.cpp b/src/drt/src/pa/FlexPA_acc_pattern.cpp index fe66a9749d6..69759da36ff 100644 --- a/src/drt/src/pa/FlexPA_acc_pattern.cpp +++ b/src/drt/src/pa/FlexPA_acc_pattern.cpp @@ -87,6 +87,9 @@ bool FlexPA::instPrefersHorizontal(frInst* unique_inst) const int pin_access_idx = unique_inst->getPinAccessIdx(); // Positive if most access points are on Horizontal layers, Negative if on // Vertical Layers + if (pin_access_idx < 0) { + return true; + } int layer_direction_bias = 0; const auto tech = getDesign()->getTech(); for (auto& inst_term : unique_inst->getInstTerms()) {