pin arrival properties
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
1e4ff7be47
commit
e6dd98f0ba
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue