adaption trap tunnel currents for bsim3

This commit is contained in:
dwarning 2022-12-27 18:26:47 +01:00
parent f7abd2a061
commit 581376f1a4
5 changed files with 192 additions and 74 deletions

View File

@ -31,6 +31,18 @@
#define DELTA_2 0.02
#define DELTA_3 0.02
#define DELTA_4 0.02
#define DEXP(A,B,C) { \
if (A > EXP_THRESHOLD) { \
B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \
C = MAX_EXP; \
} else if (A < -EXP_THRESHOLD) { \
B = MIN_EXP; \
C = 0; \
} else { \
B = exp(A); \
C = B; \
} \
}
#ifdef USE_OMP
int BSIM3LoadOMP(BSIM3instance *here, CKTcircuit *ckt);
@ -480,43 +492,127 @@ for (; model != NULL; model = BSIM3nextModel(model))
}
}
/* trap-assisted tunneling current enhancement */
if ((model->BSIM3acmMod == 12) && (model->BSIM3bsim4diodeGiven))
{
double t1 = 0.0;
if (model->BSIM3jtss > 0.0)
{
t1 = exp(-vbs/(model->BSIM3tNjts*model->BSIM3vtm)*(model->BSIM3vtss/(model->BSIM3vtss-vbs)))-1;
here->BSIM3cbs -= here->BSIM3sourceArea * model->BSIM3tJtss * t1;
}
if (model->BSIM3jtssws > 0.0)
{
t1 = exp(-vbs/(model->BSIM3tNjtssw*model->BSIM3vtm)*(model->BSIM3vtssws/(model->BSIM3vtssws-vbs)))-1;
here->BSIM3cbs -= here->BSIM3sourcePerimeter * model->BSIM3tJtssws * t1;
}
if (model->BSIM3jtsswgs > 0.0)
{
t1 = exp(-vbs/(model->BSIM3tNjtsswg*model->BSIM3vtm)*(model->BSIM3vtsswgs/(model->BSIM3vtsswgs-vbs)))-1;
here->BSIM3cbs -= pParam->BSIM3weff * model->BSIM3tJtsswgs * t1;
}
/* trap-assisted tunneling current enhancement */
if ((model->BSIM3acmMod == 12) && (model->BSIM3bsim4diodeGiven))
{
double dT4_dVb, dT5_dVb, dT6_dVb;
double Nvtmrss = model->BSIM3vtm * model->BSIM3njtstemp;
double Nvtmrsd = model->BSIM3vtm * model->BSIM3njtsdtemp;
double Nvtmrssws = model->BSIM3vtm * model->BSIM3njtsswtemp;
double Nvtmrsswd = model->BSIM3vtm * model->BSIM3njtsswdtemp;
double Nvtmrsswgs = model->BSIM3vtm * model->BSIM3njtsswgtemp;
double Nvtmrsswgd = model->BSIM3vtm * model->BSIM3njtsswgdtemp;
if (model->BSIM3jtsd > 0.0)
{
t1 = exp(-vbd/(model->BSIM3tNjtsd*model->BSIM3vtm)*(model->BSIM3vtsd/(model->BSIM3vtsd-vbd)))-1;
here->BSIM3cbd -= here->BSIM3drainArea * model->BSIM3tJtsd * t1;
}
if (model->BSIM3jtsswd > 0.0)
{
t1 = exp(-vbd/(model->BSIM3tNjtsswd*model->BSIM3vtm)*(model->BSIM3vtsswd/(model->BSIM3vtsswd-vbd)))-1;
here->BSIM3cbd -= here->BSIM3drainPerimeter * model->BSIM3tJtsswd * t1;
}
if (model->BSIM3jtsswgd > 0.0)
{
t1 = exp(-vbd/(model->BSIM3tNjtsswgd*model->BSIM3vtm)*(model->BSIM3vtsswgd/(model->BSIM3vtsswgd-vbd)))-1;
here->BSIM3cbd -= pParam->BSIM3weff * model->BSIM3tJtsswgd * t1;
if (model->BSIM3jtss > 0.0)
{
if ((model->BSIM3vtss - vbs) < (model->BSIM3vtss * 1e-3))
{ T9 = 1.0e3;
T0 = - vbs / Nvtmrss * T9;
DEXP(T0, T1, T10);
dT1_dVb = T10 / Nvtmrss * T9;
} else {
T9 = 1.0 / (model->BSIM3vtss - vbs);
T0 = -vbs / Nvtmrss * model->BSIM3vtss * T9;
dT0_dVb = model->BSIM3vtss / Nvtmrss * (T9 + vbs * T9 * T9) ;
DEXP(T0, T1, T10);
dT1_dVb = T10 * dT0_dVb;
}
here->BSIM3gbs += here->BSIM3sourceArea * model->BSIM3jtsstemp * dT1_dVb;
here->BSIM3cbs -= here->BSIM3sourceArea * model->BSIM3jtsstemp * (T1 - 1.0);
}
if (model->BSIM3jtssws > 0.0)
{
if ((model->BSIM3vtsd - vbd) < (model->BSIM3vtsd * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbd / Nvtmrsd * T9;
DEXP(T0, T2, T10);
dT2_dVb = T10 / Nvtmrsd * T9;
} else {
T9 = 1.0 / (model->BSIM3vtsd - vbd);
T0 = -vbd / Nvtmrsd * model->BSIM3vtsd * T9;
dT0_dVb = model->BSIM3vtsd / Nvtmrsd * (T9 + vbd * T9 * T9) ;
DEXP(T0, T2, T10);
dT2_dVb = T10 * dT0_dVb;
}
here->BSIM3gbs += here->BSIM3sourcePerimeter * model->BSIM3jtsswstemp * dT2_dVb;
here->BSIM3cbs -= here->BSIM3sourcePerimeter * model->BSIM3jtsswstemp * (T2 - 1.0);
}
if (model->BSIM3jtsswgs > 0.0)
{
if ((model->BSIM3vtssws - vbs) < (model->BSIM3vtssws * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbs / Nvtmrssws * T9;
DEXP(T0, T3, T10);
dT3_dVb = T10 / Nvtmrssws * T9;
} else {
T9 = 1.0 / (model->BSIM3vtssws - vbs);
T0 = -vbs / Nvtmrssws * model->BSIM3vtssws * T9;
dT0_dVb = model->BSIM3vtssws / Nvtmrssws * (T9 + vbs * T9 * T9) ;
DEXP(T0, T3, T10);
dT3_dVb = T10 * dT0_dVb;
}
here->BSIM3gbs += pParam->BSIM3weff * model->BSIM3jtsswgstemp * dT3_dVb;
here->BSIM3cbs -= pParam->BSIM3weff * model->BSIM3jtsswgstemp * (T3 - 1.0);
}
if (model->BSIM3jtsd > 0.0)
{
if ((model->BSIM3vtsswd - vbd) < (model->BSIM3vtsswd * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbd / Nvtmrsswd * T9;
DEXP(T0, T4, T10);
dT4_dVb = T10 / Nvtmrsswd * T9;
} else {
T9 = 1.0 / (model->BSIM3vtsswd - vbd);
T0 = -vbd / Nvtmrsswd * model->BSIM3vtsswd * T9;
dT0_dVb = model->BSIM3vtsswd / Nvtmrsswd * (T9 + vbd * T9 * T9) ;
DEXP(T0, T4, T10);
dT4_dVb = T10 * dT0_dVb;
}
here->BSIM3gbd += here->BSIM3drainArea * model->BSIM3jtsdtemp * dT4_dVb;
here->BSIM3cbd -= here->BSIM3drainArea * model->BSIM3jtsdtemp * (T4 - 1.0);
}
if (model->BSIM3jtsswd > 0.0)
{
if ((model->BSIM3vtsswgs - vbs) < (model->BSIM3vtsswgs * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbs / Nvtmrsswgs * T9;
DEXP(T0, T5, T10);
dT5_dVb = T10 / Nvtmrsswgs * T9;
} else {
T9 = 1.0 / (model->BSIM3vtsswgs - vbs);
T0 = -vbs / Nvtmrsswgs * model->BSIM3vtsswgs * T9;
dT0_dVb = model->BSIM3vtsswgs / Nvtmrsswgs * (T9 + vbs * T9 * T9) ;
DEXP(T0, T5, T10);
dT5_dVb = T10 * dT0_dVb;
}
here->BSIM3gbd += here->BSIM3drainPerimeter * model->BSIM3jtsswdtemp * dT5_dVb;
here->BSIM3cbd -= here->BSIM3drainPerimeter * model->BSIM3jtsswdtemp * (T5 - 1.0);
}
if (model->BSIM3jtsswgd > 0.0)
{
if ((model->BSIM3vtsswgd - vbd) < (model->BSIM3vtsswgd * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbd / Nvtmrsswgd * T9;
DEXP(T0, T6, T10);
dT6_dVb = T10 / Nvtmrsswgd * T9;
} else {
T9 = 1.0 / (model->BSIM3vtsswgd - vbd);
T0 = -vbd / Nvtmrsswgd * model->BSIM3vtsswgd * T9;
dT0_dVb = model->BSIM3vtsswgd / Nvtmrsswgd * (T9 + vbd * T9 * T9) ;
DEXP(T0, T6, T10);
dT6_dVb = T10 * dT0_dVb;
}
here->BSIM3gbd += pParam->BSIM3weff * model->BSIM3jtsswgdtemp * dT6_dVb;
here->BSIM3cbd -= pParam->BSIM3weff * model->BSIM3jtsswgdtemp * (T6 - 1.0);
}
}
/* End of diode DC model */
if (vds >= 0.0)

View File

@ -1392,6 +1392,12 @@ IFvalue *value)
case BSIM3_MOD_XTSSWD:
value->rValue = model->BSIM3xtsswd;
return(OK);
case BSIM3_MOD_XTSSWGS:
value->rValue = model->BSIM3xtsswgs;
return(OK);
case BSIM3_MOD_XTSSWGD:
value->rValue = model->BSIM3xtsswgd;
return(OK);
case BSIM3_MOD_TNJTS:
value->rValue = model->BSIM3tnjts;

View File

@ -1861,6 +1861,15 @@ GENmodel *inMod)
mod->BSIM3xtsswd = value->rValue;
mod->BSIM3xtsswdGiven = TRUE;
break;
case BSIM3_MOD_XTSSWGS:
mod->BSIM3xtsswgs = value->rValue;
mod->BSIM3xtsswgsGiven = TRUE;
break;
case BSIM3_MOD_XTSSWGD:
mod->BSIM3xtsswgd = value->rValue;
mod->BSIM3xtsswgdGiven = TRUE;
break;
case BSIM3_MOD_TNJTS:
mod->BSIM3tnjts = value->rValue;
mod->BSIM3tnjtsGiven = TRUE;

View File

@ -28,6 +28,15 @@
#define MIN_EXP 1.713908431e-15
#define EXP_THRESHOLD 34.0
#define Charge_q 1.60219e-19
#define DEXP(A,B) { \
if (A > EXP_THRESHOLD) { \
B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD); \
} else if (A < -EXP_THRESHOLD) { \
B = MIN_EXP; \
} else { \
B = exp(A); \
} \
}
/* ARGSUSED */
int
@ -38,7 +47,7 @@ CKTcircuit *ckt)
BSIM3model *model = (BSIM3model*) inModel;
BSIM3instance *here;
struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL;
double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn;
double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, T7, T9, Ldrn, Wdrn;
double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;
double Nvtm, SourceSatCurrent, DrainSatCurrent;
int Size_Not_Found, error;
@ -151,35 +160,33 @@ int Size_Not_Found, error;
/* trap-assisted tunneling current enhancement */
if ((model->BSIM3acmMod == 12) && (model->BSIM3bsim4diodeGiven))
{
model->BSIM3tJtss = model->BSIM3jtss
* exp(model->BSIM3xtss * Eg0 / ((model->BSIM3vtm * TRatio) - 1));
T0 = (TRatio - 1.0);
model->BSIM3njtstemp = model->BSIM3njts * (1.0 + model->BSIM3tnjts * T0);
model->BSIM3njtsdtemp = model->BSIM3njtsd * (1.0 + model->BSIM3tnjtsd * T0);
model->BSIM3njtsswtemp = model->BSIM3njtssw * (1.0 + model->BSIM3tnjtssw * T0);
model->BSIM3njtsswdtemp = model->BSIM3njtsswd * (1.0 + model->BSIM3tnjtsswd * T0);
model->BSIM3njtsswgtemp = model->BSIM3njtsswg * (1.0 + model->BSIM3tnjtsswg * T0);
model->BSIM3njtsswgdtemp = model->BSIM3njtsswgd * (1.0 + model->BSIM3tnjtsswgd * T0);
T7 = Eg0 / model->BSIM3vtm * T0;
T9 = model->BSIM3xtss * T7;
DEXP(T9, T1);
T9 = model->BSIM3xtsd * T7;
DEXP(T9, T2);
T9 = model->BSIM3xtssws * T7;
DEXP(T9, T3);
T9 = model->BSIM3xtsswd * T7;
DEXP(T9, T4);
T9 = model->BSIM3xtsswgs * T7;
DEXP(T9, T5);
T9 = model->BSIM3xtsswgd * T7;
DEXP(T9, T6);
model->BSIM3jtsstemp = T1 * model->BSIM3jtss;
model->BSIM3jtsdtemp = T2 * model->BSIM3jtsd;
model->BSIM3jtsswstemp = T3 * model->BSIM3jtssws;
model->BSIM3jtsswdtemp = T4 * model->BSIM3jtsswd;
model->BSIM3jtsswgstemp = T5 * model->BSIM3jtsswgs;
model->BSIM3jtsswgdtemp = T6 * model->BSIM3jtsswgd;
model->BSIM3tJtssws = model->BSIM3jtssws
* exp(model->BSIM3xtssws * Eg0 / ((model->BSIM3vtm * TRatio) - 1));
model->BSIM3tJtsswgs = model->BSIM3jtsswgs
* exp(model->BSIM3xtsswgs * Eg0 / ((model->BSIM3vtm * TRatio) - 1));
model->BSIM3tJtsd = model->BSIM3jtsd
* exp(model->BSIM3xtsd * Eg0 / ((model->BSIM3vtm * TRatio) - 1));
model->BSIM3tJtsswd = model->BSIM3jtsswd
* exp(model->BSIM3xtsswd * Eg0 / ((model->BSIM3vtm * TRatio) - 1));
model->BSIM3tJtsswgd = model->BSIM3jtsswgd
* exp(model->BSIM3xtsswgd * Eg0 / ((model->BSIM3vtm * TRatio) - 1));
model->BSIM3tNjts = model->BSIM3njts * (1 + model->BSIM3tnjts * (TRatio - 1));
model->BSIM3tNjtsd = model->BSIM3njtsd * (1 + model->BSIM3tnjtsd * (TRatio - 1));
model->BSIM3tNjtssw = model->BSIM3njtssw * (1 + model->BSIM3tnjtssw * (TRatio - 1));
model->BSIM3tNjtsswd = model->BSIM3njtsswd * (1 + model->BSIM3tnjtsswd * (TRatio - 1));
model->BSIM3tNjtsswg = model->BSIM3njtsswg * (1 + model->BSIM3tnjtsswg * (TRatio - 1));
model->BSIM3tNjtsswgd = model->BSIM3njtsswgd * (1 + model->BSIM3tnjtsswgd * (TRatio - 1));
}
/* loop through all the instances of the model */

View File

@ -918,18 +918,18 @@ typedef struct sBSIM3model
double BSIM3tnjtsswd;
double BSIM3tnjtsswgd;
double BSIM3tJtss;
double BSIM3tJtsd;
double BSIM3tJtssws;
double BSIM3tJtsswd;
double BSIM3tJtsswgs;
double BSIM3tJtsswgd;
double BSIM3tNjts;
double BSIM3tNjtssw;
double BSIM3tNjtsswg;
double BSIM3tNjtsd;
double BSIM3tNjtsswd;
double BSIM3tNjtsswgd;
double BSIM3njtstemp;
double BSIM3njtsswtemp;
double BSIM3njtsswgtemp;
double BSIM3njtsdtemp;
double BSIM3njtsswdtemp;
double BSIM3njtsswgdtemp;
double BSIM3jtsstemp;
double BSIM3jtsdtemp;
double BSIM3jtsswstemp;
double BSIM3jtsswdtemp;
double BSIM3jtsswgstemp;
double BSIM3jtsswgdtemp;
struct bsim3SizeDependParam *pSizeDependParamKnot;