report_power swerv_wrapper_asap7 hang

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2023-03-23 14:25:02 -07:00
parent d7c41853fe
commit 1e4ff7be47
2 changed files with 26 additions and 5 deletions

View File

@ -63,6 +63,7 @@
namespace sta { namespace sta {
using std::abs; using std::abs;
using std::max;
using std::isnormal; using std::isnormal;
static bool static bool
@ -302,12 +303,16 @@ public:
virtual VertexVisitor *copy() const; virtual VertexVisitor *copy() const;
virtual void visit(Vertex *vertex); virtual void visit(Vertex *vertex);
InstanceSet &visitedRegs() { return visited_regs_; } InstanceSet &visitedRegs() { return visited_regs_; }
void init();
float maxChange() const { return max_change_; }
private: private:
bool setActivityCheck(const Pin *pin, bool setActivityCheck(const Pin *pin,
PwrActivity &activity); PwrActivity &activity);
static constexpr float change_tolerance_ = .01;
InstanceSet visited_regs_; InstanceSet visited_regs_;
float max_change_;
Power *power_; Power *power_;
BfsFwdIterator *bfs_; BfsFwdIterator *bfs_;
}; };
@ -327,6 +332,12 @@ PropActivityVisitor::copy() const
return new PropActivityVisitor(power_, bfs_); return new PropActivityVisitor(power_, bfs_);
} }
void
PropActivityVisitor::init()
{
max_change_ = 0.0;
}
void void
PropActivityVisitor::visit(Vertex *vertex) PropActivityVisitor::visit(Vertex *vertex)
{ {
@ -420,8 +431,12 @@ PropActivityVisitor::setActivityCheck(const Pin *pin,
PwrActivity &activity) PwrActivity &activity)
{ {
PwrActivity &prev_activity = power_->activity(pin); PwrActivity &prev_activity = power_->activity(pin);
if (abs(activity.activity() - prev_activity.activity()) > .001 float activity_delta = abs(activity.activity() - prev_activity.activity());
|| abs(activity.duty() - prev_activity.duty()) > .001) { float duty_delta = abs(activity.duty() - prev_activity.duty());
if (activity_delta > change_tolerance_
|| duty_delta > change_tolerance_) {
max_change_ = max(max_change_, activity_delta);
max_change_ = max(max_change_, duty_delta);
power_->setActivity(pin, activity); power_->setActivity(pin, activity);
return true; return true;
} }
@ -556,7 +571,9 @@ Power::ensureActivities()
bfs.visit(levelize_->maxLevel(), &visitor); bfs.visit(levelize_->maxLevel(), &visitor);
// Propagate activiities through registers. // Propagate activiities through registers.
InstanceSet regs = std::move(visitor.visitedRegs()); InstanceSet regs = std::move(visitor.visitedRegs());
while (!regs.empty()) { int pass = 1;
while (!regs.empty() && pass < max_activity_passes_) {
visitor.init();
InstanceSet::Iterator reg_iter(regs); InstanceSet::Iterator reg_iter(regs);
while (reg_iter.hasNext()) { while (reg_iter.hasNext()) {
const Instance *reg = reg_iter.next(); const Instance *reg = reg_iter.next();
@ -567,6 +584,9 @@ Power::ensureActivities()
// combinational logic. // combinational logic.
bfs.visit(levelize_->maxLevel(), &visitor); bfs.visit(levelize_->maxLevel(), &visitor);
regs = std::move(visitor.visitedRegs()); regs = std::move(visitor.visitedRegs());
debugPrint(debug_, "power_activity", 1, "Pass %d change %.2f",
pass, visitor.maxChange());
pass++;
} }
activities_valid_ = true; activities_valid_ = true;
} }
@ -615,7 +635,7 @@ Power::seedRegOutputActivities(const Instance *inst,
&& func && func
&& (func->port() == seq->output() && (func->port() == seq->output()
|| func->port() == seq->outputInv())) { || func->port() == seq->outputInv())) {
debugPrint(debug_, "power_activity", 3, "enqueue reg output %s", debugPrint(debug_, "power_reg", 1, "enqueue reg output %s",
vertex->name(network_)); vertex->name(network_));
bfs.enqueue(vertex); bfs.enqueue(vertex);
} }

View File

@ -196,6 +196,7 @@ private:
PwrActivityMap activity_map_; PwrActivityMap activity_map_;
PwrSeqActivityMap seq_activity_map_; PwrSeqActivityMap seq_activity_map_;
bool activities_valid_; bool activities_valid_;
static constexpr int max_activity_passes_ = 100;
friend class PropActivityVisitor; friend class PropActivityVisitor;
}; };