diff --git a/search/Sta.cc b/search/Sta.cc index efbae24c..a46cd4b5 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2728,6 +2728,25 @@ Sta::vertexArrival(Vertex *vertex, return arrival; } +Required +Sta::vertexRequired(Vertex *vertex, + const MinMax *min_max) +{ + findRequired(vertex); + const MinMax *req_min_max = min_max->opposite(); + Required required = req_min_max->initValue(); + VertexPathIterator path_iter(vertex, this); + while (path_iter.hasNext()) { + const Path *path = path_iter.next(); + if (path->minMax(this) == min_max) { + const Required path_required = path->required(this); + if (fuzzyGreater(path_required, required, req_min_max)) + required = path_required; + } + } + return required; +} + Required Sta::vertexRequired(Vertex *vertex, const TransRiseFall *tr, diff --git a/search/Sta.hh b/search/Sta.hh index cf978e87..5884b6b8 100644 --- a/search/Sta.hh +++ b/search/Sta.hh @@ -976,13 +976,15 @@ public: const TransRiseFall *tr, const PathAnalysisPt *path_ap); Required vertexRequired(Vertex *vertex, - const TransRiseFall *tr, - const ClockEdge *clk_edge, - const PathAnalysisPt *path_ap); + const MinMax *min_max); // Min/max across all clock tags. Required vertexRequired(Vertex *vertex, const TransRiseFall *tr, const PathAnalysisPt *path_ap); + Required vertexRequired(Vertex *vertex, + const TransRiseFall *tr, + const ClockEdge *clk_edge, + const PathAnalysisPt *path_ap); Slack pinSlack(const Pin *pin, const TransRiseFall *tr, const MinMax *min_max); @@ -1131,8 +1133,10 @@ public: void setTclInterp(Tcl_Interp *interp); Tcl_Interp *tclInterp(); + void ensureLevelized(); // Ensure that the timing graph has been built. Graph *ensureGraph(); + void ensureClkArrivals(); Corner *cmdCorner() const; void setCmdCorner(Corner *corner); Corner *findCorner(const char *corner_name); @@ -1230,8 +1234,6 @@ protected: virtual LibertyLibrary *readLibertyFile(const char *filename, bool infer_latches, Network *network); - void ensureLevelized(); - void ensureClkArrivals(); void delayCalcPreamble(); void delaysInvalidFrom(Port *port); void delaysInvalidFromFanin(Port *port);