diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 02daccfe..4e2025a7 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -878,6 +878,7 @@ public: const Corner *corner, const SetupHold *setup_hold, int digits); + float findWorstClkSkew(const SetupHold *setup_hold); // Header above reportPathEnd results. void reportPathEndHeader(); // Footer below reportPathEnd results. diff --git a/search/ClkSkew.cc b/search/ClkSkew.cc index 4e5bcaf7..2fb37cd2 100644 --- a/search/ClkSkew.cc +++ b/search/ClkSkew.cc @@ -129,11 +129,8 @@ ClkSkews::reportClkSkew(ClockSet *clks, // Sort the clocks to report in a stable order. ClockSeq sorted_clks; - ClockSet::Iterator clk_iter1(clks); - while (clk_iter1.hasNext()) { - Clock *clk = clk_iter1.next(); + for (Clock *clk : *clks) sorted_clks.push_back(clk); - } sort(sorted_clks, ClkNameLess()); Unit *time_unit = units_->timeUnit(); @@ -168,6 +165,25 @@ ClkSkews::reportClkSkew(ClockSet *clks, skews.deleteContents(); } +float +ClkSkews::findWorstClkSkew(const Corner *corner, + const SetupHold *setup_hold) +{ + ClockSet clks; + for (Clock *clk : *sdc_->clocks()) + clks.insert(clk); + float worst_skew = INF; + ClkSkewMap skews; + findClkSkew(&clks, corner, setup_hold, skews); + for (auto clk_skew_itr : skews) { + ClkSkew *clk_skew = clk_skew_itr.second; + float skew = clk_skew->skew(); + if (skew < worst_skew) + worst_skew = skew; + } + return worst_skew; +} + void ClkSkews::findClkSkew(ClockSet *clks, const Corner *corner, diff --git a/search/ClkSkew.hh b/search/ClkSkew.hh index ddffce9a..d13673a9 100644 --- a/search/ClkSkew.hh +++ b/search/ClkSkew.hh @@ -37,6 +37,9 @@ public: const Corner *corner, const SetupHold *setup_hold, int digits); + // Find worst clock skew. + float findWorstClkSkew(const Corner *corner, + const SetupHold *setup_hold); protected: void findClkSkew(ClockSet *clks, diff --git a/search/Sta.cc b/search/Sta.cc index c987e473..262e4193 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2582,6 +2582,15 @@ Sta::reportClkSkew(ClockSet *clks, clk_skews_->reportClkSkew(clks, corner, setup_hold, digits); } +float +Sta::findWorstClkSkew(const SetupHold *setup_hold) +{ + ensureClkArrivals(); + if (clk_skews_ == nullptr) + clk_skews_ = new ClkSkews(this); + return clk_skews_->findWorstClkSkew(cmd_corner_, setup_hold); +} + //////////////////////////////////////////////////////////////// void diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index 26b4ece4..458d2e5e 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -4453,6 +4453,13 @@ report_clk_skew(ClockSet *clks, delete clks; } +float +find_worst_clk_skew(const SetupHold *setup_hold) +{ + cmdLinkedNetwork(); + return Sta::sta()->findWorstClkSkew(setup_hold); +} + TmpPinSet * startpoints() {