gated clk activity use passes instead of enqueue

Signed-off-by: James Cherry <cherry@CerezoBook.local>
This commit is contained in:
James Cherry 2026-06-20 10:05:07 -07:00
parent 8d7babf44e
commit 4f0c4c8bb3
2 changed files with 29 additions and 6 deletions

View File

@ -701,10 +701,8 @@ PropActivityVisitor::visit(Vertex *vertex)
if (cell->isClockGate()) { if (cell->isClockGate()) {
const Pin *enable, *clk, *gclk; const Pin *enable, *clk, *gclk;
power_->clockGatePins(inst, enable, clk, gclk); power_->clockGatePins(inst, enable, clk, gclk);
if (gclk) { if (gclk)
Vertex *gclk_vertex = graph_->pinDrvrVertex(gclk); visited_regs_.insert(inst);
bfs_->enqueue(gclk_vertex);
}
} }
} }
bfs_->enqueueAdjacentVertices(vertex, mode_); bfs_->enqueueAdjacentVertices(vertex, mode_);
@ -972,6 +970,8 @@ Power::seedRegOutputActivities(const Instance *inst,
const SequentialSeq &seqs = test_cell->sequentials(); const SequentialSeq &seqs = test_cell->sequentials();
seedRegOutputActivities(inst, test_cell, seqs, bfs); seedRegOutputActivities(inst, test_cell, seqs, bfs);
} }
else if (cell->isClockGate())
seedClkGateOutputActivities(inst, bfs);
} }
} }
@ -1045,6 +1045,23 @@ Power::seedRegOutputActivities(const Instance *reg,
} }
} }
void
Power::seedClkGateOutputActivities(const Instance *inst,
BfsFwdIterator &bfs)
{
InstancePinIterator *pin_iter = network_->pinIterator(inst);
while (pin_iter->hasNext()) {
Pin *pin = pin_iter->next();
LibertyPort *port = network_->libertyPort(pin);
if (port && port->isClockGateOut()) {
Vertex *vertex = graph_->pinDrvrVertex(pin);
if (vertex)
bfs.enqueue(vertex);
}
}
delete pin_iter;
}
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
void void
@ -1566,8 +1583,12 @@ Power::findActivity(const Pin *pin)
if (activity && activity->origin() != PwrActivityOrigin::unknown) if (activity && activity->origin() != PwrActivityOrigin::unknown)
return *activity; return *activity;
const Clock *clk = findClk(pin); const Clock *clk = findClk(pin);
float duty = clockDuty(clk); if (clk) {
return PwrActivity(2.0 / clk->period(), duty, PwrActivityOrigin::clock); float duty = clockDuty(clk);
return PwrActivity(2.0 / clk->period(), duty, PwrActivityOrigin::clock);
}
else
return PwrActivity();
} }
else if (global_activity_.isSet()) else if (global_activity_.isSet())
return global_activity_; return global_activity_;

View File

@ -224,6 +224,8 @@ protected:
const LibertyCell *test_cell, const LibertyCell *test_cell,
const SequentialSeq &seqs, const SequentialSeq &seqs,
BfsFwdIterator &bfs); BfsFwdIterator &bfs);
void seedClkGateOutputActivities(const Instance *inst,
BfsFwdIterator &bfs);
PwrActivity evalActivity(FuncExpr *expr, PwrActivity evalActivity(FuncExpr *expr,
const Instance *inst); const Instance *inst);
PwrActivity evalActivity(FuncExpr *expr, PwrActivity evalActivity(FuncExpr *expr,