diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index afa3d290..c28dec8b 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -631,6 +631,12 @@ public: Slew &slew, float &slack, float &limit); + void findSlewLimit(const Pin *pin, + const Corner *corner, + const MinMax *min_max, + // Return values. + float &limit, + bool &exists); void checkFanoutLimitPreamble(); // Return pins with the min/max fanout limit slack. diff --git a/search/CheckSlewLimits.cc b/search/CheckSlewLimits.cc index 9a05754a..e0b92ea8 100644 --- a/search/CheckSlewLimits.cc +++ b/search/CheckSlewLimits.cc @@ -155,10 +155,10 @@ CheckSlewLimits::checkSlews1(Vertex *vertex, && !sta_->clkNetwork()->isIdealClock(pin)) { for (auto rf : RiseFall::range()) { float limit; - bool limit_exists; + bool exists; findLimit(pin, vertex, corner, rf, min_max, check_clks, - limit, limit_exists); - if (limit_exists) { + limit, exists); + if (exists) { checkSlew(vertex, corner, rf, min_max, limit, corner1, rf1, slew1, slack1, limit1); } @@ -166,7 +166,25 @@ CheckSlewLimits::checkSlews1(Vertex *vertex, } } -// return the tightest limit. +void +CheckSlewLimits::findLimit(const Pin *pin, + const Corner *corner, + const MinMax *min_max, + // Return values. + float &limit, + bool &exists) const +{ + limit = INF; + exists = false; + for (auto rf : RiseFall::range()) { + float limit; + bool exists; + findLimit(pin, nullptr, corner, rf, min_max, false, + limit, exists); + } +} + +// Return the tightest limit. void CheckSlewLimits::findLimit(const Pin *pin, const Vertex *vertex, diff --git a/search/CheckSlewLimits.hh b/search/CheckSlewLimits.hh index 1dea2673..60d0d7da 100644 --- a/search/CheckSlewLimits.hh +++ b/search/CheckSlewLimits.hh @@ -52,6 +52,12 @@ public: bool violators, const Corner *corner, const MinMax *min_max); + void findLimit(const Pin *pin, + const Corner *corner, + const MinMax *min_max, + // Return values. + float &limit, + bool &exists) const; protected: void checkSlews1(const Pin *pin, diff --git a/search/Sta.cc b/search/Sta.cc index e379f681..45e11150 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -5211,6 +5211,19 @@ Sta::maxSlewCheck(// Return values. delete pins; } +void +Sta::findSlewLimit(const Pin *pin, + const Corner *corner, + const MinMax *min_max, + // Return values. + float &limit, + bool &exists) +{ + checkSlewLimitPreamble(); + check_slew_limits_->findLimit(pin, corner, min_max, + limit, exists); +} + ////////////////////////////////////////////////////////////////' void