|
|
@ -10,6 +10,7 @@ Modified: 2000 AlansFixes |
|
|
#include "ngspice/iferrmsg.h" |
|
|
#include "ngspice/iferrmsg.h" |
|
|
#include "ngspice/noisedef.h" |
|
|
#include "ngspice/noisedef.h" |
|
|
#include "ngspice/suffix.h" |
|
|
#include "ngspice/suffix.h" |
|
|
|
|
|
#include "ngspice/compatmode.h" |
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|
* MOS3noise (mode, operation, firstModel, ckt, data, OnDens) |
|
|
* MOS3noise (mode, operation, firstModel, ckt, data, OnDens) |
|
|
@ -97,13 +98,44 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, |
|
|
NevalSrc( & noizDens[MOS3FLNOIZ], NULL, ckt, |
|
|
NevalSrc( & noizDens[MOS3FLNOIZ], NULL, ckt, |
|
|
N_GAIN, inst -> MOS3dNodePrime, inst -> MOS3sNodePrime, |
|
|
N_GAIN, inst -> MOS3dNodePrime, inst -> MOS3sNodePrime, |
|
|
(double) 0.0); |
|
|
(double) 0.0); |
|
|
noizDens[MOS3FLNOIZ] *= model -> MOS3fNcoef * |
|
|
|
|
|
exp(model -> MOS3fNexp * |
|
|
|
|
|
log(MAX(fabs(inst -> MOS3cd), N_MINLOG))) / |
|
|
|
|
|
(data -> freq * |
|
|
|
|
|
(inst -> MOS3w - 2 * model -> MOS3widthNarrow) * |
|
|
|
|
|
(inst -> MOS3l - 2 * model -> MOS3latDiff) * |
|
|
|
|
|
model -> MOS3oxideCapFactor * model -> MOS3oxideCapFactor); |
|
|
|
|
|
|
|
|
if (newcompat.s3) { |
|
|
|
|
|
noizDens[MOS3FLNOIZ] *= model -> MOS3fNcoef * |
|
|
|
|
|
exp(model -> MOS3fNexp * |
|
|
|
|
|
log(MAX(fabs(inst -> MOS3cd), N_MINLOG))) / |
|
|
|
|
|
(data -> freq * |
|
|
|
|
|
(inst -> MOS3w - 2 * model -> MOS3widthNarrow) * |
|
|
|
|
|
(inst -> MOS3l - 2 * model -> MOS3latDiff) * |
|
|
|
|
|
model -> MOS3oxideCapFactor * model -> MOS3oxideCapFactor); |
|
|
|
|
|
} else { |
|
|
|
|
|
switch (model -> MOS3nlev) { |
|
|
|
|
|
case 0: |
|
|
|
|
|
noizDens[MOS3FLNOIZ] *= model -> MOS3fNcoef * |
|
|
|
|
|
exp(model -> MOS3fNexp * |
|
|
|
|
|
log(MAX(fabs(inst -> MOS3cd), N_MINLOG))) / |
|
|
|
|
|
(data -> freq * |
|
|
|
|
|
(inst -> MOS3l - 2 * model -> MOS3latDiff) * |
|
|
|
|
|
(inst -> MOS3l - 2 * model -> MOS3latDiff) * |
|
|
|
|
|
model -> MOS3oxideCapFactor); |
|
|
|
|
|
break; |
|
|
|
|
|
case 1: |
|
|
|
|
|
noizDens[MOS3FLNOIZ] *= model -> MOS3fNcoef * |
|
|
|
|
|
exp(model -> MOS3fNexp * |
|
|
|
|
|
log(MAX(fabs(inst -> MOS3cd), N_MINLOG))) / |
|
|
|
|
|
(data -> freq * |
|
|
|
|
|
(inst -> MOS3w - 2 * model -> MOS3widthNarrow) * |
|
|
|
|
|
(inst -> MOS3l - 2 * model -> MOS3latDiff) * |
|
|
|
|
|
model -> MOS3oxideCapFactor); |
|
|
|
|
|
break; |
|
|
|
|
|
case 2: case 3: |
|
|
|
|
|
noizDens[MOS3FLNOIZ] *= model -> MOS3fNcoef * |
|
|
|
|
|
inst -> MOS3gm * inst -> MOS3gm / |
|
|
|
|
|
(pow(data -> freq, model -> MOS3fNexp) * |
|
|
|
|
|
(inst -> MOS3w - 2 * model -> MOS3widthNarrow) * |
|
|
|
|
|
(inst -> MOS3l - 2 * model -> MOS3latDiff) * |
|
|
|
|
|
model -> MOS3oxideCapFactor); |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
lnNdens[MOS3FLNOIZ] = |
|
|
lnNdens[MOS3FLNOIZ] = |
|
|
log(MAX(noizDens[MOS3FLNOIZ], N_MINLOG)); |
|
|
log(MAX(noizDens[MOS3FLNOIZ], N_MINLOG)); |
|
|
|
|
|
|
|
|
|