mirror of
https://github.com/The-OpenROAD-Project/OpenSTA.git
synced 2026-05-30 00:24:12 +08:00
RequiredVistor integrate RequiredCmp
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
@@ -861,7 +861,7 @@ public:
|
||||
const MinMax *min_max) override;
|
||||
|
||||
protected:
|
||||
RequiredCmp *required_cmp_;
|
||||
RequiredCmp required_cmp_;
|
||||
VisitPathEnds *visit_path_ends_;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user