power nan-proofing

This commit is contained in:
James Cherry 2020-11-02 15:12:13 -08:00
parent 983149a4e4
commit bdd7468774
3 changed files with 14 additions and 9 deletions

View File

@ -35,8 +35,8 @@ class PwrActivity
public:
PwrActivity();
PwrActivity(float activity,
float duty,
PwrActivityOrigin origin);
float duty,
PwrActivityOrigin origin);
float activity() const { return activity_; }
float duty() const { return duty_; }
PwrActivityOrigin origin() { return origin_; }

View File

@ -811,10 +811,11 @@ Power::findOutputInternalPower(const Pin *to_pin,
if (tr_count)
energy /= tr_count; // average non-inf energies
auto duty_sum_iter = pg_duty_sum.find(related_pg_pin);
float duty_sum = duty_sum_iter == pg_duty_sum.end()
? 0.0
: duty_sum_iter->second;
float weight = duty_sum == 0.0 ? duty : duty / duty_sum;
float weight = 0.0;
if (duty_sum_iter != pg_duty_sum.end()) {
float duty_sum = duty_sum_iter->second;
weight = duty / duty_sum;
}
float port_internal = weight * energy * to_activity.activity();
debugPrint9(debug_, "power", 2, "%3s -> %-3s %6s %.2f %.2f %.2f %9.2e %9.2e %s\n",
from_port->name(),
@ -849,10 +850,14 @@ Power::findInputDuty(const Pin *to_pin,
float from_activity = findActivity(from_pin).activity();
float to_activity = findActivity(to_pin).activity();
float duty1 = evalActivityDifference(func, inst, from_port).duty();
if (to_activity == 0.0)
// Activities can get very small from multiplying probabilities
// through deep chains of logic. Dividing by very close to zero values
// can result in NaN/Inf depending on numerator.
float duty = from_activity * duty1 / to_activity;
if (!isnormal(duty))
return 0.0;
else
return from_activity * duty1 / to_activity;
return duty;
}
else if (when)
return evalActivity(when, inst).duty();

View File

@ -47,7 +47,7 @@ public:
const SeqPin &pin2) const;
};
typedef UnorderedMap<const Pin*,PwrActivity> PwrActivityMap;
typedef UnorderedMap<const Pin*, PwrActivity> PwrActivityMap;
typedef UnorderedMap<SeqPin, PwrActivity,
SeqPinHash, SeqPinEqual> PwrSeqActivityMap;