dcalc bfs incr level/hercules_is_int 0.3 correlation
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
4afa443892
commit
9d401d1c0e
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue