report_check_types -max_cap -net
This commit is contained in:
parent
9940576780
commit
6ebaf3ebdb
|
|
@ -649,14 +649,13 @@ public:
|
|||
float &slack);
|
||||
|
||||
void checkCapacitanceLimitPreamble();
|
||||
// Return the pin with the min/max capacitance limit slack.
|
||||
// Return pins with the min/max slew limit slack.
|
||||
// net=null check all nets
|
||||
// corner=nullptr checks all corners.
|
||||
Pin *pinMinCapacitanceLimitSlack(const Corner *corner,
|
||||
const MinMax *min_max);
|
||||
// Return all pins with min/max capacitance violations.
|
||||
// corner=nullptr checks all corners.
|
||||
PinSeq *pinCapacitanceLimitViolations(const Corner *corner,
|
||||
const MinMax *min_max);
|
||||
PinSeq *checkCapacitanceLimits(Net *net,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max);
|
||||
void reportCapacitanceLimitShortHeader();
|
||||
void reportCapacitanceLimitShort(Pin *pin,
|
||||
const Corner *corner,
|
||||
|
|
|
|||
|
|
@ -222,91 +222,84 @@ CheckCapacitanceLimits::checkCapacitance(const Pin *pin,
|
|||
}
|
||||
|
||||
PinSeq *
|
||||
CheckCapacitanceLimits::pinCapacitanceLimitViolations(const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
CheckCapacitanceLimits::checkCapacitanceLimits(Net *net,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
{
|
||||
const Network *network = sta_->network();
|
||||
PinSeq *violators = new PinSeq;
|
||||
LeafInstanceIterator *inst_iter = network->leafInstanceIterator();
|
||||
while (inst_iter->hasNext()) {
|
||||
Instance *inst = inst_iter->next();
|
||||
pinCapacitanceLimitViolations(inst, corner, min_max, violators);
|
||||
PinSeq *cap_pins = new PinSeq;
|
||||
Slack min_slack = MinMax::min()->initValue();
|
||||
if (net) {
|
||||
NetPinIterator *pin_iter = network->pinIterator(net);
|
||||
while (pin_iter->hasNext()) {
|
||||
Pin *pin = pin_iter->next();
|
||||
checkCapLimits(pin, violators, corner, min_max, cap_pins, min_slack);
|
||||
}
|
||||
delete pin_iter;
|
||||
}
|
||||
delete inst_iter;
|
||||
// Check top level ports.
|
||||
pinCapacitanceLimitViolations(network->topInstance(), corner, min_max, violators);
|
||||
sort(violators, PinCapacitanceLimitSlackLess(corner, min_max, this, sta_));
|
||||
return violators;
|
||||
else {
|
||||
LeafInstanceIterator *inst_iter = network->leafInstanceIterator();
|
||||
while (inst_iter->hasNext()) {
|
||||
Instance *inst = inst_iter->next();
|
||||
checkCapLimits(inst, violators, corner, min_max, cap_pins, min_slack);
|
||||
}
|
||||
delete inst_iter;
|
||||
// Check top level ports.
|
||||
checkCapLimits(network->topInstance(), violators, corner, min_max,
|
||||
cap_pins, min_slack);
|
||||
}
|
||||
sort(cap_pins, PinCapacitanceLimitSlackLess(corner, min_max, this, sta_));
|
||||
// Keep the min slack pin unless all violators or net pins.
|
||||
if (!cap_pins->empty() && !violators && net == nullptr)
|
||||
cap_pins->resize(1);
|
||||
return cap_pins;
|
||||
}
|
||||
|
||||
void
|
||||
CheckCapacitanceLimits::pinCapacitanceLimitViolations(Instance *inst,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
PinSeq *violators)
|
||||
CheckCapacitanceLimits::checkCapLimits(Instance *inst,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
PinSeq *cap_pins,
|
||||
float &min_slack)
|
||||
{
|
||||
const Network *network = sta_->network();
|
||||
InstancePinIterator *pin_iter = network->pinIterator(inst);
|
||||
while (pin_iter->hasNext()) {
|
||||
Pin *pin = pin_iter->next();
|
||||
if (checkPin(pin)) {
|
||||
const Corner *corner1;
|
||||
const RiseFall *rf;
|
||||
float capacitance, limit, slack;
|
||||
checkCapacitance(pin, corner, min_max, corner1, rf, capacitance, limit, slack );
|
||||
if (rf && slack < 0.0 && !fuzzyInf(slack))
|
||||
violators->push_back(pin);
|
||||
}
|
||||
checkCapLimits(pin, violators, corner, min_max, cap_pins, min_slack);
|
||||
}
|
||||
delete pin_iter;
|
||||
}
|
||||
|
||||
Pin *
|
||||
CheckCapacitanceLimits::pinMinCapacitanceLimitSlack(const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
{
|
||||
const Network *network = sta_->network();
|
||||
Pin *min_slack_pin = nullptr;
|
||||
float min_slack = MinMax::min()->initValue();
|
||||
LeafInstanceIterator *inst_iter = network->leafInstanceIterator();
|
||||
while (inst_iter->hasNext()) {
|
||||
Instance *inst = inst_iter->next();
|
||||
pinMinCapacitanceLimitSlack(inst, corner, min_max, min_slack_pin, min_slack);
|
||||
}
|
||||
delete inst_iter;
|
||||
// Check top level ports.
|
||||
pinMinCapacitanceLimitSlack(network->topInstance(), corner, min_max,
|
||||
min_slack_pin, min_slack);
|
||||
return min_slack_pin;
|
||||
}
|
||||
|
||||
void
|
||||
CheckCapacitanceLimits::pinMinCapacitanceLimitSlack(Instance *inst,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
// Return values.
|
||||
Pin *&min_slack_pin,
|
||||
float &min_slack)
|
||||
CheckCapacitanceLimits::checkCapLimits(Pin *pin,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
PinSeq *cap_pins,
|
||||
float &min_slack)
|
||||
{
|
||||
const Network *network = sta_->network();
|
||||
InstancePinIterator *pin_iter = network->pinIterator(inst);
|
||||
while (pin_iter->hasNext()) {
|
||||
Pin *pin = pin_iter->next();
|
||||
if (checkPin(pin)) {
|
||||
const Corner *corner1;
|
||||
const RiseFall *rf;
|
||||
float capacitance, limit, slack;
|
||||
checkCapacitance(pin, corner, min_max, corner1, rf, capacitance, limit, slack);
|
||||
if (rf
|
||||
&& !fuzzyInf(slack)
|
||||
&& (min_slack_pin == nullptr
|
||||
|| slack < min_slack)) {
|
||||
min_slack_pin = pin;
|
||||
min_slack = slack;
|
||||
if (checkPin(pin)) {
|
||||
const Corner *corner1;
|
||||
const RiseFall *rf;
|
||||
float capacitance, limit, slack;
|
||||
checkCapacitance(pin, corner, min_max, corner1, rf, capacitance, limit, slack);
|
||||
if (!fuzzyInf(slack)) {
|
||||
if (violators) {
|
||||
if (slack < 0.0)
|
||||
cap_pins->push_back(pin);
|
||||
}
|
||||
else {
|
||||
if (cap_pins->empty()
|
||||
|| slack < min_slack) {
|
||||
cap_pins->push_back(pin);
|
||||
min_slack = slack;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
delete pin_iter;
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
|||
|
|
@ -42,12 +42,13 @@ public:
|
|||
float &capacitance,
|
||||
float &limit,
|
||||
float &slack) const;
|
||||
// Return pins with the min/max cap limit slack.
|
||||
// net=null check all nets
|
||||
// corner=nullptr checks all corners.
|
||||
PinSeq *pinCapacitanceLimitViolations(const Corner *corner,
|
||||
const MinMax *min_max);
|
||||
// corner=nullptr checks all corners.
|
||||
Pin *pinMinCapacitanceLimitSlack(const Corner *corner,
|
||||
const MinMax *min_max);
|
||||
PinSeq *checkCapacitanceLimits(Net *net,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max);
|
||||
|
||||
protected:
|
||||
void checkCapacitance(const Pin *pin,
|
||||
|
|
@ -75,16 +76,18 @@ protected:
|
|||
// Return values.
|
||||
float &limit,
|
||||
bool &limit_exists) const;
|
||||
void pinCapacitanceLimitViolations(Instance *inst,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
PinSeq *violators);
|
||||
void pinMinCapacitanceLimitSlack(Instance *inst,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
// Return values.
|
||||
Pin *&min_slack_pin,
|
||||
float &min_slack);
|
||||
void checkCapLimits(Instance *inst,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
PinSeq *cap_pins,
|
||||
float &min_slack);
|
||||
void checkCapLimits(Pin *pin,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max,
|
||||
PinSeq *cap_pins,
|
||||
float &min_slack);
|
||||
bool checkPin(Pin *pin);
|
||||
|
||||
const Sta *sta_;
|
||||
|
|
|
|||
|
|
@ -5021,20 +5021,15 @@ Sta::checkCapacitanceLimitPreamble()
|
|||
ensureClkNetwork();
|
||||
}
|
||||
|
||||
Pin *
|
||||
Sta::pinMinCapacitanceLimitSlack(const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
{
|
||||
checkCapacitanceLimitPreamble();
|
||||
return check_capacitance_limits_->pinMinCapacitanceLimitSlack(corner, min_max);
|
||||
}
|
||||
|
||||
PinSeq *
|
||||
Sta::pinCapacitanceLimitViolations(const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
Sta::checkCapacitanceLimits(Net *net,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
{
|
||||
checkCapacitanceLimitPreamble();
|
||||
return check_capacitance_limits_->pinCapacitanceLimitViolations(corner, min_max);
|
||||
return check_capacitance_limits_->checkCapacitanceLimits(net, violators,
|
||||
corner, min_max);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -438,38 +438,22 @@ proc report_fanout_limits { min_max all_violators verbose nosplit } {
|
|||
}
|
||||
}
|
||||
|
||||
proc report_capacitance_limits { corner min_max all_violators verbose nosplit } {
|
||||
if { $all_violators } {
|
||||
set violators [pin_capacitance_limit_violations $corner $min_max]
|
||||
if { $violators != {} } {
|
||||
report_line "${min_max} capacitance"
|
||||
report_line ""
|
||||
if { $verbose } {
|
||||
foreach pin $violators {
|
||||
report_capacitance_limit_verbose $pin $corner $min_max
|
||||
report_line ""
|
||||
}
|
||||
} else {
|
||||
report_capacitance_limit_short_header
|
||||
foreach pin $violators {
|
||||
report_capacitance_limit_short $pin $corner $min_max
|
||||
}
|
||||
report_line ""
|
||||
}
|
||||
}
|
||||
} else {
|
||||
set pin [pin_min_capacitance_limit_slack $corner $min_max]
|
||||
if { $pin != "NULL" } {
|
||||
report_line "${min_max} capacitance"
|
||||
report_line ""
|
||||
if { $verbose } {
|
||||
proc report_capacitance_limits { net corner min_max violators verbose nosplit } {
|
||||
set pins [check_capacitance_limits $net $violators $corner $min_max]
|
||||
if { $pins != {} } {
|
||||
report_line "${min_max} capacitance"
|
||||
report_line ""
|
||||
if { $verbose } {
|
||||
foreach pin $pins {
|
||||
report_capacitance_limit_verbose $pin $corner $min_max
|
||||
report_line ""
|
||||
} else {
|
||||
report_capacitance_limit_short_header
|
||||
report_capacitance_limit_short $pin $corner $min_max
|
||||
report_line ""
|
||||
report_line ""
|
||||
}
|
||||
} else {
|
||||
report_capacitance_limit_short_header
|
||||
foreach pin $pins {
|
||||
report_capacitance_limit_short $pin $corner $min_max
|
||||
}
|
||||
report_line ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -228,8 +228,9 @@ proc find_timing_paths_cmd { cmd args_var } {
|
|||
set group_count $endpoint_count
|
||||
if [info exists keys(-group_count)] {
|
||||
set group_count $keys(-group_count)
|
||||
check_positive_integer "-group_count" $group_count
|
||||
if { $group_count < 1 } {
|
||||
sta_error 423 "-group_count must be a positive integer."
|
||||
sta_error 423 "-group_count must be >= 1."
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -486,10 +487,10 @@ proc_redirect report_check_types {
|
|||
report_fanout_limits "min" $violators $verbose $nosplit
|
||||
}
|
||||
if { $max_capacitance } {
|
||||
report_capacitance_limits $corner "max" $violators $verbose $nosplit
|
||||
report_capacitance_limits $net $corner "max" $violators $verbose $nosplit
|
||||
}
|
||||
if { $min_capacitance } {
|
||||
report_capacitance_limits $corner "min" $violators $verbose $nosplit
|
||||
report_capacitance_limits $net $corner "min" $violators $verbose $nosplit
|
||||
}
|
||||
if { $min_pulse_width } {
|
||||
if { $violators } {
|
||||
|
|
|
|||
16
tcl/StaTcl.i
16
tcl/StaTcl.i
|
|
@ -4775,20 +4775,14 @@ report_fanout_limit_verbose(Pin *pin,
|
|||
|
||||
////////////////////////////////////////////////////////////////
|
||||
|
||||
Pin *
|
||||
pin_min_capacitance_limit_slack(const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
{
|
||||
cmdLinkedNetwork();
|
||||
return Sta::sta()->pinMinCapacitanceLimitSlack(corner, min_max);
|
||||
}
|
||||
|
||||
PinSeq *
|
||||
pin_capacitance_limit_violations(const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
check_capacitance_limits(Net *net,
|
||||
bool violators,
|
||||
const Corner *corner,
|
||||
const MinMax *min_max)
|
||||
{
|
||||
cmdLinkedNetwork();
|
||||
return Sta::sta()->pinCapacitanceLimitViolations(corner, min_max);
|
||||
return Sta::sta()->checkCapacitanceLimits(net, violators, corner, min_max);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Reference in New Issue