@@ -53,6 +53,19 @@ using std::vector;
5353
5454using utl::RSZ ;
5555
56+ namespace {
57+
58+ const sta::Path* latchDataPath (const sta::PathExpanded& expanded)
59+ {
60+ const sta::Path* d_path = nullptr ;
61+ const sta::Path* q_path = nullptr ;
62+ sta::Edge* d_q_edge = nullptr ;
63+ expanded.latchPaths (d_path, q_path, d_q_edge);
64+ return d_path;
65+ }
66+
67+ } // namespace
68+
5669SetupLegacyBase::SetupLegacyBase (Resizer& resizer,
5770 MoveCommitter& committer,
5871 RepairSetupContext& setup_context,
@@ -455,7 +468,34 @@ bool SetupLegacyBase::makePinTargetOnPath(const sta::Pin* pin,
455468 }
456469
457470 sta::PathExpanded expanded (path, sta_);
458- for (int index = expanded.startIndex (); index < expanded.size (); index++) {
471+ if (makePinTargetInExpandedPath (pin, path, expanded, focus_slack, target)) {
472+ return true ;
473+ }
474+
475+ const sta::Path* d_path = latchDataPath (expanded);
476+ if (d_path == nullptr ) {
477+ return false ;
478+ }
479+
480+ sta::PathExpanded d_expanded (d_path, sta_);
481+ return makePinTargetInExpandedPath (
482+ pin, d_path, d_expanded, focus_slack, target);
483+ }
484+
485+ bool SetupLegacyBase::makePinTargetInExpandedPath (const sta::Pin* pin,
486+ const sta::Path* path,
487+ sta::PathExpanded& expanded,
488+ const sta::Slack focus_slack,
489+ Target& target) const
490+ {
491+ sta::Vertex* vertex = graph_->pinDrvrVertex (pin);
492+ if (vertex == nullptr ) {
493+ return false ;
494+ }
495+
496+ const int start_index = static_cast <int >(expanded.startIndex ());
497+ const int path_count = static_cast <int >(expanded.size ());
498+ for (int index = start_index; index < path_count; index++) {
459499 const sta::Path* driver_path = expanded.path (index);
460500 sta::Vertex* path_vertex = driver_path->vertex (sta_);
461501 const sta::Pin* path_pin = driver_path->pin (sta_);
@@ -737,7 +777,7 @@ bool SetupLegacyBase::repairPath(sta::Path* path,
737777 return false ;
738778 }
739779
740- const auto load_delays
780+ const std::vector<std::pair< int , sta::Delay>> load_delays
741781 = rankPathDrivers (expanded, corner, corner->libertyIndex (resizer_.max_ ));
742782 const int repairs_per_pass = repairBudget (path_slack, force_single_repair);
743783
@@ -751,13 +791,40 @@ bool SetupLegacyBase::repairPath(sta::Path* path,
751791 load_delays.size ());
752792
753793 // Construct target vector
754- std::vector<Target> targets;
755- targets.reserve (load_delays.size ());
756- for (const auto & [drvr_index, ignored] : load_delays) {
757- static_cast <void >(ignored);
794+ std::vector<std::pair<Target, sta::Delay>> ranked_targets;
795+ ranked_targets.reserve (load_delays.size ());
796+ for (const std::pair<int , sta::Delay>& load_delay : load_delays) {
758797 Target target;
759- makePathDriverTarget (path, expanded, drvr_index, path_slack, target);
760- targets.push_back (std::move (target));
798+ makePathDriverTarget (path, expanded, load_delay.first , path_slack, target);
799+ ranked_targets.emplace_back (std::move (target), load_delay.second );
800+ }
801+
802+ const sta::Path* d_path = latchDataPath (expanded);
803+ if (d_path != nullptr ) {
804+ sta::PathExpanded d_expanded (d_path, sta_);
805+ const sta::Scene* d_corner = d_path->scene (sta_);
806+ const std::vector<std::pair<int , sta::Delay>> d_load_delays
807+ = rankPathDrivers (
808+ d_expanded, d_corner, d_corner->libertyIndex (resizer_.max_ ));
809+ ranked_targets.reserve (ranked_targets.size () + d_load_delays.size ());
810+ for (const std::pair<int , sta::Delay>& load_delay : d_load_delays) {
811+ Target target;
812+ makePathDriverTarget (
813+ d_path, d_expanded, load_delay.first , path_slack, target);
814+ ranked_targets.emplace_back (std::move (target), load_delay.second );
815+ }
816+ }
817+
818+ std::ranges::stable_sort (ranked_targets,
819+ [](const std::pair<Target, sta::Delay>& lhs,
820+ const std::pair<Target, sta::Delay>& rhs) {
821+ return lhs.second > rhs.second ;
822+ });
823+
824+ std::vector<Target> targets;
825+ targets.reserve (ranked_targets.size ());
826+ for (std::pair<Target, sta::Delay>& ranked_target : ranked_targets) {
827+ targets.push_back (std::move (ranked_target.first ));
761828 }
762829
763830 // Prewarm for legacy MT policy
0 commit comments