From 82f06e6ef9460d037cfe53a92dff9bb7d577b2d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= Date: Mon, 14 Jul 2025 12:09:24 +0200 Subject: [PATCH] rsz: Fix driver slew repair after sta change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit STA has relaxed what it means for two cells to be equivalent. They are no longer required to have equivalent arcs. Adjust the slew repair resize code accordingly. Signed-off-by: Martin PoviĊĦer --- src/rsz/src/RepairDesign.cc | 33 +++++++++++++-------------------- src/rsz/src/RepairDesign.hh | 1 - 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/src/rsz/src/RepairDesign.cc b/src/rsz/src/RepairDesign.cc index 6615dfbd7f2..fba2441ba16 100644 --- a/src/rsz/src/RepairDesign.cc +++ b/src/rsz/src/RepairDesign.cc @@ -18,6 +18,7 @@ #include "ResizerObserver.hh" #include "db_sta/dbNetwork.hh" #include "rsz/Resizer.hh" +#include "sta/ClkNetwork.hh" #include "sta/Corner.hh" #include "sta/Fuzzy.hh" #include "sta/Graph.hh" @@ -732,7 +733,6 @@ bool RepairDesign::performGainBuffering(Net* net, void RepairDesign::checkDriverArcSlew(const Corner* corner, const Instance* inst, - const Edge* edge, const TimingArc* arc, float load_cap, float limit, @@ -744,11 +744,15 @@ void RepairDesign::checkDriverArcSlew(const Corner* corner, Pin* in_pin = network_->findPin(inst, arc->from()->name()); if (model && in_pin) { - Vertex* vertex = graph_->pinLoadVertex(in_pin); - // edgeFromSlew returns the graph slew value for the pin, or the ideal - // clock slew if applicable + const bool use_ideal_clk_slew + = arc->set()->role()->genericRole() == TimingRole::regClkToQ() + && clk_network_->isIdealClock(in_pin); Slew in_slew - = graph_delay_calc_->edgeFromSlew(vertex, in_rf, edge, dcalc_ap); + = use_ideal_clk_slew + ? clk_network_->idealClkSlew( + in_pin, in_rf, dcalc_ap->slewMinMax()) + : graph_->slew( + graph_->pinLoadVertex(in_pin), in_rf, dcalc_ap->index()); const Pvt* pvt = dcalc_ap->operatingConditions(); ArcDelay arc_delay; @@ -791,26 +795,15 @@ bool RepairDesign::repairDriverSlew(const Corner* corner, const Pin* drvr_pin) if (limit_exists) { float limit_w_margin = maxSlewMargined(limit); - - VertexInEdgeIterator edge_iter(graph_->pinDrvrVertex(drvr_pin), - graph_); - while (edge_iter.hasNext()) { - Edge* edge = edge_iter.next(); - TimingArcSet* arc_set = edge->timingArcSet(); + for (TimingArcSet* arc_set : size_cell->timingArcSets()) { const TimingRole* role = arc_set->role(); if (!role->isTimingCheck() && role != TimingRole::tristateDisable() && role != TimingRole::tristateEnable() && role != TimingRole::clockTreePathMin() && role != TimingRole::clockTreePathMax()) { - TimingArcSet* size_arc_set = size_cell->findTimingArcSet(arc_set); - for (TimingArc* arc : size_arc_set->arcs()) { - checkDriverArcSlew(corner, - inst, - edge, - arc, - load_cap, - limit_w_margin, - violation); + for (TimingArc* arc : arc_set->arcs()) { + checkDriverArcSlew( + corner, inst, arc, load_cap, limit_w_margin, violation); } } } diff --git a/src/rsz/src/RepairDesign.hh b/src/rsz/src/RepairDesign.hh index d3660996b56..58eb6015866 100644 --- a/src/rsz/src/RepairDesign.hh +++ b/src/rsz/src/RepairDesign.hh @@ -93,7 +93,6 @@ class RepairDesign : dbStaState void checkDriverArcSlew(const Corner* corner, const Instance* inst, - const Edge* edge, const TimingArc* arc, float load_cap, float limit,