TimingArc::intrinsicDelay, driveResistance

This commit is contained in:
James Cherry 2020-11-20 09:16:14 -07:00
parent c2d66ac62a
commit b0f0de488f
3 changed files with 37 additions and 13 deletions

View File

@ -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);

View File

@ -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<GateTimingModel*>(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<GateTimingModel*>(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;
}
}
}
}
}
}

View File

@ -134,6 +134,34 @@ TimingArcAttrs::setOcvArcDepth(float depth)
ocv_arc_depth_ = depth;
}
float
TimingArc::driveResistance() const
{
GateTimingModel *model = dynamic_cast<GateTimingModel*>(model_);
if (model) {
LibertyCell *cell = set_->libertyCell();
return model->driveResistance(cell, nullptr);
}
else
return 0.0;
}
float
TimingArc::intrinsicDelay() const
{
GateTimingModel *model = dynamic_cast<GateTimingModel*>(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;