From ecc1dcc60559a9a64cf0bee5d5e9788f0876f94f Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 7 Apr 2022 16:18:00 -0700 Subject: [PATCH] max_slew/cap/fanout_check_limit tcl accessors Signed-off-by: James Cherry --- include/sta/Sta.hh | 18 +++++++++++--- search/Sta.cc | 53 ++++++++++++++++++++++++---------------- tcl/StaTcl.i | 61 +++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 105 insertions(+), 27 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 3cb10226..afa3d290 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -626,7 +626,11 @@ public: Slew &slew, float &limit, float &slack); - float maxSlewCheckSlack(); + void maxSlewCheck(// Return values. + Pin *&pin, + Slew &slew, + float &slack, + float &limit); void checkFanoutLimitPreamble(); // Return pins with the min/max fanout limit slack. @@ -647,7 +651,11 @@ public: float &fanout, float &limit, float &slack); - float maxFanoutCheckSlack(); + void maxFanoutCheck(// Return values. + Pin *&pin, + float &fanout, + float &slack, + float &limit); void checkCapacitanceLimitPreamble(); // Return pins with the min/max slew limit slack. @@ -674,7 +682,11 @@ public: float &capacitance, float &limit, float &slack); - float maxCapacitanceCheckSlack(); + void maxCapacitanceCheck(// Return values. + Pin *&pin, + float &capacitance, + float &slack, + float &limit); // Min pulse width check with the least slack. // corner=nullptr checks all corners. diff --git a/search/Sta.cc b/search/Sta.cc index ef458727..8eaa9db6 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -5187,24 +5187,28 @@ Sta::checkSlew(const Pin *pin, corner1, rf, slew, limit, slack); } -float -Sta::maxSlewCheckSlack() +void +Sta::maxSlewCheck(// Return values. + Pin *&pin, + Slew &slew, + float &slack, + float &limit) { checkSlewLimitPreamble(); PinSeq *pins = check_slew_limits_->checkSlewLimits(nullptr, false, nullptr, MinMax::max()); - float slack = INF; + pin = nullptr; + slew = 0.0; + slack = INF; + limit = INF; if (!pins->empty()) { - Pin *pin = (*pins)[0]; + pin = (*pins)[0]; const Corner *corner; const RiseFall *rf; - Slew slew; - float limit; check_slew_limits_->checkSlew(pin, nullptr, MinMax::max(), true, corner, rf, slew, limit, slack); } delete pins; - return slack; } ////////////////////////////////////////////////////////////////' @@ -5267,21 +5271,24 @@ Sta::checkFanout(const Pin *pin, fanout, limit, slack); } -float -Sta::maxFanoutCheckSlack() +void +Sta::maxFanoutCheck(// Return values. + Pin *&pin, + float &fanout, + float &slack, + float &limit) { checkFanoutLimitPreamble(); PinSeq *pins = check_fanout_limits_->checkFanoutLimits(nullptr, false, MinMax::max()); - float slack = INF; + pin = nullptr; + fanout = 0; + slack = INF; if (!pins->empty()) { - Pin *pin = (*pins)[0]; - float fanout; - float limit; + pin = (*pins)[0]; check_fanout_limits_->checkFanout(pin, MinMax::max(), fanout, limit, slack); } delete pins; - return slack; } ////////////////////////////////////////////////////////////////' @@ -5358,25 +5365,29 @@ Sta::checkCapacitance(const Pin *pin, limit, slack); } -float -Sta::maxCapacitanceCheckSlack() +void +Sta::maxCapacitanceCheck(// Return values. + Pin *&pin, + float &capacitance, + float &slack, + float &limit) { checkCapacitanceLimitPreamble(); PinSeq *pins = check_capacitance_limits_->checkCapacitanceLimits(nullptr, false, nullptr, MinMax::max()); - float slack = INF; + pin = nullptr; + capacitance = 0.0; + slack = INF; + limit = INF; if (!pins->empty()) { - Pin *pin = (*pins)[0]; + pin = (*pins)[0]; const Corner *corner; const RiseFall *rf; - float capacitance; - float limit; check_capacitance_limits_->checkCapacitance(pin, nullptr, MinMax::max(), corner, rf, capacitance, limit, slack); } delete pins; - return slack; } //////////////////////////////////////////////////////////////// diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index fa025c2d..36887ac1 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -4762,7 +4762,25 @@ max_slew_check_slack() { cmdLinkedNetwork(); Sta *sta = Sta::sta(); - return sta->units()->timeUnit()->staToUser(sta->maxSlewCheckSlack()); + Pin *pin; + Slew slew; + float slack; + float limit; + sta->maxSlewCheck(pin, slew, slack, limit); + return sta->units()->timeUnit()->staToUser(slack); +} + +float +max_slew_check_limit() +{ + cmdLinkedNetwork(); + Sta *sta = Sta::sta(); + Pin *pin; + Slew slew; + float slack; + float limit; + sta->maxSlewCheck(pin, slew, slack, limit); + return sta->units()->timeUnit()->staToUser(limit); } void @@ -4809,7 +4827,26 @@ float max_fanout_check_slack() { cmdLinkedNetwork(); - return Sta::sta()->maxFanoutCheckSlack(); + Sta *sta = Sta::sta(); + Pin *pin; + float fanout; + float slack; + float limit; + sta->maxFanoutCheck(pin, fanout, slack, limit); + return slack;; +} + +float +max_fanout_check_limit() +{ + cmdLinkedNetwork(); + Sta *sta = Sta::sta(); + Pin *pin; + float fanout; + float slack; + float limit; + sta->maxFanoutCheck(pin, fanout, slack, limit); + return limit;; } void @@ -4856,7 +4893,25 @@ max_capacitance_check_slack() { cmdLinkedNetwork(); Sta *sta = Sta::sta(); - return sta->units()->capacitanceUnit()->staToUser(sta->maxCapacitanceCheckSlack()); + Pin *pin; + float capacitance; + float slack; + float limit; + sta->maxCapacitanceCheck(pin, capacitance, slack, limit); + return sta->units()->capacitanceUnit()->staToUser(slack); +} + +float +max_capacitance_check_limit() +{ + cmdLinkedNetwork(); + Sta *sta = Sta::sta(); + Pin *pin; + float capacitance; + float slack; + float limit; + sta->maxCapacitanceCheck(pin, capacitance, slack, limit); + return sta->units()->capacitanceUnit()->staToUser(limit); } void