dcalc tolerance
commit 5bdb9a754899cef13d6976e27b619b885fd85e23
Author: James Cherry <cherry@parallaxsw.com>
Date: Wed Dec 18 08:56:03 2024 -0700
dcalc tolerance
Signed-off-by: James Cherry <cherry@parallaxsw.com>
commit 1f2d9b9b62d322a257ec10f33f172a2050369ed9
Author: James Cherry <cherry@parallaxsw.com>
Date: Tue Dec 17 16:27:55 2024 -0700
GraphDelayCalc::findVertexDelay refactor
Signed-off-by: James Cherry <cherry@parallaxsw.com>
commit 344df7b3e6ae746f8977c3397713972e347d8054
Author: James Cherry <cherry@parallaxsw.com>
Date: Tue Dec 17 11:37:08 2024 -0700
GraphDelayCalc::loadSlewsChanged optimization
Signed-off-by: James Cherry <cherry@parallaxsw.com>
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
fded1f247d
commit
ec009543d5
|
|
@ -49,7 +49,7 @@ set_delay_calculator_cmd(const char *alg)
|
||||||
void
|
void
|
||||||
set_delay_calc_incremental_tolerance(float tol)
|
set_delay_calc_incremental_tolerance(float tol)
|
||||||
{
|
{
|
||||||
sta::Sta::sta()->setIncrementalDelayTolerance(tol);
|
Sta::sta()->setIncrementalDelayTolerance(tol);
|
||||||
}
|
}
|
||||||
|
|
||||||
string
|
string
|
||||||
|
|
|
||||||
|
|
@ -580,16 +580,17 @@ GraphDelayCalc::findVertexDelay(Vertex *vertex,
|
||||||
if (network_->isLeaf(pin)) {
|
if (network_->isLeaf(pin)) {
|
||||||
if (vertex->isDriver(network_)) {
|
if (vertex->isDriver(network_)) {
|
||||||
LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(vertex);
|
LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(vertex);
|
||||||
DrvrLoadSlews prev_load_slews = loadSlews(load_pin_index_map);
|
DrvrLoadSlews load_slews_prev;
|
||||||
|
if (incremental_)
|
||||||
|
load_slews_prev = loadSlews(load_pin_index_map);
|
||||||
findDriverDelays(vertex, arc_delay_calc, load_pin_index_map);
|
findDriverDelays(vertex, arc_delay_calc, load_pin_index_map);
|
||||||
if (propagate) {
|
if (propagate) {
|
||||||
if (network_->direction(pin)->isInternal())
|
if (network_->direction(pin)->isInternal())
|
||||||
enqueueTimingChecksEdges(vertex);
|
enqueueTimingChecksEdges(vertex);
|
||||||
bool load_slews_changed = loadSlewsChanged(prev_load_slews,
|
|
||||||
load_pin_index_map);
|
|
||||||
// Enqueue adjacent vertices even if the load slews did not
|
// Enqueue adjacent vertices even if the load slews did not
|
||||||
// change when non-incremental to stride past annotations.
|
// change when non-incremental to stride past annotations.
|
||||||
if (load_slews_changed || !incremental_)
|
if (!incremental_
|
||||||
|
|| loadSlewsChanged(load_slews_prev, load_pin_index_map))
|
||||||
iter_->enqueueAdjacentVertices(vertex);
|
iter_->enqueueAdjacentVertices(vertex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -621,19 +622,15 @@ GraphDelayCalc::loadSlews(LoadPinIndexMap &load_pin_index_map)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
GraphDelayCalc::loadSlewsChanged(DrvrLoadSlews &prev_load_slews,
|
GraphDelayCalc::loadSlewsChanged(DrvrLoadSlews &load_slews_prev,
|
||||||
LoadPinIndexMap &load_pin_index_map)
|
LoadPinIndexMap &load_pin_index_map)
|
||||||
{
|
{
|
||||||
for (auto const [pin, index] : load_pin_index_map) {
|
for (auto const [pin, index] : load_pin_index_map) {
|
||||||
Vertex *load_vertex = graph_->pinLoadVertex(pin);
|
Vertex *load_vertex = graph_->pinLoadVertex(pin);
|
||||||
const SlewSeq load_slews = graph_->slews(load_vertex);
|
const SlewSeq slews = graph_->slews(load_vertex);
|
||||||
const SlewSeq &prev_slews = prev_load_slews[index];
|
const SlewSeq &slews_prev = load_slews_prev[index];
|
||||||
for (size_t i = 0; i < load_slews.size(); i++) {
|
for (size_t i = 0; i < slews.size(); i++) {
|
||||||
const Slew &slew = delayAsFloat(load_slews[i]);
|
if (!delayEqual(slews[i], slews_prev[i]))
|
||||||
const Slew &prev_slew = delayAsFloat(prev_slews[i]);
|
|
||||||
if ((prev_slew == 0.0 && slew != 0.0)
|
|
||||||
|| (prev_slew != 0.0
|
|
||||||
&& abs((slew - prev_slew) / prev_slew) > incremental_delay_tolerance_))
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1112,10 +1109,11 @@ GraphDelayCalc::annotateDelaySlew(Edge *edge,
|
||||||
float prev_gate_delay1 = delayAsFloat(prev_gate_delay);
|
float prev_gate_delay1 = delayAsFloat(prev_gate_delay);
|
||||||
if (prev_gate_delay1 == 0.0
|
if (prev_gate_delay1 == 0.0
|
||||||
|| (abs(gate_delay1 - prev_gate_delay1) / prev_gate_delay1
|
|| (abs(gate_delay1 - prev_gate_delay1) / prev_gate_delay1
|
||||||
> incremental_delay_tolerance_))
|
> incremental_delay_tolerance_)) {
|
||||||
delay_changed = true;
|
delay_changed = true;
|
||||||
graph_->setArcDelay(edge, arc, ap_index, gate_delay);
|
graph_->setArcDelay(edge, arc, ap_index, gate_delay);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return delay_changed;
|
return delay_changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -395,9 +395,7 @@ PrevPathVisitor::visitFromToPath(const Pin *,
|
||||||
PathAPIndex path_ap_index = path_ap->index();
|
PathAPIndex path_ap_index = path_ap->index();
|
||||||
if (to_rf->index() == path_rf_index_
|
if (to_rf->index() == path_rf_index_
|
||||||
&& path_ap_index == path_ap_index_
|
&& path_ap_index == path_ap_index_
|
||||||
&& (dcalc_tol_ > 0.0
|
&& delayEqual(to_arrival, path_arrival_)
|
||||||
? std::abs(delayAsFloat(to_arrival - path_arrival_)) < dcalc_tol_
|
|
||||||
: delayEqual(to_arrival, path_arrival_))
|
|
||||||
&& (tagMatch(to_tag, path_tag_, this)
|
&& (tagMatch(to_tag, path_tag_, this)
|
||||||
// If the filter exception became active searching from
|
// If the filter exception became active searching from
|
||||||
// from_path to to_path the tag includes the filter, but
|
// from_path to to_path the tag includes the filter, but
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue