|
|
@ -196,7 +196,8 @@ void DIOtempUpdate(DIOmodel *inModel, DIOinstance *here, double Temp, CKTcircuit |
|
|
here->DIOtDepSWCap=model->DIOdepletionSWcapCoeff* |
|
|
here->DIOtDepSWCap=model->DIOdepletionSWcapCoeff* |
|
|
here->DIOtJctSWPot; |
|
|
here->DIOtJctSWPot; |
|
|
/* and Vcrit */ |
|
|
/* and Vcrit */ |
|
|
here->DIOtVcrit = vte * log(vte/(CONSTroot2*here->DIOtSatCur)); |
|
|
|
|
|
|
|
|
double totalSatCur = here->DIOtSatCur + here->DIOtSatSWCur; |
|
|
|
|
|
here->DIOtVcrit = vte * log(vte/(CONSTroot2*totalSatCur)); |
|
|
|
|
|
|
|
|
/* and now to compute the breakdown voltage, again, using |
|
|
/* and now to compute the breakdown voltage, again, using |
|
|
* temperature adjusted basic parameters */ |
|
|
* temperature adjusted basic parameters */ |
|
|
@ -211,9 +212,9 @@ void DIOtempUpdate(DIOmodel *inModel, DIOinstance *here, double Temp, CKTcircuit |
|
|
} else { /* level=3 */ |
|
|
} else { /* level=3 */ |
|
|
cbv = model->DIObreakdownCurrent * here->DIOarea * here->DIOm; |
|
|
cbv = model->DIObreakdownCurrent * here->DIOarea * here->DIOm; |
|
|
} |
|
|
} |
|
|
if (cbv < here->DIOtSatCur * tBreakdownVoltage/vt) { |
|
|
|
|
|
|
|
|
if (cbv < totalSatCur * tBreakdownVoltage/vt) { |
|
|
#ifdef TRACE |
|
|
#ifdef TRACE |
|
|
cbv=here->DIOtSatCur * tBreakdownVoltage/vt; |
|
|
|
|
|
|
|
|
cbv=totalSatCur * tBreakdownVoltage/vt; |
|
|
SPfrontEnd->IFerrorf (ERR_WARNING, "%s: breakdown current increased to %g to resolve", here->DIOname, cbv); |
|
|
SPfrontEnd->IFerrorf (ERR_WARNING, "%s: breakdown current increased to %g to resolve", here->DIOname, cbv); |
|
|
SPfrontEnd->IFerrorf (ERR_WARNING, |
|
|
SPfrontEnd->IFerrorf (ERR_WARNING, |
|
|
"incompatibility with specified saturation current"); |
|
|
"incompatibility with specified saturation current"); |
|
|
@ -222,11 +223,11 @@ void DIOtempUpdate(DIOmodel *inModel, DIOinstance *here, double Temp, CKTcircuit |
|
|
} else { |
|
|
} else { |
|
|
tol=ckt->CKTreltol*cbv; |
|
|
tol=ckt->CKTreltol*cbv; |
|
|
xbv=tBreakdownVoltage-model->DIObrkdEmissionCoeff*vt*log(1+cbv/ |
|
|
xbv=tBreakdownVoltage-model->DIObrkdEmissionCoeff*vt*log(1+cbv/ |
|
|
(here->DIOtSatCur)); |
|
|
|
|
|
|
|
|
totalSatCur); |
|
|
for(iter=0 ; iter < 25 ; iter++) { |
|
|
for(iter=0 ; iter < 25 ; iter++) { |
|
|
xbv=tBreakdownVoltage-model->DIObrkdEmissionCoeff*vt*log(cbv/ |
|
|
xbv=tBreakdownVoltage-model->DIObrkdEmissionCoeff*vt*log(cbv/ |
|
|
(here->DIOtSatCur)+1-xbv/vt); |
|
|
|
|
|
xcbv=here->DIOtSatCur * |
|
|
|
|
|
|
|
|
totalSatCur+1-xbv/vt); |
|
|
|
|
|
xcbv=totalSatCur * |
|
|
(exp((tBreakdownVoltage-xbv)/(model->DIObrkdEmissionCoeff*vt))-1+xbv/vt); |
|
|
(exp((tBreakdownVoltage-xbv)/(model->DIObrkdEmissionCoeff*vt))-1+xbv/vt); |
|
|
if (fabs(xcbv-cbv) <= tol) goto matched; |
|
|
if (fabs(xcbv-cbv) <= tol) goto matched; |
|
|
} |
|
|
} |
|
|
|