From b06e72d61fd975e7aec2607e51bda8ddadc2d3d1 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 16 Sep 2021 16:18:55 -0700 Subject: [PATCH] deleteRequireds count arg Signed-off-by: James Cherry --- graph/Graph.cc | 33 +++++++++++++++++++++++++-------- include/sta/ArrayTable.hh | 7 +++++++ include/sta/Graph.hh | 5 ++++- include/sta/PathVertex.hh | 2 -- search/PathVertex.cc | 7 ------- search/Search.cc | 21 ++++++++++++++------- 6 files changed, 50 insertions(+), 25 deletions(-) diff --git a/graph/Graph.cc b/graph/Graph.cc index 936f6d2b..5e03e275 100644 --- a/graph/Graph.cc +++ b/graph/Graph.cc @@ -17,9 +17,8 @@ #include "Graph.hh" #include "DisallowCopyAssign.hh" -#include "Stats.hh" -#include "Error.hh" #include "Debug.hh" +#include "Stats.hh" #include "MinMax.hh" #include "Mutex.hh" #include "Transition.hh" @@ -500,10 +499,14 @@ Graph::deleteOutEdge(Vertex *vertex, Graph::edge(next)->vertex_out_prev_ = prev; } +//////////////////////////////////////////////////////////////// + Arrival * Graph::makeArrivals(Vertex *vertex, uint32_t count) { + if (vertex->arrivals() != arrival_null) + debugPrint(debug_, "leaks", 617, "arrival leak"); Arrival *arrivals; ArrivalId id; { @@ -520,10 +523,20 @@ Graph::arrivals(Vertex *vertex) return arrivals_.pointer(vertex->arrivals()); } +void +Graph::deleteArrivals(Vertex *vertex, + uint32_t count) +{ + arrivals_.deleteArray(count); + vertex->setArrivals(arrival_null); +} + Required * Graph::makeRequireds(Vertex *vertex, uint32_t count) { + if (vertex->requireds() != arrival_null) + debugPrint(debug_, "leaks", 617, "required leak"); Required *requireds; ArrivalId id; { @@ -540,6 +553,14 @@ Graph::requireds(Vertex *vertex) return arrivals_.pointer(vertex->requireds()); } +void +Graph::deleteRequireds(Vertex *vertex, + uint32_t count) +{ + arrivals_.deleteArray(count); + vertex->setRequireds(arrival_null); +} + void Graph::clearArrivals() { @@ -572,6 +593,8 @@ Graph::clearPrevPaths() prev_paths_.clear(); } +//////////////////////////////////////////////////////////////// + const Slew & Graph::slew(const Vertex *vertex, const RiseFall *rf, @@ -1183,12 +1206,6 @@ Vertex::setRequireds(ArrivalId id) requireds_ = id; } -void -Vertex::deleteRequireds() -{ - requireds_ = arrival_null; -} - void Vertex::setPrevPaths(PrevPathId prev_paths) { diff --git a/include/sta/ArrayTable.hh b/include/sta/ArrayTable.hh index c5797115..7ffec6fb 100644 --- a/include/sta/ArrayTable.hh +++ b/include/sta/ArrayTable.hh @@ -34,6 +34,7 @@ public: void make(uint32_t count, TYPE *&array, ObjectId &id); + void deleteArray(uint32_t count); // Grow as necessary and return pointer for id. TYPE *ensureId(ObjectId id); TYPE *pointer(ObjectId id) const; @@ -144,6 +145,12 @@ ArrayTable::pushBlock(ArrayBlock *block) } } +template +void +ArrayTable::deleteArray(uint32_t) +{ +} + template TYPE * ArrayTable::pointer(ObjectId id) const diff --git a/include/sta/Graph.hh b/include/sta/Graph.hh index 70ed6a02..3c53ec1d 100644 --- a/include/sta/Graph.hh +++ b/include/sta/Graph.hh @@ -101,9 +101,13 @@ public: Arrival *makeArrivals(Vertex *vertex, uint32_t count); Arrival *arrivals(Vertex *vertex); + void deleteArrivals(Vertex *vertex, + uint32_t count); Required *makeRequireds(Vertex *vertex, uint32_t count); Required *requireds(Vertex *vertex); + void deleteRequireds(Vertex *vertex, + uint32_t count); void clearArrivals(); size_t arrivalCount() const { return arrivals_.size(); } PathVertexRep *makePrevPaths(Vertex *vertex, @@ -284,7 +288,6 @@ public: ArrivalId arrivals() { return arrivals_; } ArrivalId requireds() { return requireds_; } bool hasRequireds() const { return requireds_ != arrival_null; } - void deleteRequireds(); PrevPathId prevPaths() const { return prev_paths_; } void setPrevPaths(PrevPathId id); TagGroupIndex tagGroupIndex() const; diff --git a/include/sta/PathVertex.hh b/include/sta/PathVertex.hh index 5e7146a7..b066a96a 100644 --- a/include/sta/PathVertex.hh +++ b/include/sta/PathVertex.hh @@ -84,8 +84,6 @@ public: // Return values. PathVertex &prev_path, TimingArc *&prev_arc) const; - static void deleteRequireds(Vertex *vertex, - const StaState *sta); static bool equal(const PathVertex *path1, const PathVertex *path2); diff --git a/search/PathVertex.cc b/search/PathVertex.cc index cf1355b4..4ea17eb3 100644 --- a/search/PathVertex.cc +++ b/search/PathVertex.cc @@ -268,13 +268,6 @@ PathVertex::setRequired(const Required &required, requireds[arrival_index_] = required; } -void -PathVertex::deleteRequireds(Vertex *vertex, - const StaState *) -{ - vertex->deleteRequireds(); -} - bool PathVertex::equal(const PathVertex *path1, const PathVertex *path2) diff --git a/search/Search.cc b/search/Search.cc index a8f4f564..dc1fb2f0 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -2702,10 +2702,18 @@ Search::setVertexArrivals(Vertex *vertex, requiredInvalid(vertex); if (tag_group != prev_tag_group) // Requireds can only be reused if the tag group is unchanged. - vertex->deleteRequireds(); + graph_->deleteRequireds(vertex, prev_tag_group->arrivalCount()); } } else { + if (prev_tag_group) { + uint32_t prev_arrival_count = prev_tag_group->arrivalCount(); + graph_->deleteArrivals(vertex, prev_arrival_count); + if (has_requireds) { + requiredInvalid(vertex); + graph_->deleteRequireds(vertex, prev_arrival_count); + } + } Arrival *arrivals = graph_->makeArrivals(vertex, arrival_count); prev_paths = nullptr; if (tag_bldr->hasClkTag() || tag_bldr->hasGenClkSrcTag()) @@ -2713,11 +2721,6 @@ Search::setVertexArrivals(Vertex *vertex, tag_bldr->copyArrivals(tag_group, arrivals, prev_paths); vertex->setTagGroupIndex(tag_group->index()); - - if (has_requireds) { - requiredInvalid(vertex); - vertex->deleteRequireds(); - } } } } @@ -3363,7 +3366,11 @@ RequiredCmp::requiredsSave(Vertex *vertex, } } else if (prev_reqs) { - PathVertex::deleteRequireds(vertex, sta); + Graph *graph = sta->graph(); + const Search *search = sta->search(); + TagGroup *tag_group = search->tagGroup(vertex); + int arrival_count = tag_group->arrivalCount(); + graph->deleteRequireds(vertex, arrival_count); requireds_changed = true; } return requireds_changed;