diff --git a/dcalc/ArnoldiDelayCalc.cc b/dcalc/ArnoldiDelayCalc.cc index 53bda7f1..b3205010 100644 --- a/dcalc/ArnoldiDelayCalc.cc +++ b/dcalc/ArnoldiDelayCalc.cc @@ -266,8 +266,9 @@ ArnoldiDelayCalc::findParasitic(const Pin *drvr_pin, const RiseFall *drvr_rf, const DcalcAnalysisPt *dcalc_ap) { + Parasitic *parasitic = nullptr; const Corner *corner = dcalc_ap->corner(); - // set_load has precidence over parasitics. + // set_load net has precidence over parasitics. if (!sdc_->drvrPinHasWireCap(drvr_pin, corner)) { const ParasiticAnalysisPt *parasitic_ap = dcalc_ap->parasiticAnalysisPt(); Parasitic *parasitic_network = @@ -291,22 +292,20 @@ ArnoldiDelayCalc::findParasitic(const Pin *drvr_pin, } if (parasitic_network) { - Parasitic *parasitic = - reduce_->reduceToArnoldi(parasitic_network, - drvr_pin, - parasitic_ap->couplingCapFactor(), - drvr_rf, op_cond, corner, - cnst_min_max, parasitic_ap); + parasitic = reduce_->reduceToArnoldi(parasitic_network, + drvr_pin, + parasitic_ap->couplingCapFactor(), + drvr_rf, op_cond, corner, + cnst_min_max, parasitic_ap); if (delete_parasitic_network) { Net *net = network_->net(drvr_pin); parasitics_->deleteParasiticNetwork(net, parasitic_ap); } - // Arnoldi parasitics their own class that are not saved in the parasitic db. + // Arnoldi parasitics are their own class that are not saved in the parasitic db. unsaved_parasitics_.push_back(parasitic); - return parasitic; } } - return nullptr; + return parasitic; } ReducedParasiticType diff --git a/dcalc/DmpDelayCalc.cc b/dcalc/DmpDelayCalc.cc index ff29be39..169b1051 100644 --- a/dcalc/DmpDelayCalc.cc +++ b/dcalc/DmpDelayCalc.cc @@ -193,57 +193,53 @@ DmpCeffTwoPoleDelayCalc::findParasitic(const Pin *drvr_pin, const RiseFall *rf, const DcalcAnalysisPt *dcalc_ap) { + Parasitic *parasitic = nullptr; const Corner *corner = dcalc_ap->corner(); - // set_load has precidence over parasitics. + // set_load net has precidence over parasitics. if (!sdc_->drvrPinHasWireCap(drvr_pin, corner)) { - Parasitic *parasitic = nullptr; const ParasiticAnalysisPt *parasitic_ap = dcalc_ap->parasiticAnalysisPt(); if (parasitics_->haveParasitics()) { // Prefer PiPoleResidue. - parasitic = parasitics_->findPiPoleResidue(drvr_pin, rf, - parasitic_ap); - if (parasitic) - return parasitic; - - parasitic = parasitics_->findPiElmore(drvr_pin, rf, parasitic_ap); - if (parasitic) - return parasitic; - - Parasitic *parasitic_network = - parasitics_->findParasiticNetwork(drvr_pin, parasitic_ap); - if (parasitic_network) { - parasitics_->reduceToPiPoleResidue2(parasitic_network, drvr_pin, - dcalc_ap->operatingConditions(), - corner, - dcalc_ap->constraintMinMax(), - parasitic_ap); - parasitic = parasitics_->findPiPoleResidue(drvr_pin, rf, parasitic_ap); - reduced_parasitic_drvrs_.push_back(drvr_pin); - return parasitic; + parasitic = parasitics_->findPiPoleResidue(drvr_pin, rf, parasitic_ap); + if (parasitic == nullptr) { + parasitic = parasitics_->findPiElmore(drvr_pin, rf, parasitic_ap); + if (parasitic == nullptr) { + Parasitic *parasitic_network = + parasitics_->findParasiticNetwork(drvr_pin, parasitic_ap); + if (parasitic_network) { + parasitics_->reduceToPiPoleResidue2(parasitic_network, drvr_pin, + dcalc_ap->operatingConditions(), + corner, + dcalc_ap->constraintMinMax(), + parasitic_ap); + parasitic = parasitics_->findPiPoleResidue(drvr_pin, rf, parasitic_ap); + reduced_parasitic_drvrs_.push_back(drvr_pin); + } + } } } - - const MinMax *cnst_min_max = dcalc_ap->constraintMinMax(); - Wireload *wireload = sdc_->wireload(cnst_min_max); - if (wireload) { - float pin_cap, wire_cap, fanout; - bool has_wire_cap; - graph_delay_calc_->netCaps(drvr_pin, rf, dcalc_ap, - pin_cap, wire_cap, fanout, has_wire_cap); - parasitic = parasitics_->estimatePiElmore(drvr_pin, rf, wireload, - fanout, pin_cap, - dcalc_ap->operatingConditions(), - corner, - cnst_min_max, - parasitic_ap); - // Estimated parasitics are not recorded in the "database", so - // it for deletion after the drvr pin delay calc is finished. - if (parasitic) - unsaved_parasitics_.push_back(parasitic); - return parasitic; + else { + const MinMax *cnst_min_max = dcalc_ap->constraintMinMax(); + Wireload *wireload = sdc_->wireload(cnst_min_max); + if (wireload) { + float pin_cap, wire_cap, fanout; + bool has_wire_cap; + graph_delay_calc_->netCaps(drvr_pin, rf, dcalc_ap, + pin_cap, wire_cap, fanout, has_wire_cap); + parasitic = parasitics_->estimatePiElmore(drvr_pin, rf, wireload, + fanout, pin_cap, + dcalc_ap->operatingConditions(), + corner, + cnst_min_max, + parasitic_ap); + // Estimated parasitics are not recorded in the "database", so + // it for deletion after the drvr pin delay calc is finished. + if (parasitic) + unsaved_parasitics_.push_back(parasitic); + } } } - return nullptr; + return parasitic; } ReducedParasiticType diff --git a/dcalc/LumpedCapDelayCalc.cc b/dcalc/LumpedCapDelayCalc.cc index 89ffccd8..0309c2c5 100644 --- a/dcalc/LumpedCapDelayCalc.cc +++ b/dcalc/LumpedCapDelayCalc.cc @@ -55,52 +55,50 @@ LumpedCapDelayCalc::findParasitic(const Pin *drvr_pin, const RiseFall *rf, const DcalcAnalysisPt *dcalc_ap) { + Parasitic *parasitic = nullptr; const Corner *corner = dcalc_ap->corner(); // set_load net has precidence over parasitics. if (!sdc_->drvrPinHasWireCap(drvr_pin, corner)) { - Parasitic *parasitic = nullptr; const ParasiticAnalysisPt *parasitic_ap = dcalc_ap->parasiticAnalysisPt(); if (parasitics_->haveParasitics()) { // Prefer PiElmore. parasitic = parasitics_->findPiElmore(drvr_pin, rf, parasitic_ap); - if (parasitic) - return parasitic; - - Parasitic *parasitic_network = - parasitics_->findParasiticNetwork(drvr_pin, parasitic_ap); - if (parasitic_network) { - parasitics_->reduceToPiElmore(parasitic_network, drvr_pin, - dcalc_ap->operatingConditions(), - corner, - dcalc_ap->constraintMinMax(), - parasitic_ap); - parasitic = parasitics_->findPiElmore(drvr_pin, rf, parasitic_ap); - reduced_parasitic_drvrs_.push_back(drvr_pin); - return parasitic; + if (parasitic == nullptr) { + Parasitic *parasitic_network = + parasitics_->findParasiticNetwork(drvr_pin, parasitic_ap); + if (parasitic_network) { + parasitics_->reduceToPiElmore(parasitic_network, drvr_pin, + dcalc_ap->operatingConditions(), + corner, + dcalc_ap->constraintMinMax(), + parasitic_ap); + parasitic = parasitics_->findPiElmore(drvr_pin, rf, parasitic_ap); + reduced_parasitic_drvrs_.push_back(drvr_pin); + } } } - - const MinMax *cnst_min_max = dcalc_ap->constraintMinMax(); - Wireload *wireload = sdc_->wireload(cnst_min_max); - if (wireload) { - float pin_cap, wire_cap, fanout; - bool has_wire_cap; - graph_delay_calc_->netCaps(drvr_pin, rf, dcalc_ap, - pin_cap, wire_cap, fanout, has_wire_cap); - parasitic = parasitics_->estimatePiElmore(drvr_pin, rf, wireload, - fanout, pin_cap, - dcalc_ap->operatingConditions(), - corner, - cnst_min_max, - parasitic_ap); - // Estimated parasitics are not recorded in the "database", so save - // it for deletion after the drvr pin delay calc is finished. - if (parasitic) - unsaved_parasitics_.push_back(parasitic); - return parasitic; + else { + const MinMax *cnst_min_max = dcalc_ap->constraintMinMax(); + Wireload *wireload = sdc_->wireload(cnst_min_max); + if (wireload) { + float pin_cap, wire_cap, fanout; + bool has_wire_cap; + graph_delay_calc_->netCaps(drvr_pin, rf, dcalc_ap, + pin_cap, wire_cap, fanout, has_wire_cap); + parasitic = parasitics_->estimatePiElmore(drvr_pin, rf, wireload, + fanout, pin_cap, + dcalc_ap->operatingConditions(), + corner, + cnst_min_max, + parasitic_ap); + // Estimated parasitics are not recorded in the "database", so save + // it for deletion after the drvr pin delay calc is finished. + if (parasitic) + unsaved_parasitics_.push_back(parasitic); + } } } - return nullptr; + return parasitic; } ReducedParasiticType