Revert "Revert "issue103 ArrayTable critical error""
This reverts commit fa20da4c55.
This doesn't fully solve the problem so putting it back.
Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
This commit is contained in:
parent
fa20da4c55
commit
9328904ff3
|
|
@ -660,12 +660,48 @@ Graph::prevPaths(Vertex *vertex) const
|
||||||
return prev_paths_.pointer(vertex->prevPaths());
|
return prev_paths_.pointer(vertex->prevPaths());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Graph::deletePrevPaths(Vertex *vertex,
|
||||||
|
uint32_t count)
|
||||||
|
{
|
||||||
|
if (vertex->prevPaths() != object_id_null) {
|
||||||
|
{
|
||||||
|
LockGuard lock(prev_paths_lock_);
|
||||||
|
prev_paths_.destroy(vertex->prevPaths(), count);
|
||||||
|
}
|
||||||
|
vertex->setPrevPaths(object_id_null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Graph::clearPrevPaths()
|
Graph::clearPrevPaths()
|
||||||
{
|
{
|
||||||
prev_paths_.clear();
|
prev_paths_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// No locks.
|
||||||
|
void
|
||||||
|
Graph::deletePaths(Vertex *vertex,
|
||||||
|
uint32_t count)
|
||||||
|
{
|
||||||
|
if (vertex->arrivals() != arrival_null) {
|
||||||
|
arrivals_.destroy(vertex->arrivals(), count);
|
||||||
|
vertex->setArrivals(arrival_null);
|
||||||
|
}
|
||||||
|
if (vertex->requireds() != arrival_null) {
|
||||||
|
requireds_.destroy(vertex->requireds(), count);
|
||||||
|
vertex->setRequireds(arrival_null);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vertex->prevPaths() != object_id_null) {
|
||||||
|
prev_paths_.destroy(vertex->prevPaths(), count);
|
||||||
|
vertex->setPrevPaths(object_id_null);
|
||||||
|
}
|
||||||
|
|
||||||
|
vertex->tag_group_index_ = tag_group_index_max;
|
||||||
|
vertex->crpr_path_pruning_disabled_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
const Slew &
|
const Slew &
|
||||||
|
|
@ -1245,16 +1281,6 @@ Vertex::setPrevPaths(PrevPathId prev_paths)
|
||||||
prev_paths_ = prev_paths;
|
prev_paths_ = prev_paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Vertex::deletePaths()
|
|
||||||
{
|
|
||||||
arrivals_ = arrival_null;
|
|
||||||
requireds_ = arrival_null;
|
|
||||||
prev_paths_ = prev_path_null;
|
|
||||||
tag_group_index_ = tag_group_index_max;
|
|
||||||
crpr_path_pruning_disabled_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
LogicValue
|
LogicValue
|
||||||
Vertex::simValue() const
|
Vertex::simValue() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,13 @@ public:
|
||||||
PathVertexRep *makePrevPaths(Vertex *vertex,
|
PathVertexRep *makePrevPaths(Vertex *vertex,
|
||||||
uint32_t count);
|
uint32_t count);
|
||||||
PathVertexRep *prevPaths(Vertex *vertex) const;
|
PathVertexRep *prevPaths(Vertex *vertex) const;
|
||||||
|
void deletePrevPaths(Vertex *vertex,
|
||||||
|
uint32_t count);
|
||||||
void clearPrevPaths();
|
void clearPrevPaths();
|
||||||
|
// Private to Search::deletePaths1(Vertex).
|
||||||
|
void deletePaths(Vertex *vertex,
|
||||||
|
uint32_t count);
|
||||||
|
|
||||||
// Reported slew are the same as those in the liberty tables.
|
// Reported slew are the same as those in the liberty tables.
|
||||||
// reported_slews = measured_slews / slew_derate_from_library
|
// reported_slews = measured_slews / slew_derate_from_library
|
||||||
// Measured slews are between slew_lower_threshold and slew_upper_threshold.
|
// Measured slews are between slew_lower_threshold and slew_upper_threshold.
|
||||||
|
|
@ -333,8 +339,6 @@ public:
|
||||||
// ObjectTable interface.
|
// ObjectTable interface.
|
||||||
ObjectIdx objectIdx() const { return object_idx_; }
|
ObjectIdx objectIdx() const { return object_idx_; }
|
||||||
void setObjectIdx(ObjectIdx idx);
|
void setObjectIdx(ObjectIdx idx);
|
||||||
// private to Search.cc
|
|
||||||
void deletePaths();
|
|
||||||
|
|
||||||
static int transitionCount() { return 2; } // rise/fall
|
static int transitionCount() { return 2; } // rise/fall
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -498,6 +498,8 @@ protected:
|
||||||
const PathAnalysisPt *path_ap);
|
const PathAnalysisPt *path_ap);
|
||||||
void deletePaths();
|
void deletePaths();
|
||||||
void deletePaths(Vertex *vertex);
|
void deletePaths(Vertex *vertex);
|
||||||
|
// Delete with incremental tns/wns update.
|
||||||
|
void deletePathsIncr(Vertex *vertex);
|
||||||
TagGroup *findTagGroup(TagGroupBldr *group_bldr);
|
TagGroup *findTagGroup(TagGroupBldr *group_bldr);
|
||||||
void deleteFilterTags();
|
void deleteFilterTags();
|
||||||
void deleteFilterTagGroups();
|
void deleteFilterTagGroups();
|
||||||
|
|
|
||||||
|
|
@ -403,7 +403,7 @@ Search::deletePaths()
|
||||||
VertexIterator vertex_iter(graph_);
|
VertexIterator vertex_iter(graph_);
|
||||||
while (vertex_iter.hasNext()) {
|
while (vertex_iter.hasNext()) {
|
||||||
Vertex *vertex = vertex_iter.next();
|
Vertex *vertex = vertex_iter.next();
|
||||||
vertex->deletePaths();
|
deletePaths(vertex);
|
||||||
}
|
}
|
||||||
filtered_arrivals_->clear();
|
filtered_arrivals_->clear();
|
||||||
graph_->clearArrivals();
|
graph_->clearArrivals();
|
||||||
|
|
@ -412,13 +412,24 @@ Search::deletePaths()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete with incremental tns/wns update.
|
||||||
void
|
void
|
||||||
Search::deletePaths(Vertex *vertex)
|
Search::deletePathsIncr(Vertex *vertex)
|
||||||
{
|
{
|
||||||
tnsNotifyBefore(vertex);
|
tnsNotifyBefore(vertex);
|
||||||
if (worst_slacks_)
|
if (worst_slacks_)
|
||||||
worst_slacks_->worstSlackNotifyBefore(vertex);
|
worst_slacks_->worstSlackNotifyBefore(vertex);
|
||||||
vertex->deletePaths();
|
deletePaths(vertex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Search::deletePaths(Vertex *vertex)
|
||||||
|
{
|
||||||
|
TagGroup *tag_group = tagGroup(vertex);
|
||||||
|
if (tag_group) {
|
||||||
|
int arrival_count = tag_group->arrivalCount();
|
||||||
|
graph_->deletePaths(vertex, arrival_count);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -510,7 +521,7 @@ Search::deleteFilteredArrivals()
|
||||||
for (Vertex *vertex : *filtered_arrivals_) {
|
for (Vertex *vertex : *filtered_arrivals_) {
|
||||||
if (isClock(vertex))
|
if (isClock(vertex))
|
||||||
clk_arrivals_valid_ = false;
|
clk_arrivals_valid_ = false;
|
||||||
deletePaths(vertex);
|
deletePathsIncr(vertex);
|
||||||
arrivalInvalid(vertex);
|
arrivalInvalid(vertex);
|
||||||
requiredInvalid(vertex);
|
requiredInvalid(vertex);
|
||||||
}
|
}
|
||||||
|
|
@ -677,7 +688,7 @@ void
|
||||||
Search::deleteVertexBefore(Vertex *vertex)
|
Search::deleteVertexBefore(Vertex *vertex)
|
||||||
{
|
{
|
||||||
if (arrivals_exist_) {
|
if (arrivals_exist_) {
|
||||||
deletePaths(vertex);
|
deletePathsIncr(vertex);
|
||||||
arrival_iter_->deleteVertexBefore(vertex);
|
arrival_iter_->deleteVertexBefore(vertex);
|
||||||
invalid_arrivals_->erase(vertex);
|
invalid_arrivals_->erase(vertex);
|
||||||
filtered_arrivals_->erase(vertex);
|
filtered_arrivals_->erase(vertex);
|
||||||
|
|
@ -759,7 +770,7 @@ void
|
||||||
Search::arrivalInvalidDelete(Vertex *vertex)
|
Search::arrivalInvalidDelete(Vertex *vertex)
|
||||||
{
|
{
|
||||||
arrivalInvalid(vertex);
|
arrivalInvalid(vertex);
|
||||||
vertex->deletePaths();
|
deletePaths(vertex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -1457,7 +1468,7 @@ Search::seedArrival(Vertex *vertex)
|
||||||
setVertexArrivals(vertex, &tag_bldr);
|
setVertexArrivals(vertex, &tag_bldr);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
deletePaths(vertex);
|
deletePathsIncr(vertex);
|
||||||
if (search_adj_->searchFrom(vertex))
|
if (search_adj_->searchFrom(vertex))
|
||||||
arrival_iter_->enqueueAdjacentVertices(vertex, search_adj_);
|
arrival_iter_->enqueueAdjacentVertices(vertex, search_adj_);
|
||||||
}
|
}
|
||||||
|
|
@ -2663,7 +2674,7 @@ Search::setVertexArrivals(Vertex *vertex,
|
||||||
TagGroupBldr *tag_bldr)
|
TagGroupBldr *tag_bldr)
|
||||||
{
|
{
|
||||||
if (tag_bldr->empty())
|
if (tag_bldr->empty())
|
||||||
deletePaths(vertex);
|
deletePathsIncr(vertex);
|
||||||
else {
|
else {
|
||||||
TagGroup *prev_tag_group = tagGroup(vertex);
|
TagGroup *prev_tag_group = tagGroup(vertex);
|
||||||
Arrival *prev_arrivals = graph_->arrivals(vertex);
|
Arrival *prev_arrivals = graph_->arrivals(vertex);
|
||||||
|
|
@ -2682,7 +2693,7 @@ Search::setVertexArrivals(Vertex *vertex,
|
||||||
else {
|
else {
|
||||||
// Prev paths not required.
|
// Prev paths not required.
|
||||||
prev_paths = nullptr;
|
prev_paths = nullptr;
|
||||||
vertex->setPrevPaths(prev_path_null);
|
graph_->deletePrevPaths(vertex, arrival_count);
|
||||||
}
|
}
|
||||||
tag_bldr->copyArrivals(tag_group, prev_arrivals, prev_paths);
|
tag_bldr->copyArrivals(tag_group, prev_arrivals, prev_paths);
|
||||||
vertex->setTagGroupIndex(tag_group->index());
|
vertex->setTagGroupIndex(tag_group->index());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue