From e6dd98f0bae4c8006392d3e0b8e2058cb04926d3 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 23 Mar 2023 18:26:32 -0700 Subject: [PATCH] pin arrival properties Signed-off-by: James Cherry --- include/sta/Sta.hh | 6 +++++- search/Property.cc | 24 ++++++++++++++++++++++++ search/Sta.cc | 41 ++++++++++++++++++++++++----------------- tcl/StaTcl.i | 4 ++-- 4 files changed, 55 insertions(+), 20 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 9ae4a6f2..36bd2ef4 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -999,13 +999,17 @@ public: Arrival vertexArrival(Vertex *vertex, const RiseFall *rf, const ClockEdge *clk_edge, - const PathAnalysisPt *path_ap); + const PathAnalysisPt *path_ap, + const MinMax *min_max); // Min/max across all clock tags. Arrival vertexArrival(Vertex *vertex, const RiseFall *rf, const PathAnalysisPt *path_ap); Arrival vertexArrival(Vertex *vertex, const MinMax *min_max); + Arrival pinArrival(const Pin *pin, + const RiseFall *rf, + const MinMax *min_max); Required vertexRequired(Vertex *vertex, const MinMax *min_max); Required vertexRequired(Vertex *vertex, diff --git a/search/Property.cc b/search/Property.cc index cdc39d11..8abc350c 100644 --- a/search/Property.cc +++ b/search/Property.cc @@ -48,6 +48,11 @@ pinSlewProperty(const Pin *pin, const MinMax *min_max, Sta *sta); static PropertyValue +pinArrivalProperty(const Pin *pin, + const RiseFall *rf, + const MinMax *min_max, + Sta *sta); +static PropertyValue pinSlackProperty(const Pin *pin, const MinMax *min_max, Sta *sta); @@ -882,6 +887,15 @@ getProperty(const Pin *pin, return PropertyValue(&activity); } + else if (stringEqual(property, "arrival_max_rise")) + return pinArrivalProperty(pin, RiseFall::rise(), MinMax::max(), sta); + else if (stringEqual(property, "arrival_max_fall")) + return pinArrivalProperty(pin, RiseFall::fall(), MinMax::max(), sta); + else if (stringEqual(property, "arrival_min_rise")) + return pinArrivalProperty(pin, RiseFall::rise(), MinMax::min(), sta); + else if (stringEqual(property, "arrival_min_fall")) + return pinArrivalProperty(pin, RiseFall::fall(), MinMax::min(), sta); + else if (stringEqual(property, "slack_max")) return pinSlackProperty(pin, MinMax::max(), sta); else if (stringEqual(property, "slack_max_fall")) @@ -912,6 +926,16 @@ getProperty(const Pin *pin, throw PropertyUnknown("pin", property); } +static PropertyValue +pinArrivalProperty(const Pin *pin, + const RiseFall *rf, + const MinMax *min_max, + Sta *sta) +{ + Arrival arrival = sta->pinArrival(pin, rf, min_max);; + return PropertyValue(delayPropertyValue(arrival, sta)); +} + static PropertyValue pinSlackProperty(const Pin *pin, const MinMax *min_max, diff --git a/search/Sta.cc b/search/Sta.cc index e7fb9e01..0e9d4904 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2803,42 +2803,49 @@ Sta::vertexWorstSlackPath(Vertex *vertex, } Arrival -Sta::vertexArrival(Vertex *vertex, - const MinMax *min_max) +Sta::pinArrival(const Pin *pin, + const RiseFall *rf, + const MinMax *min_max) { - searchPreamble(); - search_->findArrivals(vertex->level()); - Arrival arrival = min_max->initValue(); - VertexPathIterator path_iter(vertex, this); - while (path_iter.hasNext()) { - Path *path = path_iter.next(); - const Arrival &path_arrival = path->arrival(this); - ClkInfo *clk_info = path->clkInfo(search_); - if (path->minMax(this) == min_max - && !clk_info->isGenClkSrcPath() - && delayGreater(path->arrival(this), arrival, min_max, this)) - arrival = path_arrival; + Vertex *vertex, *bidirect_vertex; + graph_->pinVertices(pin, vertex, bidirect_vertex); + Arrival arrival; + if (vertex) + arrival = vertexArrival(vertex, rf, clk_edge_wildcard, nullptr, min_max); + if (bidirect_vertex) { + Arrival arrival1 = vertexArrival(bidirect_vertex, rf, clk_edge_wildcard, + nullptr, min_max); + arrival = min_max->minMax(arrival, arrival1); } return arrival; } +Arrival +Sta::vertexArrival(Vertex *vertex, + const MinMax *min_max) +{ + return vertexArrival(vertex, nullptr, nullptr, nullptr, min_max); +} + Arrival Sta::vertexArrival(Vertex *vertex, const RiseFall *rf, const PathAnalysisPt *path_ap) { - return vertexArrival(vertex, rf, clk_edge_wildcard, path_ap); + return vertexArrival(vertex, rf, clk_edge_wildcard, path_ap, nullptr); } Arrival Sta::vertexArrival(Vertex *vertex, const RiseFall *rf, const ClockEdge *clk_edge, - const PathAnalysisPt *path_ap) + const PathAnalysisPt *path_ap, + const MinMax *min_max) { searchPreamble(); search_->findArrivals(vertex->level()); - const MinMax *min_max = path_ap->pathMinMax(); + if (min_max == nullptr) + min_max = path_ap->pathMinMax(); Arrival arrival = min_max->initValue(); VertexPathIterator path_iter(vertex, rf, path_ap, this); while (path_iter.hasNext()) { diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index c6442943..5cf93c41 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -5917,7 +5917,7 @@ arrivals_clk(const RiseFall *rf, clk_edge = clk->edge(clk_rf); for (auto path_ap : sta->corners()->pathAnalysisPts()) { arrivals.push_back(delayAsFloat(sta->vertexArrival(self, rf, clk_edge, - path_ap))); + path_ap, nullptr))); } return arrivals; } @@ -5935,7 +5935,7 @@ arrivals_clk_delays(const RiseFall *rf, clk_edge = clk->edge(clk_rf); for (auto path_ap : sta->corners()->pathAnalysisPts()) { arrivals.push_back(delayAsString(sta->vertexArrival(self, rf, clk_edge, - path_ap), + path_ap, nullptr), sta, digits)); } return arrivals;