From a09d9f0a5177d3e67421cc1456b125b7ee7d084a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Povi=C5=A1er?= Date: Mon, 4 Nov 2024 11:07:09 +0100 Subject: [PATCH] Add warning for poor activities convergence --- doc/messages.txt | 1 + power/Power.cc | 38 ++++++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/doc/messages.txt b/doc/messages.txt index 97d1a06a..c2158782 100644 --- a/doc/messages.txt +++ b/doc/messages.txt @@ -300,6 +300,7 @@ 1060 Genclks.cc:275 no master clock found for generated clock %s. 1062 Genclks.cc:939 generated clock %s source pin %s missing paths from master clock %s. 1100 Power.cc:556 unknown cudd constant +1101 Power.cc:651 poor convergence of propagated activities for power estimation after %d passes 1110 Liberty.cc:763 cell %s/%s port %s not found in cell %s/%s. 1111 Liberty.cc:789 cell %s/%s %s -> %s timing group %s not found in cell %s/%s. 1112 Liberty.cc:808 Liberty cell %s/%s for corner %s/%s not found. diff --git a/power/Power.cc b/power/Power.cc index f68c903c..7a0f9677 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -629,22 +629,28 @@ Power::ensureActivities() bfs.visit(levelize_->maxLevel(), &visitor); // Propagate activiities through registers. InstanceSet regs = std::move(visitor.visitedRegs()); - int pass = 1; - while (!regs.empty() && pass < max_activity_passes_) { - visitor.init(); - InstanceSet::Iterator reg_iter(regs); - while (reg_iter.hasNext()) { - const Instance *reg = reg_iter.next(); - // Propagate activiities across register D->Q. - seedRegOutputActivities(reg, bfs); - } - // Propagate register output activities through - // combinational logic. - bfs.visit(levelize_->maxLevel(), &visitor); - regs = std::move(visitor.visitedRegs()); - debugPrint(debug_, "power_activity", 1, "Pass %d change %.2f", - pass, visitor.maxChange()); - pass++; + if (!regs.empty()) { + int pass = 1; + while (!regs.empty() && pass < max_activity_passes_) { + visitor.init(); + InstanceSet::Iterator reg_iter(regs); + while (reg_iter.hasNext()) { + const Instance *reg = reg_iter.next(); + // Propagate activiities across register D->Q. + seedRegOutputActivities(reg, bfs); + } + // Propagate register output activities through + // combinational logic. + bfs.visit(levelize_->maxLevel(), &visitor); + regs = std::move(visitor.visitedRegs()); + debugPrint(debug_, "power_activity", 1, "Pass %d change %.2f", + pass, visitor.maxChange()); + pass++; + } + if (visitor.maxChange() > 0.20) { + report_->warn(1101, "poor convergence of propagated activities for power estimation after %d passes", + max_activity_passes_); + } } activities_valid_ = true; }