From c9d78679a62f72f23f5477430998f5362339cef7 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Tue, 2 Dec 2025 14:50:41 -0800 Subject: [PATCH] search save/delete enumbed paths Signed-off-by: James Cherry --- include/sta/PathEnd.hh | 2 +- include/sta/Search.hh | 2 ++ search/PathEnd.cc | 6 ------ search/PathEnum.cc | 7 ++++++- search/Search.cc | 11 +++++++++++ 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/include/sta/PathEnd.hh b/include/sta/PathEnd.hh index 0cfac597..c61eb16a 100644 --- a/include/sta/PathEnd.hh +++ b/include/sta/PathEnd.hh @@ -69,7 +69,7 @@ public: }; virtual PathEnd *copy() const = 0; - virtual ~PathEnd(); + virtual ~PathEnd() {} void deletePath(); Path *path() { return path_; } const Path *path() const { return path_; } diff --git a/include/sta/Search.hh b/include/sta/Search.hh index 8796301e..b23ef5c4 100644 --- a/include/sta/Search.hh +++ b/include/sta/Search.hh @@ -419,6 +419,7 @@ public: void deletePaths(Vertex *vertex); void deleteTagGroup(TagGroup *group); bool postponeLatchOutputs() const { return postpone_latch_outputs_; } + void saveEnumPath(Path *path); protected: void init(StaState *sta); @@ -674,6 +675,7 @@ protected: bool postpone_latch_outputs_; PathGroups *path_groups_; VisitPathEnds *visit_path_ends_; + std::vector enum_paths_; GatedClk *gated_clk_; CheckCrpr *check_crpr_; Genclks *genclks_; diff --git a/search/PathEnd.cc b/search/PathEnd.cc index d042ca7e..12b539d4 100644 --- a/search/PathEnd.cc +++ b/search/PathEnd.cc @@ -54,12 +54,6 @@ PathEnd::PathEnd(Path *path) : { } -PathEnd::~PathEnd() -{ - if (path_->isEnum()) - delete path_; -} - void PathEnd::setPath(Path *path) { diff --git a/search/PathEnum.cc b/search/PathEnum.cc index 9650aff0..c3a1189a 100644 --- a/search/PathEnum.cc +++ b/search/PathEnum.cc @@ -97,7 +97,11 @@ DiversionGreater::operator()(Diversion *div1, static void deleteDiversionPathEnd(Diversion *div) { - delete div->pathEnd(); + PathEnd *div_end = div->pathEnd(); + Path *div_path = div_end->path(); + if (div_path->isEnum()) + delete div_path; + delete div_end; delete div; } @@ -197,6 +201,7 @@ PathEnum::findNext() makeDiversions(path_end, div->divPath()); // Caller owns the path end now, so don't delete it. next_ = path_end; + //search_->saveEnumPath(path_end->path()); delete div; break; } diff --git a/search/Search.cc b/search/Search.cc index f83f7a07..8a5f69a3 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -409,11 +409,22 @@ Search::deletePaths() Vertex *vertex = vertex_iter.next(); deletePaths(vertex); } + + for (Path *path : enum_paths_) + delete path; + enum_paths_.clear(); + filtered_arrivals_->clear(); arrivals_exist_ = false; } } +void +Search::saveEnumPath(Path *path) +{ + enum_paths_.push_back(path); +} + // Delete with incremental tns/wns update. void Search::deletePathsIncr(Vertex *vertex)