TimingArc::intrinsicDelay, driveResistance
This commit is contained in:
parent
c2d66ac62a
commit
b0f0de488f
|
|
@ -258,6 +258,8 @@ public:
|
||||||
TimingArc *cornerArc(int ap_index);
|
TimingArc *cornerArc(int ap_index);
|
||||||
void setCornerArc(TimingArc *corner_arc,
|
void setCornerArc(TimingArc *corner_arc,
|
||||||
int ap_index);
|
int ap_index);
|
||||||
|
float driveResistance() const;
|
||||||
|
float intrinsicDelay() const;
|
||||||
|
|
||||||
static bool equiv(const TimingArc *arc1,
|
static bool equiv(const TimingArc *arc1,
|
||||||
const TimingArc *arc2);
|
const TimingArc *arc2);
|
||||||
|
|
|
||||||
|
|
@ -2011,11 +2011,10 @@ LibertyPort::driveResistance(const RiseFall *rf,
|
||||||
TimingArc *arc = arc_iter.next();
|
TimingArc *arc = arc_iter.next();
|
||||||
if (rf == nullptr
|
if (rf == nullptr
|
||||||
|| arc->toTrans()->asRiseFall() == rf) {
|
|| arc->toTrans()->asRiseFall() == rf) {
|
||||||
GateTimingModel *model = dynamic_cast<GateTimingModel*>(arc->model());
|
float drive = arc->driveResistance();
|
||||||
if (model) {
|
if (drive > 0.0) {
|
||||||
float drive = model->driveResistance(liberty_cell_, nullptr);
|
if (min_max->compare(drive, max_drive))
|
||||||
if (min_max->compare(drive, max_drive))
|
max_drive = drive;
|
||||||
max_drive = drive;
|
|
||||||
found_drive = true;
|
found_drive = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2049,18 +2048,13 @@ LibertyPort::intrinsicDelay(const RiseFall *rf,
|
||||||
TimingArc *arc = arc_iter.next();
|
TimingArc *arc = arc_iter.next();
|
||||||
if (rf == nullptr
|
if (rf == nullptr
|
||||||
|| arc->toTrans()->asRiseFall() == rf) {
|
|| arc->toTrans()->asRiseFall() == rf) {
|
||||||
GateTimingModel *model = dynamic_cast<GateTimingModel*>(arc->model());
|
float delay = arc->intrinsicDelay();
|
||||||
if (model) {
|
if (delay > 0.0) {
|
||||||
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);
|
|
||||||
if (min_max->compare(delay, max_delay))
|
if (min_max->compare(delay, max_delay))
|
||||||
max_delay = delay;
|
max_delay = delay;
|
||||||
found_delay = true;
|
found_delay = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -134,6 +134,34 @@ TimingArcAttrs::setOcvArcDepth(float depth)
|
||||||
ocv_arc_depth_ = 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;
|
TimingArcSet *TimingArcSet::wire_timing_arc_set_ = nullptr;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue