dcalc DmpPi::gateDelaySlew reorg

This commit is contained in:
James Cherry 2020-11-08 10:12:48 -07:00
parent 55177257e3
commit a56fa7f428
1 changed files with 19 additions and 20 deletions

View File

@ -46,6 +46,7 @@ using std::min;
using std::max;
using std::sqrt;
using std::log;
using std::exp;
// Tolerance (as a scale of value) for driver parameters (Ceff, delta t, t0).
static const double driver_param_tol = .01;
@ -898,20 +899,21 @@ void
DmpPi::gateDelaySlew(double &delay,
double &slew)
{
driver_valid_ = false;
try {
findDriverParamsPi();
ceff_ = x_[DmpParam::ceff];
driver_valid_ = true;
double table_slew;
// Table gate delays are more accurate than using Vo waveform delay
// (-12% max, -5% avg vs 26% max, -7% avg).
gateCapDelaySlew(ceff_, delay, table_slew);
// Vo slew is more accurate than table
// (-8% max, -3% avg vs -32% max, -12% avg).
// Need Vo delay to measure load wire delay waveform.
double table_delay, table_slew;
gateCapDelaySlew(ceff_, table_delay, table_slew);
delay = table_delay;
//slew = table_slew;
try {
double vo_slew;
findDriverDelaySlew(vo_delay_, vo_slew);
double vo_delay, vo_slew;
findDriverDelaySlew(vo_delay, vo_slew);
driver_valid_ = true;
// Save Vo delay to measure load wire delay waveform.
vo_delay_ = vo_delay;
//delay = vo_delay;
slew = vo_slew;
}
catch (DmpError &error) {
@ -923,11 +925,9 @@ DmpPi::gateDelaySlew(double &delay,
catch (DmpError &error) {
fail(error.what());
// Driver calculation failed - use Ceff=c1+c2.
driver_valid_ = false;
ceff_ = c1_ + c2_;
gateCapDelaySlew(ceff_, delay, slew);
}
// Save for wire delay calc.
gate_slew_ = slew;
}
@ -969,13 +969,12 @@ DmpPi::evalDmpEqns()
double exp_p2_dt = exp(-p2_ * dt);
double exp_dt_rd_ceff = exp(-dt / (rd_ * ceff));
// y50 in the paper.
double y_t_vth = y(t_vth, t0, dt, ceff);
// y20 in the paper. Match Vl.
double y_t_vl = y(t_vl, t0, dt, ceff);
double y50 = y(t_vth, t0, dt, ceff);
// Match Vl.
double y20 = y(t_vl, t0, dt, ceff);
fvec_[DmpFunc::ipi] = ipiIceff(t0, dt, ceff_time, ceff);
fvec_[DmpFunc::y50] = y_t_vth - vth_;
fvec_[DmpFunc::y20] = y_t_vl - vl_;
fvec_[DmpFunc::y50] = y50 - vth_;
fvec_[DmpFunc::y20] = y20 - vl_;
fjac_[DmpFunc::ipi][DmpParam::t0] = 0.0;
fjac_[DmpFunc::ipi][DmpParam::dt] =
(-A_ * dt + B_ * dt * exp_p1_dt - (2 * B_ / p1_) * (1.0 - exp_p1_dt)
@ -1206,8 +1205,9 @@ DmpZeroC2::gateDelaySlew(double &delay,
try {
findDriverParams(c1_);
ceff_ = c1_;
driver_valid_ = true;
findDriverDelaySlew(delay, slew);
driver_valid_ = true;
vo_delay_ = delay;
}
catch (DmpError &error) {
fail(error.what());
@ -1216,7 +1216,6 @@ DmpZeroC2::gateDelaySlew(double &delay,
ceff_ = c1_;
gateCapDelaySlew(ceff_, delay, slew);
}
vo_delay_ = delay;
gate_slew_ = slew;
}