From 3e1e7455c7d9f917c0882a6b0c469192b11e1179 Mon Sep 17 00:00:00 2001 From: bnmfw Date: Mon, 22 Jun 2026 19:38:57 +0000 Subject: [PATCH 1/5] drt: pa edge cost refactor and no more division by 2 Signed-off-by: bnmfw --- src/drt/src/pa/FlexPA.h | 3 + src/drt/src/pa/FlexPA_acc_pattern.cpp | 93 +++++++++++++-------------- 2 files changed, 47 insertions(+), 49 deletions(-) diff --git a/src/drt/src/pa/FlexPA.h b/src/drt/src/pa/FlexPA.h index 4ba78137050..290542e7b3b 100644 --- a/src/drt/src/pa/FlexPA.h +++ b/src/drt/src/pa/FlexPA.h @@ -74,6 +74,9 @@ struct frInstLocationComp using frInstLocationSet = std::set; +static constexpr int repeated_ap_cost = 1'000; +static constexpr int violation_cost = 1'000'000; + class FlexPinAccessPattern; class FlexDPNode; class AbstractPAGraphics; diff --git a/src/drt/src/pa/FlexPA_acc_pattern.cpp b/src/drt/src/pa/FlexPA_acc_pattern.cpp index 2afccc8f96d..f49db5ff526 100644 --- a/src/drt/src/pa/FlexPA_acc_pattern.cpp +++ b/src/drt/src/pa/FlexPA_acc_pattern.cpp @@ -496,64 +496,59 @@ int FlexPA::getEdgeCost( has_vio = !genPatternsGC({target_obj}, objs, Edge); vio_edges[edge_idx] = has_vio; + if (has_vio) { + return violation_cost; + } - // look back for GN14 - if (!has_vio) { - // check one more back - if (prev_node->hasPrevNode()) { - auto prev_prev_node = prev_node->getPrevNode(); - auto [prev_prev_pin_idx, prev_prev_acc_point_idx] - = prev_prev_node->getIdx(); - if (!prev_prev_node->isSource()) { - const auto& [pin_3, inst_term_3] = pins[prev_prev_pin_idx]; - const auto pa_3 = pin_3->getPinAccess(pin_access_idx); - const frAccessPoint* ap_3 - = pa_3->getAccessPoint(prev_prev_acc_point_idx); - std::unique_ptr via3; - if (ap_3->hasAccess(frDirEnum::U)) { - odb::Point pt3(ap_3->getPoint()); - xform.apply(pt3); - via3 = std::make_unique(ap_3->getViaDef(), pt3); - if (inst_term_3->hasNet()) { - objs.emplace_back(via3.get(), inst_term_3->getNet()); - } else { - objs.emplace_back(via3.get(), inst_term_3); - } + // check one more back + if (prev_node->hasPrevNode()) { + auto prev_prev_node = prev_node->getPrevNode(); + auto [prev_prev_pin_idx, prev_prev_acc_point_idx] + = prev_prev_node->getIdx(); + if (!prev_prev_node->isSource()) { + const auto& [pin_3, inst_term_3] = pins[prev_prev_pin_idx]; + const auto pa_3 = pin_3->getPinAccess(pin_access_idx); + const frAccessPoint* ap_3 + = pa_3->getAccessPoint(prev_prev_acc_point_idx); + std::unique_ptr via3; + if (ap_3->hasAccess(frDirEnum::U)) { + odb::Point pt3(ap_3->getPoint()); + xform.apply(pt3); + via3 = std::make_unique(ap_3->getViaDef(), pt3); + if (inst_term_3->hasNet()) { + objs.emplace_back(via3.get(), inst_term_3->getNet()); + } else { + objs.emplace_back(via3.get(), inst_term_3); } - - has_vio = !genPatternsGC({target_obj}, objs, Edge); } + + has_vio = !genPatternsGC({target_obj}, objs, Edge); } } } - if (!has_vio) { - if ((prev_pin_idx == 0 - && used_access_points.find( - std::make_pair(prev_pin_idx, prev_acc_point_idx)) - != used_access_points.end()) - || (curr_pin_idx == (int) pins.size() - 1 - && used_access_points.find( - std::make_pair(curr_pin_idx, curr_acc_point_idx)) - != used_access_points.end())) { - edge_cost = 100; - } else if (viol_access_points.find( - std::make_pair(prev_pin_idx, prev_acc_point_idx)) - != viol_access_points.end() - || viol_access_points.find( - std::make_pair(curr_pin_idx, curr_acc_point_idx)) - != viol_access_points.end()) { - edge_cost = 1000; - } else { - const int prev_node_cost = prev_node->getNodeCost(); - const int curr_node_cost = curr_node->getNodeCost(); - edge_cost = (prev_node_cost + curr_node_cost) / 2; - } - } else { - edge_cost = 1000 /*violation cost*/; + if ((prev_pin_idx == 0 + && used_access_points.find( + std::make_pair(prev_pin_idx, prev_acc_point_idx)) + != used_access_points.end()) + || (curr_pin_idx == (int) pins.size() - 1 + && used_access_points.find( + std::make_pair(curr_pin_idx, curr_acc_point_idx)) + != used_access_points.end())) { + return repeated_ap_cost; + } + + if (viol_access_points.find(std::make_pair(prev_pin_idx, prev_acc_point_idx)) + != viol_access_points.end() + || viol_access_points.find( + std::make_pair(curr_pin_idx, curr_acc_point_idx)) + != viol_access_points.end()) { + return violation_cost; } - return edge_cost; + const int prev_node_cost = prev_node->getNodeCost(); + const int curr_node_cost = curr_node->getNodeCost(); + return prev_node_cost + curr_node_cost; } std::vector FlexPA::extractAccessPatternFromNodes( From 2824d7c609c82799f4cb9d44f69e4ffe72ccec8d Mon Sep 17 00:00:00 2001 From: bnmfw Date: Mon, 22 Jun 2026 20:52:20 +0000 Subject: [PATCH 2/5] drt: early return on violation in getEdgeCost Signed-off-by: bnmfw --- src/drt/src/pa/FlexPA_acc_pattern.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/drt/src/pa/FlexPA_acc_pattern.cpp b/src/drt/src/pa/FlexPA_acc_pattern.cpp index f49db5ff526..d41790107c3 100644 --- a/src/drt/src/pa/FlexPA_acc_pattern.cpp +++ b/src/drt/src/pa/FlexPA_acc_pattern.cpp @@ -522,7 +522,9 @@ int FlexPA::getEdgeCost( } } - has_vio = !genPatternsGC({target_obj}, objs, Edge); + if (!genPatternsGC({target_obj}, objs, Edge)) { + return violation_cost; + } } } } From 4f8463f800c5157b2adcd8ce463ba8ec1b80a6b2 Mon Sep 17 00:00:00 2001 From: bnmfw Date: Tue, 23 Jun 2026 01:24:49 +0000 Subject: [PATCH 3/5] drt: applies contains where it is possible Signed-off-by: bnmfw --- src/drt/src/pa/FlexPA.h | 4 ++-- src/drt/src/pa/FlexPA_acc_pattern.cpp | 33 ++++++++++++--------------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/drt/src/pa/FlexPA.h b/src/drt/src/pa/FlexPA.h index 290542e7b3b..c2650ca8a3a 100644 --- a/src/drt/src/pa/FlexPA.h +++ b/src/drt/src/pa/FlexPA.h @@ -74,8 +74,8 @@ struct frInstLocationComp using frInstLocationSet = std::set; -static constexpr int repeated_ap_cost = 1'000; -static constexpr int violation_cost = 1'000'000; +inline constexpr int repeated_ap_cost = 1000; +inline constexpr int violation_cost = 1000000; class FlexPinAccessPattern; class FlexDPNode; diff --git a/src/drt/src/pa/FlexPA_acc_pattern.cpp b/src/drt/src/pa/FlexPA_acc_pattern.cpp index d41790107c3..dff96c8d5b9 100644 --- a/src/drt/src/pa/FlexPA_acc_pattern.cpp +++ b/src/drt/src/pa/FlexPA_acc_pattern.cpp @@ -67,7 +67,7 @@ void FlexPA::removeFromInstsSet(frInst* inst) void FlexPA::addToInstsSet(frInst* inst) { - if (insts_set_.find(inst) != insts_set_.end()) { + if (insts_set_.contains(inst)) { return; } if (!unique_insts_.hasUnique(inst)) { @@ -455,9 +455,14 @@ int FlexPA::getEdgeCost( prev_acc_point_idx, curr_acc_point_idx, max_access_point_size); + + // edge know to be a violation + if (vio_edges[edge_idx] == 1) { + return violation_cost; + } + + // edge not known to be a violation of not if (vio_edges[edge_idx] != -1) { - has_vio = (vio_edges[edge_idx] == 1); - } else { odb::dbTransform xform = unique_inst->getNoRotationTransform(); // check DRC std::vector> objs; @@ -529,22 +534,14 @@ int FlexPA::getEdgeCost( } } - if ((prev_pin_idx == 0 - && used_access_points.find( - std::make_pair(prev_pin_idx, prev_acc_point_idx)) - != used_access_points.end()) + if ((prev_pin_idx == 0 && used_access_points.contains(prev_node->getIdx())) || (curr_pin_idx == (int) pins.size() - 1 - && used_access_points.find( - std::make_pair(curr_pin_idx, curr_acc_point_idx)) - != used_access_points.end())) { + && used_access_points.contains(curr_node->getIdx()))) { return repeated_ap_cost; } - if (viol_access_points.find(std::make_pair(prev_pin_idx, prev_acc_point_idx)) - != viol_access_points.end() - || viol_access_points.find( - std::make_pair(curr_pin_idx, curr_acc_point_idx)) - != viol_access_points.end()) { + if (viol_access_points.contains(prev_node->getIdx()) + || viol_access_points.contains(curr_node->getIdx())) { return violation_cost; } @@ -597,7 +594,7 @@ bool FlexPA::genPatternsCommit( std::vector access_pattern = extractAccessPatternFromNodes( unique_inst, nodes, pins, used_access_points); // not a new access pattern - if (inst_access_patterns.find(access_pattern) != inst_access_patterns.end()) { + if (inst_access_patterns.contains(access_pattern)) { return false; } @@ -648,7 +645,7 @@ bool FlexPA::genPatternsCommit( } uint64_t n_no_ap_pins = 0; for (auto& pin : inst_term->getTerm()->getPins()) { - if (pin_to_access_point.find(pin.get()) == pin_to_access_point.end()) { + if (!pin_to_access_point.contains(pin.get())) { n_no_ap_pins++; pin_access_pattern->addAccessPoint(nullptr); } else { @@ -691,7 +688,7 @@ bool FlexPA::genPatternsCommit( if (inst_term->hasNet()) { owner = inst_term->getNet(); } - if (owners.find(owner) != owners.end()) { + if (owners.contains(owner)) { viol_access_points.insert({pin_idx, acc_pattern_idx}); // idx ; } } From b35418d5e53af227b14663095fef36d54e24363b Mon Sep 17 00:00:00 2001 From: bnmfw Date: Tue, 23 Jun 2026 17:52:26 +0000 Subject: [PATCH 4/5] drt: fixing typo and inverted inequality Signed-off-by: bnmfw --- src/drt/src/pa/FlexPA_acc_pattern.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/drt/src/pa/FlexPA_acc_pattern.cpp b/src/drt/src/pa/FlexPA_acc_pattern.cpp index dff96c8d5b9..66a187b7579 100644 --- a/src/drt/src/pa/FlexPA_acc_pattern.cpp +++ b/src/drt/src/pa/FlexPA_acc_pattern.cpp @@ -456,13 +456,13 @@ int FlexPA::getEdgeCost( curr_acc_point_idx, max_access_point_size); - // edge know to be a violation + // edge know to be of violation type if (vio_edges[edge_idx] == 1) { return violation_cost; } - // edge not known to be a violation of not - if (vio_edges[edge_idx] != -1) { + // edge not known to be of violation or not + if (vio_edges[edge_idx] == -1) { odb::dbTransform xform = unique_inst->getNoRotationTransform(); // check DRC std::vector> objs; From 814b4f2346098a90beed338e24dd0d5795a0eb0c Mon Sep 17 00:00:00 2001 From: bnmfw Date: Wed, 24 Jun 2026 20:08:23 +0000 Subject: [PATCH 5/5] drt: better comments for vio_edges Signed-off-by: bnmfw --- src/drt/src/pa/FlexPA_acc_pattern.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/drt/src/pa/FlexPA_acc_pattern.cpp b/src/drt/src/pa/FlexPA_acc_pattern.cpp index 66a187b7579..de048261118 100644 --- a/src/drt/src/pa/FlexPA_acc_pattern.cpp +++ b/src/drt/src/pa/FlexPA_acc_pattern.cpp @@ -456,12 +456,17 @@ int FlexPA::getEdgeCost( curr_acc_point_idx, max_access_point_size); - // edge know to be of violation type + // vio_edges caches wether a pair of aps have violations betweem themselves. + // -1: No cache exists + // 0: Already cached as no violation + // 1: Already caches as having a violation + + // Edge cached as having a violation if (vio_edges[edge_idx] == 1) { return violation_cost; } - // edge not known to be of violation or not + // Violation status of the edge is not cached, has to be calculated if (vio_edges[edge_idx] == -1) { odb::dbTransform xform = unique_inst->getNoRotationTransform(); // check DRC