report_check_types max slew/cap/fanout with set_driving_cell min limit

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2022-02-10 10:04:12 -07:00
parent 6802190c15
commit 8627c6826d
3 changed files with 53 additions and 59 deletions

View File

@ -167,26 +167,24 @@ CheckCapacitanceLimits::findLimit(const Pin *pin,
} }
InputDrive *drive = sdc->findInputDrive(port); InputDrive *drive = sdc->findInputDrive(port);
if (drive) { if (drive) {
for (auto min_max : MinMax::range()) { for (auto rf : RiseFall::range()) {
for (auto rf : RiseFall::range()) { LibertyCell *cell;
LibertyCell *cell; LibertyPort *from_port;
LibertyPort *from_port; float *from_slews;
float *from_slews; LibertyPort *to_port;
LibertyPort *to_port; drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port); if (to_port) {
if (to_port) { LibertyPort *corner_port = to_port->cornerPort(corner->libertyIndex(min_max));
LibertyPort *corner_port = to_port->cornerPort(corner->libertyIndex(min_max)); corner_port->capacitanceLimit(min_max, limit1, exists1);
corner_port->capacitanceLimit(min_max, limit1, exists1); if (!exists1
if (!exists1 && corner_port->direction()->isAnyOutput()
&& corner_port->direction()->isAnyOutput() && min_max == MinMax::max())
&& min_max == MinMax::max()) corner_port->libertyLibrary()->defaultMaxSlew(limit1, exists1);
corner_port->libertyLibrary()->defaultMaxSlew(limit1, exists1); if (exists1
if (exists1 && (!exists
&& (!exists || min_max->compare(limit, limit1))) {
|| min_max->compare(limit, limit1))) { limit = limit1;
limit = limit1; exists = true;
exists = true;
}
} }
} }
} }

View File

@ -129,25 +129,23 @@ CheckFanoutLimits::findLimit(const Pin *pin,
} }
InputDrive *drive = sdc->findInputDrive(port); InputDrive *drive = sdc->findInputDrive(port);
if (drive) { if (drive) {
for (auto min_max : MinMax::range()) { for (auto rf : RiseFall::range()) {
for (auto rf : RiseFall::range()) { LibertyCell *cell;
LibertyCell *cell; LibertyPort *from_port;
LibertyPort *from_port; float *from_slews;
float *from_slews; LibertyPort *to_port;
LibertyPort *to_port; drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port); if (to_port) {
if (to_port) { to_port->fanoutLimit(min_max, limit1, exists1);
to_port->fanoutLimit(min_max, limit1, exists1); if (!exists1
if (!exists1 && min_max == MinMax::max()
&& min_max == MinMax::max() && to_port->direction()->isAnyOutput())
&& to_port->direction()->isAnyOutput()) to_port->libertyLibrary()->defaultMaxFanout(limit1, exists1);
to_port->libertyLibrary()->defaultMaxFanout(limit1, exists1); if (exists1
if (exists1 && (!exists
&& (!exists || min_max->compare(limit, limit1))) {
|| min_max->compare(limit, limit1))) { limit = limit1;
limit = limit1; exists = true;
exists = true;
}
} }
} }
} }

View File

@ -218,26 +218,24 @@ CheckSlewLimits::findLimit(const Pin *pin,
} }
InputDrive *drive = sdc->findInputDrive(port); InputDrive *drive = sdc->findInputDrive(port);
if (drive) { if (drive) {
for (auto min_max : MinMax::range()) { for (auto rf : RiseFall::range()) {
for (auto rf : RiseFall::range()) { LibertyCell *cell;
LibertyCell *cell; LibertyPort *from_port;
LibertyPort *from_port; float *from_slews;
float *from_slews; LibertyPort *to_port;
LibertyPort *to_port; drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port); if (to_port) {
if (to_port) { LibertyPort *corner_port = to_port->cornerPort(corner->libertyIndex(min_max));
LibertyPort *corner_port = to_port->cornerPort(corner->libertyIndex(min_max)); corner_port->slewLimit(min_max, limit1, exists1);
corner_port->slewLimit(min_max, limit1, exists1); if (!exists1
if (!exists1 && corner_port->direction()->isAnyOutput()
&& corner_port->direction()->isAnyOutput() && min_max == MinMax::max())
&& min_max == MinMax::max()) corner_port->libertyLibrary()->defaultMaxSlew(limit1, exists1);
corner_port->libertyLibrary()->defaultMaxSlew(limit1, exists1); if (exists1
if (exists1 && (!exists
&& (!exists || min_max->compare(limit, limit1))) {
|| min_max->compare(limit, limit1))) { limit = limit1;
limit = limit1; exists = true;
exists = true;
}
} }
} }
} }