From d25f6878a20af9c3ea456bfa1b46d2596f0e574f Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 17 Sep 2021 16:19:24 -0700 Subject: [PATCH] separate array tables for arrivals and requireds Signed-off-by: James Cherry --- graph/Graph.cc | 9 +++++---- include/sta/Graph.hh | 4 ++++ include/sta/Sta.hh | 1 + search/Sta.cc | 13 +++++++++++++ tcl/StaTcl.i | 12 ++++++++++++ 5 files changed, 35 insertions(+), 4 deletions(-) diff --git a/graph/Graph.cc b/graph/Graph.cc index c8815b25..a9862ef6 100644 --- a/graph/Graph.cc +++ b/graph/Graph.cc @@ -540,8 +540,8 @@ Graph::makeRequireds(Vertex *vertex, Required *requireds; ArrivalId id; { - UniqueLock lock(arrivals_lock_); - arrivals_.make(count, requireds, id); + UniqueLock lock(requireds_lock_); + requireds_.make(count, requireds, id); } vertex->setRequireds(id); return requireds; @@ -550,14 +550,14 @@ Graph::makeRequireds(Vertex *vertex, Required * Graph::requireds(Vertex *vertex) { - return arrivals_.pointer(vertex->requireds()); + return requireds_.pointer(vertex->requireds()); } void Graph::deleteRequireds(Vertex *vertex, uint32_t count) { - arrivals_.destroy(vertex->requireds(), count); + requireds_.destroy(vertex->requireds(), count); vertex->setRequireds(arrival_null); } @@ -565,6 +565,7 @@ void Graph::clearArrivals() { arrivals_.clear(); + requireds_.clear(); } PathVertexRep * diff --git a/include/sta/Graph.hh b/include/sta/Graph.hh index 3c53ec1d..6a115613 100644 --- a/include/sta/Graph.hh +++ b/include/sta/Graph.hh @@ -43,6 +43,7 @@ typedef ArrayTable DelayTable; typedef ObjectTable VertexTable; typedef ObjectTable EdgeTable; typedef ArrayTable ArrivalsTable; +typedef ArrayTable RequiredsTable; typedef ArrayTable PrevPathsTable; typedef Map PinVertexMap; typedef Iterator VertexEdgeIterator; @@ -110,6 +111,7 @@ public: uint32_t count); void clearArrivals(); size_t arrivalCount() const { return arrivals_.size(); } + size_t requiredCount() const { return requireds_.size(); } PathVertexRep *makePrevPaths(Vertex *vertex, uint32_t count); PathVertexRep *prevPaths(Vertex *vertex) const; @@ -244,6 +246,8 @@ protected: int arc_count_; ArrivalsTable arrivals_; std::mutex arrivals_lock_; + RequiredsTable requireds_; + std::mutex requireds_lock_; PrevPathsTable prev_paths_; std::mutex prev_paths_lock_; Vector arc_delay_annotated_; diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index a165c4b7..7bc19a3b 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -1045,6 +1045,7 @@ public: TagGroupIndex tagGroupCount() const; int clkInfoCount() const; int arrivalCount() const; + int requiredCount() const; int vertexArrivalCount(Vertex *vertex) const; Vertex *maxArrivalCountVertex() const; diff --git a/search/Sta.cc b/search/Sta.cc index 36bf3d3c..d89fc919 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -3356,6 +3356,19 @@ Sta::arrivalCount() const return count; } +int +Sta::requiredCount() const +{ + int count = 0; + VertexIterator vertex_iter(graph_); + while (vertex_iter.hasNext()) { + Vertex *vertex = vertex_iter.next(); + if (vertex->hasRequireds()) + count += vertexArrivalCount(vertex); + } + return count; +} + TagIndex Sta::tagCount() const { diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index 3fe2e0a4..1364f882 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -5301,12 +5301,24 @@ arrival_count() return Sta::sta()->arrivalCount(); } +int +required_count() +{ + return Sta::sta()->requiredCount(); +} + int graph_arrival_count() { return Sta::sta()->graph()->arrivalCount(); } +int +graph_required_count() +{ + return Sta::sta()->graph()->requiredCount(); +} + void delete_all_memory() {