Trimmed high level injection code.

This commit is contained in:
pnenzi 2003-10-15 20:39:37 +00:00
parent de08745044
commit 38252ebdbe
1 changed files with 22 additions and 28 deletions

View File

@ -35,7 +35,6 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
double czeroSW; double czeroSW;
double czof2SW; double czof2SW;
double sargSW; double sargSW;
double cd_new;
double sqrt_ikr; double sqrt_ikr;
double sqrt_ikf; double sqrt_ikf;
double ikf_area_m; double ikf_area_m;
@ -183,55 +182,50 @@ DIOload(GENmodel *inModel, CKTcircuit *ckt)
next1: if (vd >= -3*vte) { /* forward */ next1: if (vd >= -3*vte) { /* forward */
evd = exp(vd/vte); evd = exp(vd/vte);
cd = csat*(evd-1); cd = csat*(evd-1) + ckt->CKTgmin*vd;
gd = csat*evd/vte; gd = csat*evd/vte + ckt->CKTgmin;
if( (model->DIOforwardKneeCurrentGiven) && (model->DIOforwardKneeCurrent > 0.0) && (cd > 1.0e-18) ) {
if( (model->DIOforwardKneeCurrentGiven) && (model->DIOforwardKneeCurrent > 0.0) && (cd > 1.0e-18) ) {
gd = gd-ckt->CKTgmin;
cd = cd-ckt->CKTgmin*vd;
ikf_area_m = model->DIOforwardKneeCurrent*here->DIOarea*here->DIOm; ikf_area_m = model->DIOforwardKneeCurrent*here->DIOarea*here->DIOm;
sqrt_ikf = sqrt(cd/ikf_area_m); sqrt_ikf = sqrt(cd/ikf_area_m);
cd_new = cd/(1+sqrt_ikf); gd = ((1+sqrt_ikf)*gd - cd*gd/(2*sqrt_ikf*ikf_area_m))/(1+2*sqrt_ikf+cd/ikf_area_m)+ckt->CKTgmin;
gd = ((1+sqrt_ikf)*gd - cd*gd/(2*sqrt_ikf*ikf_area_m))/(1+2*sqrt_ikf+cd/ikf_area_m); cd = cd/(1+sqrt_ikf)+ckt->CKTgmin*vd;
cd = cd_new;
} }
cd = cd + ckt->CKTgmin*vd;
gd = gd + ckt->CKTgmin;
} else if((!(model->DIObreakdownVoltageGiven)) || /* reverse*/ } else if((!(model->DIObreakdownVoltageGiven)) || /* reverse*/
vd >= -here->DIOtBrkdwnV) { vd >= -here->DIOtBrkdwnV) {
arg=3*vte/(vd*CONSTe); arg=3*vte/(vd*CONSTe);
arg = arg * arg * arg; arg = arg * arg * arg;
cd = -csat*(1+arg); cd = -csat*(1+arg) + ckt->CKTgmin*vd ;
gd = csat*3*arg/vd; gd = csat*3*arg/vd + ckt->CKTgmin;
if( (model->DIOreverseKneeCurrentGiven) && (model->DIOreverseKneeCurrent > 0.0) && (cd < -1.0e-18) ) { if( (model->DIOreverseKneeCurrentGiven) && (model->DIOreverseKneeCurrent > 0.0) && (cd < -1.0e-18) ) {
ikr_area_m = model->DIOreverseKneeCurrent*here->DIOarea*here->DIOm; gd = gd-ckt->CKTgmin;
cd = cd-ckt->CKTgmin*vd;
ikr_area_m = model->DIOreverseKneeCurrent*here->DIOarea*here->DIOm;
sqrt_ikr = sqrt(cd/(-ikr_area_m)); sqrt_ikr = sqrt(cd/(-ikr_area_m));
cd_new = cd/(1+sqrt_ikr); gd = ((1+sqrt_ikr)*gd + cd*gd/(2*sqrt_ikr*ikr_area_m))/(1+2*sqrt_ikr - cd/ikr_area_m)+ckt->CKTgmin;
gd = ((1+sqrt_ikr)*gd + cd*gd/(2*sqrt_ikr*ikr_area_m))/(1+2*sqrt_ikr - cd/ikr_area_m); cd = cd/(1+sqrt_ikr)+ckt->CKTgmin*vd;
cd = cd_new;
} }
cd = cd + ckt->CKTgmin*vd;
gd = gd + ckt->CKTgmin;
} else { /* breakdown */ } else { /* breakdown */
evrev=exp(-(here->DIOtBrkdwnV+vd)/vte); evrev=exp(-(here->DIOtBrkdwnV+vd)/vte);
cd = -csat*evrev; cd = -csat*evrev + ckt->CKTgmin*vd;
gd = csat*evrev/vte; gd = csat*evrev/vte + ckt->CKTgmin;
if( (model->DIOreverseKneeCurrentGiven) && (model->DIOreverseKneeCurrent > 0.0) && (cd < -1.0e-18) ) { if( (model->DIOreverseKneeCurrentGiven) && (model->DIOreverseKneeCurrent > 0.0) && (cd < -1.0e-18) ) {
ikr_area_m = model->DIOreverseKneeCurrent*here->DIOarea*here->DIOm; gd = gd-ckt->CKTgmin;
cd = cd-ckt->CKTgmin*vd;
ikr_area_m = model->DIOreverseKneeCurrent*here->DIOarea*here->DIOm;
sqrt_ikr = sqrt(cd/(-ikr_area_m)); sqrt_ikr = sqrt(cd/(-ikr_area_m));
cd_new = cd/(1+sqrt_ikr);
gd = ((1+sqrt_ikr)*gd + cd*gd/(2*sqrt_ikr*ikr_area_m))/(1+2*sqrt_ikr - cd/ikr_area_m); gd = ((1+sqrt_ikr)*gd + cd*gd/(2*sqrt_ikr*ikr_area_m))/(1+2*sqrt_ikr - cd/ikr_area_m);
cd = cd_new; cd = cd/(1+sqrt_ikr);
} }
cd = cd + ckt->CKTgmin*vd;
gd = gd + ckt->CKTgmin;
} }
if ((ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) || if ((ckt->CKTmode & (MODETRAN | MODEAC | MODEINITSMSIG)) ||
((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) { ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) {