report_power swerv_wrapper_asap7 hang
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
d7c41853fe
commit
1e4ff7be47
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue