diff --git a/dcalc/DcalcAnalysisPt.cc b/dcalc/DcalcAnalysisPt.cc index 2dfb635a..518edd4e 100644 --- a/dcalc/DcalcAnalysisPt.cc +++ b/dcalc/DcalcAnalysisPt.cc @@ -54,7 +54,7 @@ DcalcAnalysisPt::setCheckClkSlewIndex(DcalcAPIndex index) int DcalcAnalysisPt::libertyIndex() const { - return index_; // same for now + return corner_->libertyIndex(min_max_); } } // namespace diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 1f887d5b..35eea33a 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -951,6 +951,11 @@ public: const MinMax *min_max); PathRef vertexWorstArrivalPath(Vertex *vertex, const MinMax *min_max); + PathRef vertexWorstRequiredPath(Vertex *vertex, + const RiseFall *rf, + const MinMax *min_max); + PathRef vertexWorstRequiredPath(Vertex *vertex, + const MinMax *min_max); PathRef vertexWorstSlackPath(Vertex *vertex, const MinMax *min_max); PathRef vertexWorstSlackPath(Vertex *vertex, diff --git a/search/Sta.cc b/search/Sta.cc index 727be7e0..359a3f4d 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2677,6 +2677,13 @@ Sta::vertexPathIterator(Vertex *vertex, return new VertexPathIterator(vertex, rf, min_max, this); } +PathRef +Sta::vertexWorstArrivalPath(Vertex *vertex, + const MinMax *min_max) +{ + return vertexWorstArrivalPath(vertex, nullptr, min_max); +} + PathRef Sta::vertexWorstArrivalPath(Vertex *vertex, const RiseFall *rf, @@ -2698,10 +2705,31 @@ Sta::vertexWorstArrivalPath(Vertex *vertex, } PathRef -Sta::vertexWorstArrivalPath(Vertex *vertex, - const MinMax *min_max) +Sta::vertexWorstRequiredPath(Vertex *vertex, + const MinMax *min_max) { - return vertexWorstArrivalPath(vertex, nullptr, min_max); + return vertexWorstRequiredPath(vertex, nullptr, min_max); +} + +PathRef +Sta::vertexWorstRequiredPath(Vertex *vertex, + const RiseFall *rf, + const MinMax *min_max) +{ + PathRef worst_path; + const MinMax *req_min_max = min_max->opposite(); + Arrival worst_req = req_min_max->initValue(); + VertexPathIterator path_iter(vertex, rf, min_max, this); + while (path_iter.hasNext()) { + PathVertex *path = path_iter.next(); + const Required path_req = path->required(this); + if (!path->tag(this)->isGenClkSrcPath() + && delayGreater(path_req, worst_req, req_min_max, this)) { + worst_req = path_req; + worst_path.init(path); + } + } + return worst_path; } PathRef