Code merged into bsim4v4
This commit is contained in:
parent
0132e5430d
commit
c93ca8410d
|
|
@ -154,9 +154,11 @@ BSIM4v4instance *here = (BSIM4v4instance*)inst;
|
||||||
return(OK);
|
return(OK);
|
||||||
case BSIM4v4_SOURCECONDUCT:
|
case BSIM4v4_SOURCECONDUCT:
|
||||||
value->rValue = here->BSIM4v4sourceConductance;
|
value->rValue = here->BSIM4v4sourceConductance;
|
||||||
|
value->rValue *= here->BSIM4v4m;
|
||||||
return(OK);
|
return(OK);
|
||||||
case BSIM4v4_DRAINCONDUCT:
|
case BSIM4v4_DRAINCONDUCT:
|
||||||
value->rValue = here->BSIM4v4drainConductance;
|
value->rValue = here->BSIM4v4drainConductance;
|
||||||
|
value->rValue *= here->BSIM4v4m;
|
||||||
return(OK);
|
return(OK);
|
||||||
case BSIM4v4_VBD:
|
case BSIM4v4_VBD:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->BSIM4v4vbd);
|
value->rValue = *(ckt->CKTstate0 + here->BSIM4v4vbd);
|
||||||
|
|
@ -305,6 +307,7 @@ BSIM4v4instance *here = (BSIM4v4instance*)inst;
|
||||||
return(OK);
|
return(OK);
|
||||||
case BSIM4v4_CBDB:
|
case BSIM4v4_CBDB:
|
||||||
value->rValue = here->BSIM4v4cbdb;
|
value->rValue = here->BSIM4v4cbdb;
|
||||||
|
value->rValue *= here->BSIM4v4m;
|
||||||
return(OK);
|
return(OK);
|
||||||
case BSIM4v4_CBSB:
|
case BSIM4v4_CBSB:
|
||||||
value->rValue = here->BSIM4v4cbsb;
|
value->rValue = here->BSIM4v4cbsb;
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,5 +1,5 @@
|
||||||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/
|
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/
|
||||||
|
/* ngspice multirevision code extension covering 4.2.1 & 4.3.0 & 4.4.0 */
|
||||||
/**********
|
/**********
|
||||||
* Copyright 2004 Regents of the University of California. All rights reserved.
|
* Copyright 2004 Regents of the University of California. All rights reserved.
|
||||||
* File: b4mpar.c of BSIM4.4.0.
|
* File: b4mpar.c of BSIM4.4.0.
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
#include "const.h"
|
||||||
|
|
||||||
int
|
int
|
||||||
BSIM4v4mParam(
|
BSIM4v4mParam(
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/
|
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/
|
||||||
|
/* ngspice multirevision code extension covering 4.2.1 & 4.3.0 & 4.4.0 */
|
||||||
/**********
|
/**********
|
||||||
* Copyright 2004 Regents of the University of California. All rights reserved.
|
* Copyright 2004 Regents of the University of California. All rights reserved.
|
||||||
* File: b4noi.c of BSIM4.4.0.
|
* File: b4noi.c of BSIM4.4.0.
|
||||||
|
|
@ -18,7 +18,6 @@
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "iferrmsg.h"
|
#include "iferrmsg.h"
|
||||||
#include "noisedef.h"
|
#include "noisedef.h"
|
||||||
#include "suffix.h"
|
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -36,23 +35,47 @@ BSIM4v4instance *here,
|
||||||
double freq, double temp)
|
double freq, double temp)
|
||||||
{
|
{
|
||||||
struct bsim4SizeDependParam *pParam;
|
struct bsim4SizeDependParam *pParam;
|
||||||
double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq;
|
double cd, esat=0.0, DelClm, EffFreq, N0, Nl, Leff, Leffsq=0.0;
|
||||||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
double T0, T1, T2=0.0, T3, T4, T5, T6, T7=0.0, T8, T9, Ssi;
|
||||||
|
|
||||||
pParam = here->pParam;
|
pParam = here->pParam;
|
||||||
cd = fabs(here->BSIM4v4cd);
|
cd = fabs(here->BSIM4v4cd);
|
||||||
Leff = pParam->BSIM4v4leff - 2.0 * model->BSIM4v4lintnoi;
|
switch (model->BSIM4v4intVersion) {
|
||||||
Leffsq = Leff * Leff;
|
case BSIM4vOLD: case BSIM4v21: case BSIM4v30:
|
||||||
esat = 2.0 * here->BSIM4v4vsattemp / here->BSIM4v4ueff;
|
break;
|
||||||
|
case BSIM4v40:
|
||||||
|
Leff = pParam->BSIM4v4leff - 2.0 * model->BSIM4v4lintnoi;
|
||||||
|
Leffsq = Leff * Leff;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
switch (model->BSIM4v4intVersion) {
|
||||||
|
case BSIM4vOLD: case BSIM4v21:
|
||||||
|
esat = 2.0 * pParam->BSIM4v4vsattemp / here->BSIM4v4ueff;
|
||||||
|
break;
|
||||||
|
case BSIM4v30: case BSIM4v40:
|
||||||
|
esat = 2.0 * here->BSIM4v4vsattemp / here->BSIM4v4ueff;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
if(model->BSIM4v4em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */
|
if(model->BSIM4v4em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */
|
||||||
else {
|
else {
|
||||||
T0 = ((((Vds - here->BSIM4v4Vdseff) / pParam->BSIM4v4litl)
|
T0 = ((((Vds - here->BSIM4v4Vdseff) / pParam->BSIM4v4litl)
|
||||||
+ model->BSIM4v4em) / esat);
|
+ model->BSIM4v4em) / esat);
|
||||||
DelClm = pParam->BSIM4v4litl * log (MAX(T0, N_MINLOG));
|
DelClm = pParam->BSIM4v4litl * log (MAX(T0, N_MINLOG));
|
||||||
}
|
}
|
||||||
EffFreq = pow(freq, model->BSIM4v4ef);
|
EffFreq = pow(freq, model->BSIM4v4ef);
|
||||||
T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4v4ueff;
|
T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4v4ueff;
|
||||||
T2 = 1.0e10 * EffFreq * here->BSIM4v4Abulk * model->BSIM4v4coxe * Leffsq;
|
switch (model->BSIM4v4intVersion) {
|
||||||
|
case BSIM4vOLD: case BSIM4v21: case BSIM4v30:
|
||||||
|
T2 = 1.0e10 * EffFreq * here->BSIM4v4Abulk * model->BSIM4v4coxe
|
||||||
|
* pParam->BSIM4v4leff * pParam->BSIM4v4leff;
|
||||||
|
break;
|
||||||
|
case BSIM4v40:
|
||||||
|
T2 = 1.0e10 * EffFreq * here->BSIM4v4Abulk * model->BSIM4v4coxe * Leffsq;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
N0 = model->BSIM4v4coxe * here->BSIM4v4Vgsteff / CHARGE;
|
N0 = model->BSIM4v4coxe * here->BSIM4v4Vgsteff / CHARGE;
|
||||||
Nl = model->BSIM4v4coxe * here->BSIM4v4Vgsteff
|
Nl = model->BSIM4v4coxe * here->BSIM4v4Vgsteff
|
||||||
* (1.0 - here->BSIM4v4AbovVgst2Vtm * here->BSIM4v4Vdseff) / CHARGE;
|
* (1.0 - here->BSIM4v4AbovVgst2Vtm * here->BSIM4v4Vdseff) / CHARGE;
|
||||||
|
|
@ -63,7 +86,16 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
|
||||||
T5 = model->BSIM4v4oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl);
|
T5 = model->BSIM4v4oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl);
|
||||||
|
|
||||||
T6 = CONSTboltz * temp * cd * cd;
|
T6 = CONSTboltz * temp * cd * cd;
|
||||||
T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4v4weff;
|
switch (model->BSIM4v4intVersion) {
|
||||||
|
case BSIM4vOLD: case BSIM4v21: case BSIM4v30:
|
||||||
|
T7 = 1.0e10 * EffFreq * pParam->BSIM4v4leff
|
||||||
|
* pParam->BSIM4v4leff * pParam->BSIM4v4weff;
|
||||||
|
break;
|
||||||
|
case BSIM4v40:
|
||||||
|
T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4v4weff;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
T8 = model->BSIM4v4oxideTrapDensityA + model->BSIM4v4oxideTrapDensityB * Nl
|
T8 = model->BSIM4v4oxideTrapDensityA + model->BSIM4v4oxideTrapDensityB * Nl
|
||||||
+ model->BSIM4v4oxideTrapDensityC * Nl * Nl;
|
+ model->BSIM4v4oxideTrapDensityC * Nl * Nl;
|
||||||
T9 = (Nl + here->BSIM4v4nstar) * (Nl + here->BSIM4v4nstar);
|
T9 = (Nl + here->BSIM4v4nstar) * (Nl + here->BSIM4v4nstar);
|
||||||
|
|
@ -89,6 +121,7 @@ double tempInoise;
|
||||||
double noizDens[BSIM4v4NSRCS];
|
double noizDens[BSIM4v4NSRCS];
|
||||||
double lnNdens[BSIM4v4NSRCS];
|
double lnNdens[BSIM4v4NSRCS];
|
||||||
|
|
||||||
|
|
||||||
double T0, T1, T2, T5, T10, T11;
|
double T0, T1, T2, T5, T10, T11;
|
||||||
double Vds, Ssi, Swi;
|
double Vds, Ssi, Swi;
|
||||||
double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare;
|
double tmp=0.0, gdpr, gspr, npart_theta=0.0, npart_beta=0.0, igsquare;
|
||||||
|
|
@ -100,106 +133,117 @@ int i;
|
||||||
/* define the names of the noise sources */
|
/* define the names of the noise sources */
|
||||||
static char *BSIM4v4nNames[BSIM4v4NSRCS] =
|
static char *BSIM4v4nNames[BSIM4v4NSRCS] =
|
||||||
{ /* Note that we have to keep the order */
|
{ /* Note that we have to keep the order */
|
||||||
".rd", /* noise due to rd */
|
".rd", /* noise due to rd */
|
||||||
".rs", /* noise due to rs */
|
".rs", /* noise due to rs */
|
||||||
".rg", /* noise due to rgeltd */
|
".rg", /* noise due to rgeltd */
|
||||||
".rbps", /* noise due to rbps */
|
".rbps", /* noise due to rbps */
|
||||||
".rbpd", /* noise due to rbpd */
|
".rbpd", /* noise due to rbpd */
|
||||||
".rbpb", /* noise due to rbpb */
|
".rbpb", /* noise due to rbpb */
|
||||||
".rbsb", /* noise due to rbsb */
|
".rbsb", /* noise due to rbsb */
|
||||||
".rbdb", /* noise due to rbdb */
|
".rbdb", /* noise due to rbdb */
|
||||||
".id", /* noise due to id */
|
".id", /* noise due to id */
|
||||||
".1overf", /* flicker (1/f) noise */
|
".1overf", /* flicker (1/f) noise */
|
||||||
".igs", /* shot noise due to IGS */
|
".igs", /* shot noise due to IGS */
|
||||||
".igd", /* shot noise due to IGD */
|
".igd", /* shot noise due to IGD */
|
||||||
".igb", /* shot noise due to IGB */
|
".igb", /* shot noise due to IGB */
|
||||||
"" /* total transistor noise */
|
"" /* total transistor noise */
|
||||||
};
|
};
|
||||||
|
|
||||||
for (; model != NULL; model = model->BSIM4v4nextModel)
|
for (; model != NULL; model = model->BSIM4v4nextModel)
|
||||||
{ for (here = model->BSIM4v4instances; here != NULL;
|
{ for (here = model->BSIM4v4instances; here != NULL;
|
||||||
here = here->BSIM4v4nextInstance)
|
here = here->BSIM4v4nextInstance)
|
||||||
{ pParam = here->pParam;
|
{ pParam = here->pParam;
|
||||||
switch (operation)
|
switch (operation)
|
||||||
{ case N_OPEN:
|
{ case N_OPEN:
|
||||||
/* see if we have to to produce a summary report */
|
/* see if we have to to produce a summary report */
|
||||||
/* if so, name all the noise generators */
|
/* if so, name all the noise generators */
|
||||||
|
|
||||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||||
{ switch (mode)
|
{ switch (mode)
|
||||||
{ case N_DENS:
|
{ case N_DENS:
|
||||||
for (i = 0; i < BSIM4v4NSRCS; i++)
|
for (i = 0; i < BSIM4v4NSRCS; i++)
|
||||||
{ (void) sprintf(name, "onoise.%s%s",
|
{ (void) sprintf(name, "onoise.%s%s",
|
||||||
here->BSIM4v4name,
|
here->BSIM4v4name,
|
||||||
BSIM4v4nNames[i]);
|
BSIM4v4nNames[i]);
|
||||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||||
if (!data->namelist)
|
if (!data->namelist)
|
||||||
return(E_NOMEM);
|
return(E_NOMEM);
|
||||||
SPfrontEnd->IFnewUid (ckt,
|
SPfrontEnd->IFnewUid (ckt,
|
||||||
&(data->namelist[data->numPlots++]),
|
&(data->namelist[data->numPlots++]),
|
||||||
NULL, name, UID_OTHER,
|
NULL, name, UID_OTHER,
|
||||||
NULL);
|
NULL);
|
||||||
/* we've added one more plot */
|
/* we've added one more plot */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case INT_NOIZ:
|
case INT_NOIZ:
|
||||||
for (i = 0; i < BSIM4v4NSRCS; i++)
|
for (i = 0; i < BSIM4v4NSRCS; i++)
|
||||||
{ (void) sprintf(name, "onoise_total.%s%s",
|
{ (void) sprintf(name, "onoise_total.%s%s",
|
||||||
here->BSIM4v4name,
|
here->BSIM4v4name,
|
||||||
BSIM4v4nNames[i]);
|
BSIM4v4nNames[i]);
|
||||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||||
if (!data->namelist)
|
if (!data->namelist)
|
||||||
return(E_NOMEM);
|
return(E_NOMEM);
|
||||||
SPfrontEnd->IFnewUid (ckt,
|
SPfrontEnd->IFnewUid (ckt,
|
||||||
&(data->namelist[data->numPlots++]),
|
&(data->namelist[data->numPlots++]),
|
||||||
NULL, name, UID_OTHER,
|
NULL, name, UID_OTHER,
|
||||||
NULL);
|
NULL);
|
||||||
/* we've added one more plot */
|
/* we've added one more plot */
|
||||||
|
|
||||||
(void) sprintf(name, "inoise_total.%s%s",
|
(void) sprintf(name, "inoise_total.%s%s",
|
||||||
here->BSIM4v4name,
|
here->BSIM4v4name,
|
||||||
BSIM4v4nNames[i]);
|
BSIM4v4nNames[i]);
|
||||||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||||
if (!data->namelist)
|
if (!data->namelist)
|
||||||
return(E_NOMEM);
|
return(E_NOMEM);
|
||||||
SPfrontEnd->IFnewUid (ckt,
|
SPfrontEnd->IFnewUid (ckt,
|
||||||
&(data->namelist[data->numPlots++]),
|
&(data->namelist[data->numPlots++]),
|
||||||
NULL, name, UID_OTHER,
|
NULL, name, UID_OTHER,
|
||||||
NULL);
|
NULL);
|
||||||
/* we've added one more plot */
|
/* we've added one more plot */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case N_CALC:
|
case N_CALC:
|
||||||
m = here->BSIM4v4m;
|
m = here->BSIM4v4m;
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{ case N_DENS:
|
{ case N_DENS:
|
||||||
if (model->BSIM4v4tnoiMod == 0)
|
if (model->BSIM4v4tnoiMod == 0)
|
||||||
{ if (model->BSIM4v4rdsMod == 0)
|
{ if (model->BSIM4v4rdsMod == 0)
|
||||||
{ gspr = here->BSIM4v4sourceConductance;
|
{ gspr = here->BSIM4v4sourceConductance;
|
||||||
gdpr = here->BSIM4v4drainConductance;
|
gdpr = here->BSIM4v4drainConductance;
|
||||||
if (here->BSIM4v4grdsw > 0.0)
|
if (here->BSIM4v4grdsw > 0.0)
|
||||||
tmp = 1.0 / here->BSIM4v4grdsw; /* tmp used below */
|
tmp = 1.0 / here->BSIM4v4grdsw; /* tmp used below */
|
||||||
else
|
else
|
||||||
tmp = 0.0;
|
tmp = 0.0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ gspr = here->BSIM4v4gstot;
|
{ gspr = here->BSIM4v4gstot;
|
||||||
gdpr = here->BSIM4v4gdtot;
|
gdpr = here->BSIM4v4gdtot;
|
||||||
tmp = 0.0;
|
tmp = 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ T5 = here->BSIM4v4Vgsteff / here->BSIM4v4EsatL;
|
{ T5 = here->BSIM4v4Vgsteff / here->BSIM4v4EsatL;
|
||||||
T5 *= T5;
|
T5 *= T5;
|
||||||
npart_beta = model->BSIM4v4rnoia * (1.0 + T5
|
switch (model->BSIM4v4intVersion) {
|
||||||
* model->BSIM4v4tnoia * pParam->BSIM4v4leff);
|
case BSIM4vOLD: case BSIM4v21:
|
||||||
npart_theta = model->BSIM4v4rnoib * (1.0 + T5
|
npart_beta = 0.577 * (1.0 + T5
|
||||||
|
* model->BSIM4v4tnoia * pParam->BSIM4v4leff);
|
||||||
|
npart_theta = 0.37 * (1.0 + T5
|
||||||
* model->BSIM4v4tnoib * pParam->BSIM4v4leff);
|
* model->BSIM4v4tnoib * pParam->BSIM4v4leff);
|
||||||
|
break;
|
||||||
|
case BSIM4v30: case BSIM4v40:
|
||||||
|
npart_beta = model->BSIM4v4rnoia * (1.0 + T5
|
||||||
|
* model->BSIM4v4tnoia * pParam->BSIM4v4leff);
|
||||||
|
npart_theta = model->BSIM4v4rnoib * (1.0 + T5
|
||||||
|
* model->BSIM4v4tnoib * pParam->BSIM4v4leff);
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
if (model->BSIM4v4rdsMod == 0)
|
if (model->BSIM4v4rdsMod == 0)
|
||||||
{ gspr = here->BSIM4v4sourceConductance;
|
{ gspr = here->BSIM4v4sourceConductance;
|
||||||
gdpr = here->BSIM4v4drainConductance;
|
gdpr = here->BSIM4v4drainConductance;
|
||||||
}
|
}
|
||||||
|
|
@ -208,42 +252,55 @@ int i;
|
||||||
gdpr = here->BSIM4v4gdtot;
|
gdpr = here->BSIM4v4gdtot;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*(ckt->CKTstates[0] + here->BSIM4v4vds)) >= 0.0)
|
switch (model->BSIM4v4intVersion) {
|
||||||
gspr = gspr / (1.0 + npart_theta * npart_theta * gspr
|
case BSIM4vOLD: case BSIM4v21:
|
||||||
/ here->BSIM4v4IdovVds); /* bugfix */
|
if ((*(ckt->CKTstates[0] + here->BSIM4v4vds)) >= 0.0)
|
||||||
else
|
gspr = gspr * (1.0 + npart_theta * npart_theta * gspr
|
||||||
gdpr = gdpr / (1.0 + npart_theta * npart_theta * gdpr
|
/ here->BSIM4v4IdovVds);
|
||||||
/ here->BSIM4v4IdovVds);
|
else
|
||||||
}
|
gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr
|
||||||
|
/ here->BSIM4v4IdovVds);
|
||||||
|
break;
|
||||||
|
case BSIM4v30: case BSIM4v40:
|
||||||
|
if ((*(ckt->CKTstates[0] + here->BSIM4v4vds)) >= 0.0)
|
||||||
|
gspr = gspr / (1.0 + npart_theta * npart_theta * gspr
|
||||||
|
/ here->BSIM4v4IdovVds); /* bugfix */
|
||||||
|
else
|
||||||
|
gdpr = gdpr / (1.0 + npart_theta * npart_theta * gdpr
|
||||||
|
/ here->BSIM4v4IdovVds);
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NevalSrc(&noizDens[BSIM4v4RDNOIZ],
|
NevalSrc(&noizDens[BSIM4v4RDNOIZ],
|
||||||
&lnNdens[BSIM4v4RDNOIZ], ckt, THERMNOISE,
|
&lnNdens[BSIM4v4RDNOIZ], ckt, THERMNOISE,
|
||||||
here->BSIM4v4dNodePrime, here->BSIM4v4dNode,
|
here->BSIM4v4dNodePrime, here->BSIM4v4dNode,
|
||||||
gdpr * m);
|
gdpr * m);
|
||||||
|
|
||||||
NevalSrc(&noizDens[BSIM4v4RSNOIZ],
|
NevalSrc(&noizDens[BSIM4v4RSNOIZ],
|
||||||
&lnNdens[BSIM4v4RSNOIZ], ckt, THERMNOISE,
|
&lnNdens[BSIM4v4RSNOIZ], ckt, THERMNOISE,
|
||||||
here->BSIM4v4sNodePrime, here->BSIM4v4sNode,
|
here->BSIM4v4sNodePrime, here->BSIM4v4sNode,
|
||||||
gspr * m);
|
gspr * m);
|
||||||
|
|
||||||
|
|
||||||
if ((here->BSIM4v4rgateMod == 1) || (here->BSIM4v4rgateMod == 2))
|
if ((here->BSIM4v4rgateMod == 1) || (here->BSIM4v4rgateMod == 2))
|
||||||
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
|
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
|
||||||
&lnNdens[BSIM4v4RGNOIZ], ckt, THERMNOISE,
|
&lnNdens[BSIM4v4RGNOIZ], ckt, THERMNOISE,
|
||||||
here->BSIM4v4gNodePrime, here->BSIM4v4gNodeExt,
|
here->BSIM4v4gNodePrime, here->BSIM4v4gNodeExt,
|
||||||
here->BSIM4v4grgeltd * m);
|
here->BSIM4v4grgeltd * m);
|
||||||
}
|
}
|
||||||
else if (here->BSIM4v4rgateMod == 3)
|
else if (here->BSIM4v4rgateMod == 3)
|
||||||
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
|
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
|
||||||
&lnNdens[BSIM4v4RGNOIZ], ckt, THERMNOISE,
|
&lnNdens[BSIM4v4RGNOIZ], ckt, THERMNOISE,
|
||||||
here->BSIM4v4gNodeMid, here->BSIM4v4gNodeExt,
|
here->BSIM4v4gNodeMid, here->BSIM4v4gNodeExt,
|
||||||
here->BSIM4v4grgeltd * m);
|
here->BSIM4v4grgeltd * m);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ noizDens[BSIM4v4RGNOIZ] = 0.0;
|
{ noizDens[BSIM4v4RGNOIZ] = 0.0;
|
||||||
lnNdens[BSIM4v4RGNOIZ] =
|
lnNdens[BSIM4v4RGNOIZ] =
|
||||||
log(MAX(noizDens[BSIM4v4RGNOIZ], N_MINLOG));
|
log(MAX(noizDens[BSIM4v4RGNOIZ], N_MINLOG));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (here->BSIM4v4rbodyMod)
|
if (here->BSIM4v4rbodyMod)
|
||||||
|
|
@ -286,49 +343,49 @@ int i;
|
||||||
|
|
||||||
|
|
||||||
switch(model->BSIM4v4tnoiMod)
|
switch(model->BSIM4v4tnoiMod)
|
||||||
{ case 0:
|
{ case 0:
|
||||||
T0 = m * here->BSIM4v4ueff * fabs(here->BSIM4v4qinv);
|
T0 = m * here->BSIM4v4ueff * fabs(here->BSIM4v4qinv);
|
||||||
T1 = T0 * tmp + pParam->BSIM4v4leff
|
T1 = T0 * tmp + pParam->BSIM4v4leff
|
||||||
* pParam->BSIM4v4leff;
|
* pParam->BSIM4v4leff;
|
||||||
NevalSrc(&noizDens[BSIM4v4IDNOIZ],
|
NevalSrc(&noizDens[BSIM4v4IDNOIZ],
|
||||||
&lnNdens[BSIM4v4IDNOIZ], ckt,
|
&lnNdens[BSIM4v4IDNOIZ], ckt,
|
||||||
THERMNOISE, here->BSIM4v4dNodePrime,
|
THERMNOISE, here->BSIM4v4dNodePrime,
|
||||||
here->BSIM4v4sNodePrime,
|
here->BSIM4v4sNodePrime,
|
||||||
(T0 / T1) * model->BSIM4v4ntnoi);
|
(T0 / T1) * model->BSIM4v4ntnoi);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
T0 = m * (here->BSIM4v4gm + here->BSIM4v4gmbs + here->BSIM4v4gds);
|
T0 = m * (here->BSIM4v4gm + here->BSIM4v4gmbs + here->BSIM4v4gds);
|
||||||
T0 *= T0;
|
T0 *= T0;
|
||||||
igsquare = npart_theta * npart_theta * T0 / here->BSIM4v4IdovVds;
|
igsquare = npart_theta * npart_theta * T0 / here->BSIM4v4IdovVds;
|
||||||
T1 = npart_beta * (here->BSIM4v4gm
|
T1 = npart_beta * (here->BSIM4v4gm
|
||||||
+ here->BSIM4v4gmbs) + here->BSIM4v4gds;
|
+ here->BSIM4v4gmbs) + here->BSIM4v4gds;
|
||||||
T2 = T1 * T1 / here->BSIM4v4IdovVds;
|
T2 = T1 * T1 / here->BSIM4v4IdovVds;
|
||||||
NevalSrc(&noizDens[BSIM4v4IDNOIZ],
|
NevalSrc(&noizDens[BSIM4v4IDNOIZ],
|
||||||
&lnNdens[BSIM4v4IDNOIZ], ckt,
|
&lnNdens[BSIM4v4IDNOIZ], ckt,
|
||||||
THERMNOISE, here->BSIM4v4dNodePrime,
|
THERMNOISE, here->BSIM4v4dNodePrime,
|
||||||
here->BSIM4v4sNodePrime, (T2 - igsquare));
|
here->BSIM4v4sNodePrime, (T2 - igsquare));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
NevalSrc(&noizDens[BSIM4v4FLNOIZ], NULL,
|
NevalSrc(&noizDens[BSIM4v4FLNOIZ], NULL,
|
||||||
ckt, N_GAIN, here->BSIM4v4dNodePrime,
|
ckt, N_GAIN, here->BSIM4v4dNodePrime,
|
||||||
here->BSIM4v4sNodePrime, (double) 0.0);
|
here->BSIM4v4sNodePrime, (double) 0.0);
|
||||||
|
|
||||||
switch(model->BSIM4v4fnoiMod)
|
switch(model->BSIM4v4fnoiMod)
|
||||||
{ case 0:
|
{ case 0:
|
||||||
noizDens[BSIM4v4FLNOIZ] *= m * model->BSIM4v4kf
|
noizDens[BSIM4v4FLNOIZ] *= m * model->BSIM4v4kf
|
||||||
* exp(model->BSIM4v4af
|
* exp(model->BSIM4v4af
|
||||||
* log(MAX(fabs(here->BSIM4v4cd),
|
* log(MAX(fabs(here->BSIM4v4cd),
|
||||||
N_MINLOG)))
|
N_MINLOG)))
|
||||||
/ (pow(data->freq, model->BSIM4v4ef)
|
/ (pow(data->freq, model->BSIM4v4ef)
|
||||||
* pParam->BSIM4v4leff
|
* pParam->BSIM4v4leff
|
||||||
* pParam->BSIM4v4leff
|
* pParam->BSIM4v4leff
|
||||||
* model->BSIM4v4coxe);
|
* model->BSIM4v4coxe);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
Vds = *(ckt->CKTstates[0] + here->BSIM4v4vds);
|
Vds = *(ckt->CKTstates[0] + here->BSIM4v4vds);
|
||||||
if (Vds < 0.0)
|
if (Vds < 0.0)
|
||||||
Vds = -Vds;
|
Vds = -Vds;
|
||||||
|
|
||||||
Ssi = BSIM4v4Eval1ovFNoise(Vds, model, here,
|
Ssi = BSIM4v4Eval1ovFNoise(Vds, model, here,
|
||||||
data->freq, ckt->CKTtemp);
|
data->freq, ckt->CKTtemp);
|
||||||
|
|
@ -336,7 +393,7 @@ int i;
|
||||||
* CONSTboltz * ckt->CKTtemp;
|
* CONSTboltz * ckt->CKTtemp;
|
||||||
T11 = pParam->BSIM4v4weff * pParam->BSIM4v4leff
|
T11 = pParam->BSIM4v4weff * pParam->BSIM4v4leff
|
||||||
* pow(data->freq, model->BSIM4v4ef) * 1.0e10
|
* pow(data->freq, model->BSIM4v4ef) * 1.0e10
|
||||||
* here->BSIM4v4nstar * here->BSIM4v4nstar;
|
* here->BSIM4v4nstar * here->BSIM4v4nstar;
|
||||||
Swi = T10 / T11 * here->BSIM4v4cd
|
Swi = T10 / T11 * here->BSIM4v4cd
|
||||||
* here->BSIM4v4cd;
|
* here->BSIM4v4cd;
|
||||||
T1 = Swi + Ssi;
|
T1 = Swi + Ssi;
|
||||||
|
|
@ -344,133 +401,148 @@ int i;
|
||||||
noizDens[BSIM4v4FLNOIZ] *= m * (Ssi * Swi) / T1;
|
noizDens[BSIM4v4FLNOIZ] *= m * (Ssi * Swi) / T1;
|
||||||
else
|
else
|
||||||
noizDens[BSIM4v4FLNOIZ] *= 0.0;
|
noizDens[BSIM4v4FLNOIZ] *= 0.0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
lnNdens[BSIM4v4FLNOIZ] =
|
lnNdens[BSIM4v4FLNOIZ] =
|
||||||
log(MAX(noizDens[BSIM4v4FLNOIZ], N_MINLOG));
|
log(MAX(noizDens[BSIM4v4FLNOIZ], N_MINLOG));
|
||||||
|
|
||||||
|
|
||||||
if(here->BSIM4v4mode >= 0) { /* bugfix */
|
switch (model->BSIM4v4intVersion) {
|
||||||
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
|
case BSIM4vOLD: case BSIM4v21:
|
||||||
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
|
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
|
||||||
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
|
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
|
||||||
m * (here->BSIM4v4Igs + here->BSIM4v4Igcs));
|
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
|
||||||
NevalSrc(&noizDens[BSIM4v4IGDNOIZ],
|
m * (here->BSIM4v4Igs + here->BSIM4v4Igcs));
|
||||||
&lnNdens[BSIM4v4IGDNOIZ], ckt, SHOTNOISE,
|
NevalSrc(&noizDens[BSIM4v4IGDNOIZ],
|
||||||
here->BSIM4v4gNodePrime, here->BSIM4v4dNodePrime,
|
&lnNdens[BSIM4v4IGDNOIZ], ckt, SHOTNOISE,
|
||||||
m * (here->BSIM4v4Igd + here->BSIM4v4Igcd));
|
here->BSIM4v4gNodePrime, here->BSIM4v4dNodePrime,
|
||||||
} else {
|
m * (here->BSIM4v4Igd + here->BSIM4v4Igcd));
|
||||||
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
|
break;
|
||||||
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
|
case BSIM4v30: case BSIM4v40:
|
||||||
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
|
if(here->BSIM4v4mode >= 0) { /* bugfix */
|
||||||
m * (here->BSIM4v4Igs + here->BSIM4v4Igcd));
|
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
|
||||||
NevalSrc(&noizDens[BSIM4v4IGDNOIZ],
|
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
|
||||||
&lnNdens[BSIM4v4IGDNOIZ], ckt, SHOTNOISE,
|
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
|
||||||
here->BSIM4v4gNodePrime, here->BSIM4v4dNodePrime,
|
m * (here->BSIM4v4Igs + here->BSIM4v4Igcs));
|
||||||
m * (here->BSIM4v4Igd + here->BSIM4v4Igcs));
|
NevalSrc(&noizDens[BSIM4v4IGDNOIZ],
|
||||||
}
|
&lnNdens[BSIM4v4IGDNOIZ], ckt, SHOTNOISE,
|
||||||
|
here->BSIM4v4gNodePrime, here->BSIM4v4dNodePrime,
|
||||||
|
m * (here->BSIM4v4Igd + here->BSIM4v4Igcd));
|
||||||
|
} else {
|
||||||
|
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
|
||||||
|
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
|
||||||
|
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
|
||||||
|
m * (here->BSIM4v4Igs + here->BSIM4v4Igcd));
|
||||||
|
NevalSrc(&noizDens[BSIM4v4IGDNOIZ],
|
||||||
|
&lnNdens[BSIM4v4IGDNOIZ], ckt, SHOTNOISE,
|
||||||
|
here->BSIM4v4gNodePrime, here->BSIM4v4dNodePrime,
|
||||||
|
m * (here->BSIM4v4Igd + here->BSIM4v4Igcs));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
NevalSrc(&noizDens[BSIM4v4IGBNOIZ],
|
NevalSrc(&noizDens[BSIM4v4IGBNOIZ],
|
||||||
&lnNdens[BSIM4v4IGBNOIZ], ckt, SHOTNOISE,
|
&lnNdens[BSIM4v4IGBNOIZ], ckt, SHOTNOISE,
|
||||||
here->BSIM4v4gNodePrime, here->BSIM4v4bNodePrime,
|
here->BSIM4v4gNodePrime, here->BSIM4v4bNodePrime,
|
||||||
m * here->BSIM4v4Igb);
|
m * here->BSIM4v4Igb);
|
||||||
|
|
||||||
|
|
||||||
noizDens[BSIM4v4TOTNOIZ] = noizDens[BSIM4v4RDNOIZ]
|
noizDens[BSIM4v4TOTNOIZ] = noizDens[BSIM4v4RDNOIZ]
|
||||||
+ noizDens[BSIM4v4RSNOIZ] + noizDens[BSIM4v4RGNOIZ]
|
+ noizDens[BSIM4v4RSNOIZ] + noizDens[BSIM4v4RGNOIZ]
|
||||||
+ noizDens[BSIM4v4RBPSNOIZ] + noizDens[BSIM4v4RBPDNOIZ]
|
+ noizDens[BSIM4v4RBPSNOIZ] + noizDens[BSIM4v4RBPDNOIZ]
|
||||||
+ noizDens[BSIM4v4RBPBNOIZ]
|
+ noizDens[BSIM4v4RBPBNOIZ]
|
||||||
+ noizDens[BSIM4v4RBSBNOIZ] + noizDens[BSIM4v4RBDBNOIZ]
|
+ noizDens[BSIM4v4RBSBNOIZ] + noizDens[BSIM4v4RBDBNOIZ]
|
||||||
+ noizDens[BSIM4v4IDNOIZ] + noizDens[BSIM4v4FLNOIZ]
|
+ noizDens[BSIM4v4IDNOIZ] + noizDens[BSIM4v4FLNOIZ]
|
||||||
+ noizDens[BSIM4v4IGSNOIZ] + noizDens[BSIM4v4IGDNOIZ]
|
+ noizDens[BSIM4v4IGSNOIZ] + noizDens[BSIM4v4IGDNOIZ]
|
||||||
+ noizDens[BSIM4v4IGBNOIZ];
|
+ noizDens[BSIM4v4IGBNOIZ];
|
||||||
lnNdens[BSIM4v4TOTNOIZ] =
|
lnNdens[BSIM4v4TOTNOIZ] =
|
||||||
log(MAX(noizDens[BSIM4v4TOTNOIZ], N_MINLOG));
|
log(MAX(noizDens[BSIM4v4TOTNOIZ], N_MINLOG));
|
||||||
|
|
||||||
*OnDens += noizDens[BSIM4v4TOTNOIZ];
|
*OnDens += noizDens[BSIM4v4TOTNOIZ];
|
||||||
|
|
||||||
if (data->delFreq == 0.0)
|
if (data->delFreq == 0.0)
|
||||||
{ /* if we haven't done any previous
|
{ /* if we haven't done any previous
|
||||||
integration, we need to initialize our
|
integration, we need to initialize our
|
||||||
"history" variables.
|
"history" variables.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < BSIM4v4NSRCS; i++)
|
for (i = 0; i < BSIM4v4NSRCS; i++)
|
||||||
{ here->BSIM4v4nVar[LNLSTDENS][i] =
|
{ here->BSIM4v4nVar[LNLSTDENS][i] =
|
||||||
lnNdens[i];
|
lnNdens[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clear out our integration variables
|
/* clear out our integration variables
|
||||||
if it's the first pass
|
if it's the first pass
|
||||||
*/
|
*/
|
||||||
if (data->freq ==
|
if (data->freq ==
|
||||||
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
|
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
|
||||||
{ for (i = 0; i < BSIM4v4NSRCS; i++)
|
{ for (i = 0; i < BSIM4v4NSRCS; i++)
|
||||||
{ here->BSIM4v4nVar[OUTNOIZ][i] = 0.0;
|
{ here->BSIM4v4nVar[OUTNOIZ][i] = 0.0;
|
||||||
here->BSIM4v4nVar[INNOIZ][i] = 0.0;
|
here->BSIM4v4nVar[INNOIZ][i] = 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* data->delFreq != 0.0,
|
{ /* data->delFreq != 0.0,
|
||||||
we have to integrate.
|
we have to integrate.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < BSIM4v4NSRCS; i++)
|
for (i = 0; i < BSIM4v4NSRCS; i++)
|
||||||
{ if (i != BSIM4v4TOTNOIZ)
|
{ if (i != BSIM4v4TOTNOIZ)
|
||||||
{ tempOnoise = Nintegrate(noizDens[i],
|
{ tempOnoise = Nintegrate(noizDens[i],
|
||||||
lnNdens[i],
|
lnNdens[i],
|
||||||
here->BSIM4v4nVar[LNLSTDENS][i],
|
here->BSIM4v4nVar[LNLSTDENS][i],
|
||||||
data);
|
data);
|
||||||
tempInoise = Nintegrate(noizDens[i]
|
tempInoise = Nintegrate(noizDens[i]
|
||||||
* data->GainSqInv, lnNdens[i]
|
* data->GainSqInv, lnNdens[i]
|
||||||
+ data->lnGainInv,
|
+ data->lnGainInv,
|
||||||
here->BSIM4v4nVar[LNLSTDENS][i]
|
here->BSIM4v4nVar[LNLSTDENS][i]
|
||||||
+ data->lnGainInv, data);
|
+ data->lnGainInv, data);
|
||||||
here->BSIM4v4nVar[LNLSTDENS][i] =
|
here->BSIM4v4nVar[LNLSTDENS][i] =
|
||||||
lnNdens[i];
|
lnNdens[i];
|
||||||
data->outNoiz += tempOnoise;
|
data->outNoiz += tempOnoise;
|
||||||
data->inNoise += tempInoise;
|
data->inNoise += tempInoise;
|
||||||
if (((NOISEAN*)
|
if (((NOISEAN*)
|
||||||
ckt->CKTcurJob)->NStpsSm != 0)
|
ckt->CKTcurJob)->NStpsSm != 0)
|
||||||
{ here->BSIM4v4nVar[OUTNOIZ][i]
|
{ here->BSIM4v4nVar[OUTNOIZ][i]
|
||||||
+= tempOnoise;
|
+= tempOnoise;
|
||||||
here->BSIM4v4nVar[OUTNOIZ][BSIM4v4TOTNOIZ]
|
here->BSIM4v4nVar[OUTNOIZ][BSIM4v4TOTNOIZ]
|
||||||
+= tempOnoise;
|
+= tempOnoise;
|
||||||
here->BSIM4v4nVar[INNOIZ][i]
|
here->BSIM4v4nVar[INNOIZ][i]
|
||||||
+= tempInoise;
|
+= tempInoise;
|
||||||
here->BSIM4v4nVar[INNOIZ][BSIM4v4TOTNOIZ]
|
here->BSIM4v4nVar[INNOIZ][BSIM4v4TOTNOIZ]
|
||||||
+= tempInoise;
|
+= tempInoise;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (data->prtSummary)
|
if (data->prtSummary)
|
||||||
{ for (i = 0; i < BSIM4v4NSRCS; i++)
|
{ for (i = 0; i < BSIM4v4NSRCS; i++)
|
||||||
{ /* print a summary report */
|
{ /* print a summary report */
|
||||||
data->outpVector[data->outNumber++]
|
data->outpVector[data->outNumber++]
|
||||||
= noizDens[i];
|
= noizDens[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case INT_NOIZ:
|
case INT_NOIZ:
|
||||||
/* already calculated, just output */
|
/* already calculated, just output */
|
||||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||||
{ for (i = 0; i < BSIM4v4NSRCS; i++)
|
{ for (i = 0; i < BSIM4v4NSRCS; i++)
|
||||||
{ data->outpVector[data->outNumber++]
|
{ data->outpVector[data->outNumber++]
|
||||||
= here->BSIM4v4nVar[OUTNOIZ][i];
|
= here->BSIM4v4nVar[OUTNOIZ][i];
|
||||||
data->outpVector[data->outNumber++]
|
data->outpVector[data->outNumber++]
|
||||||
= here->BSIM4v4nVar[INNOIZ][i];
|
= here->BSIM4v4nVar[INNOIZ][i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case N_CLOSE:
|
case N_CLOSE:
|
||||||
/* do nothing, the main calling routine will close */
|
/* do nothing, the main calling routine will close */
|
||||||
return (OK);
|
return (OK);
|
||||||
break; /* the plots */
|
break; /* the plots */
|
||||||
} /* switch (operation) */
|
} /* switch (operation) */
|
||||||
} /* for here */
|
} /* for here */
|
||||||
} /* for model */
|
} /* for model */
|
||||||
|
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,3 +1,4 @@
|
||||||
|
/* ngspice multirevision code extension covering 4.2.1 & 4.3.0 & 4.4.0 */
|
||||||
/**********
|
/**********
|
||||||
Copyright 2004 Regents of the University of California. All rights reserved.
|
Copyright 2004 Regents of the University of California. All rights reserved.
|
||||||
Author: 2000 Weidong Liu.
|
Author: 2000 Weidong Liu.
|
||||||
|
|
@ -654,6 +655,14 @@ typedef struct sBSIM4v4model
|
||||||
int BSIM4v4binUnit;
|
int BSIM4v4binUnit;
|
||||||
int BSIM4v4paramChk;
|
int BSIM4v4paramChk;
|
||||||
char *BSIM4v4version;
|
char *BSIM4v4version;
|
||||||
|
/* The following field is an integer coding
|
||||||
|
* of BSIM4 Versions.
|
||||||
|
*/
|
||||||
|
int BSIM4v4intVersion;
|
||||||
|
#define BSIM4v40 440 /* BSIM4.4.0 */
|
||||||
|
#define BSIM4v30 430 /* BSIM4.3.0 */
|
||||||
|
#define BSIM4v21 421 /* BSIM4.2.1 */
|
||||||
|
#define BSIM4vOLD 420 /* < BSIM4.2.1 */
|
||||||
double BSIM4v4toxe;
|
double BSIM4v4toxe;
|
||||||
double BSIM4v4toxp;
|
double BSIM4v4toxp;
|
||||||
double BSIM4v4toxm;
|
double BSIM4v4toxm;
|
||||||
|
|
@ -2008,7 +2017,7 @@ typedef struct sBSIM4v4model
|
||||||
unsigned BSIM4v4SbulkJctGateSideGradingCoeffGiven :1;
|
unsigned BSIM4v4SbulkJctGateSideGradingCoeffGiven :1;
|
||||||
unsigned BSIM4v4SunitLengthGateSidewallJctCapGiven :1;
|
unsigned BSIM4v4SunitLengthGateSidewallJctCapGiven :1;
|
||||||
unsigned BSIM4v4SjctEmissionCoeffGiven :1;
|
unsigned BSIM4v4SjctEmissionCoeffGiven :1;
|
||||||
unsigned BSIM4v4SjctTempExponentGiven :1;
|
unsigned BSIM4v4SjctTempExponentGiven :1;
|
||||||
|
|
||||||
unsigned BSIM4v4DjctSatCurDensityGiven :1;
|
unsigned BSIM4v4DjctSatCurDensityGiven :1;
|
||||||
unsigned BSIM4v4DjctSidewallSatCurDensityGiven :1;
|
unsigned BSIM4v4DjctSidewallSatCurDensityGiven :1;
|
||||||
|
|
@ -2727,11 +2736,11 @@ typedef struct sBSIM4v4model
|
||||||
#define BSIM4v4_MOD_LKVTH0 808
|
#define BSIM4v4_MOD_LKVTH0 808
|
||||||
#define BSIM4v4_MOD_WKVTH0 809
|
#define BSIM4v4_MOD_WKVTH0 809
|
||||||
#define BSIM4v4_MOD_PKVTH0 810
|
#define BSIM4v4_MOD_PKVTH0 810
|
||||||
#define BSIM4v4_MOD_WLOD 811
|
#define BSIM4v4_MOD_WLOD 811
|
||||||
#define BSIM4v4_MOD_STK2 812
|
#define BSIM4v4_MOD_STK2 812
|
||||||
#define BSIM4v4_MOD_LODK2 813
|
#define BSIM4v4_MOD_LODK2 813
|
||||||
#define BSIM4v4_MOD_STETA0 814
|
#define BSIM4v4_MOD_STETA0 814
|
||||||
#define BSIM4v4_MOD_LODETA0 815
|
#define BSIM4v4_MOD_LODETA0 815
|
||||||
|
|
||||||
#define BSIM4v4_MOD_PLAMBDA 825
|
#define BSIM4v4_MOD_PLAMBDA 825
|
||||||
#define BSIM4v4_MOD_PVTL 826
|
#define BSIM4v4_MOD_PVTL 826
|
||||||
|
|
@ -2811,29 +2820,29 @@ typedef struct sBSIM4v4model
|
||||||
/* trap-assisted tunneling */
|
/* trap-assisted tunneling */
|
||||||
|
|
||||||
#define BSIM4v4_MOD_JTSS 900
|
#define BSIM4v4_MOD_JTSS 900
|
||||||
#define BSIM4v4_MOD_JTSD 901
|
#define BSIM4v4_MOD_JTSD 901
|
||||||
#define BSIM4v4_MOD_JTSSWS 902
|
#define BSIM4v4_MOD_JTSSWS 902
|
||||||
#define BSIM4v4_MOD_JTSSWD 903
|
#define BSIM4v4_MOD_JTSSWD 903
|
||||||
#define BSIM4v4_MOD_JTSSWGS 904
|
#define BSIM4v4_MOD_JTSSWGS 904
|
||||||
#define BSIM4v4_MOD_JTSSWGD 905
|
#define BSIM4v4_MOD_JTSSWGD 905
|
||||||
#define BSIM4v4_MOD_NJTS 906
|
#define BSIM4v4_MOD_NJTS 906
|
||||||
#define BSIM4v4_MOD_NJTSSW 907
|
#define BSIM4v4_MOD_NJTSSW 907
|
||||||
#define BSIM4v4_MOD_NJTSSWG 908
|
#define BSIM4v4_MOD_NJTSSWG 908
|
||||||
#define BSIM4v4_MOD_XTSS 909
|
#define BSIM4v4_MOD_XTSS 909
|
||||||
#define BSIM4v4_MOD_XTSD 910
|
#define BSIM4v4_MOD_XTSD 910
|
||||||
#define BSIM4v4_MOD_XTSSWS 911
|
#define BSIM4v4_MOD_XTSSWS 911
|
||||||
#define BSIM4v4_MOD_XTSSWD 912
|
#define BSIM4v4_MOD_XTSSWD 912
|
||||||
#define BSIM4v4_MOD_XTSSWGS 913
|
#define BSIM4v4_MOD_XTSSWGS 913
|
||||||
#define BSIM4v4_MOD_XTSSWGD 914
|
#define BSIM4v4_MOD_XTSSWGD 914
|
||||||
#define BSIM4v4_MOD_TNJTS 915
|
#define BSIM4v4_MOD_TNJTS 915
|
||||||
#define BSIM4v4_MOD_TNJTSSW 916
|
#define BSIM4v4_MOD_TNJTSSW 916
|
||||||
#define BSIM4v4_MOD_TNJTSSWG 917
|
#define BSIM4v4_MOD_TNJTSSWG 917
|
||||||
#define BSIM4v4_MOD_VTSS 918
|
#define BSIM4v4_MOD_VTSS 918
|
||||||
#define BSIM4v4_MOD_VTSD 919
|
#define BSIM4v4_MOD_VTSD 919
|
||||||
#define BSIM4v4_MOD_VTSSWS 920
|
#define BSIM4v4_MOD_VTSSWS 920
|
||||||
#define BSIM4v4_MOD_VTSSWD 921
|
#define BSIM4v4_MOD_VTSSWD 921
|
||||||
#define BSIM4v4_MOD_VTSSWGS 922
|
#define BSIM4v4_MOD_VTSSWGS 922
|
||||||
#define BSIM4v4_MOD_VTSSWGD 923
|
#define BSIM4v4_MOD_VTSSWGD 923
|
||||||
|
|
||||||
/* device questions */
|
/* device questions */
|
||||||
#define BSIM4v4_DNODE 945
|
#define BSIM4v4_DNODE 945
|
||||||
|
|
@ -2885,9 +2894,9 @@ typedef struct sBSIM4v4model
|
||||||
#define BSIM4v4_DRAINCONDUCT 991
|
#define BSIM4v4_DRAINCONDUCT 991
|
||||||
#define BSIM4v4_CBDB 992
|
#define BSIM4v4_CBDB 992
|
||||||
#define BSIM4v4_CBSB 993
|
#define BSIM4v4_CBSB 993
|
||||||
#define BSIM4v4_CSUB 994
|
#define BSIM4v4_CSUB 994
|
||||||
#define BSIM4v4_QINV 995
|
#define BSIM4v4_QINV 995
|
||||||
#define BSIM4v4_IGIDL 996
|
#define BSIM4v4_IGIDL 996
|
||||||
#define BSIM4v4_CSGB 997
|
#define BSIM4v4_CSGB 997
|
||||||
#define BSIM4v4_CSDB 998
|
#define BSIM4v4_CSDB 998
|
||||||
#define BSIM4v4_CSSB 999
|
#define BSIM4v4_CSSB 999
|
||||||
|
|
@ -2896,12 +2905,12 @@ typedef struct sBSIM4v4model
|
||||||
#define BSIM4v4_CSBB 1002
|
#define BSIM4v4_CSBB 1002
|
||||||
#define BSIM4v4_CBBB 1003
|
#define BSIM4v4_CBBB 1003
|
||||||
#define BSIM4v4_QS 1004
|
#define BSIM4v4_QS 1004
|
||||||
#define BSIM4v4_IGISL 1005
|
#define BSIM4v4_IGISL 1005
|
||||||
#define BSIM4v4_IGS 1006
|
#define BSIM4v4_IGS 1006
|
||||||
#define BSIM4v4_IGD 1007
|
#define BSIM4v4_IGD 1007
|
||||||
#define BSIM4v4_IGB 1008
|
#define BSIM4v4_IGB 1008
|
||||||
#define BSIM4v4_IGCS 1009
|
#define BSIM4v4_IGCS 1009
|
||||||
#define BSIM4v4_IGCD 1010
|
#define BSIM4v4_IGCD 1010
|
||||||
|
|
||||||
#include "bsim4v4ext.h"
|
#include "bsim4v4ext.h"
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue