mirror of
https://github.com/The-OpenROAD-Project/OpenSTA.git
synced 2026-05-30 00:24:12 +08:00
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:
@@ -49,7 +49,7 @@ set_delay_calculator_cmd(const char *alg)
|
||||
void
|
||||
set_delay_calc_incremental_tolerance(float tol)
|
||||
{
|
||||
sta::Sta::sta()->setIncrementalDelayTolerance(tol);
|
||||
Sta::sta()->setIncrementalDelayTolerance(tol);
|
||||
}
|
||||
|
||||
string
|
||||
|
||||
@@ -580,16 +580,17 @@ GraphDelayCalc::findVertexDelay(Vertex *vertex,
|
||||
if (network_->isLeaf(pin)) {
|
||||
if (vertex->isDriver(network_)) {
|
||||
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);
|
||||
if (propagate) {
|
||||
if (network_->direction(pin)->isInternal())
|
||||
enqueueTimingChecksEdges(vertex);
|
||||
bool load_slews_changed = loadSlewsChanged(prev_load_slews,
|
||||
load_pin_index_map);
|
||||
// Enqueue adjacent vertices even if the load slews did not
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
@@ -621,19 +622,15 @@ GraphDelayCalc::loadSlews(LoadPinIndexMap &load_pin_index_map)
|
||||
}
|
||||
|
||||
bool
|
||||
GraphDelayCalc::loadSlewsChanged(DrvrLoadSlews &prev_load_slews,
|
||||
GraphDelayCalc::loadSlewsChanged(DrvrLoadSlews &load_slews_prev,
|
||||
LoadPinIndexMap &load_pin_index_map)
|
||||
{
|
||||
for (auto const [pin, index] : load_pin_index_map) {
|
||||
Vertex *load_vertex = graph_->pinLoadVertex(pin);
|
||||
const SlewSeq load_slews = graph_->slews(load_vertex);
|
||||
const SlewSeq &prev_slews = prev_load_slews[index];
|
||||
for (size_t i = 0; i < load_slews.size(); i++) {
|
||||
const Slew &slew = delayAsFloat(load_slews[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_))
|
||||
const SlewSeq slews = graph_->slews(load_vertex);
|
||||
const SlewSeq &slews_prev = load_slews_prev[index];
|
||||
for (size_t i = 0; i < slews.size(); i++) {
|
||||
if (!delayEqual(slews[i], slews_prev[i]))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1112,9 +1109,10 @@ GraphDelayCalc::annotateDelaySlew(Edge *edge,
|
||||
float prev_gate_delay1 = delayAsFloat(prev_gate_delay);
|
||||
if (prev_gate_delay1 == 0.0
|
||||
|| (abs(gate_delay1 - prev_gate_delay1) / prev_gate_delay1
|
||||
> incremental_delay_tolerance_))
|
||||
> incremental_delay_tolerance_)) {
|
||||
delay_changed = true;
|
||||
graph_->setArcDelay(edge, arc, ap_index, gate_delay);
|
||||
graph_->setArcDelay(edge, arc, ap_index, gate_delay);
|
||||
}
|
||||
}
|
||||
return delay_changed;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user