Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 34 additions & 30 deletions src/rsz/src/BaseMove.cc
Original file line number Diff line number Diff line change
Expand Up @@ -827,29 +827,31 @@ vector<const sta::Pin*> BaseMove::getOutputPins(const sta::Instance* inst)
outputs.push_back(pin);
}
}

return outputs;
}

bool BaseMove::checkMaxCapViolation(const sta::Pin* output_pin,
sta::LibertyPort* output_port,
float output_cap)
sta::LibertyPort* output_port,
float output_cap)
{
float max_cap;
bool cap_limit_exists;
// FIXME: Can we update to consider multiple corners?
output_port->capacitanceLimit(resizer_->max_, max_cap, cap_limit_exists);
// Check capacitance limit across all corners (not just one).
float cap1, max_cap1, cap_slack1;
const sta::Scene* corner1;
const sta::RiseFall* tr1;
Comment on lines +838 to +840
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The variables cap1, cap_slack1, and tr1 are declared as output parameters for sta_->checkCapacitance but are not used in the subsequent logic within this function. While they are output parameters, if their values are not needed, consider if they can be omitted or if a comment should clarify why they are declared but not used, to improve code clarity.

sta_->checkCapacitance(
output_pin, sta_->scenes(), resizer_->max_,
cap1, max_cap1, cap_slack1, tr1, corner1);

debugPrint(logger_,
RSZ,
"opt_moves",
3,
" fanout pin {} cap {} output_cap {} ",
output_port->name(),
max_cap,
max_cap1,
output_cap);

if (cap_limit_exists && max_cap > 0.0 && output_cap > max_cap) {
if (max_cap1 > 0.0 && corner1 && output_cap > max_cap1) {
debugPrint(logger_,
RSZ,
"opt_moves",
Expand All @@ -858,38 +860,40 @@ bool BaseMove::checkMaxCapViolation(const sta::Pin* output_pin,
network_->pathName(output_pin),
output_port->libertyCell()->name(),
output_cap,
max_cap);
max_cap1);
return true;
}

return false;
}

bool BaseMove::checkMaxSlewViolation(const sta::Pin* output_pin,
sta::LibertyPort* output_port,
float output_slew_factor,
float output_cap,
const sta::Scene* scene)
sta::LibertyPort* output_port,
float output_slew_factor,
float output_cap)
{
float output_res = output_port->driveResistance();
float output_slew = output_slew_factor * output_res * output_cap;
float max_slew;
bool slew_limit_exists;

sta_->findSlewLimit(
output_port, scene, resizer_->max_, max_slew, slew_limit_exists);

if (output_slew > max_slew) {
debugPrint(logger_,
RSZ,
"opt_moves",
2,
" skip based on max slew {} gate={} slew={} max_slew={}",
network_->pathName(output_pin),
output_port->libertyCell()->name(),
output_slew,
max_slew);
return true;
// Check slew limit across all corners (not just one).
for (const sta::Scene* corner : sta_->scenes()) {
float max_slew;
bool slew_limit_exists;
sta_->findSlewLimit(
output_port, corner, resizer_->max_, max_slew, slew_limit_exists);

if (slew_limit_exists && output_slew > max_slew) {
debugPrint(logger_,
RSZ,
"opt_moves",
2,
" skip based on max slew {} gate={} slew={} max_slew={}",
network_->pathName(output_pin),
output_port->libertyCell()->name(),
output_slew,
max_slew);
return true;
}
}

return false;
Expand Down
3 changes: 1 addition & 2 deletions src/rsz/src/BaseMove.hh
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,7 @@ class BaseMove : public sta::dbStaState
bool checkMaxSlewViolation(const sta::Pin* output_pin,
sta::LibertyPort* output_port,
float output_slew_factor,
float output_cap,
const sta::Scene* corner);
float output_cap);
float computeElmoreSlewFactor(const sta::Pin* output_pin,
sta::LibertyPort* output_port,
float output_load_cap);
Expand Down
4 changes: 1 addition & 3 deletions src/rsz/src/SizeDownMove.cc
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,6 @@ sta::LibertyCell* SizeDownMove::downSizeGate(const sta::LibertyPort* drvr_port,
sta::LibertyPort* output_port
= swappable->findLibertyPort(output_port_names[i]);

// FIXME: Only applies to current corner
if (checkMaxCapViolation(output_pins[i], output_port, output_caps[i])) {
skip_cell = true;
break;
Expand All @@ -339,8 +338,7 @@ sta::LibertyCell* SizeDownMove::downSizeGate(const sta::LibertyPort* drvr_port,
if (checkMaxSlewViolation(output_pins[i],
output_port,
output_slew_factors[i],
output_caps[i],
scene)) {
output_caps[i])) {
skip_cell = true;
break;
}
Expand Down