RequiredVistor integrate RequiredCmp

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry
2026-05-05 19:37:43 -07:00
parent 2290ed97c0
commit fa3c89f436
2 changed files with 14 additions and 33 deletions

View File

@@ -861,7 +861,7 @@ public:
const MinMax *min_max) override;
protected:
RequiredCmp *required_cmp_;
RequiredCmp required_cmp_;
VisitPathEnds *visit_path_ends_;
};

View File

@@ -3293,40 +3293,24 @@ Search::seedInvalidRequireds()
class FindEndRequiredVisitor : public PathEndVisitor
{
public:
FindEndRequiredVisitor(RequiredCmp *required_cmp,
FindEndRequiredVisitor(RequiredCmp &required_cmp,
const StaState *sta);
FindEndRequiredVisitor(const StaState *sta);
~FindEndRequiredVisitor() override;
PathEndVisitor *copy() const override;
void visit(PathEnd *path_end) override;
protected:
const StaState *sta_;
RequiredCmp *required_cmp_;
bool own_required_cmp_;
RequiredCmp &required_cmp_;
};
FindEndRequiredVisitor::FindEndRequiredVisitor(RequiredCmp *required_cmp,
FindEndRequiredVisitor::FindEndRequiredVisitor(RequiredCmp &required_cmp,
const StaState *sta) :
sta_(sta),
required_cmp_(required_cmp),
own_required_cmp_(false)
required_cmp_(required_cmp)
{
}
FindEndRequiredVisitor::FindEndRequiredVisitor(const StaState *sta) :
sta_(sta),
required_cmp_(new RequiredCmp),
own_required_cmp_(true)
{
}
FindEndRequiredVisitor::~FindEndRequiredVisitor()
{
if (own_required_cmp_)
delete required_cmp_;
}
PathEndVisitor *
FindEndRequiredVisitor::copy() const
{
@@ -3341,7 +3325,7 @@ FindEndRequiredVisitor::visit(PathEnd *path_end)
const MinMax *min_max = path->minMax(sta_)->opposite();
size_t path_index = path->pathIndex(sta_);
Required required = path_end->requiredTime(sta_);
required_cmp_->requiredSet(path_index, required, min_max, sta_);
required_cmp_.requiredSet(path_index, required, min_max, sta_);
}
}
@@ -3351,7 +3335,7 @@ Search::seedRequired(Vertex *vertex)
debugPrint(debug_, "search", 2, "required seed {}",
vertex->to_string(this));
RequiredCmp required_cmp;
FindEndRequiredVisitor seeder(&required_cmp, this);
FindEndRequiredVisitor seeder(required_cmp, this);
required_cmp.requiredsInit(vertex, this);
visit_path_ends_->visitPathEnds(vertex, &seeder);
// Enqueue fanin vertices for back-propagating required times.
@@ -3363,7 +3347,7 @@ void
Search::seedRequiredEnqueueFanin(Vertex *vertex)
{
RequiredCmp required_cmp;
FindEndRequiredVisitor seeder(&required_cmp, this);
FindEndRequiredVisitor seeder(required_cmp, this);
required_cmp.requiredsInit(vertex, this);
visit_path_ends_->visitPathEnds(vertex, &seeder);
// Enqueue fanin vertices for back-propagating required times.
@@ -3438,21 +3422,18 @@ RequiredCmp::required(size_t path_index)
RequiredVisitor::RequiredVisitor(const StaState *sta) :
PathVisitor(sta),
required_cmp_(new RequiredCmp),
visit_path_ends_(new VisitPathEnds(sta))
{
}
RequiredVisitor::RequiredVisitor(const RequiredVisitor &required_visitor) :
PathVisitor(required_visitor.search()->evalPred(), true, &required_visitor),
required_cmp_(new RequiredCmp),
visit_path_ends_(new VisitPathEnds(&required_visitor))
{
}
RequiredVisitor::~RequiredVisitor()
{
delete required_cmp_;
delete visit_path_ends_;
}
@@ -3467,7 +3448,7 @@ RequiredVisitor::visit(Vertex *vertex)
{
debugPrint(debug_, "search", 2, "find required {}",
vertex->to_string(this));
required_cmp_->requiredsInit(vertex, this);
required_cmp_.requiredsInit(vertex, this);
// Back propagate requireds from fanout.
visitFanoutPaths(vertex);
// Check for constraints at endpoints that set required times.
@@ -3475,7 +3456,7 @@ RequiredVisitor::visit(Vertex *vertex)
FindEndRequiredVisitor seeder(required_cmp_, this);
visit_path_ends_->visitPathEnds(vertex, &seeder);
}
bool changed = required_cmp_->requiredsSave(vertex, this);
bool changed = required_cmp_.requiredsSave(vertex, this);
search_->tnsInvalid(vertex);
if (changed)
@@ -3521,8 +3502,8 @@ RequiredVisitor::visitFromToPath(const Pin *,
delayAsString(arc_delay, this),
delayAsString(from_required, this),
min_max == MinMax::max() ? "<" : ">",
delayAsString(required_cmp_->required(path_index), this));
required_cmp_->requiredSet(path_index, from_required, req_min, this);
delayAsString(required_cmp_.required(path_index), this));
required_cmp_.requiredSet(path_index, from_required, req_min, this);
}
else {
if (search_->crprApproxMissingRequireds()) {
@@ -3545,8 +3526,8 @@ RequiredVisitor::visitFromToPath(const Pin *,
delayAsString(arc_delay, this),
delayAsString(from_required, this),
min_max == MinMax::max() ? "<" : ">",
delayAsString(required_cmp_->required(path_index), this));
required_cmp_->requiredSet(path_index, from_required, req_min, this);
delayAsString(required_cmp_.required(path_index), this));
required_cmp_.requiredSet(path_index, from_required, req_min, this);
break;
}
}