power ideal clock slews
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
28ce2c1d45
commit
28bb1f0eec
|
|
@ -651,9 +651,7 @@ Power::findInputInternalPower(const Pin *pin,
|
||||||
float energy = 0.0;
|
float energy = 0.0;
|
||||||
int rf_count = 0;
|
int rf_count = 0;
|
||||||
for (RiseFall *rf : RiseFall::range()) {
|
for (RiseFall *rf : RiseFall::range()) {
|
||||||
float slew = clk_network_->isIdealClock(pin)
|
float slew = getSlew(vertex, rf, corner);
|
||||||
? clk_network_->idealClkSlew(pin, rf, MinMax::max())
|
|
||||||
: delayAsFloat(graph_->slew(vertex, rf, dcalc_ap->index()));
|
|
||||||
if (!delayInf(slew)) {
|
if (!delayInf(slew)) {
|
||||||
float table_energy = pwr->power(rf, pvt, slew, load_cap);
|
float table_energy = pwr->power(rf, pvt, slew, load_cap);
|
||||||
energy += table_energy;
|
energy += table_energy;
|
||||||
|
|
@ -692,6 +690,19 @@ Power::findInputInternalPower(const Pin *pin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
Power::getSlew(Vertex *vertex,
|
||||||
|
const RiseFall *rf,
|
||||||
|
const Corner *corner)
|
||||||
|
{
|
||||||
|
const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(MinMax::max());
|
||||||
|
const Pin *pin = vertex->pin();
|
||||||
|
if (clk_network_->isIdealClock(pin))
|
||||||
|
return clk_network_->idealClkSlew(pin, rf, MinMax::max());
|
||||||
|
else
|
||||||
|
return delayAsFloat(graph_->slew(vertex, rf, dcalc_ap->index()));
|
||||||
|
}
|
||||||
|
|
||||||
LibertyPort *
|
LibertyPort *
|
||||||
Power::findExprOutPort(FuncExpr *expr)
|
Power::findExprOutPort(FuncExpr *expr)
|
||||||
{
|
{
|
||||||
|
|
@ -796,8 +807,7 @@ Power::findOutputInternalPower(const Pin *to_pin,
|
||||||
// Use unateness to find from_rf.
|
// Use unateness to find from_rf.
|
||||||
RiseFall *from_rf = positive_unate ? to_rf : to_rf->opposite();
|
RiseFall *from_rf = positive_unate ? to_rf : to_rf->opposite();
|
||||||
float slew = from_vertex
|
float slew = from_vertex
|
||||||
? delayAsFloat(graph_->slew(from_vertex, from_rf,
|
? getSlew(from_vertex, from_rf, corner)
|
||||||
dcalc_ap->index()))
|
|
||||||
: 0.0;
|
: 0.0;
|
||||||
if (!delayInf(slew)) {
|
if (!delayInf(slew)) {
|
||||||
float table_energy = pwr->power(to_rf, pvt, slew, load_cap);
|
float table_energy = pwr->power(to_rf, pvt, slew, load_cap);
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@ class Corner;
|
||||||
class DcalcAnalysisPt;
|
class DcalcAnalysisPt;
|
||||||
class PropActivityVisitor;
|
class PropActivityVisitor;
|
||||||
class BfsFwdIterator;
|
class BfsFwdIterator;
|
||||||
|
class Vertex;
|
||||||
|
|
||||||
typedef std::pair<const Instance*, LibertyPort*> SeqPin;
|
typedef std::pair<const Instance*, LibertyPort*> SeqPin;
|
||||||
|
|
||||||
|
|
@ -134,6 +135,9 @@ protected:
|
||||||
const Corner *corner,
|
const Corner *corner,
|
||||||
// Return values.
|
// Return values.
|
||||||
PowerResult &result);
|
PowerResult &result);
|
||||||
|
float getSlew(Vertex *vertex,
|
||||||
|
const RiseFall *rf,
|
||||||
|
const Corner *corner);
|
||||||
const Clock *findInstClk(const Instance *inst);
|
const Clock *findInstClk(const Instance *inst);
|
||||||
const Clock *findClk(const Pin *to_pin);
|
const Clock *findClk(const Pin *to_pin);
|
||||||
PwrActivity findClkedActivity(const Pin *pin,
|
PwrActivity findClkedActivity(const Pin *pin,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue