separate array tables for arrivals and requireds

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2021-09-17 16:19:24 -07:00
parent 2e89d12078
commit d25f6878a2
5 changed files with 35 additions and 4 deletions

View File

@ -540,8 +540,8 @@ Graph::makeRequireds(Vertex *vertex,
Required *requireds; Required *requireds;
ArrivalId id; ArrivalId id;
{ {
UniqueLock lock(arrivals_lock_); UniqueLock lock(requireds_lock_);
arrivals_.make(count, requireds, id); requireds_.make(count, requireds, id);
} }
vertex->setRequireds(id); vertex->setRequireds(id);
return requireds; return requireds;
@ -550,14 +550,14 @@ Graph::makeRequireds(Vertex *vertex,
Required * Required *
Graph::requireds(Vertex *vertex) Graph::requireds(Vertex *vertex)
{ {
return arrivals_.pointer(vertex->requireds()); return requireds_.pointer(vertex->requireds());
} }
void void
Graph::deleteRequireds(Vertex *vertex, Graph::deleteRequireds(Vertex *vertex,
uint32_t count) uint32_t count)
{ {
arrivals_.destroy(vertex->requireds(), count); requireds_.destroy(vertex->requireds(), count);
vertex->setRequireds(arrival_null); vertex->setRequireds(arrival_null);
} }
@ -565,6 +565,7 @@ void
Graph::clearArrivals() Graph::clearArrivals()
{ {
arrivals_.clear(); arrivals_.clear();
requireds_.clear();
} }
PathVertexRep * PathVertexRep *

View File

@ -43,6 +43,7 @@ typedef ArrayTable<Delay> DelayTable;
typedef ObjectTable<Vertex> VertexTable; typedef ObjectTable<Vertex> VertexTable;
typedef ObjectTable<Edge> EdgeTable; typedef ObjectTable<Edge> EdgeTable;
typedef ArrayTable<Arrival> ArrivalsTable; typedef ArrayTable<Arrival> ArrivalsTable;
typedef ArrayTable<Required> RequiredsTable;
typedef ArrayTable<PathVertexRep> PrevPathsTable; typedef ArrayTable<PathVertexRep> PrevPathsTable;
typedef Map<const Pin*, Vertex*> PinVertexMap; typedef Map<const Pin*, Vertex*> PinVertexMap;
typedef Iterator<Edge*> VertexEdgeIterator; typedef Iterator<Edge*> VertexEdgeIterator;
@ -110,6 +111,7 @@ public:
uint32_t count); uint32_t count);
void clearArrivals(); void clearArrivals();
size_t arrivalCount() const { return arrivals_.size(); } size_t arrivalCount() const { return arrivals_.size(); }
size_t requiredCount() const { return requireds_.size(); }
PathVertexRep *makePrevPaths(Vertex *vertex, PathVertexRep *makePrevPaths(Vertex *vertex,
uint32_t count); uint32_t count);
PathVertexRep *prevPaths(Vertex *vertex) const; PathVertexRep *prevPaths(Vertex *vertex) const;
@ -244,6 +246,8 @@ protected:
int arc_count_; int arc_count_;
ArrivalsTable arrivals_; ArrivalsTable arrivals_;
std::mutex arrivals_lock_; std::mutex arrivals_lock_;
RequiredsTable requireds_;
std::mutex requireds_lock_;
PrevPathsTable prev_paths_; PrevPathsTable prev_paths_;
std::mutex prev_paths_lock_; std::mutex prev_paths_lock_;
Vector<bool> arc_delay_annotated_; Vector<bool> arc_delay_annotated_;

View File

@ -1045,6 +1045,7 @@ public:
TagGroupIndex tagGroupCount() const; TagGroupIndex tagGroupCount() const;
int clkInfoCount() const; int clkInfoCount() const;
int arrivalCount() const; int arrivalCount() const;
int requiredCount() const;
int vertexArrivalCount(Vertex *vertex) const; int vertexArrivalCount(Vertex *vertex) const;
Vertex *maxArrivalCountVertex() const; Vertex *maxArrivalCountVertex() const;

View File

@ -3356,6 +3356,19 @@ Sta::arrivalCount() const
return count; 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 TagIndex
Sta::tagCount() const Sta::tagCount() const
{ {

View File

@ -5301,12 +5301,24 @@ arrival_count()
return Sta::sta()->arrivalCount(); return Sta::sta()->arrivalCount();
} }
int
required_count()
{
return Sta::sta()->requiredCount();
}
int int
graph_arrival_count() graph_arrival_count()
{ {
return Sta::sta()->graph()->arrivalCount(); return Sta::sta()->graph()->arrivalCount();
} }
int
graph_required_count()
{
return Sta::sta()->graph()->requiredCount();
}
void void
delete_all_memory() delete_all_memory()
{ {