From 8d64381795841adbd0a1ccdf524ed3f93673ffc0 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 14 Feb 2024 14:14:15 +0100 Subject: [PATCH 1/9] rm confusing comments and formatting --- src/spicelib/analysis/nevalsrc.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/spicelib/analysis/nevalsrc.c b/src/spicelib/analysis/nevalsrc.c index e1a4bdd46..3fde1c447 100644 --- a/src/spicelib/analysis/nevalsrc.c +++ b/src/spicelib/analysis/nevalsrc.c @@ -62,7 +62,6 @@ NevalSrc(double* noise, double* lnNoise, CKTcircuit* ckt, int type, int node1, i case N_GAIN: inoise = 0.0; *noise = cmodu(csubco(ckt->CKTadjointRHS->d[0][node1], ckt->CKTadjointRHS->d[0][node2])); - break; } @@ -92,8 +91,8 @@ NevalSrc(double* noise, double* lnNoise, CKTcircuit* ckt, int type, int node1, i return; } - #endif + double realVal; double imagVal; double gain; @@ -180,7 +179,6 @@ NevalSrc2( case THERMNOISE: knoise = 4 * CONSTboltz * ckt->CKTtemp; /* param is the conductance of a resistor */ - // For this simulation we are not collecting any statistics on output nodes. Force noise to 0 *noise = knoise; *lnNoise = log(MAX(*noise, N_MINLOG)); break; @@ -216,7 +214,6 @@ NevalSrc2( iNoise->d[0][d] = in; } - for (int d = 0; d < ckt->CKTportCount; d++) for (int s = 0; s < ckt->CKTportCount; s++) ckt->CKTNoiseCYmat->d[d][s] = caddco(ckt->CKTNoiseCYmat->d[d][s], cmultco(iNoise->d[0][d], conju(iNoise->d[0][s]))); @@ -225,7 +222,6 @@ NevalSrc2( } #endif - realVal1 = ckt->CKTrhs[node1] - ckt->CKTrhs[node2]; imagVal1 = ckt->CKTirhs[node1] - ckt->CKTirhs[node2]; realVal2 = ckt->CKTrhs[node3] - ckt->CKTrhs[node4]; @@ -270,10 +266,7 @@ NevalSrcInstanceTemp(double* noise, double* lnNoise, CKTcircuit* ckt, int type, int node1, int node2, double param, double param2) { - #ifdef RFSPICE - // For this simulation we are not collecting any statistics on output nodes. Force noise to 0 - if (ckt->CKTcurrentAnalysis & DOING_SP) { double inoise = 0.0; @@ -282,14 +275,12 @@ NevalSrcInstanceTemp(double* noise, double* lnNoise, CKTcircuit* ckt, int type, case SHOTNOISE: inoise = 2 * CHARGE * fabs(param); /* param is the dc current in a semiconductor */ - // For this simulation we are not collecting any statistics on output nodes. Force noise to 0 *noise = inoise; *lnNoise = log(MAX(*noise, N_MINLOG)); break; case THERMNOISE: inoise = 4.0 * CONSTboltz * (ckt->CKTtemp + param2) * param; /* param is the conductance of a resistor */ - // For this simulation we are not collecting any statistics on output nodes. Force noise to 0 *noise = inoise; *lnNoise = log(MAX(*noise, N_MINLOG)); break; @@ -320,7 +311,6 @@ NevalSrcInstanceTemp(double* noise, double* lnNoise, CKTcircuit* ckt, int type, iNoise->d[0][d] = in; } - for (int d = 0; d < ckt->CKTportCount; d++) for (int s = 0; s < ckt->CKTportCount; s++) ckt->CKTNoiseCYmat->d[d][s] = caddco(ckt->CKTNoiseCYmat->d[d][s], cmultco(iNoise->d[0][d], conju(iNoise->d[0][s]))); @@ -328,12 +318,14 @@ NevalSrcInstanceTemp(double* noise, double* lnNoise, CKTcircuit* ckt, int type, return; } #endif + double realVal; double imagVal; double gain; realVal = ckt->CKTrhs[node1] - ckt->CKTrhs[node2]; imagVal = ckt->CKTirhs[node1] - ckt->CKTirhs[node2]; gain = (realVal * realVal) + (imagVal * imagVal); + switch (type) { case SHOTNOISE: @@ -343,7 +335,7 @@ NevalSrcInstanceTemp(double* noise, double* lnNoise, CKTcircuit* ckt, int type, case THERMNOISE: *noise = gain * 4 * CONSTboltz * (ckt->CKTtemp + param2) /* param2 is the instance temperature difference */ - * param; /* param is the conductance of a resistor */ + * param; /* param is the conductance of a resistor */ *lnNoise = log(MAX(*noise, N_MINLOG)); break; From e8f1cd4c92acef592c96109dc2b474140ba1b6ae Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 14 Feb 2024 14:17:01 +0100 Subject: [PATCH 2/9] too soon return - break is correct --- src/spicelib/analysis/nevalsrc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spicelib/analysis/nevalsrc.c b/src/spicelib/analysis/nevalsrc.c index 3fde1c447..6c4436b84 100644 --- a/src/spicelib/analysis/nevalsrc.c +++ b/src/spicelib/analysis/nevalsrc.c @@ -288,7 +288,7 @@ NevalSrcInstanceTemp(double* noise, double* lnNoise, CKTcircuit* ckt, int type, case N_GAIN: inoise = 0.0; *noise = cmodu(csubco(ckt->CKTadjointRHS->d[0][node1], ckt->CKTadjointRHS->d[0][node2])); - return; + break; } From 20c82a5b1bf7ff545a91f364cb347e341e0e7901 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 14 Feb 2024 17:50:41 +0100 Subject: [PATCH 3/9] format --- src/spicelib/devices/bjt/bjtnoise.c | 277 ++++++++++++++-------------- src/spicelib/devices/dio/dionoise.c | 248 +++++++++++++------------ src/spicelib/devices/jfet/jfetnoi.c | 138 +++++++------- src/spicelib/devices/res/resnoise.c | 180 +++++++++--------- 4 files changed, 423 insertions(+), 420 deletions(-) diff --git a/src/spicelib/devices/bjt/bjtnoise.c b/src/spicelib/devices/bjt/bjtnoise.c index 556e24284..6e7258491 100644 --- a/src/spicelib/devices/bjt/bjtnoise.c +++ b/src/spicelib/devices/bjt/bjtnoise.c @@ -11,23 +11,22 @@ Author: 1987 Gary W. Ng #include "ngspice/suffix.h" /* - * BJTnoise (mode, operation, firstModel, ckt, data, OnDens) +*BJTnoise (mode, operation, firstModel, ckt, data, OnDens) * - * This routine names and evaluates all of the noise sources - * associated with BJT's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the BJT's is summed with the variable "OnDens". +* This routine names and evaluates all of the noise sources +* associated with BJT's. It starts with the model *firstModel and +* traverses all of its insts. It then proceeds to any other models +* on the linked list. The total output noise density generated by +* all of the BJT's is summed with the variable "OnDens". */ - int -BJTnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) +BJTnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; + NOISEAN *job = (NOISEAN*) ckt->CKTcurJob; - BJTmodel *firstModel = (BJTmodel *) genmodel; + BJTmodel *firstModel = (BJTmodel*) genmodel; BJTmodel *model; BJTinstance *inst; double tempOnoise; @@ -39,159 +38,159 @@ BJTnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, /* define the names of the noise sources */ static char *BJTnNames[BJTNSRCS] = { - /* Note that we have to keep the order consistent with the - strchr definitions in BJTdefs.h */ - "_rc", /* noise due to rc */ - "_rb", /* noise due to rb */ - "_re", /* noise due to re */ - "_ic", /* noise due to ic */ - "_ib", /* noise due to ib */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ + /* Note that we have to keep the order consistent with the + strchr definitions in BJTdefs.h */ + "_rc", /* noise due to rc */ + "_rb", /* noise due to rb */ + "_re", /* noise due to re */ + "_ic", /* noise due to ic */ + "_ib", /* noise due to ib */ + "_1overf", /* flicker (1/f) noise */ + "" /* total transistor noise */ }; -for (model=firstModel; model != NULL; model=BJTnextModel(model)) { - for (inst=BJTinstances(model); inst != NULL; - inst=BJTnextInstance(inst)) { + for (model = firstModel; model != NULL; model = BJTnextModel(model)) { + for (inst = BJTinstances(model); inst != NULL; inst = BJTnextInstance(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 < BJTNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->BJTname, BJTnNames[i]); - } - break; + case N_DENS: + for (i = 0; i < BJTNSRCS; i++) { + NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->BJTname, BJTnNames[i]); + } + break; - case INT_NOIZ: - for (i=0; i < BJTNSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->BJTname, BJTnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->BJTname, BJTnNames[i]); - } - break; - } - } - break; + case INT_NOIZ: + for (i = 0; i < BJTNSRCS; i++) { + NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->BJTname, BJTnNames[i]); + NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->BJTname, BJTnNames[i]); + } + break; + } + } + break; - case N_CALC: - switch (mode) { + case N_CALC: + switch (mode) { - case N_DENS: - NevalSrc(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ], - ckt,THERMNOISE,inst->BJTcollCXNode,inst->BJTcolNode, - inst->BJTtcollectorConduct * inst->BJTm); + case N_DENS: + NevalSrc(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ], + ckt, THERMNOISE, inst->BJTcollCXNode, inst->BJTcolNode, + inst->BJTtcollectorConduct * inst->BJTm); - NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ], - ckt,THERMNOISE,inst->BJTbasePrimeNode,inst->BJTbaseNode, - *(ckt->CKTstate0 + inst->BJTgx) * inst->BJTm); + NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ], + ckt, THERMNOISE, inst->BJTbasePrimeNode, inst->BJTbaseNode, + *(ckt->CKTstate0 + inst->BJTgx) * inst->BJTm); - NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE], - ckt,THERMNOISE,inst->BJTemitPrimeNode,inst->BJTemitNode, - inst->BJTtemitterConduct * inst-> BJTm); + NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE], + ckt, THERMNOISE, inst->BJTemitPrimeNode, inst->BJTemitNode, + inst->BJTtemitterConduct * inst->BJTm); - NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ], - ckt,SHOTNOISE,inst->BJTcolPrimeNode, inst->BJTemitPrimeNode, - *(ckt->CKTstate0 + inst->BJTcc) * inst->BJTm); + NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ], + ckt, SHOTNOISE, inst->BJTcolPrimeNode, inst->BJTemitPrimeNode, + *(ckt->CKTstate0 + inst->BJTcc) * inst->BJTm); - NevalSrc(&noizDens[BJTIBNOIZ],&lnNdens[BJTIBNOIZ], - ckt,SHOTNOISE,inst->BJTbasePrimeNode, inst->BJTemitPrimeNode, - *(ckt->CKTstate0 + inst->BJTcb) * inst->BJTm); + NevalSrc(&noizDens[BJTIBNOIZ],&lnNdens[BJTIBNOIZ], + ckt, SHOTNOISE, inst->BJTbasePrimeNode, inst->BJTemitPrimeNode, + *(ckt->CKTstate0 + inst->BJTcb) * inst->BJTm); - NevalSrc(&noizDens[BJTFLNOIZ], NULL, ckt, - N_GAIN,inst->BJTbasePrimeNode, inst->BJTemitPrimeNode, - (double)0.0); - noizDens[BJTFLNOIZ] *= inst->BJTm * model->BJTfNcoef * - exp(model->BJTfNexp * - log(MAX(fabs(*(ckt->CKTstate0 + inst->BJTcb)),N_MINLOG))) / - data->freq; - lnNdens[BJTFLNOIZ] = - log(MAX(noizDens[BJTFLNOIZ],N_MINLOG)); + NevalSrc(&noizDens[BJTFLNOIZ], NULL, ckt, + N_GAIN, inst->BJTbasePrimeNode, inst->BJTemitPrimeNode, + (double) 0.0); + noizDens[BJTFLNOIZ] *= inst->BJTm * model->BJTfNcoef * + exp(model->BJTfNexp * + log(MAX(fabs(*(ckt->CKTstate0 + inst->BJTcb)), N_MINLOG))) / + data->freq; + lnNdens[BJTFLNOIZ] = + log(MAX(noizDens[BJTFLNOIZ], N_MINLOG)); - noizDens[BJTTOTNOIZ] = noizDens[BJTRCNOIZ] + - noizDens[BJTRBNOIZ] + - noizDens[BJT_RE_NOISE] + - noizDens[BJTICNOIZ] + - noizDens[BJTIBNOIZ] + - noizDens[BJTFLNOIZ]; - lnNdens[BJTTOTNOIZ] = - log(noizDens[BJTTOTNOIZ]); + noizDens[BJTTOTNOIZ] = noizDens[BJTRCNOIZ] + + noizDens[BJTRBNOIZ] + + noizDens[BJT_RE_NOISE] + + noizDens[BJTICNOIZ] + + noizDens[BJTIBNOIZ] + + noizDens[BJTFLNOIZ]; + lnNdens[BJTTOTNOIZ] = + log(noizDens[BJTTOTNOIZ]); - *OnDens += noizDens[BJTTOTNOIZ]; + *OnDens += noizDens[BJTTOTNOIZ]; - 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 < BJTNSRCS; i++) { - inst->BJTnVar[LNLSTDENS][i] = lnNdens[i]; - } + for (i = 0; i < BJTNSRCS; i++) { + inst->BJTnVar[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 < BJTNSRCS; i++) { - inst->BJTnVar[OUTNOIZ][i] = 0.0; - inst->BJTnVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ + if (data->freq == job->NstartFreq) { + for (i = 0; i < BJTNSRCS; i++) { + inst->BJTnVar[OUTNOIZ][i] = 0.0; + inst->BJTnVar[INNOIZ][i] = 0.0; + } + } + } else { + /* data->delFreq != 0.0 (we have to integrate) */ -/* In order to get the best curve fit, we have to integrate each component separately */ + /* In order to get the best curve fit, we have to integrate each component separately */ - for (i=0; i < BJTNSRCS; i++) { - if (i != BJTTOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->BJTnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->BJTnVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->BJTnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->BJTnVar[OUTNOIZ][i] += tempOnoise; - inst->BJTnVar[OUTNOIZ][BJTTOTNOIZ] += tempOnoise; - inst->BJTnVar[INNOIZ][i] += tempInoise; - inst->BJTnVar[INNOIZ][BJTTOTNOIZ] += tempInoise; + for (i = 0; i < BJTNSRCS; i++) { + if (i != BJTTOTNOIZ) { + tempOnoise = Nintegrate(noizDens[i], lnNdens[i], + inst->BJTnVar[LNLSTDENS][i], data); + tempInoise = Nintegrate(noizDens[i] * data->GainSqInv, + lnNdens[i] + data->lnGainInv, + inst->BJTnVar[LNLSTDENS][i] + data->lnGainInv, + data); + inst->BJTnVar[LNLSTDENS][i] = lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (job->NStpsSm != 0) { + inst->BJTnVar[OUTNOIZ][i] += tempOnoise; + inst->BJTnVar[OUTNOIZ][BJTTOTNOIZ] += tempOnoise; + inst->BJTnVar[INNOIZ][i] += tempInoise; + inst->BJTnVar[INNOIZ][BJTTOTNOIZ] += tempInoise; } - } - } - } - if (data->prtSummary) { - for (i=0; i < BJTNSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; + } + } + } + if (data->prtSummary) { + for (i = 0; i < BJTNSRCS; 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 < BJTNSRCS; i++) { - data->outpVector[data->outNumber++] = inst->BJTnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->BJTnVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; + case INT_NOIZ: + /* already calculated, just output */ + if (job->NStpsSm != 0) { + for (i = 0; i < BJTNSRCS; i++) { + data->outpVector[data->outNumber++] = inst->BJTnVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] = inst->BJTnVar[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 */ -} /* for model */ - -return(OK); -} - + case N_CLOSE: + return (OK); /* do nothing, the main calling routine will close */ + break; /* the plots */ + } /* switch (operation) */ + } /* for inst */ + } /* for model */ + return (OK); +} \ No newline at end of file diff --git a/src/spicelib/devices/dio/dionoise.c b/src/spicelib/devices/dio/dionoise.c index dcdadc4e3..1331977ab 100644 --- a/src/spicelib/devices/dio/dionoise.c +++ b/src/spicelib/devices/dio/dionoise.c @@ -12,23 +12,22 @@ Modified by Dietmar Warning 2003 #include "ngspice/suffix.h" /* - * DIOnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with diodes. It starts with the model *firstModel and - * traverses all of its instancess. It then proceeds to any other - * models on the linked list. The total output noise density - * generated by all of the diodes is summed with the variable - * "OnDens". +*DIOnoise (mode, operation, firstModel, ckt, data, OnDens) +* This routine names and evaluates all of the noise sources +* associated with diodes. It starts with the model *firstModel and +* traverses all of its instancess. It then proceeds to any other +* models on the linked list. The total output noise density +* generated by all of the diodes is summed with the variable +* "OnDens". */ - int -DIOnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) +DIOnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; + NOISEAN *job = (NOISEAN*) ckt->CKTcurJob; - DIOmodel *firstModel = (DIOmodel *) genmodel; + DIOmodel *firstModel = (DIOmodel*) genmodel; DIOmodel *model; DIOinstance *inst; double tempOnoise; @@ -39,138 +38,141 @@ DIOnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, /* define the names of the noise sources */ - static char *DIOnNames[DIONSRCS] = { /* Note that we have to keep the order */ - "_rs", /* noise due to rs */ /* consistent with thestrchr definitions */ - "_id", /* noise due to id */ /* in DIOdefs.h */ - "_1overf", /* flicker (1/f) noise */ - "" /* total diode noise */ + static char *DIOnNames[DIONSRCS] = { + /* Note that we have to keep the order + consistent with thestrchr definitions in DIOdefs.h */ + "_rs", /* noise due to rs */ + "_id", /* noise due to id */ + "_1overf", /* flicker (1/f) noise */ + "" /* total diode noise */ }; - for (model=firstModel; model != NULL; model=DIOnextModel(model)) { - for (inst=DIOinstances(model); inst != NULL; inst=DIOnextInstance(inst)) { + for (model = firstModel; model != NULL; model = DIOnextModel(model)) { + for (inst = DIOinstances(model); inst != NULL; inst = DIOnextInstance(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 < DIONSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->DIOname, DIOnNames[i]); - } - break; + case N_DENS: + for (i = 0; i < DIONSRCS; i++) { + NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->DIOname, DIOnNames[i]); + } + break; - case INT_NOIZ: - for (i=0; i < DIONSRCS; i++) { - NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->DIOname, DIOnNames[i]); - NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->DIOname, DIOnNames[i]); - } - break; - } - } - break; + case INT_NOIZ: + for (i = 0; i < DIONSRCS; i++) { + NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->DIOname, DIOnNames[i]); + NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->DIOname, DIOnNames[i]); + } + break; + } + } + break; - case N_CALC: - switch (mode) { + case N_CALC: + switch (mode) { - case N_DENS: - NevalSrc(&noizDens[DIORSNOIZ],&lnNdens[DIORSNOIZ], - ckt,THERMNOISE,inst->DIOposPrimeNode,inst->DIOposNode, - inst->DIOtConductance * inst->DIOarea * inst->DIOm); - NevalSrc(&noizDens[DIOIDNOIZ],&lnNdens[DIOIDNOIZ], - ckt,SHOTNOISE,inst->DIOposPrimeNode, inst->DIOnegNode, - *(ckt->CKTstate0 + inst->DIOcurrent)); + case N_DENS: + NevalSrc(&noizDens[DIORSNOIZ],&lnNdens[DIORSNOIZ], + ckt, THERMNOISE, inst->DIOposPrimeNode, inst->DIOposNode, + inst->DIOtConductance * inst->DIOarea * inst->DIOm); + NevalSrc(&noizDens[DIOIDNOIZ],&lnNdens[DIOIDNOIZ], + ckt, SHOTNOISE, inst->DIOposPrimeNode, inst->DIOnegNode, + *(ckt->CKTstate0 + inst->DIOcurrent)); - NevalSrc(&noizDens[DIOFLNOIZ], NULL, ckt, - N_GAIN,inst->DIOposPrimeNode, inst->DIOnegNode, - (double)0.0); - noizDens[DIOFLNOIZ] *= model->DIOfNcoef * - exp(model->DIOfNexp * - log(MAX(fabs(*(ckt->CKTstate0 + inst->DIOcurrent)/inst->DIOm),N_MINLOG))) / - data->freq * inst->DIOm; - lnNdens[DIOFLNOIZ] = - log(MAX(noizDens[DIOFLNOIZ],N_MINLOG)); + NevalSrc(&noizDens[DIOFLNOIZ], NULL, ckt, + N_GAIN, inst->DIOposPrimeNode, inst->DIOnegNode, + (double) 0.0); + noizDens[DIOFLNOIZ] *= model->DIOfNcoef * + exp(model->DIOfNexp * + log(MAX(fabs(*(ckt->CKTstate0 + inst->DIOcurrent) / inst->DIOm), N_MINLOG))) / + data->freq * inst->DIOm; + lnNdens[DIOFLNOIZ] = + log(MAX(noizDens[DIOFLNOIZ], N_MINLOG)); - noizDens[DIOTOTNOIZ] = noizDens[DIORSNOIZ] + - noizDens[DIOIDNOIZ] + - noizDens[DIOFLNOIZ]; - lnNdens[DIOTOTNOIZ] = - log(MAX(noizDens[DIOTOTNOIZ], N_MINLOG)); + noizDens[DIOTOTNOIZ] = noizDens[DIORSNOIZ] + + noizDens[DIOIDNOIZ] + + noizDens[DIOFLNOIZ]; + lnNdens[DIOTOTNOIZ] = + log(MAX(noizDens[DIOTOTNOIZ], N_MINLOG)); - *OnDens += noizDens[DIOTOTNOIZ]; + *OnDens += noizDens[DIOTOTNOIZ]; - 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 < DIONSRCS; i++) { - inst->DIOnVar[LNLSTDENS][i] = lnNdens[i]; - } + for (i = 0; i < DIONSRCS; i++) { + inst->DIOnVar[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 < DIONSRCS; i++) { - inst->DIOnVar[OUTNOIZ][i] = 0.0; - inst->DIOnVar[INNOIZ][i] = 0.0; - } - } - } else { /* data->delFreq != 0.0 (we have to integrate) */ + if (data->freq == job->NstartFreq) { + for (i = 0; i < DIONSRCS; i++) { + inst->DIOnVar[OUTNOIZ][i] = 0.0; + inst->DIOnVar[INNOIZ][i] = 0.0; + } + } + } else { + /* data->delFreq != 0.0 (we have to integrate) */ -/* To insure accurracy, we have to integrate each component separately */ + /* To insure accurracy, we have to integrate each component separately */ - for (i=0; i < DIONSRCS; i++) { - if (i != DIOTOTNOIZ) { - tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->DIOnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->DIOnVar[LNLSTDENS][i] + data->lnGainInv, - data); - inst->DIOnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOnoise; - data->inNoise += tempInoise; - if (job->NStpsSm != 0) { - inst->DIOnVar[OUTNOIZ][i] += tempOnoise; - inst->DIOnVar[OUTNOIZ][DIOTOTNOIZ] += tempOnoise; - inst->DIOnVar[INNOIZ][i] += tempInoise; - inst->DIOnVar[INNOIZ][DIOTOTNOIZ] += tempInoise; + for (i = 0; i < DIONSRCS; i++) { + if (i != DIOTOTNOIZ) { + tempOnoise = Nintegrate(noizDens[i], lnNdens[i], + inst->DIOnVar[LNLSTDENS][i], data); + tempInoise = Nintegrate(noizDens[i] * data->GainSqInv, + lnNdens[i] + data->lnGainInv, + inst->DIOnVar[LNLSTDENS][i] + data->lnGainInv, + data); + inst->DIOnVar[LNLSTDENS][i] = lnNdens[i]; + data->outNoiz += tempOnoise; + data->inNoise += tempInoise; + if (job->NStpsSm != 0) { + inst->DIOnVar[OUTNOIZ][i] += tempOnoise; + inst->DIOnVar[OUTNOIZ][DIOTOTNOIZ] += tempOnoise; + inst->DIOnVar[INNOIZ][i] += tempInoise; + inst->DIOnVar[INNOIZ][DIOTOTNOIZ] += tempInoise; } - } - } - } - if (data->prtSummary) { - for (i=0; i < DIONSRCS; i++) { /* print a summary report */ - data->outpVector[data->outNumber++] = noizDens[i]; - } - } - break; + } + } + } + if (data->prtSummary) { + for (i = 0; i < DIONSRCS; 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 < DIONSRCS; i++) { - data->outpVector[data->outNumber++] = inst->DIOnVar[OUTNOIZ][i]; - data->outpVector[data->outNumber++] = inst->DIOnVar[INNOIZ][i]; - } - } /* if */ - break; - } /* switch (mode) */ - break; + case INT_NOIZ: + /* already calculated, just output */ + if (job->NStpsSm != 0) { + for (i = 0; i < DIONSRCS; i++) { + data->outpVector[data->outNumber++] = inst->DIOnVar[OUTNOIZ][i]; + data->outpVector[data->outNumber++] = inst->DIOnVar[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 */ - } /* for model */ - -return(OK); -} - + case N_CLOSE: + return (OK); /* do nothing, the main calling routine will close */ + break; /* the plots */ + } /* switch (operation) */ + } /* for inst */ + } /* for model */ + return (OK); +} \ No newline at end of file diff --git a/src/spicelib/devices/jfet/jfetnoi.c b/src/spicelib/devices/jfet/jfetnoi.c index 5b70f97e5..d36d66e98 100644 --- a/src/spicelib/devices/jfet/jfetnoi.c +++ b/src/spicelib/devices/jfet/jfetnoi.c @@ -11,22 +11,21 @@ Author: 1987 Gary W. Ng #include "ngspice/suffix.h" /* - * JFETnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with JFET's. It starts with the model *firstModel and - * traverses all of its insts. It then proceeds to any other models - * on the linked list. The total output noise density generated by - * all of the JFET's is summed with the variable "OnDens". +*JFETnoise (mode, operation, firstModel, ckt, data, OnDens) +* This routine names and evaluates all of the noise sources +* associated with JFET's. It starts with the model *firstModel and +* traverses all of its insts. It then proceeds to any other models +* on the linked list. The total output noise density generated by +* all of the JFET's is summed with the variable "OnDens". */ - int -JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, - double *OnDens) +JFETnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, + double *OnDens) { - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; + NOISEAN *job = (NOISEAN*) ckt->CKTcurJob; - JFETmodel *firstModel = (JFETmodel *) genmodel; + JFETmodel *firstModel = (JFETmodel*) genmodel; JFETmodel *model; JFETinstance *inst; double tempOnoise; @@ -38,16 +37,18 @@ JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * /* define the names of the noise sources */ - static char *JFETnNames[JFETNSRCS] = { /* Note that we have to keep the order */ - "_rd", /* noise due to rd */ /* consistent with thestrchr definitions */ - "_rs", /* noise due to rs */ /* in JFETdefs.h */ - "_id", /* noise due to id */ - "_1overf", /* flicker (1/f) noise */ - "" /* total transistor noise */ + static char *JFETnNames[JFETNSRCS] = { + /* Note that we have to keep the order + consistent with the strchr definitions in JFETdefs.h */ + "_rd", /* noise due to rd */ + "_rs", /* noise due to rs */ + "_id", /* noise due to id */ + "_1overf", /* flicker (1/f) noise */ + "" /* total transistor noise */ }; - for (model=firstModel; model != NULL; model=JFETnextModel(model)) { - for (inst=JFETinstances(model); inst != NULL; inst=JFETnextInstance(inst)) { + for (model = firstModel; model != NULL; model = JFETnextModel(model)) { + for (inst = JFETinstances(model); inst != NULL; inst = JFETnextInstance(inst)) { switch (operation) { @@ -60,13 +61,13 @@ JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * switch (mode) { case N_DENS: - for (i=0; i < JFETNSRCS; i++) { + for (i = 0; i < JFETNSRCS; i++) { NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->JFETname, JFETnNames[i]); } break; case INT_NOIZ: - for (i=0; i < JFETNSRCS; i++) { + for (i = 0; i < JFETNSRCS; i++) { NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->JFETname, JFETnNames[i]); NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->JFETname, JFETnNames[i]); } @@ -80,80 +81,81 @@ JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * case N_DENS: NevalSrc(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ], - ckt,THERMNOISE,inst->JFETdrainPrimeNode,inst->JFETdrainNode, - model->JFETdrainConduct * inst->JFETarea * inst->JFETm); + ckt, THERMNOISE, inst->JFETdrainPrimeNode, inst->JFETdrainNode, + model->JFETdrainConduct * inst->JFETarea * inst->JFETm); NevalSrc(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ], - ckt,THERMNOISE,inst->JFETsourcePrimeNode, - inst->JFETsourceNode,model->JFETsourceConduct - * inst->JFETarea * inst->JFETm); + ckt, THERMNOISE, inst->JFETsourcePrimeNode, + inst->JFETsourceNode, model->JFETsourceConduct * + inst->JFETarea * inst->JFETm); if (model->JFETnlev < 3) { NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], - ckt,THERMNOISE,inst->JFETdrainPrimeNode, - inst->JFETsourcePrimeNode, - (2.0/3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); + ckt, THERMNOISE, inst->JFETdrainPrimeNode, + inst->JFETsourcePrimeNode, + (2.0 / 3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); } else { vgs = *(ckt->CKTstate0 + inst->JFETvgs); vds = vgs - *(ckt->CKTstate0 + inst->JFETvgd); vgst = vgs - inst->JFETtThreshold; if (vgst >= vds) - alpha = 1 - vds/vgst; /* linear region */ + alpha = 1 - vds / vgst; /* linear region */ else - alpha = 0; /* saturation region */ + alpha = 0; /* saturation region */ beta = inst->JFETtBeta * inst->JFETarea * inst->JFETm; NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], - ckt,THERMNOISE,inst->JFETdrainPrimeNode, - inst->JFETsourcePrimeNode, - (2.0/3.0 * beta*vgst*(1+alpha+alpha*alpha)/(1+alpha)*model->JFETgdsnoi)); + ckt, THERMNOISE, inst->JFETdrainPrimeNode, + inst->JFETsourcePrimeNode, + (2.0 / 3.0*beta*vgst*(1 + alpha + alpha*alpha) / (1 + alpha) * model->JFETgdsnoi)); } NevalSrc(&noizDens[JFETFLNOIZ], NULL, ckt, - N_GAIN,inst->JFETdrainPrimeNode, - inst->JFETsourcePrimeNode, (double)0.0); - noizDens[JFETFLNOIZ] *= inst->JFETm * model->JFETfNcoef * - exp(model->JFETfNexp * - log(MAX(fabs(*(ckt->CKTstate0 + inst->JFETcd)),N_MINLOG))) / - data->freq; + N_GAIN, inst->JFETdrainPrimeNode, + inst->JFETsourcePrimeNode, (double) 0.0); + noizDens[JFETFLNOIZ] *= inst->JFETm*model->JFETfNcoef * + exp(model->JFETfNexp * + log(MAX(fabs(*(ckt->CKTstate0 + inst->JFETcd)), N_MINLOG))) / + data->freq; lnNdens[JFETFLNOIZ] = - log(MAX(noizDens[JFETFLNOIZ],N_MINLOG)); + log(MAX(noizDens[JFETFLNOIZ], N_MINLOG)); noizDens[JFETTOTNOIZ] = noizDens[JFETRDNOIZ] + - noizDens[JFETRSNOIZ] + - noizDens[JFETIDNOIZ] + - noizDens[JFETFLNOIZ]; + noizDens[JFETRSNOIZ] + + noizDens[JFETIDNOIZ] + + noizDens[JFETFLNOIZ]; lnNdens[JFETTOTNOIZ] = - log(MAX(noizDens[JFETTOTNOIZ], N_MINLOG)); + log(MAX(noizDens[JFETTOTNOIZ], N_MINLOG)); - *OnDens += noizDens[JFETTOTNOIZ]; + *OnDens += noizDens[JFETTOTNOIZ]; if (data->delFreq == 0.0) { /* if we haven't done any previous integration, we need to */ /* initialize our "history" variables */ - for (i=0; i < JFETNSRCS; i++) { + for (i = 0; i < JFETNSRCS; i++) { inst->JFETnVar[LNLSTDENS][i] = lnNdens[i]; } /* clear out our integration variables if it's the first pass */ if (data->freq == job->NstartFreq) { - for (i=0; i < JFETNSRCS; i++) { + for (i = 0; i < JFETNSRCS; i++) { inst->JFETnVar[OUTNOIZ][i] = 0.0; inst->JFETnVar[INNOIZ][i] = 0.0; } } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - for (i=0; i < JFETNSRCS; i++) { + } else { + /* data->delFreq != 0.0 (we have to integrate) */ + for (i = 0; i < JFETNSRCS; i++) { if (i != JFETTOTNOIZ) { tempOnoise = Nintegrate(noizDens[i], lnNdens[i], - inst->JFETnVar[LNLSTDENS][i], data); - tempInoise = Nintegrate(noizDens[i] * data->GainSqInv , - lnNdens[i] + data->lnGainInv, - inst->JFETnVar[LNLSTDENS][i] + data->lnGainInv, - data); + inst->JFETnVar[LNLSTDENS][i], data); + tempInoise = Nintegrate(noizDens[i] * data->GainSqInv, + lnNdens[i] + data->lnGainInv, + inst->JFETnVar[LNLSTDENS][i] + data->lnGainInv, + data); inst->JFETnVar[LNLSTDENS][i] = lnNdens[i]; data->outNoiz += tempOnoise; data->inNoise += tempInoise; @@ -167,29 +169,31 @@ JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * } } if (data->prtSummary) { - for (i=0; i < JFETNSRCS; i++) { /* print a summary report */ + for (i = 0; i < JFETNSRCS; i++) { + /* print a summary report */ data->outpVector[data->outNumber++] = noizDens[i]; } } break; - case INT_NOIZ: /* already calculated, just output */ + case INT_NOIZ: + /* already calculated, just output */ if (job->NStpsSm != 0) { - for (i=0; i < JFETNSRCS; i++) { + for (i = 0; i < JFETNSRCS; i++) { data->outpVector[data->outNumber++] = inst->JFETnVar[OUTNOIZ][i]; data->outpVector[data->outNumber++] = inst->JFETnVar[INNOIZ][i]; } - } /* if */ + } /* if */ break; - } /* switch (mode) */ + } /* switch (mode) */ break; case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ + return (OK); /* do nothing, the main calling routine will close */ + break; /* the plots */ + } /* switch (operation) */ + } /* for inst */ + } /* for model */ - return(OK); -} + return (OK); +} \ No newline at end of file diff --git a/src/spicelib/devices/res/resnoise.c b/src/spicelib/devices/res/resnoise.c index a27faf460..491fde3b1 100644 --- a/src/spicelib/devices/res/resnoise.c +++ b/src/spicelib/devices/res/resnoise.c @@ -11,28 +11,27 @@ Modified: Apr 2000 - Paolo Nenzi #include "ngspice/noisedef.h" /* - * RESnoise (mode, operation, firstModel, ckt, data, OnDens) - * This routine names and evaluates all of the noise sources - * associated with resistors. It starts with the model *firstModel - * and traverses all of its instances. It then proceeds to any other - * models on the linked list. The total output noise density - * generated by all the resistors is summed in the variable "OnDens". +*RESnoise (mode, operation, firstModel, ckt, data, OnDens) +* This routine names and evaluates all of the noise sources +* associated with resistors. It starts with the model *firstModel +* and traverses all of its instances. It then proceeds to any other +* models on the linked list. The total output noise density +* generated by all the resistors is summed in the variable "OnDens". * - * Paolo Nenzi 2003: - * Added flicker noise (Kf-Af) calculation to simulate - * carbon resistors. +*Paolo Nenzi 2003: +* Added flicker noise (Kf-Af) calculation to simulate +* carbon resistors. * - * Added "noisy" switch to simulate noiseless resistors. +* Added "noisy" switch to simulate noiseless resistors. */ - int -RESnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, - Ndata *data, double *OnDens) +RESnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, + Ndata *data, double *OnDens) { - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; + NOISEAN *job = (NOISEAN*) ckt->CKTcurJob; - RESmodel *firstModel = (RESmodel *) genmodel; + RESmodel *firstModel = (RESmodel*) genmodel; RESmodel *model; RESinstance *inst; double tempOutNoise; @@ -41,23 +40,21 @@ RESnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, double lnNdens[RESNSRCS]; int i; - /* define the names of the noise sources */ + /* define the names of the noise sources */ static char *RESnNames[RESNSRCS] = { /* Note that we have to keep the order consistent with the - * strchr definitions in RESdefs.h */ - "_thermal", /* Thermal noise */ - "_1overf", /* flicker (1/f) noise */ - "" /* total resistor noise */ + strchr definitions in RESdefs.h */ + "_thermal", /* Thermal noise */ + "_1overf", /* flicker (1/f) noise */ + "" /* total resistor noise */ }; - for (model = firstModel; model != NULL; model = RESnextModel(model)) { - for (inst = RESinstances(model); inst != NULL; - inst = RESnextInstance(inst)) { + for (inst = RESinstances(model); inst != NULL; inst = RESnextInstance(inst)) { + + if (!inst->RESnoisy) continue; /* Quiet resistors are skipped */ - if(!inst->RESnoisy) continue; /* Quiet resistors are skipped */ - switch (operation) { case N_OPEN: @@ -71,13 +68,13 @@ RESnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, switch (mode) { case N_DENS: - for (i=0; i < RESNSRCS; i++) { + for (i = 0; i < RESNSRCS; i++) { NOISE_ADD_OUTVAR(ckt, data, "onoise_%s%s", inst->RESname, RESnNames[i]); } break; case INT_NOIZ: - for (i=0; i < RESNSRCS; i++) { + for (i = 0; i < RESNSRCS; i++) { NOISE_ADD_OUTVAR(ckt, data, "onoise_total_%s%s", inst->RESname, RESnNames[i]); NOISE_ADD_OUTVAR(ckt, data, "inoise_total_%s%s", inst->RESname, RESnNames[i]); } @@ -90,99 +87,100 @@ RESnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, switch (mode) { case N_DENS: - - NevalSrcInstanceTemp(&noizDens[RESTHNOIZ],&lnNdens[RESTHNOIZ], - ckt,THERMNOISE, inst->RESposNode,inst->RESnegNode, - inst->RESconduct, inst->RESdtemp); - NevalSrcInstanceTemp(&noizDens[RESFLNOIZ], NULL, ckt, - N_GAIN,inst->RESposNode, inst->RESnegNode, - (double)0.0, (double)0.0); - -#if 0 - printf("DC current in resistor %s: %e\n",inst->RESname, inst->REScurrent); -#endif - - noizDens[RESFLNOIZ] *= inst->RESm * model->RESfNcoef * - pow(fabs(inst->REScurrent / inst->RESm), model->RESfNexp) - / (inst->RESeffNoiseArea * pow(data->freq, model->RESef)); - lnNdens[RESFLNOIZ] = log(MAX(noizDens[RESFLNOIZ],N_MINLOG)); + NevalSrcInstanceTemp(&noizDens[RESTHNOIZ],&lnNdens[RESTHNOIZ], + ckt, THERMNOISE, inst->RESposNode, inst->RESnegNode, + inst->RESconduct, inst->RESdtemp); - noizDens[RESTOTNOIZ] = noizDens[RESTHNOIZ] + noizDens[RESFLNOIZ]; - lnNdens[RESTOTNOIZ] = log(noizDens[RESTOTNOIZ]); + NevalSrcInstanceTemp(&noizDens[RESFLNOIZ], NULL, ckt, + N_GAIN, inst->RESposNode, inst->RESnegNode, + (double) 0.0, (double) 0.0); - *OnDens += noizDens[RESTOTNOIZ]; + #if 0 + printf("DC current in resistor %s: %e\n", inst->RESname, inst->REScurrent); + #endif - if (data->delFreq == 0.0) { + noizDens[RESFLNOIZ] *= inst->RESm * model->RESfNcoef * + pow(fabs(inst->REScurrent / inst->RESm), model->RESfNexp) / + (inst->RESeffNoiseArea * pow(data->freq, model->RESef)); + lnNdens[RESFLNOIZ] = log(MAX(noizDens[RESFLNOIZ], N_MINLOG)); + + noizDens[RESTOTNOIZ] = noizDens[RESTHNOIZ] + noizDens[RESFLNOIZ]; + lnNdens[RESTOTNOIZ] = log(noizDens[RESTOTNOIZ]); + + *OnDens += noizDens[RESTOTNOIZ]; + + if (data->delFreq == 0.0) { /* if we haven't done any previous integration, we need to */ /* initialize our "history" variables */ - for (i=0; i < RESNSRCS; i++) { - inst->RESnVar[LNLSTDENS][i] = lnNdens[i]; + for (i = 0; i < RESNSRCS; i++) { + inst->RESnVar[LNLSTDENS][i] = lnNdens[i]; } - + /* clear out our integration variable if it's the first pass */ if (data->freq == job->NstartFreq) { - for (i=0; i < RESNSRCS; i++) { - inst->RESnVar[OUTNOIZ][i] = 0.0; /* Clear output noise */ - inst->RESnVar[INNOIZ][i] = 0.0; /* Clear input noise */ + for (i = 0; i < RESNSRCS; i++) { + inst->RESnVar[OUTNOIZ][i] = 0.0; /* Clear output noise */ + inst->RESnVar[INNOIZ][i] = 0.0; /* Clear input noise */ } } - } else { /* data->delFreq != 0.0 (we have to integrate) */ - -/* In order to get the best curve fit, we have to integrate each component separately */ + } else { + /* data->delFreq != 0.0 (we have to integrate) */ - for (i = 0; i < RESNSRCS; i++) { - if (i != RESTOTNOIZ) { - tempOutNoise = Nintegrate(noizDens[i], lnNdens[i], - inst->RESnVar[LNLSTDENS][i], data); - tempInNoise = Nintegrate(noizDens[i] * - data->GainSqInv ,lnNdens[i] - + data->lnGainInv, - inst->RESnVar[LNLSTDENS][i] - + data->lnGainInv, - data); - inst->RESnVar[LNLSTDENS][i] = lnNdens[i]; - data->outNoiz += tempOutNoise; - data->inNoise += tempInNoise; - if (job->NStpsSm != 0) { - inst->RESnVar[OUTNOIZ][i] += tempOutNoise; - inst->RESnVar[OUTNOIZ][RESTOTNOIZ] += tempOutNoise; - inst->RESnVar[INNOIZ][i] += tempInNoise; - inst->RESnVar[INNOIZ][RESTOTNOIZ] += tempInNoise; + /* In order to get the best curve fit, we have to integrate each component separately */ + + for (i = 0; i < RESNSRCS; i++) { + if (i != RESTOTNOIZ) { + tempOutNoise = Nintegrate(noizDens[i], lnNdens[i], + inst->RESnVar[LNLSTDENS][i], data); + tempInNoise = Nintegrate(noizDens[i] * + data->GainSqInv, lnNdens[i] + + data->lnGainInv, + inst->RESnVar[LNLSTDENS][i] + + data->lnGainInv, + data); + inst->RESnVar[LNLSTDENS][i] = lnNdens[i]; + data->outNoiz += tempOutNoise; + data->inNoise += tempInNoise; + if (job->NStpsSm != 0) { + inst->RESnVar[OUTNOIZ][i] += tempOutNoise; + inst->RESnVar[OUTNOIZ][RESTOTNOIZ] += tempOutNoise; + inst->RESnVar[INNOIZ][i] += tempInNoise; + inst->RESnVar[INNOIZ][RESTOTNOIZ] += tempInNoise; } + } } - } - - } + + } if (data->prtSummary) { - for (i=0; i < RESNSRCS; i++) { /* print a summary report */ + for (i = 0; i < RESNSRCS; i++) { + /* print a summary report */ data->outpVector[data->outNumber++] = noizDens[i]; } } break; - case INT_NOIZ: /* already calculated, just output */ + case INT_NOIZ: + /* already calculated, just output */ if (job->NStpsSm != 0) { - for (i=0; i < RESNSRCS; i++) { + for (i = 0; i < RESNSRCS; i++) { data->outpVector[data->outNumber++] = inst->RESnVar[OUTNOIZ][i]; data->outpVector[data->outNumber++] = inst->RESnVar[INNOIZ][i]; } - } /* if */ + } /* if */ break; - } /* switch (mode) */ + } /* switch (mode) */ break; case N_CLOSE: - return (OK); /* do nothing, the main calling routine will close */ - break; /* the plots */ - } /* switch (operation) */ - } /* for inst */ - } /* for model */ - -return(OK); -} - + return (OK); /* do nothing, the main calling routine will close */ + break; /* the plots */ + } /* switch (operation) */ + } /* for inst */ + } /* for model */ + return (OK); +} \ No newline at end of file From a1dbd3f3c8fab83f19e796fa84fa66cc2c68ace2 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 14 Feb 2024 18:16:50 +0100 Subject: [PATCH 4/9] bjt, dio, jfet, res: use device temperature for noise analysis too --- src/spicelib/devices/bjt/bjtnoise.c | 18 ++++++++++++------ src/spicelib/devices/dio/dionoise.c | 12 ++++++++++-- src/spicelib/devices/jfet/jfetnoi.c | 27 +++++++++++++++++---------- src/spicelib/devices/res/resnoise.c | 16 +++++++++++----- 4 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/spicelib/devices/bjt/bjtnoise.c b/src/spicelib/devices/bjt/bjtnoise.c index 6e7258491..e26cfa53f 100644 --- a/src/spicelib/devices/bjt/bjtnoise.c +++ b/src/spicelib/devices/bjt/bjtnoise.c @@ -82,17 +82,23 @@ BJTnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, switch (mode) { case N_DENS: - NevalSrc(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ], + double dtemp; + if (inst->BJTtempGiven) + dtemp = inst->BJTtemp - ckt->CKTtemp + (model->BJTtnom-CONSTCtoK); + else + dtemp = inst->BJTdtemp; + + NevalSrcInstanceTemp(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ], ckt, THERMNOISE, inst->BJTcollCXNode, inst->BJTcolNode, - inst->BJTtcollectorConduct * inst->BJTm); + inst->BJTtcollectorConduct * inst->BJTm, dtemp); - NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ], + NevalSrcInstanceTemp(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ], ckt, THERMNOISE, inst->BJTbasePrimeNode, inst->BJTbaseNode, - *(ckt->CKTstate0 + inst->BJTgx) * inst->BJTm); + *(ckt->CKTstate0 + inst->BJTgx) * inst->BJTm, dtemp); - NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE], + NevalSrcInstanceTemp(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE], ckt, THERMNOISE, inst->BJTemitPrimeNode, inst->BJTemitNode, - inst->BJTtemitterConduct * inst->BJTm); + inst->BJTtemitterConduct * inst->BJTm, dtemp); NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ], ckt, SHOTNOISE, inst->BJTcolPrimeNode, inst->BJTemitPrimeNode, diff --git a/src/spicelib/devices/dio/dionoise.c b/src/spicelib/devices/dio/dionoise.c index 1331977ab..ea893826d 100644 --- a/src/spicelib/devices/dio/dionoise.c +++ b/src/spicelib/devices/dio/dionoise.c @@ -80,9 +80,17 @@ DIOnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, switch (mode) { case N_DENS: - NevalSrc(&noizDens[DIORSNOIZ],&lnNdens[DIORSNOIZ], + + double dtemp; + if (inst->DIOtempGiven) + dtemp = inst->DIOtemp - ckt->CKTtemp + (model->DIOnomTemp-CONSTCtoK); + else + dtemp = inst->DIOdtemp; + + NevalSrcInstanceTemp(&noizDens[DIORSNOIZ],&lnNdens[DIORSNOIZ], ckt, THERMNOISE, inst->DIOposPrimeNode, inst->DIOposNode, - inst->DIOtConductance * inst->DIOarea * inst->DIOm); + inst->DIOtConductance * inst->DIOarea * inst->DIOm, dtemp); + NevalSrc(&noizDens[DIOIDNOIZ],&lnNdens[DIOIDNOIZ], ckt, SHOTNOISE, inst->DIOposPrimeNode, inst->DIOnegNode, *(ckt->CKTstate0 + inst->DIOcurrent)); diff --git a/src/spicelib/devices/jfet/jfetnoi.c b/src/spicelib/devices/jfet/jfetnoi.c index d36d66e98..b4194758c 100644 --- a/src/spicelib/devices/jfet/jfetnoi.c +++ b/src/spicelib/devices/jfet/jfetnoi.c @@ -80,20 +80,27 @@ JFETnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *d switch (mode) { case N_DENS: - NevalSrc(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ], - ckt, THERMNOISE, inst->JFETdrainPrimeNode, inst->JFETdrainNode, - model->JFETdrainConduct * inst->JFETarea * inst->JFETm); - NevalSrc(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ], + double dtemp; + if (inst->JFETtempGiven) + dtemp = inst->JFETtemp - ckt->CKTtemp + (model->JFETtnom-CONSTCtoK); + else + dtemp = inst->JFETdtemp; + + NevalSrcInstanceTemp(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ], + ckt, THERMNOISE, inst->JFETdrainPrimeNode, inst->JFETdrainNode, + model->JFETdrainConduct * inst->JFETarea * inst->JFETm, dtemp); + + NevalSrcInstanceTemp(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ], ckt, THERMNOISE, inst->JFETsourcePrimeNode, inst->JFETsourceNode, model->JFETsourceConduct * - inst->JFETarea * inst->JFETm); + inst->JFETarea * inst->JFETm, inst->JFETdtemp); if (model->JFETnlev < 3) { - NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], + NevalSrcInstanceTemp(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], ckt, THERMNOISE, inst->JFETdrainPrimeNode, inst->JFETsourcePrimeNode, - (2.0 / 3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); + (2.0 / 3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm))), inst->JFETdtemp); } else { vgs = *(ckt->CKTstate0 + inst->JFETvgs); vds = vgs - *(ckt->CKTstate0 + inst->JFETvgd); @@ -104,16 +111,16 @@ JFETnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *d alpha = 0; /* saturation region */ beta = inst->JFETtBeta * inst->JFETarea * inst->JFETm; - NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], + NevalSrcInstanceTemp(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], ckt, THERMNOISE, inst->JFETdrainPrimeNode, inst->JFETsourcePrimeNode, - (2.0 / 3.0*beta*vgst*(1 + alpha + alpha*alpha) / (1 + alpha) * model->JFETgdsnoi)); + (2.0 / 3.0*beta*vgst*(1 + alpha + alpha*alpha) / (1 + alpha) * model->JFETgdsnoi), inst->JFETdtemp); } NevalSrc(&noizDens[JFETFLNOIZ], NULL, ckt, N_GAIN, inst->JFETdrainPrimeNode, inst->JFETsourcePrimeNode, (double) 0.0); - noizDens[JFETFLNOIZ] *= inst->JFETm*model->JFETfNcoef * + noizDens[JFETFLNOIZ] *= inst->JFETm * model->JFETfNcoef * exp(model->JFETfNexp * log(MAX(fabs(*(ckt->CKTstate0 + inst->JFETcd)), N_MINLOG))) / data->freq; diff --git a/src/spicelib/devices/res/resnoise.c b/src/spicelib/devices/res/resnoise.c index 491fde3b1..459db4e26 100644 --- a/src/spicelib/devices/res/resnoise.c +++ b/src/spicelib/devices/res/resnoise.c @@ -88,17 +88,23 @@ RESnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, case N_DENS: + double dtemp; + if (inst->REStempGiven) + dtemp = inst->REStemp - ckt->CKTtemp + (model->REStnom-CONSTCtoK); + else + dtemp = inst->RESdtemp; + NevalSrcInstanceTemp(&noizDens[RESTHNOIZ],&lnNdens[RESTHNOIZ], ckt, THERMNOISE, inst->RESposNode, inst->RESnegNode, - inst->RESconduct, inst->RESdtemp); + inst->RESconduct, dtemp); - NevalSrcInstanceTemp(&noizDens[RESFLNOIZ], NULL, ckt, + NevalSrc(&noizDens[RESFLNOIZ], NULL, ckt, N_GAIN, inst->RESposNode, inst->RESnegNode, - (double) 0.0, (double) 0.0); + (double) 0.0); - #if 0 +#if 0 printf("DC current in resistor %s: %e\n", inst->RESname, inst->REScurrent); - #endif +#endif noizDens[RESFLNOIZ] *= inst->RESm * model->RESfNcoef * pow(fabs(inst->REScurrent / inst->RESm), model->RESfNexp) / From 305cd85c76ecee329f1658dfe66d7c58fae98537 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 15 Feb 2024 07:49:06 +0100 Subject: [PATCH 5/9] mos1...3: use device temperature for noise analysis too --- src/spicelib/devices/mos1/mos1noi.c | 20 +++++++++++++------- src/spicelib/devices/mos2/mos2noi.c | 20 +++++++++++++------- src/spicelib/devices/mos3/mos3noi.c | 20 +++++++++++++------- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/spicelib/devices/mos1/mos1noi.c b/src/spicelib/devices/mos1/mos1noi.c index 2c853c9a9..dcdfae69d 100644 --- a/src/spicelib/devices/mos1/mos1noi.c +++ b/src/spicelib/devices/mos1/mos1noi.c @@ -95,13 +95,19 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, switch (mode) { case N_DENS: - NevalSrc( & noizDens[MOS1RDNOIZ], & lnNdens[MOS1RDNOIZ], - ckt, THERMNOISE, inst->MOS1dNodePrime, inst->MOS1dNode, - inst->MOS1drainConductance); + double dtemp; + if (inst->MOS1tempGiven) + dtemp = inst->MOS1temp - ckt->CKTtemp + (model->MOS1tnom-CONSTCtoK); + else + dtemp = inst->MOS1dtemp; - NevalSrc( & noizDens[MOS1RSNOIZ], & lnNdens[MOS1RSNOIZ], + NevalSrcInstanceTemp( & noizDens[MOS1RDNOIZ], & lnNdens[MOS1RDNOIZ], + ckt, THERMNOISE, inst->MOS1dNodePrime, inst->MOS1dNode, + inst->MOS1drainConductance, dtemp); + + NevalSrcInstanceTemp( & noizDens[MOS1RSNOIZ], & lnNdens[MOS1RSNOIZ], ckt, THERMNOISE, inst->MOS1sNodePrime, inst->MOS1sNode, - inst->MOS1sourceConductance); + inst->MOS1sourceConductance, dtemp); if (model->MOS1nlev < 3) { @@ -127,9 +133,9 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS1gdsnoi; } - NevalSrc( & noizDens[MOS1IDNOIZ], & lnNdens[MOS1IDNOIZ], + NevalSrcInstanceTemp( & noizDens[MOS1IDNOIZ], & lnNdens[MOS1IDNOIZ], ckt, THERMNOISE, inst->MOS1dNodePrime, inst->MOS1sNodePrime, - Sid); + Sid, dtemp); NevalSrc( & noizDens[MOS1FLNOIZ], NULL, ckt, N_GAIN, inst->MOS1dNodePrime, inst->MOS1sNodePrime, diff --git a/src/spicelib/devices/mos2/mos2noi.c b/src/spicelib/devices/mos2/mos2noi.c index c3e942adf..85e969115 100644 --- a/src/spicelib/devices/mos2/mos2noi.c +++ b/src/spicelib/devices/mos2/mos2noi.c @@ -84,13 +84,19 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, switch (mode) { case N_DENS: - NevalSrc( & noizDens[MOS2RDNOIZ], & lnNdens[MOS2RDNOIZ], - ckt, THERMNOISE, inst->MOS2dNodePrime, inst->MOS2dNode, - inst->MOS2drainConductance); + double dtemp; + if (inst->MOS2tempGiven) + dtemp = inst->MOS2temp - ckt->CKTtemp + (model->MOS2tnom-CONSTCtoK); + else + dtemp = inst->MOS2dtemp; - NevalSrc( & noizDens[MOS2RSNOIZ], & lnNdens[MOS2RSNOIZ], + NevalSrcInstanceTemp( & noizDens[MOS2RDNOIZ], & lnNdens[MOS2RDNOIZ], + ckt, THERMNOISE, inst->MOS2dNodePrime, inst->MOS2dNode, + inst->MOS2drainConductance, dtemp); + + NevalSrcInstanceTemp( & noizDens[MOS2RSNOIZ], & lnNdens[MOS2RSNOIZ], ckt, THERMNOISE, inst->MOS2sNodePrime, inst->MOS2sNode, - inst->MOS2sourceConductance); + inst->MOS2sourceConductance, dtemp); if (model->MOS2nlev < 3) { @@ -116,9 +122,9 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS2gdsnoi; } - NevalSrc( & noizDens[MOS2IDNOIZ], & lnNdens[MOS2IDNOIZ], + NevalSrcInstanceTemp( & noizDens[MOS2IDNOIZ], & lnNdens[MOS2IDNOIZ], ckt, THERMNOISE, inst->MOS2dNodePrime, inst->MOS2sNodePrime, - Sid); + Sid, dtemp); NevalSrc( & noizDens[MOS2FLNOIZ], NULL, ckt, N_GAIN, inst->MOS2dNodePrime, inst->MOS2sNodePrime, diff --git a/src/spicelib/devices/mos3/mos3noi.c b/src/spicelib/devices/mos3/mos3noi.c index 3d7551184..ea180a8ee 100644 --- a/src/spicelib/devices/mos3/mos3noi.c +++ b/src/spicelib/devices/mos3/mos3noi.c @@ -84,13 +84,19 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, switch (mode) { case N_DENS: - NevalSrc( & noizDens[MOS3RDNOIZ], & lnNdens[MOS3RDNOIZ], - ckt, THERMNOISE, inst->MOS3dNodePrime, inst->MOS3dNode, - inst->MOS3drainConductance); + double dtemp; + if (inst->MOS3tempGiven) + dtemp = inst->MOS3temp - ckt->CKTtemp + (model->MOS3tnom-CONSTCtoK); + else + dtemp = inst->MOS3dtemp; - NevalSrc( & noizDens[MOS3RSNOIZ], & lnNdens[MOS3RSNOIZ], + NevalSrcInstanceTemp( & noizDens[MOS3RDNOIZ], & lnNdens[MOS3RDNOIZ], + ckt, THERMNOISE, inst->MOS3dNodePrime, inst->MOS3dNode, + inst->MOS3drainConductance, dtemp); + + NevalSrcInstanceTemp( & noizDens[MOS3RSNOIZ], & lnNdens[MOS3RSNOIZ], ckt, THERMNOISE, inst->MOS3sNodePrime, inst->MOS3sNode, - inst->MOS3sourceConductance); + inst->MOS3sourceConductance, dtemp); if (model->MOS3nlev < 3) { @@ -116,9 +122,9 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, Sid = 2.0 / 3.0 * beta * vgst * (1.0+alpha+alpha*alpha) / (1.0+alpha) * model->MOS3gdsnoi; } - NevalSrc( & noizDens[MOS3IDNOIZ], & lnNdens[MOS3IDNOIZ], + NevalSrcInstanceTemp( & noizDens[MOS3IDNOIZ], & lnNdens[MOS3IDNOIZ], ckt, THERMNOISE, inst->MOS3dNodePrime, inst->MOS3sNodePrime, - Sid); + Sid, dtemp); NevalSrc( & noizDens[MOS3FLNOIZ], NULL, ckt, N_GAIN, inst->MOS3dNodePrime, inst->MOS3sNodePrime, From 3a180282833f2473ccb98aa688ff202675660ef5 Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 15 Feb 2024 18:09:38 +0100 Subject: [PATCH 6/9] vbic: use device temperature for noise analysis too --- src/spicelib/devices/vbic/vbicnoise.c | 34 ++++++++++++++++----------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/spicelib/devices/vbic/vbicnoise.c b/src/spicelib/devices/vbic/vbicnoise.c index 42516da59..9a332c565 100644 --- a/src/spicelib/devices/vbic/vbicnoise.c +++ b/src/spicelib/devices/vbic/vbicnoise.c @@ -92,33 +92,39 @@ VBICnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * switch (mode) { case N_DENS: - NevalSrc(&noizDens[VBICRCNOIZ],&lnNdens[VBICRCNOIZ], + double dtemp; + if (inst->VBICtempGiven) + dtemp = inst->VBICtemp - ckt->CKTtemp + (model->VBICtnom-CONSTCtoK); + else + dtemp = inst->VBICdtemp; + + NevalSrcInstanceTemp(&noizDens[VBICRCNOIZ],&lnNdens[VBICRCNOIZ], ckt,THERMNOISE,inst->VBICcollCXNode,inst->VBICcollNode, - *(ckt->CKTstate0 + inst->VBICircx_Vrcx)); + *(ckt->CKTstate0 + inst->VBICircx_Vrcx), dtemp); - NevalSrc(&noizDens[VBICRCINOIZ],&lnNdens[VBICRCINOIZ], + NevalSrcInstanceTemp(&noizDens[VBICRCINOIZ],&lnNdens[VBICRCINOIZ], ckt,THERMNOISE,inst->VBICcollCXNode,inst->VBICcollCINode, - *(ckt->CKTstate0 + inst->VBICirci_Vrci)); + *(ckt->CKTstate0 + inst->VBICirci_Vrci), dtemp); - NevalSrc(&noizDens[VBICRBNOIZ],&lnNdens[VBICRBNOIZ], + NevalSrcInstanceTemp(&noizDens[VBICRBNOIZ],&lnNdens[VBICRBNOIZ], ckt,THERMNOISE,inst->VBICbaseBXNode,inst->VBICbaseNode, - *(ckt->CKTstate0 + inst->VBICirbx_Vrbx)); + *(ckt->CKTstate0 + inst->VBICirbx_Vrbx), dtemp); - NevalSrc(&noizDens[VBICRBINOIZ],&lnNdens[VBICRBINOIZ], + NevalSrcInstanceTemp(&noizDens[VBICRBINOIZ],&lnNdens[VBICRBINOIZ], ckt,THERMNOISE,inst->VBICbaseBXNode,inst->VBICbaseBINode, - *(ckt->CKTstate0 + inst->VBICirbi_Vrbi)); + *(ckt->CKTstate0 + inst->VBICirbi_Vrbi), dtemp); - NevalSrc(&noizDens[VBICRENOIZ],&lnNdens[VBICRENOIZ], + NevalSrcInstanceTemp(&noizDens[VBICRENOIZ],&lnNdens[VBICRENOIZ], ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode, - *(ckt->CKTstate0 + inst->VBICire_Vre)); + *(ckt->CKTstate0 + inst->VBICire_Vre), dtemp); - NevalSrc(&noizDens[VBICRBPNOIZ],&lnNdens[VBICRBPNOIZ], + NevalSrcInstanceTemp(&noizDens[VBICRBPNOIZ],&lnNdens[VBICRBPNOIZ], ckt,THERMNOISE,inst->VBICemitEINode,inst->VBICemitNode, - *(ckt->CKTstate0 + inst->VBICirbp_Vrbp)); + *(ckt->CKTstate0 + inst->VBICirbp_Vrbp), dtemp); - NevalSrc(&noizDens[VBICRSNOIZ],&lnNdens[VBICRSNOIZ], + NevalSrcInstanceTemp(&noizDens[VBICRSNOIZ],&lnNdens[VBICRSNOIZ], ckt,THERMNOISE,inst->VBICsubsSINode,inst->VBICsubsNode, - *(ckt->CKTstate0 + inst->VBICirs_Vrs)); + *(ckt->CKTstate0 + inst->VBICirs_Vrs), dtemp); NevalSrc(&noizDens[VBICICNOIZ],&lnNdens[VBICICNOIZ], From fd000c079b09f363645d8a455895bc33ba01c4eb Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 15 Feb 2024 18:19:11 +0100 Subject: [PATCH 7/9] hicum2: use device temperature for noise analysis too --- src/spicelib/devices/hicum2/hicum2noise.c | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index ed19ad0e7..e2184084a 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -125,25 +125,31 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata switch (mode) { case N_DENS: - NevalSrc(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ], + double dtemp; + if (here->HICUMtempGiven) + dtemp = here->HICUMtemp - ckt->CKTtemp + (model->HICUMtnom-CONSTCtoK); + else + dtemp = here->HICUMdtemp; + + NevalSrcInstanceTemp(&noizDens[HICUMRCNOIZ],&lnNdens[HICUMRCNOIZ], ckt,THERMNOISE,here->HICUMcollCINode,here->HICUMcollNode, - Icic_Vcic); + Icic_Vcic, dtemp); - NevalSrc(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ], + NevalSrcInstanceTemp(&noizDens[HICUMRBNOIZ],&lnNdens[HICUMRBNOIZ], ckt,THERMNOISE,here->HICUMbaseNode,here->HICUMbaseBPNode, - Ibbp_Vbbp); + Ibbp_Vbbp, dtemp); - NevalSrc(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ], + NevalSrcInstanceTemp(&noizDens[HICUMRBINOIZ],&lnNdens[HICUMRBINOIZ], ckt,THERMNOISE,here->HICUMbaseBPNode,here->HICUMbaseBINode, - Ibpbi_Vbpbi); + Ibpbi_Vbpbi, dtemp); - NevalSrc(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ], + NevalSrcInstanceTemp(&noizDens[HICUMRENOIZ],&lnNdens[HICUMRENOIZ], ckt,THERMNOISE,here->HICUMemitEINode,here->HICUMemitNode, - Ieie_Veie); + Ieie_Veie, dtemp); - NevalSrc(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ], + NevalSrcInstanceTemp(&noizDens[HICUMRSNOIZ],&lnNdens[HICUMRSNOIZ], ckt,THERMNOISE,here->HICUMsubsSINode,here->HICUMsubsNode, - Isis_Vsis); + Isis_Vsis, dtemp); NevalSrc(&noizDens[HICUMIAVLNOIZ],&lnNdens[HICUMIAVLNOIZ], From 3201bcb09bd231a14e96d0e5e0d291f299b97ed2 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 16 Feb 2024 10:12:09 +0100 Subject: [PATCH 8/9] prevent clang error --- src/spicelib/devices/bjt/bjtnoise.c | 3 ++- src/spicelib/devices/dio/dionoise.c | 2 +- src/spicelib/devices/hicum2/hicum2noise.c | 3 ++- src/spicelib/devices/jfet/jfetnoi.c | 2 +- src/spicelib/devices/mos1/mos1noi.c | 3 ++- src/spicelib/devices/mos2/mos2noi.c | 3 ++- src/spicelib/devices/mos3/mos3noi.c | 3 ++- src/spicelib/devices/res/resnoise.c | 2 +- src/spicelib/devices/vbic/vbicnoise.c | 3 ++- 9 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/spicelib/devices/bjt/bjtnoise.c b/src/spicelib/devices/bjt/bjtnoise.c index e26cfa53f..08888383c 100644 --- a/src/spicelib/devices/bjt/bjtnoise.c +++ b/src/spicelib/devices/bjt/bjtnoise.c @@ -34,6 +34,7 @@ BJTnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, double noizDens[BJTNSRCS]; double lnNdens[BJTNSRCS]; int i; + double dtemp; /* define the names of the noise sources */ @@ -82,7 +83,7 @@ BJTnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, switch (mode) { case N_DENS: - double dtemp; + if (inst->BJTtempGiven) dtemp = inst->BJTtemp - ckt->CKTtemp + (model->BJTtnom-CONSTCtoK); else diff --git a/src/spicelib/devices/dio/dionoise.c b/src/spicelib/devices/dio/dionoise.c index ea893826d..ab64839df 100644 --- a/src/spicelib/devices/dio/dionoise.c +++ b/src/spicelib/devices/dio/dionoise.c @@ -35,6 +35,7 @@ DIOnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, double noizDens[DIONSRCS]; double lnNdens[DIONSRCS]; int i; + double dtemp; /* define the names of the noise sources */ @@ -81,7 +82,6 @@ DIOnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, case N_DENS: - double dtemp; if (inst->DIOtempGiven) dtemp = inst->DIOtemp - ckt->CKTtemp + (model->DIOnomTemp-CONSTCtoK); else diff --git a/src/spicelib/devices/hicum2/hicum2noise.c b/src/spicelib/devices/hicum2/hicum2noise.c index e2184084a..d1532a561 100644 --- a/src/spicelib/devices/hicum2/hicum2noise.c +++ b/src/spicelib/devices/hicum2/hicum2noise.c @@ -35,6 +35,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata double noizDens[HICUMNSRCS]; double lnNdens[HICUMNSRCS]; int i; + double dtemp; double Ibbp_Vbbp; double Icic_Vcic; @@ -125,7 +126,7 @@ HICUMnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata switch (mode) { case N_DENS: - double dtemp; + if (here->HICUMtempGiven) dtemp = here->HICUMtemp - ckt->CKTtemp + (model->HICUMtnom-CONSTCtoK); else diff --git a/src/spicelib/devices/jfet/jfetnoi.c b/src/spicelib/devices/jfet/jfetnoi.c index b4194758c..c0934c266 100644 --- a/src/spicelib/devices/jfet/jfetnoi.c +++ b/src/spicelib/devices/jfet/jfetnoi.c @@ -34,6 +34,7 @@ JFETnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *d double lnNdens[JFETNSRCS]; int i; double vgs, vds, vgst, alpha, beta; + double dtemp; /* define the names of the noise sources */ @@ -81,7 +82,6 @@ JFETnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *d case N_DENS: - double dtemp; if (inst->JFETtempGiven) dtemp = inst->JFETtemp - ckt->CKTtemp + (model->JFETtnom-CONSTCtoK); else diff --git a/src/spicelib/devices/mos1/mos1noi.c b/src/spicelib/devices/mos1/mos1noi.c index dcdfae69d..f64b137e3 100644 --- a/src/spicelib/devices/mos1/mos1noi.c +++ b/src/spicelib/devices/mos1/mos1noi.c @@ -36,6 +36,7 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, double lnNdens[MOS1NSRCS]; int i; double vgs, vds, vgd, vgst, alpha, beta, Sid; + double dtemp; /* define the names of the noise sources */ @@ -95,7 +96,7 @@ MOS1noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, switch (mode) { case N_DENS: - double dtemp; + if (inst->MOS1tempGiven) dtemp = inst->MOS1temp - ckt->CKTtemp + (model->MOS1tnom-CONSTCtoK); else diff --git a/src/spicelib/devices/mos2/mos2noi.c b/src/spicelib/devices/mos2/mos2noi.c index 85e969115..5a726f123 100644 --- a/src/spicelib/devices/mos2/mos2noi.c +++ b/src/spicelib/devices/mos2/mos2noi.c @@ -35,6 +35,7 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, double lnNdens[MOS2NSRCS]; int i; double vgs, vds, vgd, vgst, alpha, beta, Sid; + double dtemp; /* define the names of the noise sources */ @@ -84,7 +85,7 @@ MOS2noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, switch (mode) { case N_DENS: - double dtemp; + if (inst->MOS2tempGiven) dtemp = inst->MOS2temp - ckt->CKTtemp + (model->MOS2tnom-CONSTCtoK); else diff --git a/src/spicelib/devices/mos3/mos3noi.c b/src/spicelib/devices/mos3/mos3noi.c index ea180a8ee..f07bc57c3 100644 --- a/src/spicelib/devices/mos3/mos3noi.c +++ b/src/spicelib/devices/mos3/mos3noi.c @@ -35,6 +35,7 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, double lnNdens[MOS3NSRCS]; int i; double vgs, vds, vgd, vgst, alpha, beta, Sid; + double dtemp; /* define the names of the noise sources */ @@ -84,7 +85,7 @@ MOS3noise(int mode, int operation, GENmodel * genmodel, CKTcircuit * ckt, switch (mode) { case N_DENS: - double dtemp; + if (inst->MOS3tempGiven) dtemp = inst->MOS3temp - ckt->CKTtemp + (model->MOS3tnom-CONSTCtoK); else diff --git a/src/spicelib/devices/res/resnoise.c b/src/spicelib/devices/res/resnoise.c index 459db4e26..044b0b796 100644 --- a/src/spicelib/devices/res/resnoise.c +++ b/src/spicelib/devices/res/resnoise.c @@ -39,6 +39,7 @@ RESnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, double noizDens[RESNSRCS]; double lnNdens[RESNSRCS]; int i; + double dtemp; /* define the names of the noise sources */ @@ -88,7 +89,6 @@ RESnoise(int mode, int operation, GENmodel*genmodel, CKTcircuit *ckt, case N_DENS: - double dtemp; if (inst->REStempGiven) dtemp = inst->REStemp - ckt->CKTtemp + (model->REStnom-CONSTCtoK); else diff --git a/src/spicelib/devices/vbic/vbicnoise.c b/src/spicelib/devices/vbic/vbicnoise.c index 9a332c565..09dea77a6 100644 --- a/src/spicelib/devices/vbic/vbicnoise.c +++ b/src/spicelib/devices/vbic/vbicnoise.c @@ -36,6 +36,7 @@ VBICnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * double noizDens[VBICNSRCS]; double lnNdens[VBICNSRCS]; int i; + double dtemp; /* define the names of the noise sources */ @@ -92,7 +93,7 @@ VBICnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata * switch (mode) { case N_DENS: - double dtemp; + if (inst->VBICtempGiven) dtemp = inst->VBICtemp - ckt->CKTtemp + (model->VBICtnom-CONSTCtoK); else From adaa3d39fcb960dc0810877477893fa75b61d5f8 Mon Sep 17 00:00:00 2001 From: dwarning Date: Fri, 16 Feb 2024 13:56:43 +0100 Subject: [PATCH 9/9] no use for grouping in cx_fft and cx_ifft --- src/maths/cmaths/cmath4.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/maths/cmaths/cmath4.c b/src/maths/cmaths/cmath4.c index 50d772761..63b03f0a6 100644 --- a/src/maths/cmaths/cmath4.c +++ b/src/maths/cmaths/cmath4.c @@ -584,8 +584,7 @@ cx_fft(void *data, short int type, int length, int *newlength, short int *newtyp double *datax = NULL; #endif - if (grouping == 0) - grouping = length; + NG_IGNORE(grouping); /* First do some sanity checks. */ if (!pl || !pl->pl_scale || !newpl || !newpl->pl_scale) { @@ -847,8 +846,7 @@ cx_ifft(void *data, short int type, int length, int *newlength, short int *newty double scale; #endif - if (grouping == 0) - grouping = length; + NG_IGNORE(grouping); /* First do some sanity checks. */ if (!pl || !pl->pl_scale || !newpl || !newpl->pl_scale) {