dcalc bfs incr level/hercules_is_int 0.3 correlation

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2026-01-06 14:37:26 -08:00
parent 4afa443892
commit 9d401d1c0e
5 changed files with 45 additions and 6 deletions

View File

@ -184,6 +184,19 @@ GraphDelayCalc::delayInvalid(Vertex *vertex)
}
}
void
GraphDelayCalc::levelsChangedBefore()
{
delaysInvalid();
}
void
GraphDelayCalc::levelChangedBefore(Vertex *vertex)
{
iter_->remove(vertex);
delayInvalid(vertex);
}
void
GraphDelayCalc::deleteVertexBefore(Vertex *vertex)
{

View File

@ -106,6 +106,8 @@ protected:
virtual void incrLevel(Level &level) const = 0;
void findNext(Level to_level);
void deleteEntries();
void checkLevel(Vertex *vertex,
Level level);
BfsIndex bfs_index_;
Level level_min_;

View File

@ -58,10 +58,12 @@ public:
virtual void setObserver(DelayCalcObserver *observer);
// Invalidate all delays/slews.
virtual void delaysInvalid();
virtual void levelsChangedBefore();
// Invalidate vertex and downstream delays/slews.
virtual void delayInvalid(Vertex *vertex);
virtual void delayInvalid(const Pin *pin);
virtual void deleteVertexBefore(Vertex *vertex);
virtual void levelChangedBefore(Vertex *vertex);
// Reset to virgin state.
virtual void clear();
// Find arc delays and vertex slews thru level.

View File

@ -146,7 +146,8 @@ BfsIterator::visit(Level to_level,
int visit_count = 0;
while (levelLessOrEqual(first_level_, last_level_)
&& levelLessOrEqual(first_level_, to_level)) {
VertexSeq &level_vertices = queue_[first_level_];
Level level = first_level_;
VertexSeq &level_vertices = queue_[level];
incrLevel(first_level_);
// Note that ArrivalVisitor::enqueueRefPinInputDelays may enqueue
// vertices at this level so range iteration fails if the vector grows.
@ -154,6 +155,7 @@ BfsIterator::visit(Level to_level,
Vertex *vertex = level_vertices.back();
level_vertices.pop_back();
if (vertex) {
checkLevel(vertex, level);
vertex->setBfsInQueue(bfs_index_, false);
visitor->visit(vertex);
visit_count++;
@ -187,6 +189,7 @@ BfsIterator::visitParallel(Level to_level,
if (vertex_count < thread_count) {
for (Vertex *vertex : level_vertices) {
if (vertex) {
checkLevel(vertex, first_level_);
vertex->setBfsInQueue(bfs_index_, false);
visitor->visit(vertex);
}
@ -203,6 +206,7 @@ BfsIterator::visitParallel(Level to_level,
for (size_t i = from; i < to; i++) {
Vertex *vertex = level_vertices[i];
if (vertex) {
checkLevel(vertex, first_level_);
vertex->setBfsInQueue(bfs_index, false);
visitors[k]->visit(vertex);
}
@ -259,8 +263,10 @@ BfsIterator::findNext(Level to_level)
Vertex *vertex = level_vertices.back();
if (vertex == nullptr)
level_vertices.pop_back();
else
else {
checkLevel(vertex, first_level_);
return;
}
}
incrLevel(first_level_);
}
@ -313,6 +319,17 @@ BfsIterator::checkInQueue(Vertex *vertex)
vertex->to_string(this).c_str());
}
void
BfsIterator::checkLevel(Vertex *vertex,
Level level)
{
if (vertex->level() != level)
report_->error(000, "vertex %s level %d != bfs level %d",
vertex->to_string(this).c_str(),
vertex->level(),
level);
}
void
BfsIterator::deleteVertexBefore(Vertex *vertex)
{

View File

@ -209,16 +209,19 @@ StaSimObserver::fanoutEdgesChangeAfter(Vertex *vertex)
class StaLevelizeObserver : public LevelizeObserver
{
public:
StaLevelizeObserver(Search *search);
StaLevelizeObserver(Search *search, GraphDelayCalc *graph_delay_calc);
void levelsChangedBefore() override;
void levelChangedBefore(Vertex *vertex) override;
private:
Search *search_;
GraphDelayCalc *graph_delay_calc_;
};
StaLevelizeObserver::StaLevelizeObserver(Search *search) :
search_(search)
StaLevelizeObserver::StaLevelizeObserver(Search *search,
GraphDelayCalc *graph_delay_calc) :
search_(search),
graph_delay_calc_(graph_delay_calc)
{
}
@ -226,12 +229,14 @@ void
StaLevelizeObserver::levelsChangedBefore()
{
search_->levelsChangedBefore();
graph_delay_calc_->levelsChangedBefore();
}
void
StaLevelizeObserver::levelChangedBefore(Vertex *vertex)
{
search_->levelChangedBefore(vertex);
graph_delay_calc_->levelChangedBefore(vertex);
}
////////////////////////////////////////////////////////////////
@ -326,7 +331,7 @@ Sta::makeObservers()
{
graph_delay_calc_->setObserver(new StaDelayCalcObserver(search_));
sim_->setObserver(new StaSimObserver(graph_delay_calc_, levelize_, search_));
levelize_->setObserver(new StaLevelizeObserver(search_));
levelize_->setObserver(new StaLevelizeObserver(search_, graph_delay_calc_));
}
int