diff --git a/include/sta/TimingArc.hh b/include/sta/TimingArc.hh index 00cea66b..0deb1d4a 100644 --- a/include/sta/TimingArc.hh +++ b/include/sta/TimingArc.hh @@ -258,6 +258,8 @@ public: TimingArc *cornerArc(int ap_index); void setCornerArc(TimingArc *corner_arc, int ap_index); + float driveResistance() const; + float intrinsicDelay() const; static bool equiv(const TimingArc *arc1, const TimingArc *arc2); diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 4b0f8d16..91754417 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -2011,11 +2011,10 @@ LibertyPort::driveResistance(const RiseFall *rf, TimingArc *arc = arc_iter.next(); if (rf == nullptr || arc->toTrans()->asRiseFall() == rf) { - GateTimingModel *model = dynamic_cast(arc->model()); - if (model) { - float drive = model->driveResistance(liberty_cell_, nullptr); - if (min_max->compare(drive, max_drive)) - max_drive = drive; + float drive = arc->driveResistance(); + if (drive > 0.0) { + if (min_max->compare(drive, max_drive)) + max_drive = drive; found_drive = true; } } @@ -2049,18 +2048,13 @@ LibertyPort::intrinsicDelay(const RiseFall *rf, TimingArc *arc = arc_iter.next(); if (rf == nullptr || arc->toTrans()->asRiseFall() == rf) { - GateTimingModel *model = dynamic_cast(arc->model()); - if (model) { - ArcDelay arc_delay; - Slew slew; - model->gateDelay(liberty_cell_, nullptr, 0.0, 0.0, 0.0, false, - arc_delay, slew); - float delay = delayAsFloat(arc_delay); + float delay = arc->intrinsicDelay(); + if (delay > 0.0) { if (min_max->compare(delay, max_delay)) max_delay = delay; found_delay = true; } - } + } } } } diff --git a/liberty/TimingArc.cc b/liberty/TimingArc.cc index 55a3d4f9..92d6396d 100644 --- a/liberty/TimingArc.cc +++ b/liberty/TimingArc.cc @@ -134,6 +134,34 @@ TimingArcAttrs::setOcvArcDepth(float depth) ocv_arc_depth_ = depth; } +float +TimingArc::driveResistance() const +{ + GateTimingModel *model = dynamic_cast(model_); + if (model) { + LibertyCell *cell = set_->libertyCell(); + return model->driveResistance(cell, nullptr); + } + else + return 0.0; +} + +float +TimingArc::intrinsicDelay() const +{ + GateTimingModel *model = dynamic_cast(model_); + if (model) { + LibertyCell *cell = set_->libertyCell(); + ArcDelay arc_delay; + Slew slew; + model->gateDelay(cell, nullptr, 0.0, 0.0, 0.0, false, + arc_delay, slew); + return arc_delay; + } + else + return 0.0; +} + //////////////////////////////////////////////////////////////// TimingArcSet *TimingArcSet::wire_timing_arc_set_ = nullptr;