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