1818#include " ord/Tech.h"
1919#include " rsz/Resizer.hh"
2020#include " sta/Clock.hh"
21- #include " sta/Corner.hh"
2221#include " sta/DelayFloat.hh"
2322#include " sta/Graph.hh"
2423#include " sta/Liberty.hh"
2524#include " sta/LibertyClass.hh"
2625#include " sta/MinMax.hh"
26+ #include " sta/Mode.hh"
2727#include " sta/PowerClass.hh"
28+ #include " sta/Scene.hh"
2829#include " sta/SdcClass.hh"
2930#include " sta/Search.hh"
3031#include " sta/TimingArc.hh"
@@ -79,15 +80,8 @@ bool Timing::isEndpoint(sta::Pin* sta_pin)
7980float Timing::slewAllCorners (sta::Vertex* vertex, const sta::MinMax* minmax)
8081{
8182 auto sta = getSta ();
82- bool max = (minmax == sta::MinMax::max ());
83- float slew = (max) ? -sta::INF : sta::INF;
84- float slew_corner;
85- for (auto corner : getCorners ()) {
86- slew_corner = sta::delayAsFloat (
87- sta->vertexSlew (vertex, sta::RiseFall::rise (), corner, minmax));
88- slew = (max) ? std::max (slew, slew_corner) : std::min (slew, slew_corner);
89- }
90- return slew;
83+ return sta::delayAsFloat (
84+ sta->slew (vertex, sta::RiseFallBoth::riseFall (), sta->scenes (), minmax));
9185}
9286
9387float Timing::getPinSlew (odb::dbITerm* db_pin, MinMax minmax)
@@ -145,24 +139,6 @@ std::array<sta::Vertex*, 2> Timing::vertices(const sta::Pin* pin)
145139 return vertices;
146140}
147141
148- std::vector<float > Timing::arrivalsClk (const sta::RiseFall* rf,
149- sta::Clock* clk,
150- const sta::RiseFall* clk_rf,
151- sta::Vertex* vertex)
152- {
153- auto sta = getSta ();
154- std::vector<float > arrivals;
155- const sta::ClockEdge* clk_edge = nullptr ;
156- if (clk) {
157- clk_edge = clk->edge (clk_rf);
158- }
159- for (auto path_ap : sta->corners ()->pathAnalysisPts ()) {
160- arrivals.push_back (sta::delayAsFloat (
161- sta->vertexArrival (vertex, rf, clk_edge, path_ap, nullptr )));
162- }
163- return arrivals;
164- }
165-
166142bool Timing::isTimeInf (float time)
167143{
168144 return (time > 1e+10 || time < -1e+10 );
@@ -171,16 +147,15 @@ bool Timing::isTimeInf(float time)
171147float Timing::getPinArrivalTime (sta::Clock* clk,
172148 const sta::RiseFall* clk_rf,
173149 sta::Vertex* vertex,
174- const sta::RiseFall* arrive_hold )
150+ const sta::RiseFall* rf )
175151{
176- std::vector<float > times = arrivalsClk (arrive_hold, clk, clk_rf, vertex);
177- float delay = -sta::INF;
178- for (float delay_time : times) {
179- if (!isTimeInf (delay_time)) {
180- delay = std::max (delay, delay_time);
181- }
152+ sta::dbSta* sta = getSta ();
153+ if (clk) {
154+ return sta::delayAsFloat (sta->arrival (
155+ vertex, rf, clk->edge (clk_rf), sta->scenes (), sta::MinMax::max ()));
182156 }
183- return delay;
157+ return sta::delayAsFloat (sta->arrival (
158+ vertex, rf->asRiseFallBoth (), sta->scenes (), sta::MinMax::max ()));
184159}
185160
186161sta::ClockSeq Timing::findClocksMatching (const char * pattern,
@@ -190,7 +165,7 @@ sta::ClockSeq Timing::findClocksMatching(const char* pattern,
190165 auto sta = getSta ();
191166 cmdLinkedNetwork ();
192167 sta::PatternMatch matcher (pattern, regexp, nocase, sta->tclInterp ());
193- return sta->sdc ()->findClocksMatching (&matcher);
168+ return sta->cmdMode ()-> sdc ()->findClocksMatching (&matcher);
194169}
195170
196171float Timing::getPinArrival (odb::dbITerm* db_pin, RiseFall rf, MinMax minmax)
@@ -212,7 +187,8 @@ float Timing::getPinArrival(sta::Pin* sta_pin, RiseFall rf, MinMax minmax)
212187 auto vertex_array = vertices (sta_pin);
213188 float delay = (minmax == Max) ? -sta::INF : sta::INF;
214189 float d1, d2;
215- sta::Clock* default_arrival_clock = getSta ()->sdc ()->defaultArrivalClock ();
190+ sta::Clock* default_arrival_clock
191+ = getSta ()->cmdMode ()->sdc ()->defaultArrivalClock ();
216192 for (auto vertex : vertex_array) {
217193 if (vertex == nullptr ) {
218194 continue ;
@@ -234,21 +210,21 @@ float Timing::getPinArrival(sta::Pin* sta_pin, RiseFall rf, MinMax minmax)
234210 return delay;
235211}
236212
237- std::vector<sta::Corner *> Timing::getCorners ()
213+ std::vector<sta::Scene *> Timing::getCorners ()
238214{
239- sta::Corners* corners = getSta ()->corners ();
240- return {corners-> begin (), corners-> end ()};
215+ auto & corners = getSta ()->scenes ();
216+ return {corners. begin (), corners. end ()};
241217}
242218
243- sta::Corner * Timing::cmdCorner ()
219+ sta::Scene * Timing::cmdCorner ()
244220{
245- return getSta ()->cmdCorner ();
221+ return getSta ()->cmdScene ();
246222}
247223
248- sta::Corner * Timing::findCorner (const char * name)
224+ sta::Scene * Timing::findCorner (const char * name)
249225{
250226 for (auto * corner : getCorners ()) {
251- if (strcmp (corner->name (), name) == 0 ) {
227+ if (strcmp (corner->name (). c_str () , name) == 0 ) {
252228 return corner;
253229 }
254230 }
@@ -274,7 +250,8 @@ float Timing::getPinSlack(sta::Pin* sta_pin, RiseFall rf, MinMax minmax)
274250{
275251 sta::dbSta* sta = getSta ();
276252 auto sta_rf = (rf == Rise) ? sta::RiseFall::rise () : sta::RiseFall::fall ();
277- return sta->pinSlack (sta_pin, sta_rf, getMinMax (minmax));
253+ return sta->slack (
254+ sta_pin, sta_rf->asRiseFallBoth (), sta->scenes (), getMinMax (minmax));
278255}
279256
280257// I'd like to return a std::set but swig gave me way too much grief
@@ -319,7 +296,7 @@ const sta::MinMax* Timing::getMinMax(MinMax type)
319296 return type == Max ? sta::MinMax::max () : sta::MinMax::min ();
320297}
321298
322- float Timing::getNetCap (odb::dbNet* net, sta::Corner * corner, MinMax minmax)
299+ float Timing::getNetCap (odb::dbNet* net, sta::Scene * corner, MinMax minmax)
323300{
324301 sta::dbSta* sta = getSta ();
325302 sta::Net* sta_net = sta->getDbNetwork ()->dbToSta (net);
@@ -330,7 +307,7 @@ float Timing::getNetCap(odb::dbNet* net, sta::Corner* corner, MinMax minmax)
330307 return pin_cap + wire_cap;
331308}
332309
333- float Timing::getPortCap (odb::dbITerm* pin, sta::Corner * corner, MinMax minmax)
310+ float Timing::getPortCap (odb::dbITerm* pin, sta::Scene * corner, MinMax minmax)
334311{
335312 sta::dbSta* sta = getSta ();
336313 sta::dbNetwork* network = sta->getDbNetwork ();
@@ -375,7 +352,7 @@ float Timing::getMaxSlewLimit(odb::dbMTerm* pin)
375352 return max_slew;
376353}
377354
378- float Timing::staticPower (odb::dbInst* inst, sta::Corner * corner)
355+ float Timing::staticPower (odb::dbInst* inst, sta::Scene * corner)
379356{
380357 sta::dbSta* sta = getSta ();
381358 sta::dbNetwork* network = sta->getDbNetwork ();
@@ -388,7 +365,7 @@ float Timing::staticPower(odb::dbInst* inst, sta::Corner* corner)
388365 return power.leakage ();
389366}
390367
391- float Timing::dynamicPower (odb::dbInst* inst, sta::Corner * corner)
368+ float Timing::dynamicPower (odb::dbInst* inst, sta::Scene * corner)
392369{
393370 sta::dbSta* sta = getSta ();
394371 sta::dbNetwork* network = sta->getDbNetwork ();
0 commit comments