Code merged into bsim4v4

This commit is contained in:
dwarning 2011-06-19 13:59:18 +00:00
parent 0132e5430d
commit c93ca8410d
8 changed files with 4801 additions and 3827 deletions

View File

@ -154,9 +154,11 @@ BSIM4v4instance *here = (BSIM4v4instance*)inst;
return(OK);
case BSIM4v4_SOURCECONDUCT:
value->rValue = here->BSIM4v4sourceConductance;
value->rValue *= here->BSIM4v4m;
return(OK);
case BSIM4v4_DRAINCONDUCT:
value->rValue = here->BSIM4v4drainConductance;
value->rValue *= here->BSIM4v4m;
return(OK);
case BSIM4v4_VBD:
value->rValue = *(ckt->CKTstate0 + here->BSIM4v4vbd);
@ -305,6 +307,7 @@ BSIM4v4instance *here = (BSIM4v4instance*)inst;
return(OK);
case BSIM4v4_CBDB:
value->rValue = here->BSIM4v4cbdb;
value->rValue *= here->BSIM4v4m;
return(OK);
case BSIM4v4_CBSB:
value->rValue = here->BSIM4v4cbsb;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/**** 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.
* File: b4mpar.c of BSIM4.4.0.
@ -18,6 +18,7 @@
#include "ifsim.h"
#include "sperror.h"
#include "suffix.h"
#include "const.h"
int
BSIM4v4mParam(

View File

@ -1,5 +1,5 @@
/**** 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.
* File: b4noi.c of BSIM4.4.0.
@ -18,7 +18,6 @@
#include "cktdefs.h"
#include "iferrmsg.h"
#include "noisedef.h"
#include "suffix.h"
#include "const.h"
@ -36,23 +35,47 @@ BSIM4v4instance *here,
double freq, double temp)
{
struct bsim4SizeDependParam *pParam;
double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq;
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi;
double cd, esat=0.0, DelClm, EffFreq, N0, Nl, Leff, Leffsq=0.0;
double T0, T1, T2=0.0, T3, T4, T5, T6, T7=0.0, T8, T9, Ssi;
pParam = here->pParam;
cd = fabs(here->BSIM4v4cd);
Leff = pParam->BSIM4v4leff - 2.0 * model->BSIM4v4lintnoi;
Leffsq = Leff * Leff;
esat = 2.0 * here->BSIM4v4vsattemp / here->BSIM4v4ueff;
switch (model->BSIM4v4intVersion) {
case BSIM4vOLD: case BSIM4v21: case BSIM4v30:
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 */
else {
T0 = ((((Vds - here->BSIM4v4Vdseff) / pParam->BSIM4v4litl)
+ model->BSIM4v4em) / esat);
DelClm = pParam->BSIM4v4litl * log (MAX(T0, N_MINLOG));
T0 = ((((Vds - here->BSIM4v4Vdseff) / pParam->BSIM4v4litl)
+ model->BSIM4v4em) / esat);
DelClm = pParam->BSIM4v4litl * log (MAX(T0, N_MINLOG));
}
EffFreq = pow(freq, model->BSIM4v4ef);
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;
Nl = model->BSIM4v4coxe * here->BSIM4v4Vgsteff
* (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);
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
+ model->BSIM4v4oxideTrapDensityC * Nl * Nl;
T9 = (Nl + here->BSIM4v4nstar) * (Nl + here->BSIM4v4nstar);
@ -89,6 +121,7 @@ double tempInoise;
double noizDens[BSIM4v4NSRCS];
double lnNdens[BSIM4v4NSRCS];
double T0, T1, T2, T5, T10, T11;
double Vds, Ssi, Swi;
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 */
static char *BSIM4v4nNames[BSIM4v4NSRCS] =
{ /* Note that we have to keep the order */
".rd", /* noise due to rd */
".rs", /* noise due to rs */
".rd", /* noise due to rd */
".rs", /* noise due to rs */
".rg", /* noise due to rgeltd */
".rbps", /* noise due to rbps */
".rbpd", /* noise due to rbpd */
".rbpb", /* noise due to rbpb */
".rbsb", /* noise due to rbsb */
".rbdb", /* noise due to rbdb */
".id", /* noise due to id */
".1overf", /* flicker (1/f) noise */
".id", /* noise due to id */
".1overf", /* flicker (1/f) noise */
".igs", /* shot noise due to IGS */
".igd", /* shot noise due to IGD */
".igb", /* shot noise due to IGB */
"" /* total transistor noise */
"" /* total transistor noise */
};
for (; model != NULL; model = model->BSIM4v4nextModel)
{ for (here = model->BSIM4v4instances; here != NULL;
here = here->BSIM4v4nextInstance)
{ pParam = here->pParam;
switch (operation)
{ case N_OPEN:
/* see if we have to to produce a summary report */
/* if so, name all the noise generators */
here = here->BSIM4v4nextInstance)
{ pParam = here->pParam;
switch (operation)
{ case N_OPEN:
/* see if we have to to produce a summary report */
/* if so, name all the noise generators */
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
{ switch (mode)
{ case N_DENS:
for (i = 0; i < BSIM4v4NSRCS; i++)
{ (void) sprintf(name, "onoise.%s%s",
here->BSIM4v4name,
BSIM4v4nNames[i]);
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
{ switch (mode)
{ case N_DENS:
for (i = 0; i < BSIM4v4NSRCS; i++)
{ (void) sprintf(name, "onoise.%s%s",
here->BSIM4v4name,
BSIM4v4nNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
}
break;
case INT_NOIZ:
for (i = 0; i < BSIM4v4NSRCS; i++)
{ (void) sprintf(name, "onoise_total.%s%s",
here->BSIM4v4name,
BSIM4v4nNames[i]);
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
}
break;
case INT_NOIZ:
for (i = 0; i < BSIM4v4NSRCS; i++)
{ (void) sprintf(name, "onoise_total.%s%s",
here->BSIM4v4name,
BSIM4v4nNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
(void) sprintf(name, "inoise_total.%s%s",
here->BSIM4v4name,
BSIM4v4nNames[i]);
(void) sprintf(name, "inoise_total.%s%s",
here->BSIM4v4name,
BSIM4v4nNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist)
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
m = here->BSIM4v4m;
switch (mode)
{ case N_DENS:
if (model->BSIM4v4tnoiMod == 0)
{ if (model->BSIM4v4rdsMod == 0)
{ gspr = here->BSIM4v4sourceConductance;
return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER,
NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
m = here->BSIM4v4m;
switch (mode)
{ case N_DENS:
if (model->BSIM4v4tnoiMod == 0)
{ if (model->BSIM4v4rdsMod == 0)
{ gspr = here->BSIM4v4sourceConductance;
gdpr = here->BSIM4v4drainConductance;
if (here->BSIM4v4grdsw > 0.0)
tmp = 1.0 / here->BSIM4v4grdsw; /* tmp used below */
else
tmp = 0.0;
}
else
{ gspr = here->BSIM4v4gstot;
if (here->BSIM4v4grdsw > 0.0)
tmp = 1.0 / here->BSIM4v4grdsw; /* tmp used below */
else
tmp = 0.0;
}
else
{ gspr = here->BSIM4v4gstot;
gdpr = here->BSIM4v4gdtot;
tmp = 0.0;
}
}
else
{ T5 = here->BSIM4v4Vgsteff / here->BSIM4v4EsatL;
T5 *= T5;
npart_beta = model->BSIM4v4rnoia * (1.0 + T5
* model->BSIM4v4tnoia * pParam->BSIM4v4leff);
npart_theta = model->BSIM4v4rnoib * (1.0 + T5
}
}
else
{ T5 = here->BSIM4v4Vgsteff / here->BSIM4v4EsatL;
T5 *= T5;
switch (model->BSIM4v4intVersion) {
case BSIM4vOLD: case BSIM4v21:
npart_beta = 0.577 * (1.0 + T5
* model->BSIM4v4tnoia * pParam->BSIM4v4leff);
npart_theta = 0.37 * (1.0 + T5
* 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;
gdpr = here->BSIM4v4drainConductance;
}
@ -208,42 +252,55 @@ int i;
gdpr = here->BSIM4v4gdtot;
}
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);
}
switch (model->BSIM4v4intVersion) {
case BSIM4vOLD: case BSIM4v21:
if ((*(ckt->CKTstates[0] + here->BSIM4v4vds)) >= 0.0)
gspr = gspr * (1.0 + npart_theta * npart_theta * gspr
/ 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],
&lnNdens[BSIM4v4RDNOIZ], ckt, THERMNOISE,
here->BSIM4v4dNodePrime, here->BSIM4v4dNode,
gdpr * m);
NevalSrc(&noizDens[BSIM4v4RDNOIZ],
&lnNdens[BSIM4v4RDNOIZ], ckt, THERMNOISE,
here->BSIM4v4dNodePrime, here->BSIM4v4dNode,
gdpr * m);
NevalSrc(&noizDens[BSIM4v4RSNOIZ],
&lnNdens[BSIM4v4RSNOIZ], ckt, THERMNOISE,
here->BSIM4v4sNodePrime, here->BSIM4v4sNode,
gspr * m);
NevalSrc(&noizDens[BSIM4v4RSNOIZ],
&lnNdens[BSIM4v4RSNOIZ], ckt, THERMNOISE,
here->BSIM4v4sNodePrime, here->BSIM4v4sNode,
gspr * m);
if ((here->BSIM4v4rgateMod == 1) || (here->BSIM4v4rgateMod == 2))
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
if ((here->BSIM4v4rgateMod == 1) || (here->BSIM4v4rgateMod == 2))
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
&lnNdens[BSIM4v4RGNOIZ], ckt, THERMNOISE,
here->BSIM4v4gNodePrime, here->BSIM4v4gNodeExt,
here->BSIM4v4grgeltd * m);
}
else if (here->BSIM4v4rgateMod == 3)
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
}
else if (here->BSIM4v4rgateMod == 3)
{ NevalSrc(&noizDens[BSIM4v4RGNOIZ],
&lnNdens[BSIM4v4RGNOIZ], ckt, THERMNOISE,
here->BSIM4v4gNodeMid, here->BSIM4v4gNodeExt,
here->BSIM4v4grgeltd * m);
}
else
{ noizDens[BSIM4v4RGNOIZ] = 0.0;
}
else
{ noizDens[BSIM4v4RGNOIZ] = 0.0;
lnNdens[BSIM4v4RGNOIZ] =
log(MAX(noizDens[BSIM4v4RGNOIZ], N_MINLOG));
}
}
if (here->BSIM4v4rbodyMod)
@ -286,49 +343,49 @@ int i;
switch(model->BSIM4v4tnoiMod)
{ case 0:
T0 = m * here->BSIM4v4ueff * fabs(here->BSIM4v4qinv);
T1 = T0 * tmp + pParam->BSIM4v4leff
{ case 0:
T0 = m * here->BSIM4v4ueff * fabs(here->BSIM4v4qinv);
T1 = T0 * tmp + pParam->BSIM4v4leff
* pParam->BSIM4v4leff;
NevalSrc(&noizDens[BSIM4v4IDNOIZ],
&lnNdens[BSIM4v4IDNOIZ], ckt,
THERMNOISE, here->BSIM4v4dNodePrime,
NevalSrc(&noizDens[BSIM4v4IDNOIZ],
&lnNdens[BSIM4v4IDNOIZ], ckt,
THERMNOISE, here->BSIM4v4dNodePrime,
here->BSIM4v4sNodePrime,
(T0 / T1) * model->BSIM4v4ntnoi);
break;
case 1:
T0 = m * (here->BSIM4v4gm + here->BSIM4v4gmbs + here->BSIM4v4gds);
T0 *= T0;
igsquare = npart_theta * npart_theta * T0 / here->BSIM4v4IdovVds;
T1 = npart_beta * (here->BSIM4v4gm
+ here->BSIM4v4gmbs) + here->BSIM4v4gds;
T2 = T1 * T1 / here->BSIM4v4IdovVds;
(T0 / T1) * model->BSIM4v4ntnoi);
break;
case 1:
T0 = m * (here->BSIM4v4gm + here->BSIM4v4gmbs + here->BSIM4v4gds);
T0 *= T0;
igsquare = npart_theta * npart_theta * T0 / here->BSIM4v4IdovVds;
T1 = npart_beta * (here->BSIM4v4gm
+ here->BSIM4v4gmbs) + here->BSIM4v4gds;
T2 = T1 * T1 / here->BSIM4v4IdovVds;
NevalSrc(&noizDens[BSIM4v4IDNOIZ],
&lnNdens[BSIM4v4IDNOIZ], ckt,
THERMNOISE, here->BSIM4v4dNodePrime,
here->BSIM4v4sNodePrime, (T2 - igsquare));
break;
}
}
NevalSrc(&noizDens[BSIM4v4FLNOIZ], NULL,
ckt, N_GAIN, here->BSIM4v4dNodePrime,
here->BSIM4v4sNodePrime, (double) 0.0);
NevalSrc(&noizDens[BSIM4v4FLNOIZ], NULL,
ckt, N_GAIN, here->BSIM4v4dNodePrime,
here->BSIM4v4sNodePrime, (double) 0.0);
switch(model->BSIM4v4fnoiMod)
{ case 0:
noizDens[BSIM4v4FLNOIZ] *= m * model->BSIM4v4kf
* exp(model->BSIM4v4af
* log(MAX(fabs(here->BSIM4v4cd),
N_MINLOG)))
/ (pow(data->freq, model->BSIM4v4ef)
* pParam->BSIM4v4leff
* pParam->BSIM4v4leff
* model->BSIM4v4coxe);
break;
case 1:
Vds = *(ckt->CKTstates[0] + here->BSIM4v4vds);
if (Vds < 0.0)
Vds = -Vds;
{ case 0:
noizDens[BSIM4v4FLNOIZ] *= m * model->BSIM4v4kf
* exp(model->BSIM4v4af
* log(MAX(fabs(here->BSIM4v4cd),
N_MINLOG)))
/ (pow(data->freq, model->BSIM4v4ef)
* pParam->BSIM4v4leff
* pParam->BSIM4v4leff
* model->BSIM4v4coxe);
break;
case 1:
Vds = *(ckt->CKTstates[0] + here->BSIM4v4vds);
if (Vds < 0.0)
Vds = -Vds;
Ssi = BSIM4v4Eval1ovFNoise(Vds, model, here,
data->freq, ckt->CKTtemp);
@ -336,7 +393,7 @@ int i;
* CONSTboltz * ckt->CKTtemp;
T11 = pParam->BSIM4v4weff * pParam->BSIM4v4leff
* pow(data->freq, model->BSIM4v4ef) * 1.0e10
* here->BSIM4v4nstar * here->BSIM4v4nstar;
* here->BSIM4v4nstar * here->BSIM4v4nstar;
Swi = T10 / T11 * here->BSIM4v4cd
* here->BSIM4v4cd;
T1 = Swi + Ssi;
@ -344,133 +401,148 @@ int i;
noizDens[BSIM4v4FLNOIZ] *= m * (Ssi * Swi) / T1;
else
noizDens[BSIM4v4FLNOIZ] *= 0.0;
break;
}
break;
}
lnNdens[BSIM4v4FLNOIZ] =
log(MAX(noizDens[BSIM4v4FLNOIZ], N_MINLOG));
lnNdens[BSIM4v4FLNOIZ] =
log(MAX(noizDens[BSIM4v4FLNOIZ], N_MINLOG));
if(here->BSIM4v4mode >= 0) { /* bugfix */
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
m * (here->BSIM4v4Igs + 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));
}
switch (model->BSIM4v4intVersion) {
case BSIM4vOLD: case BSIM4v21:
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
m * (here->BSIM4v4Igs + here->BSIM4v4Igcs));
NevalSrc(&noizDens[BSIM4v4IGDNOIZ],
&lnNdens[BSIM4v4IGDNOIZ], ckt, SHOTNOISE,
here->BSIM4v4gNodePrime, here->BSIM4v4dNodePrime,
m * (here->BSIM4v4Igd + here->BSIM4v4Igcd));
break;
case BSIM4v30: case BSIM4v40:
if(here->BSIM4v4mode >= 0) { /* bugfix */
NevalSrc(&noizDens[BSIM4v4IGSNOIZ],
&lnNdens[BSIM4v4IGSNOIZ], ckt, SHOTNOISE,
here->BSIM4v4gNodePrime, here->BSIM4v4sNodePrime,
m * (here->BSIM4v4Igs + 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],
&lnNdens[BSIM4v4IGBNOIZ], ckt, SHOTNOISE,
here->BSIM4v4gNodePrime, here->BSIM4v4bNodePrime,
m * here->BSIM4v4Igb);
noizDens[BSIM4v4TOTNOIZ] = noizDens[BSIM4v4RDNOIZ]
+ noizDens[BSIM4v4RSNOIZ] + noizDens[BSIM4v4RGNOIZ]
+ noizDens[BSIM4v4RBPSNOIZ] + noizDens[BSIM4v4RBPDNOIZ]
+ noizDens[BSIM4v4RBPBNOIZ]
+ noizDens[BSIM4v4RBSBNOIZ] + noizDens[BSIM4v4RBDBNOIZ]
+ noizDens[BSIM4v4IDNOIZ] + noizDens[BSIM4v4FLNOIZ]
noizDens[BSIM4v4TOTNOIZ] = noizDens[BSIM4v4RDNOIZ]
+ noizDens[BSIM4v4RSNOIZ] + noizDens[BSIM4v4RGNOIZ]
+ noizDens[BSIM4v4RBPSNOIZ] + noizDens[BSIM4v4RBPDNOIZ]
+ noizDens[BSIM4v4RBPBNOIZ]
+ noizDens[BSIM4v4RBSBNOIZ] + noizDens[BSIM4v4RBDBNOIZ]
+ noizDens[BSIM4v4IDNOIZ] + noizDens[BSIM4v4FLNOIZ]
+ noizDens[BSIM4v4IGSNOIZ] + noizDens[BSIM4v4IGDNOIZ]
+ noizDens[BSIM4v4IGBNOIZ];
lnNdens[BSIM4v4TOTNOIZ] =
log(MAX(noizDens[BSIM4v4TOTNOIZ], N_MINLOG));
lnNdens[BSIM4v4TOTNOIZ] =
log(MAX(noizDens[BSIM4v4TOTNOIZ], N_MINLOG));
*OnDens += noizDens[BSIM4v4TOTNOIZ];
*OnDens += noizDens[BSIM4v4TOTNOIZ];
if (data->delFreq == 0.0)
{ /* if we haven't done any previous
integration, we need to initialize our
"history" variables.
*/
if (data->delFreq == 0.0)
{ /* if we haven't done any previous
integration, we need to initialize our
"history" variables.
*/
for (i = 0; i < BSIM4v4NSRCS; i++)
{ here->BSIM4v4nVar[LNLSTDENS][i] =
lnNdens[i];
}
for (i = 0; i < BSIM4v4NSRCS; i++)
{ here->BSIM4v4nVar[LNLSTDENS][i] =
lnNdens[i];
}
/* clear out our integration variables
if it's the first pass
*/
if (data->freq ==
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
{ for (i = 0; i < BSIM4v4NSRCS; i++)
{ here->BSIM4v4nVar[OUTNOIZ][i] = 0.0;
here->BSIM4v4nVar[INNOIZ][i] = 0.0;
}
}
}
else
{ /* data->delFreq != 0.0,
we have to integrate.
*/
for (i = 0; i < BSIM4v4NSRCS; i++)
{ if (i != BSIM4v4TOTNOIZ)
{ tempOnoise = Nintegrate(noizDens[i],
lnNdens[i],
here->BSIM4v4nVar[LNLSTDENS][i],
data);
tempInoise = Nintegrate(noizDens[i]
* data->GainSqInv, lnNdens[i]
+ data->lnGainInv,
here->BSIM4v4nVar[LNLSTDENS][i]
+ data->lnGainInv, data);
here->BSIM4v4nVar[LNLSTDENS][i] =
lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if (((NOISEAN*)
ckt->CKTcurJob)->NStpsSm != 0)
{ here->BSIM4v4nVar[OUTNOIZ][i]
+= tempOnoise;
here->BSIM4v4nVar[OUTNOIZ][BSIM4v4TOTNOIZ]
+= tempOnoise;
here->BSIM4v4nVar[INNOIZ][i]
+= tempInoise;
here->BSIM4v4nVar[INNOIZ][BSIM4v4TOTNOIZ]
+= tempInoise;
/* clear out our integration variables
if it's the first pass
*/
if (data->freq ==
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
{ for (i = 0; i < BSIM4v4NSRCS; i++)
{ here->BSIM4v4nVar[OUTNOIZ][i] = 0.0;
here->BSIM4v4nVar[INNOIZ][i] = 0.0;
}
}
}
else
{ /* data->delFreq != 0.0,
we have to integrate.
*/
for (i = 0; i < BSIM4v4NSRCS; i++)
{ if (i != BSIM4v4TOTNOIZ)
{ tempOnoise = Nintegrate(noizDens[i],
lnNdens[i],
here->BSIM4v4nVar[LNLSTDENS][i],
data);
tempInoise = Nintegrate(noizDens[i]
* data->GainSqInv, lnNdens[i]
+ data->lnGainInv,
here->BSIM4v4nVar[LNLSTDENS][i]
+ data->lnGainInv, data);
here->BSIM4v4nVar[LNLSTDENS][i] =
lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if (((NOISEAN*)
ckt->CKTcurJob)->NStpsSm != 0)
{ here->BSIM4v4nVar[OUTNOIZ][i]
+= tempOnoise;
here->BSIM4v4nVar[OUTNOIZ][BSIM4v4TOTNOIZ]
+= tempOnoise;
here->BSIM4v4nVar[INNOIZ][i]
+= tempInoise;
here->BSIM4v4nVar[INNOIZ][BSIM4v4TOTNOIZ]
+= tempInoise;
}
}
}
}
if (data->prtSummary)
{ for (i = 0; i < BSIM4v4NSRCS; i++)
{ /* print a summary report */
data->outpVector[data->outNumber++]
= noizDens[i];
}
}
break;
case INT_NOIZ:
/* already calculated, just output */
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
{ for (i = 0; i < BSIM4v4NSRCS; i++)
{ data->outpVector[data->outNumber++]
= here->BSIM4v4nVar[OUTNOIZ][i];
data->outpVector[data->outNumber++]
= here->BSIM4v4nVar[INNOIZ][i];
}
}
break;
}
break;
case N_CLOSE:
/* do nothing, the main calling routine will close */
return (OK);
break; /* the plots */
} /* switch (operation) */
} /* for here */
}
}
}
if (data->prtSummary)
{ for (i = 0; i < BSIM4v4NSRCS; i++)
{ /* print a summary report */
data->outpVector[data->outNumber++]
= noizDens[i];
}
}
break;
case INT_NOIZ:
/* already calculated, just output */
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
{ for (i = 0; i < BSIM4v4NSRCS; i++)
{ data->outpVector[data->outNumber++]
= here->BSIM4v4nVar[OUTNOIZ][i];
data->outpVector[data->outNumber++]
= here->BSIM4v4nVar[INNOIZ][i];
}
}
break;
}
break;
case N_CLOSE:
/* do nothing, the main calling routine will close */
return (OK);
break; /* the plots */
} /* switch (operation) */
} /* for here */
} /* for model */
return(OK);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff