white spaces
This commit is contained in:
parent
61ba54de8d
commit
d9247cc322
|
|
@ -103,34 +103,34 @@ typedef struct sVDMOSinstance {
|
|||
* cdr = cdrain
|
||||
*/
|
||||
|
||||
#define VDMOSNDCOEFFS 11
|
||||
#define VDMOSNDCOEFFS 11
|
||||
|
||||
#ifndef NODISTO
|
||||
double VDMOSdCoeffs[VDMOSNDCOEFFS];
|
||||
double VDMOSdCoeffs[VDMOSNDCOEFFS];
|
||||
#else /* NODISTO */
|
||||
double *VDMOSdCoeffs;
|
||||
double *VDMOSdCoeffs;
|
||||
#endif /* NODISTO */
|
||||
|
||||
#ifndef CONFIG
|
||||
|
||||
#define cdr_x2 VDMOSdCoeffs[0]
|
||||
#define cdr_y2 VDMOSdCoeffs[1]
|
||||
#define cdr_xy VDMOSdCoeffs[2]
|
||||
#define cdr_x3 VDMOSdCoeffs[3]
|
||||
#define cdr_y3 VDMOSdCoeffs[4]
|
||||
#define cdr_x2y VDMOSdCoeffs[5]
|
||||
#define cdr_xy2 VDMOSdCoeffs[6]
|
||||
#define capgs2 VDMOSdCoeffs[7]
|
||||
#define capgs3 VDMOSdCoeffs[8]
|
||||
#define capgd2 VDMOSdCoeffs[9]
|
||||
#define capgd3 VDMOSdCoeffs[10]
|
||||
#define cdr_x2 VDMOSdCoeffs[0]
|
||||
#define cdr_y2 VDMOSdCoeffs[1]
|
||||
#define cdr_xy VDMOSdCoeffs[2]
|
||||
#define cdr_x3 VDMOSdCoeffs[3]
|
||||
#define cdr_y3 VDMOSdCoeffs[4]
|
||||
#define cdr_x2y VDMOSdCoeffs[5]
|
||||
#define cdr_xy2 VDMOSdCoeffs[6]
|
||||
#define capgs2 VDMOSdCoeffs[7]
|
||||
#define capgs3 VDMOSdCoeffs[8]
|
||||
#define capgd2 VDMOSdCoeffs[9]
|
||||
#define capgd3 VDMOSdCoeffs[10]
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NONOISE
|
||||
double VDMOSnVar[NSTATVARS][VDMOSNSRCS];
|
||||
#else /* NONOISE */
|
||||
double **VDMOSnVar;
|
||||
double **VDMOSnVar;
|
||||
#endif /* NONOISE */
|
||||
|
||||
int VDMOSmode; /* device mode : 1 = normal, -1 = inverse */
|
||||
|
|
|
|||
|
|
@ -40,150 +40,150 @@ VDMOSnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt,
|
|||
/* define the names of the noise sources */
|
||||
|
||||
static char *VDMOSnNames[VDMOSNSRCS] = { /* Note that we have to keep the order */
|
||||
"_rd", /* noise due to rd */ /* consistent with thestrchr definitions */
|
||||
"_rs", /* noise due to rs */ /* in VDMOSdefs.h */
|
||||
"_id", /* noise due to id */
|
||||
"_1overf", /* flicker (1/f) noise */
|
||||
"" /* total transistor noise */
|
||||
"_rd", /* noise due to rd */ /* consistent with thestrchr definitions */
|
||||
"_rs", /* noise due to rs */ /* in VDMOSdefs.h */
|
||||
"_id", /* noise due to id */
|
||||
"_1overf", /* flicker (1/f) noise */
|
||||
"" /* total transistor noise */
|
||||
};
|
||||
|
||||
for (model=firstModel; model != NULL; model=VDMOSnextModel(model)) {
|
||||
|
||||
/* Oxide capacitance can be zero in MOS level 1. Since this will give us problems in our 1/f */
|
||||
/* noise model, we ASSUME an actual "tox" of 1e-7 */
|
||||
/* Oxide capacitance can be zero in MOS level 1. Since this will give us problems in our 1/f */
|
||||
/* noise model, we ASSUME an actual "tox" of 1e-7 */
|
||||
|
||||
if (model->VDMOSoxideCapFactor == 0.0) {
|
||||
coxSquared = 3.9 * 8.854214871e-12 / 1e-7;
|
||||
if (model->VDMOSoxideCapFactor == 0.0) {
|
||||
coxSquared = 3.9 * 8.854214871e-12 / 1e-7;
|
||||
} else {
|
||||
coxSquared = model->VDMOSoxideCapFactor;
|
||||
coxSquared = model->VDMOSoxideCapFactor;
|
||||
}
|
||||
coxSquared *= coxSquared;
|
||||
for (inst=VDMOSinstances(model); inst != NULL; inst=VDMOSnextInstance(inst)) {
|
||||
coxSquared *= coxSquared;
|
||||
for (inst=VDMOSinstances(model); inst != NULL; inst=VDMOSnextInstance(inst)) {
|
||||
|
||||
switch (operation) {
|
||||
switch (operation) {
|
||||
|
||||
case N_OPEN:
|
||||
case N_OPEN:
|
||||
|
||||
/* see if we have to to produce a summary report */
|
||||
/* if so, name all the noise generators */
|
||||
/* see if we have to to produce a summary report */
|
||||
/* if so, name all the noise generators */
|
||||
|
||||
if (job->NStpsSm != 0) {
|
||||
switch (mode) {
|
||||
if (job->NStpsSm != 0) {
|
||||
switch (mode) {
|
||||
|
||||
case N_DENS:
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->VDMOSname, VDMOSnNames[i]);
|
||||
}
|
||||
break;
|
||||
case N_DENS:
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->VDMOSname, VDMOSnNames[i]);
|
||||
}
|
||||
break;
|
||||
|
||||
case INT_NOIZ:
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->VDMOSname, VDMOSnNames[i]);
|
||||
NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->VDMOSname, VDMOSnNames[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case INT_NOIZ:
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->VDMOSname, VDMOSnNames[i]);
|
||||
NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->VDMOSname, VDMOSnNames[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case N_CALC:
|
||||
switch (mode) {
|
||||
case N_CALC:
|
||||
switch (mode) {
|
||||
|
||||
case N_DENS:
|
||||
NevalSrc(&noizDens[VDMOSRDNOIZ],&lnNdens[VDMOSRDNOIZ],
|
||||
ckt,THERMNOISE,inst->VDMOSdNodePrime,inst->VDMOSdNode,
|
||||
inst->VDMOSdrainConductance);
|
||||
case N_DENS:
|
||||
NevalSrc(&noizDens[VDMOSRDNOIZ],&lnNdens[VDMOSRDNOIZ],
|
||||
ckt,THERMNOISE,inst->VDMOSdNodePrime,inst->VDMOSdNode,
|
||||
inst->VDMOSdrainConductance);
|
||||
|
||||
NevalSrc(&noizDens[VDMOSRSNOIZ],&lnNdens[VDMOSRSNOIZ],
|
||||
ckt,THERMNOISE,inst->VDMOSsNodePrime,inst->VDMOSsNode,
|
||||
inst->VDMOSsourceConductance);
|
||||
NevalSrc(&noizDens[VDMOSRSNOIZ],&lnNdens[VDMOSRSNOIZ],
|
||||
ckt,THERMNOISE,inst->VDMOSsNodePrime,inst->VDMOSsNode,
|
||||
inst->VDMOSsourceConductance);
|
||||
|
||||
NevalSrc(&noizDens[VDMOSIDNOIZ],&lnNdens[VDMOSIDNOIZ],
|
||||
ckt,THERMNOISE,inst->VDMOSdNodePrime,inst->VDMOSsNodePrime,
|
||||
NevalSrc(&noizDens[VDMOSIDNOIZ],&lnNdens[VDMOSIDNOIZ],
|
||||
ckt,THERMNOISE,inst->VDMOSdNodePrime,inst->VDMOSsNodePrime,
|
||||
(2.0/3.0 * fabs(inst->VDMOSgm)));
|
||||
|
||||
NevalSrc(&noizDens[VDMOSFLNOIZ], NULL, ckt,
|
||||
N_GAIN,inst->VDMOSdNodePrime, inst->VDMOSsNodePrime,
|
||||
(double)0.0);
|
||||
noizDens[VDMOSFLNOIZ] *= model->VDMOSfNcoef *
|
||||
exp(model->VDMOSfNexp *
|
||||
log(MAX(fabs(inst->VDMOScd),N_MINLOG))) /
|
||||
(data->freq * inst->VDMOSw *
|
||||
inst->VDMOSm *
|
||||
inst->VDMOSl * coxSquared);
|
||||
lnNdens[VDMOSFLNOIZ] =
|
||||
log(MAX(noizDens[VDMOSFLNOIZ],N_MINLOG));
|
||||
NevalSrc(&noizDens[VDMOSFLNOIZ], NULL, ckt,
|
||||
N_GAIN,inst->VDMOSdNodePrime, inst->VDMOSsNodePrime,
|
||||
(double)0.0);
|
||||
noizDens[VDMOSFLNOIZ] *= model->VDMOSfNcoef *
|
||||
exp(model->VDMOSfNexp *
|
||||
log(MAX(fabs(inst->VDMOScd),N_MINLOG))) /
|
||||
(data->freq * inst->VDMOSw *
|
||||
inst->VDMOSm *
|
||||
inst->VDMOSl * coxSquared);
|
||||
lnNdens[VDMOSFLNOIZ] =
|
||||
log(MAX(noizDens[VDMOSFLNOIZ],N_MINLOG));
|
||||
|
||||
noizDens[VDMOSTOTNOIZ] = noizDens[VDMOSRDNOIZ] +
|
||||
noizDens[VDMOSRSNOIZ] +
|
||||
noizDens[VDMOSIDNOIZ] +
|
||||
noizDens[VDMOSFLNOIZ];
|
||||
lnNdens[VDMOSTOTNOIZ] =
|
||||
log(MAX(noizDens[VDMOSTOTNOIZ], N_MINLOG));
|
||||
noizDens[VDMOSTOTNOIZ] = noizDens[VDMOSRDNOIZ] +
|
||||
noizDens[VDMOSRSNOIZ] +
|
||||
noizDens[VDMOSIDNOIZ] +
|
||||
noizDens[VDMOSFLNOIZ];
|
||||
lnNdens[VDMOSTOTNOIZ] =
|
||||
log(MAX(noizDens[VDMOSTOTNOIZ], N_MINLOG));
|
||||
|
||||
*OnDens += noizDens[VDMOSTOTNOIZ];
|
||||
*OnDens += noizDens[VDMOSTOTNOIZ];
|
||||
|
||||
if (data->delFreq == 0.0) {
|
||||
if (data->delFreq == 0.0) {
|
||||
|
||||
/* if we haven't done any previous integration, we need to */
|
||||
/* initialize our "history" variables */
|
||||
/* if we haven't done any previous integration, we need to */
|
||||
/* initialize our "history" variables */
|
||||
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
inst->VDMOSnVar[LNLSTDENS][i] = lnNdens[i];
|
||||
}
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
inst->VDMOSnVar[LNLSTDENS][i] = lnNdens[i];
|
||||
}
|
||||
|
||||
/* clear out our integration variables if it's the first pass */
|
||||
/* clear out our integration variables if it's the first pass */
|
||||
|
||||
if (data->freq == job->NstartFreq) {
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
inst->VDMOSnVar[OUTNOIZ][i] = 0.0;
|
||||
inst->VDMOSnVar[INNOIZ][i] = 0.0;
|
||||
}
|
||||
}
|
||||
} else { /* data->delFreq != 0.0 (we have to integrate) */
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
if (i != VDMOSTOTNOIZ) {
|
||||
tempOnoise = Nintegrate(noizDens[i], lnNdens[i],
|
||||
inst->VDMOSnVar[LNLSTDENS][i], data);
|
||||
tempInoise = Nintegrate(noizDens[i] * data->GainSqInv ,
|
||||
lnNdens[i] + data->lnGainInv,
|
||||
inst->VDMOSnVar[LNLSTDENS][i] + data->lnGainInv,
|
||||
data);
|
||||
inst->VDMOSnVar[LNLSTDENS][i] = lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (job->NStpsSm != 0) {
|
||||
inst->VDMOSnVar[OUTNOIZ][i] += tempOnoise;
|
||||
inst->VDMOSnVar[OUTNOIZ][VDMOSTOTNOIZ] += tempOnoise;
|
||||
inst->VDMOSnVar[INNOIZ][i] += tempInoise;
|
||||
inst->VDMOSnVar[INNOIZ][VDMOSTOTNOIZ] += tempInoise;
|
||||
if (data->freq == job->NstartFreq) {
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
inst->VDMOSnVar[OUTNOIZ][i] = 0.0;
|
||||
inst->VDMOSnVar[INNOIZ][i] = 0.0;
|
||||
}
|
||||
}
|
||||
} else { /* data->delFreq != 0.0 (we have to integrate) */
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
if (i != VDMOSTOTNOIZ) {
|
||||
tempOnoise = Nintegrate(noizDens[i], lnNdens[i],
|
||||
inst->VDMOSnVar[LNLSTDENS][i], data);
|
||||
tempInoise = Nintegrate(noizDens[i] * data->GainSqInv ,
|
||||
lnNdens[i] + data->lnGainInv,
|
||||
inst->VDMOSnVar[LNLSTDENS][i] + data->lnGainInv,
|
||||
data);
|
||||
inst->VDMOSnVar[LNLSTDENS][i] = lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (job->NStpsSm != 0) {
|
||||
inst->VDMOSnVar[OUTNOIZ][i] += tempOnoise;
|
||||
inst->VDMOSnVar[OUTNOIZ][VDMOSTOTNOIZ] += tempOnoise;
|
||||
inst->VDMOSnVar[INNOIZ][i] += tempInoise;
|
||||
inst->VDMOSnVar[INNOIZ][VDMOSTOTNOIZ] += tempInoise;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data->prtSummary) {
|
||||
for (i=0; i < VDMOSNSRCS; i++) { /* print a summary report */
|
||||
data->outpVector[data->outNumber++] = noizDens[i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data->prtSummary) {
|
||||
for (i=0; i < VDMOSNSRCS; i++) { /* print a summary report */
|
||||
data->outpVector[data->outNumber++] = noizDens[i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case INT_NOIZ: /* already calculated, just output */
|
||||
if (job->NStpsSm != 0) {
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
data->outpVector[data->outNumber++] = inst->VDMOSnVar[OUTNOIZ][i];
|
||||
data->outpVector[data->outNumber++] = inst->VDMOSnVar[INNOIZ][i];
|
||||
}
|
||||
} /* if */
|
||||
break;
|
||||
} /* switch (mode) */
|
||||
break;
|
||||
case INT_NOIZ: /* already calculated, just output */
|
||||
if (job->NStpsSm != 0) {
|
||||
for (i=0; i < VDMOSNSRCS; i++) {
|
||||
data->outpVector[data->outNumber++] = inst->VDMOSnVar[OUTNOIZ][i];
|
||||
data->outpVector[data->outNumber++] = inst->VDMOSnVar[INNOIZ][i];
|
||||
}
|
||||
} /* if */
|
||||
break;
|
||||
} /* switch (mode) */
|
||||
break;
|
||||
|
||||
case N_CLOSE:
|
||||
return (OK); /* do nothing, the main calling routine will close */
|
||||
break; /* the plots */
|
||||
} /* switch (operation) */
|
||||
} /* for inst */
|
||||
case N_CLOSE:
|
||||
return (OK); /* do nothing, the main calling routine will close */
|
||||
break; /* the plots */
|
||||
} /* switch (operation) */
|
||||
} /* for inst */
|
||||
} /* for model */
|
||||
|
||||
return(OK);
|
||||
|
|
|
|||
Loading…
Reference in New Issue