adaption trap tunnel currents for bsim3.2

This commit is contained in:
dwarning 2023-01-01 17:53:17 +01:00
parent 547449304b
commit f613188728
7 changed files with 632 additions and 0 deletions

View File

@ -512,6 +512,43 @@ IOP("vgbr_max", BSIM3v32_MOD_VGBR_MAX, IF_REAL, "maximum voltage G-B branch"),
IOP("vbsr_max", BSIM3v32_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"), IOP("vbsr_max", BSIM3v32_MOD_VBSR_MAX, IF_REAL, "maximum voltage B-S branch"),
IOP("vbdr_max", BSIM3v32_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"), IOP("vbdr_max", BSIM3v32_MOD_VBDR_MAX, IF_REAL, "maximum voltage B-D branch"),
/* trap-assisted tunneling current enhancement */
IOP("bsim4diode", BSIM3v32_MOD_BSIM4DIODE, IF_INTEGER, "flag invoking trap-assisted diode model"),
IOP("jtss", BSIM3v32_MOD_JTSS, IF_REAL, "Bottom trap-assisted saturation current density"),
IOP("jtsd", BSIM3v32_MOD_JTSD, IF_REAL, "Bottom trap-assisted saturation current density"),
IOP("jtssws", BSIM3v32_MOD_JTSSWS, IF_REAL, "STI sidewall trap-assisted saturation current density"),
IOP("jtsswd", BSIM3v32_MOD_JTSSWD, IF_REAL, "STI sidewall trap-assisted saturation current density"),
IOP("jtsswgs", BSIM3v32_MOD_JTSSWGS, IF_REAL, "Gate-edge sidewall trap-assisted saturation current density"),
IOP("jtsswgd", BSIM3v32_MOD_JTSSWGD, IF_REAL, "Gate-edge sidewall trap-assisted saturation current density"),
IOP("njts", BSIM3v32_MOD_NJTS, IF_REAL, "Non-ideality factor for JTSS and JTSD"),
IOP("njtsd", BSIM3v32_MOD_NJTSD, IF_REAL, "Non-ideality factor for JTSD"),
IOP("njtssw", BSIM3v32_MOD_NJTSSW, IF_REAL, "Non-ideality factor for JTSSWS and JTSSWD"),
IOP("njtsswd", BSIM3v32_MOD_NJTSSWD, IF_REAL, "Non-ideality factor for JTSSWS"),
IOP("njtsswg", BSIM3v32_MOD_NJTSSWG, IF_REAL, "Non-ideality factor for JTSSWGS"),
IOP("njtsswgd", BSIM3v32_MOD_NJTSSWGD, IF_REAL, "Non-ideality factor for JTSSWGD"),
IOP("vtss", BSIM3v32_MOD_VTSS, IF_REAL, "Bottom source junction trap-assisted current voltage dependent parameter"),
IOP("vtsd", BSIM3v32_MOD_VTSD, IF_REAL, "Bottom drain junction trap-assisted current voltage dependent parameter"),
IOP("vtssws", BSIM3v32_MOD_VTSSWS, IF_REAL, "Unit length trap-assisted current voltage dependent parameter for sidewall source junctio"),
IOP("vtsswd", BSIM3v32_MOD_VTSSWD, IF_REAL, "Unit length trap-assisted current voltage dependent parameter for sidewall drain junction"),
IOP("vtsswgs", BSIM3v32_MOD_VTSSWGS, IF_REAL, "Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall source junction"),
IOP("vtsswgd", BSIM3v32_MOD_VTSSWGD, IF_REAL, "Unit length trap-assisted current voltage dependent parameter for gate-edge sidewall drain junction"),
IOP("xtss", BSIM3v32_MOD_XTSS, IF_REAL, "Power dependence of JTSS, JTSD on temperature"),
IOP("xtsd", BSIM3v32_MOD_XTSD, IF_REAL, "Power dependence of JTSS, JTSD on temperature"),
IOP("xtssws", BSIM3v32_MOD_XTSSWS, IF_REAL, "Power dependence of JTSSWS, JTSSWD on temperature"),
IOP("xtsswd", BSIM3v32_MOD_XTSSWD, IF_REAL, "Power dependence of JTSSWS, JTSSWD on temperature"),
IOP("xtsswgs", BSIM3v32_MOD_XTSSWGS, IF_REAL, "Power dependence of JTSSWGS, JTSSWGD on temperature"),
IOP("xtsswgd", BSIM3v32_MOD_XTSSWGD, IF_REAL, "Power dependence of JTSSWGS, JTSSWGD on temperature"),
IOP("tnjts", BSIM3v32_MOD_TNJTS, IF_REAL, "Temperature coefficient for NJTS"),
IOP("tnjtssw", BSIM3v32_MOD_TNJTSSW, IF_REAL, "Temperature coefficient for NJTSD"),
IOP("tnjtsswg", BSIM3v32_MOD_TNJTSSWG, IF_REAL, "Temperature coefficient for NJTSSW"),
IOP("tnjtsd", BSIM3v32_MOD_TNJTSD, IF_REAL, "Temperature coefficient for NJTSSWD"),
IOP("tnjtsswd", BSIM3v32_MOD_TNJTSSWD, IF_REAL, "Temperature coefficient for NJTSSWG"),
IOP("tnjtsswgd", BSIM3v32_MOD_TNJTSSWGD, IF_REAL, "Temperature coefficient for NJTSSWGD"),
IP( "nmos", BSIM3v32_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"), IP( "nmos", BSIM3v32_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
IP( "pmos", BSIM3v32_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"), IP( "pmos", BSIM3v32_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
}; };

View File

@ -30,6 +30,18 @@
#define DELTA_2 0.02 #define DELTA_2 0.02
#define DELTA_3 0.02 #define DELTA_3 0.02
#define DELTA_4 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 #ifdef USE_OMP
int BSIM3v32LoadOMP(BSIM3v32instance *here, CKTcircuit *ckt); int BSIM3v32LoadOMP(BSIM3v32instance *here, CKTcircuit *ckt);
@ -499,6 +511,127 @@ for (; model != NULL; model = BSIM3v32nextModel(model))
} }
} }
} }
/* trap-assisted tunneling current enhancement */
if ((model->BSIM3v32acmMod == 12) && (model->BSIM3v32bsim4diodeGiven))
{
double dT4_dVb, dT5_dVb, dT6_dVb;
double Nvtmrss = model->BSIM3v32vtm * model->BSIM3v32njtstemp;
double Nvtmrsd = model->BSIM3v32vtm * model->BSIM3v32njtsdtemp;
double Nvtmrssws = model->BSIM3v32vtm * model->BSIM3v32njtsswtemp;
double Nvtmrsswd = model->BSIM3v32vtm * model->BSIM3v32njtsswdtemp;
double Nvtmrsswgs = model->BSIM3v32vtm * model->BSIM3v32njtsswgtemp;
double Nvtmrsswgd = model->BSIM3v32vtm * model->BSIM3v32njtsswgdtemp;
if (model->BSIM3v32jtss > 0.0)
{
if ((model->BSIM3v32vtss - vbs) < (model->BSIM3v32vtss * 1e-3))
{ T9 = 1.0e3;
T0 = - vbs / Nvtmrss * T9;
DEXP(T0, T1, T10);
dT1_dVb = T10 / Nvtmrss * T9;
} else {
T9 = 1.0 / (model->BSIM3v32vtss - vbs);
T0 = -vbs / Nvtmrss * model->BSIM3v32vtss * T9;
dT0_dVb = model->BSIM3v32vtss / Nvtmrss * (T9 + vbs * T9 * T9) ;
DEXP(T0, T1, T10);
dT1_dVb = T10 * dT0_dVb;
}
here->BSIM3v32gbs += here->BSIM3v32sourceArea * model->BSIM3v32jtsstemp * dT1_dVb;
here->BSIM3v32cbs -= here->BSIM3v32sourceArea * model->BSIM3v32jtsstemp * (T1 - 1.0);
}
if (model->BSIM3v32jtssws > 0.0)
{
if ((model->BSIM3v32vtsd - vbd) < (model->BSIM3v32vtsd * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbd / Nvtmrsd * T9;
DEXP(T0, T2, T10);
dT2_dVb = T10 / Nvtmrsd * T9;
} else {
T9 = 1.0 / (model->BSIM3v32vtsd - vbd);
T0 = -vbd / Nvtmrsd * model->BSIM3v32vtsd * T9;
dT0_dVb = model->BSIM3v32vtsd / Nvtmrsd * (T9 + vbd * T9 * T9) ;
DEXP(T0, T2, T10);
dT2_dVb = T10 * dT0_dVb;
}
here->BSIM3v32gbs += here->BSIM3v32sourcePerimeter * model->BSIM3v32jtsswstemp * dT2_dVb;
here->BSIM3v32cbs -= here->BSIM3v32sourcePerimeter * model->BSIM3v32jtsswstemp * (T2 - 1.0);
}
if (model->BSIM3v32jtsswgs > 0.0)
{
if ((model->BSIM3v32vtssws - vbs) < (model->BSIM3v32vtssws * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbs / Nvtmrssws * T9;
DEXP(T0, T3, T10);
dT3_dVb = T10 / Nvtmrssws * T9;
} else {
T9 = 1.0 / (model->BSIM3v32vtssws - vbs);
T0 = -vbs / Nvtmrssws * model->BSIM3v32vtssws * T9;
dT0_dVb = model->BSIM3v32vtssws / Nvtmrssws * (T9 + vbs * T9 * T9) ;
DEXP(T0, T3, T10);
dT3_dVb = T10 * dT0_dVb;
}
here->BSIM3v32gbs += pParam->BSIM3v32weff * model->BSIM3v32jtsswgstemp * dT3_dVb;
here->BSIM3v32cbs -= pParam->BSIM3v32weff * model->BSIM3v32jtsswgstemp * (T3 - 1.0);
}
if (model->BSIM3v32jtsd > 0.0)
{
if ((model->BSIM3v32vtsswd - vbd) < (model->BSIM3v32vtsswd * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbd / Nvtmrsswd * T9;
DEXP(T0, T4, T10);
dT4_dVb = T10 / Nvtmrsswd * T9;
} else {
T9 = 1.0 / (model->BSIM3v32vtsswd - vbd);
T0 = -vbd / Nvtmrsswd * model->BSIM3v32vtsswd * T9;
dT0_dVb = model->BSIM3v32vtsswd / Nvtmrsswd * (T9 + vbd * T9 * T9) ;
DEXP(T0, T4, T10);
dT4_dVb = T10 * dT0_dVb;
}
here->BSIM3v32gbd += here->BSIM3v32drainArea * model->BSIM3v32jtsdtemp * dT4_dVb;
here->BSIM3v32cbd -= here->BSIM3v32drainArea * model->BSIM3v32jtsdtemp * (T4 - 1.0);
}
if (model->BSIM3v32jtsswd > 0.0)
{
if ((model->BSIM3v32vtsswgs - vbs) < (model->BSIM3v32vtsswgs * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbs / Nvtmrsswgs * T9;
DEXP(T0, T5, T10);
dT5_dVb = T10 / Nvtmrsswgs * T9;
} else {
T9 = 1.0 / (model->BSIM3v32vtsswgs - vbs);
T0 = -vbs / Nvtmrsswgs * model->BSIM3v32vtsswgs * T9;
dT0_dVb = model->BSIM3v32vtsswgs / Nvtmrsswgs * (T9 + vbs * T9 * T9) ;
DEXP(T0, T5, T10);
dT5_dVb = T10 * dT0_dVb;
}
here->BSIM3v32gbd += here->BSIM3v32drainPerimeter * model->BSIM3v32jtsswdtemp * dT5_dVb;
here->BSIM3v32cbd -= here->BSIM3v32drainPerimeter * model->BSIM3v32jtsswdtemp * (T5 - 1.0);
}
if (model->BSIM3v32jtsswgd > 0.0)
{
if ((model->BSIM3v32vtsswgd - vbd) < (model->BSIM3v32vtsswgd * 1e-3) )
{ T9 = 1.0e3;
T0 = -vbd / Nvtmrsswgd * T9;
DEXP(T0, T6, T10);
dT6_dVb = T10 / Nvtmrsswgd * T9;
} else {
T9 = 1.0 / (model->BSIM3v32vtsswgd - vbd);
T0 = -vbd / Nvtmrsswgd * model->BSIM3v32vtsswgd * T9;
dT0_dVb = model->BSIM3v32vtsswgd / Nvtmrsswgd * (T9 + vbd * T9 * T9) ;
DEXP(T0, T6, T10);
dT6_dVb = T10 * dT0_dVb;
}
here->BSIM3v32gbd += pParam->BSIM3v32weff * model->BSIM3v32jtsswgdtemp * dT6_dVb;
here->BSIM3v32cbd -= pParam->BSIM3v32weff * model->BSIM3v32jtsswgdtemp * (T6 - 1.0);
}
}
/* End of diode DC model */ /* End of diode DC model */
if (vds >= 0.0) if (vds >= 0.0)

View File

@ -1312,6 +1312,104 @@ BSIM3v32mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
case BSIM3v32_MOD_VBDR_MAX: case BSIM3v32_MOD_VBDR_MAX:
value->rValue = model->BSIM3v32vbdrMax; value->rValue = model->BSIM3v32vbdrMax;
return(OK); return(OK);
/* trap-assisted tunneling current enhancement */
case BSIM3v32_MOD_BSIM4DIODE:
value->iValue = model->BSIM3v32bsim4diode;
return(OK);
case BSIM3v32_MOD_JTSS:
value->rValue = model->BSIM3v32jtss;
return(OK);
case BSIM3v32_MOD_JTSD:
value->rValue = model->BSIM3v32jtsd;
return(OK);
case BSIM3v32_MOD_JTSSWS:
value->rValue = model->BSIM3v32jtssws;
return(OK);
case BSIM3v32_MOD_JTSSWD:
value->rValue = model->BSIM3v32jtsswd;
return(OK);
case BSIM3v32_MOD_JTSSWGS:
value->rValue = model->BSIM3v32jtsswgs;
return(OK);
case BSIM3v32_MOD_JTSSWGD:
value->rValue = model->BSIM3v32jtsswgd;
return(OK);
case BSIM3v32_MOD_NJTS:
value->rValue = model->BSIM3v32njts;
return(OK);
case BSIM3v32_MOD_NJTSSW:
value->rValue = model->BSIM3v32njtssw;
return(OK);
case BSIM3v32_MOD_NJTSSWG:
value->rValue = model->BSIM3v32njtsswg;
return(OK);
case BSIM3v32_MOD_NJTSD:
value->rValue = model->BSIM3v32njtsd;
return(OK);
case BSIM3v32_MOD_NJTSSWD:
value->rValue = model->BSIM3v32njtsswd;
return(OK);
case BSIM3v32_MOD_NJTSSWGD:
value->rValue = model->BSIM3v32njtsswgd;
return(OK);
case BSIM3v32_MOD_VTSS:
value->rValue = model->BSIM3v32vtss;
return(OK);
case BSIM3v32_MOD_VTSD:
value->rValue = model->BSIM3v32vtsd;
return(OK);
case BSIM3v32_MOD_VTSSWS:
value->rValue = model->BSIM3v32vtssws;
return(OK);
case BSIM3v32_MOD_VTSSWD:
value->rValue = model->BSIM3v32vtsswd;
return(OK);
case BSIM3v32_MOD_VTSSWGS:
value->rValue = model->BSIM3v32vtsswgs;
return(OK);
case BSIM3v32_MOD_VTSSWGD:
value->rValue = model->BSIM3v32vtsswgd;
return(OK);
case BSIM3v32_MOD_XTSS:
value->rValue = model->BSIM3v32xtss;
return(OK);
case BSIM3v32_MOD_XTSD:
value->rValue = model->BSIM3v32xtsd;
return(OK);
case BSIM3v32_MOD_XTSSWS:
value->rValue = model->BSIM3v32xtssws;
return(OK);
case BSIM3v32_MOD_XTSSWD:
value->rValue = model->BSIM3v32xtsswd;
return(OK);
case BSIM3v32_MOD_XTSSWGS:
value->rValue = model->BSIM3v32xtsswgs;
return(OK);
case BSIM3v32_MOD_XTSSWGD:
value->rValue = model->BSIM3v32xtsswgd;
return(OK);
case BSIM3v32_MOD_TNJTS:
value->rValue = model->BSIM3v32tnjts;
return(OK);
case BSIM3v32_MOD_TNJTSSW:
value->rValue = model->BSIM3v32tnjtssw;
return(OK);
case BSIM3v32_MOD_TNJTSSWG:
value->rValue = model->BSIM3v32tnjtsswg;
return(OK);
case BSIM3v32_MOD_TNJTSD:
value->rValue = model->BSIM3v32tnjtsd;
return(OK);
case BSIM3v32_MOD_TNJTSSWD:
value->rValue = model->BSIM3v32tnjtsswd;
return(OK);
case BSIM3v32_MOD_TNJTSSWGD:
value->rValue = model->BSIM3v32tnjtsswgd;
return(OK);
default: default:
return(E_BADPARM); return(E_BADPARM);

View File

@ -1761,6 +1761,136 @@ BSIM3v32mParam(int param, IFvalue *value, GENmodel *inMod)
mod->BSIM3v32vbdrMaxGiven = TRUE; mod->BSIM3v32vbdrMaxGiven = TRUE;
break; break;
/* trap-assisted tunneling current enhancement */
case BSIM3v32_MOD_BSIM4DIODE:
mod->BSIM3v32bsim4diode = value->iValue;
mod->BSIM3v32bsim4diodeGiven = TRUE;
break;
case BSIM3v32_MOD_JTSS:
mod->BSIM3v32jtss = value->rValue;
mod->BSIM3v32jtssGiven = TRUE;
break;
case BSIM3v32_MOD_JTSD:
mod->BSIM3v32jtsd = value->rValue;
mod->BSIM3v32jtsdGiven = TRUE;
break;
case BSIM3v32_MOD_JTSSWS:
mod->BSIM3v32jtssws = value->rValue;
mod->BSIM3v32jtsswsGiven = TRUE;
break;
case BSIM3v32_MOD_JTSSWD:
mod->BSIM3v32jtsswd = value->rValue;
mod->BSIM3v32jtsswdGiven = TRUE;
break;
case BSIM3v32_MOD_JTSSWGS:
mod->BSIM3v32jtsswgs = value->rValue;
mod->BSIM3v32jtsswgsGiven = TRUE;
break;
case BSIM3v32_MOD_JTSSWGD:
mod->BSIM3v32jtsswgd = value->rValue;
mod->BSIM3v32jtsswgdGiven = TRUE;
break;
case BSIM3v32_MOD_NJTS:
mod->BSIM3v32njts = value->rValue;
mod->BSIM3v32njtsGiven = TRUE;
break;
case BSIM3v32_MOD_NJTSSW:
mod->BSIM3v32njtssw = value->rValue;
mod->BSIM3v32njtsswGiven = TRUE;
break;
case BSIM3v32_MOD_NJTSSWG:
mod->BSIM3v32njtsswg = value->rValue;
mod->BSIM3v32njtsswgGiven = TRUE;
break;
case BSIM3v32_MOD_NJTSD:
mod->BSIM3v32njtsd = value->rValue;
mod->BSIM3v32njtsdGiven = TRUE;
break;
case BSIM3v32_MOD_NJTSSWD:
mod->BSIM3v32njtsswd = value->rValue;
mod->BSIM3v32njtsswdGiven = TRUE;
break;
case BSIM3v32_MOD_NJTSSWGD:
mod->BSIM3v32njtsswgd = value->rValue;
mod->BSIM3v32njtsswgdGiven = TRUE;
break;
case BSIM3v32_MOD_VTSS:
mod->BSIM3v32vtss = value->rValue;
mod->BSIM3v32vtssGiven = TRUE;
break;
case BSIM3v32_MOD_VTSD:
mod->BSIM3v32vtsd = value->rValue;
mod->BSIM3v32vtsdGiven = TRUE;
break;
case BSIM3v32_MOD_VTSSWS:
mod->BSIM3v32vtssws = value->rValue;
mod->BSIM3v32vtsswsGiven = TRUE;
break;
case BSIM3v32_MOD_VTSSWD:
mod->BSIM3v32vtsswd = value->rValue;
mod->BSIM3v32vtsswdGiven = TRUE;
break;
case BSIM3v32_MOD_VTSSWGS:
mod->BSIM3v32vtsswgs = value->rValue;
mod->BSIM3v32vtsswgsGiven = TRUE;
break;
case BSIM3v32_MOD_VTSSWGD:
mod->BSIM3v32vtsswgd = value->rValue;
mod->BSIM3v32vtsswgdGiven = TRUE;
break;
case BSIM3v32_MOD_XTSS:
mod->BSIM3v32xtss = value->rValue;
mod->BSIM3v32xtssGiven = TRUE;
break;
case BSIM3v32_MOD_XTSD:
mod->BSIM3v32xtsd = value->rValue;
mod->BSIM3v32xtsdGiven = TRUE;
break;
case BSIM3v32_MOD_XTSSWS:
mod->BSIM3v32xtssws = value->rValue;
mod->BSIM3v32xtsswsGiven = TRUE;
break;
case BSIM3v32_MOD_XTSSWD:
mod->BSIM3v32xtsswd = value->rValue;
mod->BSIM3v32xtsswdGiven = TRUE;
break;
case BSIM3v32_MOD_XTSSWGS:
mod->BSIM3v32xtsswgs = value->rValue;
mod->BSIM3v32xtsswgsGiven = TRUE;
break;
case BSIM3v32_MOD_XTSSWGD:
mod->BSIM3v32xtsswgd = value->rValue;
mod->BSIM3v32xtsswgdGiven = TRUE;
break;
case BSIM3v32_MOD_TNJTS:
mod->BSIM3v32tnjts = value->rValue;
mod->BSIM3v32tnjtsGiven = TRUE;
break;
case BSIM3v32_MOD_TNJTSSW:
mod->BSIM3v32tnjtssw = value->rValue;
mod->BSIM3v32tnjtsswGiven = TRUE;
break;
case BSIM3v32_MOD_TNJTSSWG:
mod->BSIM3v32tnjtsswg = value->rValue;
mod->BSIM3v32tnjtsswgGiven = TRUE;
break;
case BSIM3v32_MOD_TNJTSD:
mod->BSIM3v32tnjtsd = value->rValue;
mod->BSIM3v32tnjtsdGiven = TRUE;
break;
case BSIM3v32_MOD_TNJTSSWD:
mod->BSIM3v32tnjtsswd = value->rValue;
mod->BSIM3v32tnjtsswdGiven = TRUE;
break;
case BSIM3v32_MOD_TNJTSSWGD:
mod->BSIM3v32tnjtsswgd = value->rValue;
mod->BSIM3v32tnjtsswgdGiven = TRUE;
break;
case BSIM3v32_MOD_NMOS : case BSIM3v32_MOD_NMOS :
if(value->iValue) { if(value->iValue) {
mod->BSIM3v32type = 1; mod->BSIM3v32type = 1;

View File

@ -935,6 +935,74 @@ BSIM3v32instance **InstArray;
if (!model->BSIM3v32vbdrMaxGiven) if (!model->BSIM3v32vbdrMaxGiven)
model->BSIM3v32vbdrMax = 1e99; model->BSIM3v32vbdrMax = 1e99;
/* trap-assisted tunneling current enhancement */
if (!model->BSIM3v32bsim4diodeGiven)
model->BSIM3v32bsim4diode = 0;
if (!model->BSIM3v32jtssGiven)
model->BSIM3v32jtss = 0.0;
if (!model->BSIM3v32jtsdGiven)
model->BSIM3v32jtsd = model->BSIM3v32jtss;
if (!model->BSIM3v32jtsswsGiven)
model->BSIM3v32jtssws = 0.0;
if (!model->BSIM3v32jtsswdGiven)
model->BSIM3v32jtsswd = model->BSIM3v32jtssws;
if (!model->BSIM3v32jtsswgsGiven)
model->BSIM3v32jtsswgs = 0.0;
if (!model->BSIM3v32jtsswgdGiven)
model->BSIM3v32jtsswgd = model->BSIM3v32jtsswgs;
if (!model->BSIM3v32njtsGiven)
model->BSIM3v32njts = 20.0;
if (!model->BSIM3v32njtsswGiven)
model->BSIM3v32njtssw = 20.0;
if (!model->BSIM3v32njtsswgGiven)
model->BSIM3v32njtsswg = 20.0;
if (!model->BSIM3v32njtsdGiven)
model->BSIM3v32njtsd = model->BSIM3v32njts;
if (!model->BSIM3v32njtsswdGiven)
model->BSIM3v32njtsswd = model->BSIM3v32njtssw;
if (!model->BSIM3v32njtsswgdGiven)
model->BSIM3v32njtsswgd = model->BSIM3v32njtsswg;
if (!model->BSIM3v32vtssGiven)
model->BSIM3v32vtss = 10.0;
if (!model->BSIM3v32vtsdGiven)
model->BSIM3v32vtsd = model->BSIM3v32vtss;
if (!model->BSIM3v32vtsswsGiven)
model->BSIM3v32vtssws = 10.0;
if (!model->BSIM3v32vtsswdGiven)
model->BSIM3v32vtsswd = model->BSIM3v32vtssws;
if (!model->BSIM3v32vtsswgsGiven)
model->BSIM3v32vtsswgs = 10.0;
if (!model->BSIM3v32vtsswgdGiven)
model->BSIM3v32vtsswgd = model->BSIM3v32vtsswgs;
if (!model->BSIM3v32xtssGiven)
model->BSIM3v32xtss = 0.02;
if (!model->BSIM3v32xtsdGiven)
model->BSIM3v32xtsd = 0.02;
if (!model->BSIM3v32xtsswsGiven)
model->BSIM3v32xtssws = 0.02;
if (!model->BSIM3v32xtsswdGiven)
model->BSIM3v32xtsswd = 0.02;
if (!model->BSIM3v32xtsswgsGiven)
model->BSIM3v32xtsswgs = 0.02;
if (!model->BSIM3v32xtsswgdGiven)
model->BSIM3v32xtsswgd = 0.02;
if (!model->BSIM3v32tnjtsGiven)
model->BSIM3v32tnjts = 0.0;
if (!model->BSIM3v32tnjtsswGiven)
model->BSIM3v32tnjtssw = 0.0;
if (!model->BSIM3v32tnjtsswgGiven)
model->BSIM3v32tnjtsswg = 0.0;
if (!model->BSIM3v32tnjtsdGiven)
model->BSIM3v32tnjtsd = 0.0;
if (!model->BSIM3v32tnjtsswdGiven)
model->BSIM3v32tnjtsswd = 0.0;
if (!model->BSIM3v32tnjtsswgdGiven)
model->BSIM3v32tnjtsswgd = 0.0;
/* loop through all the instances of the model */ /* loop through all the instances of the model */
for (here = BSIM3v32instances(model); here != NULL ; for (here = BSIM3v32instances(model); here != NULL ;
here=BSIM3v32nextInstance(here)) here=BSIM3v32nextInstance(here))

View File

@ -27,6 +27,15 @@
#define MIN_EXP 1.713908431e-15 #define MIN_EXP 1.713908431e-15
#define EXP_THRESHOLD 34.0 #define EXP_THRESHOLD 34.0
#define Charge_q 1.60219e-19 #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 */ /* ARGSUSED */
int int
@ -214,6 +223,39 @@ int Size_Not_Found, error;
} }
/* End of junction capacitance */ /* End of junction capacitance */
/* trap-assisted tunneling current enhancement */
if ((model->BSIM3v32acmMod == 12) && (model->BSIM3v32bsim4diodeGiven))
{
double T6, T7, T9;
T0 = (TRatio - 1.0);
model->BSIM3v32njtstemp = model->BSIM3v32njts * (1.0 + model->BSIM3v32tnjts * T0);
model->BSIM3v32njtsdtemp = model->BSIM3v32njtsd * (1.0 + model->BSIM3v32tnjtsd * T0);
model->BSIM3v32njtsswtemp = model->BSIM3v32njtssw * (1.0 + model->BSIM3v32tnjtssw * T0);
model->BSIM3v32njtsswdtemp = model->BSIM3v32njtsswd * (1.0 + model->BSIM3v32tnjtsswd * T0);
model->BSIM3v32njtsswgtemp = model->BSIM3v32njtsswg * (1.0 + model->BSIM3v32tnjtsswg * T0);
model->BSIM3v32njtsswgdtemp = model->BSIM3v32njtsswgd * (1.0 + model->BSIM3v32tnjtsswgd * T0);
T7 = Eg0 / model->BSIM3v32vtm * T0;
T9 = model->BSIM3v32xtss * T7;
DEXP(T9, T1);
T9 = model->BSIM3v32xtsd * T7;
DEXP(T9, T2);
T9 = model->BSIM3v32xtssws * T7;
DEXP(T9, T3);
T9 = model->BSIM3v32xtsswd * T7;
DEXP(T9, T4);
T9 = model->BSIM3v32xtsswgs * T7;
DEXP(T9, T5);
T9 = model->BSIM3v32xtsswgd * T7;
DEXP(T9, T6);
model->BSIM3v32jtsstemp = T1 * model->BSIM3v32jtss;
model->BSIM3v32jtsdtemp = T2 * model->BSIM3v32jtsd;
model->BSIM3v32jtsswstemp = T3 * model->BSIM3v32jtssws;
model->BSIM3v32jtsswdtemp = T4 * model->BSIM3v32jtsswd;
model->BSIM3v32jtsswgstemp = T5 * model->BSIM3v32jtsswgs;
model->BSIM3v32jtsswgdtemp = T6 * model->BSIM3v32jtsswgd;
}
/* loop through all the instances of the model */ /* loop through all the instances of the model */
/* MCJ: Length and Width not initialized */ /* MCJ: Length and Width not initialized */
for (here = BSIM3v32instances(model); here != NULL; for (here = BSIM3v32instances(model); here != NULL;

View File

@ -886,6 +886,56 @@ typedef struct sBSIM3v32model
double BSIM3v32vbsrMax; double BSIM3v32vbsrMax;
double BSIM3v32vbdrMax; double BSIM3v32vbdrMax;
/* trap-assisted tunneling current enhancement */
int BSIM3v32bsim4diode;
double BSIM3v32jtss;
double BSIM3v32jtsd;
double BSIM3v32jtssws;
double BSIM3v32jtsswd;
double BSIM3v32jtsswgs;
double BSIM3v32jtsswgd;
double BSIM3v32njts;
double BSIM3v32njtssw;
double BSIM3v32njtsswg;
double BSIM3v32njtsd;
double BSIM3v32njtsswd;
double BSIM3v32njtsswgd;
double BSIM3v32vtss;
double BSIM3v32vtsd;
double BSIM3v32vtssws;
double BSIM3v32vtsswd;
double BSIM3v32vtsswgs;
double BSIM3v32vtsswgd;
double BSIM3v32xtss;
double BSIM3v32xtsd;
double BSIM3v32xtssws;
double BSIM3v32xtsswd;
double BSIM3v32xtsswgs;
double BSIM3v32xtsswgd;
double BSIM3v32tnjts;
double BSIM3v32tnjtssw;
double BSIM3v32tnjtsswg;
double BSIM3v32tnjtsd;
double BSIM3v32tnjtsswd;
double BSIM3v32tnjtsswgd;
double BSIM3v32njtstemp;
double BSIM3v32njtsswtemp;
double BSIM3v32njtsswgtemp;
double BSIM3v32njtsdtemp;
double BSIM3v32njtsswdtemp;
double BSIM3v32njtsswgdtemp;
double BSIM3v32jtsstemp;
double BSIM3v32jtsdtemp;
double BSIM3v32jtsswstemp;
double BSIM3v32jtsswdtemp;
double BSIM3v32jtsswgstemp;
double BSIM3v32jtsswgdtemp;
struct bsim3v32SizeDependParam *pSizeDependParamKnot; struct bsim3v32SizeDependParam *pSizeDependParamKnot;
#ifdef USE_OMP #ifdef USE_OMP
@ -1342,6 +1392,43 @@ typedef struct sBSIM3v32model
unsigned BSIM3v32vbsrMaxGiven :1; unsigned BSIM3v32vbsrMaxGiven :1;
unsigned BSIM3v32vbdrMaxGiven :1; unsigned BSIM3v32vbdrMaxGiven :1;
/* trap-assisted tunneling current enhancement */
unsigned BSIM3v32bsim4diodeGiven :1;
unsigned BSIM3v32jtssGiven :1;
unsigned BSIM3v32jtsdGiven :1;
unsigned BSIM3v32jtsswsGiven :1;
unsigned BSIM3v32jtsswdGiven :1;
unsigned BSIM3v32jtsswgsGiven :1;
unsigned BSIM3v32jtsswgdGiven :1;
unsigned BSIM3v32njtsGiven :1;
unsigned BSIM3v32njtsswGiven :1;
unsigned BSIM3v32njtsswgGiven :1;
unsigned BSIM3v32njtsdGiven :1;
unsigned BSIM3v32njtsswdGiven :1;
unsigned BSIM3v32njtsswgdGiven :1;
unsigned BSIM3v32vtssGiven :1;
unsigned BSIM3v32vtsdGiven :1;
unsigned BSIM3v32vtsswsGiven :1;
unsigned BSIM3v32vtsswdGiven :1;
unsigned BSIM3v32vtsswgsGiven :1;
unsigned BSIM3v32vtsswgdGiven :1;
unsigned BSIM3v32xtssGiven :1;
unsigned BSIM3v32xtsdGiven :1;
unsigned BSIM3v32xtsswsGiven :1;
unsigned BSIM3v32xtsswdGiven :1;
unsigned BSIM3v32xtsswgsGiven :1;
unsigned BSIM3v32xtsswgdGiven :1;
unsigned BSIM3v32tnjtsGiven :1;
unsigned BSIM3v32tnjtsswGiven :1;
unsigned BSIM3v32tnjtsswgGiven :1;
unsigned BSIM3v32tnjtsdGiven :1;
unsigned BSIM3v32tnjtsswdGiven :1;
unsigned BSIM3v32tnjtsswgdGiven :1;
} BSIM3v32model; } BSIM3v32model;
@ -1911,6 +1998,43 @@ typedef struct sBSIM3v32model
#define BSIM3v32_MOD_VBSR_MAX 810 #define BSIM3v32_MOD_VBSR_MAX 810
#define BSIM3v32_MOD_VBDR_MAX 811 #define BSIM3v32_MOD_VBDR_MAX 811
/* trap-assisted tunneling current enhancement */
#define BSIM3v32_MOD_BSIM4DIODE 820
#define BSIM3v32_MOD_JTSS 821
#define BSIM3v32_MOD_JTSD 822
#define BSIM3v32_MOD_JTSSWS 823
#define BSIM3v32_MOD_JTSSWD 824
#define BSIM3v32_MOD_JTSSWGS 825
#define BSIM3v32_MOD_JTSSWGD 826
#define BSIM3v32_MOD_NJTS 827
#define BSIM3v32_MOD_NJTSSW 828
#define BSIM3v32_MOD_NJTSSWG 829
#define BSIM3v32_MOD_NJTSD 830
#define BSIM3v32_MOD_NJTSSWD 831
#define BSIM3v32_MOD_NJTSSWGD 832
#define BSIM3v32_MOD_VTSS 833
#define BSIM3v32_MOD_VTSD 834
#define BSIM3v32_MOD_VTSSWS 835
#define BSIM3v32_MOD_VTSSWD 836
#define BSIM3v32_MOD_VTSSWGS 837
#define BSIM3v32_MOD_VTSSWGD 838
#define BSIM3v32_MOD_XTSS 839
#define BSIM3v32_MOD_XTSD 840
#define BSIM3v32_MOD_XTSSWS 841
#define BSIM3v32_MOD_XTSSWD 842
#define BSIM3v32_MOD_XTSSWGS 843
#define BSIM3v32_MOD_XTSSWGD 844
#define BSIM3v32_MOD_TNJTS 845
#define BSIM3v32_MOD_TNJTSSW 846
#define BSIM3v32_MOD_TNJTSSWG 847
#define BSIM3v32_MOD_TNJTSD 848
#define BSIM3v32_MOD_TNJTSSWD 849
#define BSIM3v32_MOD_TNJTSSWGD 850
#include "bsim3v32ext.h" #include "bsim3v32ext.h"
extern void BSIM3v32evaluate(double,double,double,BSIM3v32instance*,BSIM3v32model*, extern void BSIM3v32evaluate(double,double,double,BSIM3v32instance*,BSIM3v32model*,