diff --git a/dcalc/DmpCeff.cc b/dcalc/DmpCeff.cc index 29f4ce4a..cc4bbca5 100644 --- a/dcalc/DmpCeff.cc +++ b/dcalc/DmpCeff.cc @@ -25,7 +25,7 @@ #include "DmpCeff.hh" #include // abs, min -#include // sqrt +#include // sqrt, log #include "Report.hh" #include "Debug.hh" @@ -43,6 +43,9 @@ namespace sta { using std::abs; using std::min; +using std::max; +using std::sqrt; +using std::log; // Tolerance (as a scale of value) for driver parameters (Ceff, delta t, t0). static const double driver_param_tol = .01; @@ -263,6 +266,7 @@ protected: // Load rspf elmore delay. double elmore_; double p3_; + double elmore_slew_factor_; private: virtual double dvl0dt(double t) = 0; @@ -320,6 +324,7 @@ DmpAlg::init(const LibertyLibrary *drvr_library, vl_ = drvr_library->slewLowerThreshold(rf); vh_ = drvr_library->slewUpperThreshold(rf); slew_derate_ = drvr_library->slewDerateFromLibrary(); + elmore_slew_factor_ = log(vh_) - log(vl_); } // Find Ceff, delta_t and t0 for the driver. @@ -608,7 +613,9 @@ DmpAlg::loadDelaySlew(const Pin *, else { // Failed - use elmore delay and driver slew. delay = static_cast(elmore_); - slew = static_cast(gate_slew_); + // solve v=1-exp(-t/rc) for t, elmore_slew_factor_ = t(vh) - t(vl) + // slew = elmore * (log(vh_) - log(vl_)) + slew = static_cast(gate_slew_ + elmore * elmore_slew_factor_); } } }