noisean.c, beautify the code
This commit is contained in:
parent
afe36c73d5
commit
c9b91e2c05
|
|
@ -30,10 +30,10 @@ extern int fixme_inoise_type;
|
||||||
int
|
int
|
||||||
NOISEan (CKTcircuit *ckt, int restart)
|
NOISEan (CKTcircuit *ckt, int restart)
|
||||||
{
|
{
|
||||||
static Ndata *data; /* va, must be static, for continuation of
|
/* variable must be static, for continuation of interrupted (Ctrl-C),
|
||||||
* interrupted(Ctrl-C), longer lasting noise
|
longer lasting noise anlysis */
|
||||||
* analysis
|
static Ndata *data;
|
||||||
*/
|
|
||||||
double realVal;
|
double realVal;
|
||||||
double imagVal;
|
double imagVal;
|
||||||
int error;
|
int error;
|
||||||
|
|
@ -51,37 +51,35 @@ NOISEan (CKTcircuit *ckt, int restart)
|
||||||
posOutNode = (job->output) -> number;
|
posOutNode = (job->output) -> number;
|
||||||
negOutNode = (job->outputRef) -> number;
|
negOutNode = (job->outputRef) -> number;
|
||||||
|
|
||||||
if (job->NnumSteps < 1) {
|
if (job->NnumSteps < 1) {
|
||||||
SPfrontEnd->IFerrorf(ERR_WARNING,
|
SPfrontEnd->IFerrorf(ERR_WARNING,
|
||||||
"Number of steps for noise measurement has to be larger than 0,\n but currently is %d\n",
|
"Number of steps for noise measurement has to be larger than 0,\n but currently is %d\n",
|
||||||
job->NnumSteps);
|
job->NnumSteps);
|
||||||
return(E_PARMVAL);
|
return(E_PARMVAL);
|
||||||
}
|
} else if ((job->NnumSteps == 1) && (job->NstpType == LINEAR)) {
|
||||||
else if ((job->NnumSteps == 1) && (job->NstpType == LINEAR)) {
|
if (!frequequal) {
|
||||||
if (!frequequal) {
|
job->NstopFreq = job->NstartFreq;
|
||||||
job->NstopFreq = job->NstartFreq;
|
SPfrontEnd->IFerrorf(ERR_WARNING,
|
||||||
SPfrontEnd->IFerrorf(ERR_WARNING,
|
"Noise measurement at a single frequency %g only!\n",
|
||||||
"Noise measurement at a single frequency %g only!\n",
|
job->NstartFreq);
|
||||||
job->NstartFreq);
|
}
|
||||||
}
|
} else {
|
||||||
}
|
if (frequequal) {
|
||||||
else {
|
job->NstopFreq = job->NstartFreq;
|
||||||
if (frequequal) {
|
job->NnumSteps = 1;
|
||||||
job->NstopFreq = job->NstartFreq;
|
SPfrontEnd->IFerrorf(ERR_WARNING,
|
||||||
job->NnumSteps = 1;
|
"Noise measurement at a single frequency %g only!\n",
|
||||||
SPfrontEnd->IFerrorf(ERR_WARNING,
|
job->NstartFreq);
|
||||||
"Noise measurement at a single frequency %g only!\n",
|
}
|
||||||
job->NstartFreq);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
/* see if the source specified is AC */
|
/* see if the source specified is AC */
|
||||||
{
|
{
|
||||||
bool ac_given = FALSE;
|
bool ac_given = FALSE;
|
||||||
|
|
||||||
if (!inst || inst->GENmodPtr->GENmodType < 0) {
|
if (!inst || inst->GENmodPtr->GENmodType < 0) {
|
||||||
SPfrontEnd->IFerrorf (ERR_WARNING,
|
SPfrontEnd->IFerrorf (ERR_WARNING,
|
||||||
"Noise input source %s not in circuit",
|
"Noise input source %s not in circuit",
|
||||||
job->input);
|
job->input);
|
||||||
return E_NOTFOUND;
|
return E_NOTFOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,93 +91,93 @@ NOISEan (CKTcircuit *ckt, int restart)
|
||||||
src_type = SV_CURRENT;
|
src_type = SV_CURRENT;
|
||||||
} else {
|
} else {
|
||||||
SPfrontEnd->IFerrorf (ERR_WARNING,
|
SPfrontEnd->IFerrorf (ERR_WARNING,
|
||||||
"Noise input source %s is not of proper type",
|
"Noise input source %s is not of proper type",
|
||||||
job->input);
|
job->input);
|
||||||
return E_NOTFOUND;
|
return E_NOTFOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ac_given) {
|
if (!ac_given) {
|
||||||
SPfrontEnd->IFerrorf (ERR_WARNING,
|
SPfrontEnd->IFerrorf (ERR_WARNING,
|
||||||
"Noise input source %s has no AC value",
|
"Noise input source %s has no AC value",
|
||||||
job->input);
|
job->input);
|
||||||
return E_NOACINPUT;
|
return E_NOACINPUT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (job->NsavFstp == 0.0) || restart) { /* va, NsavFstp is double */
|
if ( (job->NsavFstp == 0.0) || restart) { /* va, NsavFstp is double */
|
||||||
switch (job->NstpType) {
|
switch (job->NstpType) {
|
||||||
|
|
||||||
|
|
||||||
case DECADE:
|
case DECADE:
|
||||||
job->NfreqDelta = exp(log(10.0)/
|
job->NfreqDelta = exp(log(10.0)/
|
||||||
job->NnumSteps);
|
job->NnumSteps);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OCTAVE:
|
case OCTAVE:
|
||||||
job->NfreqDelta = exp(log(2.0)/
|
job->NfreqDelta = exp(log(2.0)/
|
||||||
job->NnumSteps);
|
job->NnumSteps);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LINEAR:
|
case LINEAR:
|
||||||
if (job->NnumSteps == 1)
|
if (job->NnumSteps == 1)
|
||||||
job->NfreqDelta = 0;
|
job->NfreqDelta = 0;
|
||||||
else
|
else
|
||||||
job->NfreqDelta = (job->NstopFreq -
|
job->NfreqDelta = (job->NstopFreq -
|
||||||
job->NstartFreq) / (job->NnumSteps - 1);
|
job->NstartFreq) / (job->NnumSteps - 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return(E_BADPARM);
|
return(E_BADPARM);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* error = DCop(ckt); */
|
/* error = DCop(ckt); */
|
||||||
error = CKTop(ckt, (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT,
|
error = CKTop(ckt, (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT,
|
||||||
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
|
(ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT,
|
||||||
ckt->CKTdcMaxIter);
|
ckt->CKTdcMaxIter);
|
||||||
|
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
|
|
||||||
/* Patch to noisean.c by Richard D. McRoberts. */
|
/* Patch to noisean.c by Richard D. McRoberts. */
|
||||||
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITSMSIG;
|
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITSMSIG;
|
||||||
error = CKTload(ckt);
|
error = CKTload(ckt);
|
||||||
if(error) return(error);
|
if(error) return(error);
|
||||||
|
|
||||||
data = TMALLOC(Ndata, 1);
|
data = TMALLOC(Ndata, 1);
|
||||||
step = 0;
|
step = 0;
|
||||||
data->freq = job->NstartFreq;
|
data->freq = job->NstartFreq;
|
||||||
data->outNoiz = 0.0;
|
data->outNoiz = 0.0;
|
||||||
data->inNoise = 0.0;
|
data->inNoise = 0.0;
|
||||||
data->squared = cp_getvar("sqrnoise", CP_BOOL, NULL, 0) ? 1 : 0;
|
data->squared = cp_getvar("sqrnoise", CP_BOOL, NULL, 0) ? 1 : 0;
|
||||||
|
|
||||||
/* the current front-end needs the namelist to be fully
|
/* the current front-end needs the namelist to be fully
|
||||||
declared before an OUTpBeginplot */
|
declared before an OUTpBeginplot */
|
||||||
|
|
||||||
SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL);
|
SPfrontEnd->IFnewUid (ckt, &freqUid, NULL, "frequency", UID_OTHER, NULL);
|
||||||
|
|
||||||
data->numPlots = 0; /* we don't have any plots yet */
|
data->numPlots = 0; /* we don't have any plots yet */
|
||||||
error = CKTnoise(ckt,N_DENS,N_OPEN,data);
|
error = CKTnoise(ckt,N_DENS,N_OPEN,data);
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* all names in the namelist have been declared. now start the
|
* all names in the namelist have been declared. now start the
|
||||||
* plot
|
* plot
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (src_type == SV_VOLTAGE)
|
if (src_type == SV_VOLTAGE)
|
||||||
fixme_inoise_type =
|
fixme_inoise_type =
|
||||||
data->squared ? SV_SQR_VOLTAGE_DENSITY : SV_VOLTAGE_DENSITY;
|
data->squared ? SV_SQR_VOLTAGE_DENSITY : SV_VOLTAGE_DENSITY;
|
||||||
else
|
else
|
||||||
fixme_inoise_type =
|
fixme_inoise_type =
|
||||||
data->squared ? SV_SQR_CURRENT_DENSITY : SV_CURRENT_DENSITY;
|
data->squared ? SV_SQR_CURRENT_DENSITY : SV_CURRENT_DENSITY;
|
||||||
|
|
||||||
fixme_onoise_type =
|
fixme_onoise_type =
|
||||||
data->squared ? SV_SQR_VOLTAGE_DENSITY : SV_VOLTAGE_DENSITY;
|
data->squared ? SV_SQR_VOLTAGE_DENSITY : SV_VOLTAGE_DENSITY;
|
||||||
|
|
||||||
if (!data->squared)
|
if (!data->squared)
|
||||||
for (i = 0; i < data->numPlots; i++)
|
for (i = 0; i < data->numPlots; i++)
|
||||||
data->squared_value[i] =
|
data->squared_value[i] =
|
||||||
ciprefix("inoise", data->namelist[i]) ||
|
ciprefix("inoise", data->namelist[i]) ||
|
||||||
ciprefix("onoise", data->namelist[i]);
|
ciprefix("onoise", data->namelist[i]);
|
||||||
|
|
||||||
error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob,
|
error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob,
|
||||||
data->squared
|
data->squared
|
||||||
|
|
@ -189,41 +187,41 @@ NOISEan (CKTcircuit *ckt, int restart)
|
||||||
freqUid, IF_REAL,
|
freqUid, IF_REAL,
|
||||||
data->numPlots, data->namelist, IF_REAL,
|
data->numPlots, data->namelist, IF_REAL,
|
||||||
&(data->NplotPtr));
|
&(data->NplotPtr));
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
|
|
||||||
if (job->NstpType != LINEAR) {
|
if (job->NstpType != LINEAR) {
|
||||||
SPfrontEnd->OUTattributes (data->NplotPtr, NULL, OUT_SCALE_LOG, NULL);
|
SPfrontEnd->OUTattributes (data->NplotPtr, NULL, OUT_SCALE_LOG, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else { /* we must have paused before. pick up where we left off */
|
} else { /* we must have paused before. pick up where we left off */
|
||||||
step = (int)(job->NsavFstp);
|
step = (int)(job->NsavFstp);
|
||||||
switch (job->NstpType) {
|
switch (job->NstpType) {
|
||||||
|
|
||||||
case DECADE:
|
case DECADE:
|
||||||
case OCTAVE:
|
case OCTAVE:
|
||||||
data->freq = job->NstartFreq * exp (step *
|
data->freq = job->NstartFreq * exp (step *
|
||||||
log (job->NfreqDelta));
|
log (job->NfreqDelta));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LINEAR:
|
case LINEAR:
|
||||||
data->freq = job->NstartFreq + step *
|
data->freq = job->NstartFreq + step *
|
||||||
job->NfreqDelta;
|
job->NfreqDelta;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return(E_BADPARM);
|
return(E_BADPARM);
|
||||||
|
|
||||||
}
|
}
|
||||||
job->NsavFstp = 0;
|
job->NsavFstp = 0;
|
||||||
data->outNoiz = job->NsavOnoise;
|
data->outNoiz = job->NsavOnoise;
|
||||||
data->inNoise = job->NsavInoise;
|
data->inNoise = job->NsavInoise;
|
||||||
/* saj resume rawfile fix*/
|
/* saj resume rawfile fix*/
|
||||||
error = SPfrontEnd->OUTpBeginPlot (NULL, NULL,
|
error = SPfrontEnd->OUTpBeginPlot (NULL, NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL, 0,
|
NULL, 0,
|
||||||
666, NULL, 666,
|
666, NULL, 666,
|
||||||
&(data->NplotPtr));
|
&(data->NplotPtr));
|
||||||
/*saj*/
|
/*saj*/
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (job->NstpType) {
|
switch (job->NstpType) {
|
||||||
|
|
@ -244,83 +242,83 @@ NOISEan (CKTcircuit *ckt, int restart)
|
||||||
|
|
||||||
while (data->freq <= job->NstopFreq + freqTol) {
|
while (data->freq <= job->NstopFreq + freqTol) {
|
||||||
if(SPfrontEnd->IFpauseTest()) {
|
if(SPfrontEnd->IFpauseTest()) {
|
||||||
job->NsavFstp = step; /* save our results */
|
job->NsavFstp = step; /* save our results */
|
||||||
job->NsavOnoise = data->outNoiz; /* up until now */
|
job->NsavOnoise = data->outNoiz; /* up until now */
|
||||||
job->NsavInoise = data->inNoise;
|
job->NsavInoise = data->inNoise;
|
||||||
return (E_PAUSE);
|
return (E_PAUSE);
|
||||||
}
|
}
|
||||||
ckt->CKTomega = 2.0 * M_PI * data->freq;
|
ckt->CKTomega = 2.0 * M_PI * data->freq;
|
||||||
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEAC | MODEACNOISE;
|
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEAC | MODEACNOISE;
|
||||||
ckt->noise_input = inst;
|
ckt->noise_input = inst;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* solve the original AC system to get the transfer
|
* solve the original AC system to get the transfer
|
||||||
* function between the input and output
|
* function between the input and output
|
||||||
*/
|
*/
|
||||||
|
|
||||||
NIacIter(ckt);
|
NIacIter(ckt);
|
||||||
realVal = ckt->CKTrhsOld [posOutNode]
|
realVal = ckt->CKTrhsOld [posOutNode]
|
||||||
- ckt->CKTrhsOld [negOutNode];
|
- ckt->CKTrhsOld [negOutNode];
|
||||||
imagVal = ckt->CKTirhsOld [posOutNode]
|
imagVal = ckt->CKTirhsOld [posOutNode]
|
||||||
- ckt->CKTirhsOld [negOutNode];
|
- ckt->CKTirhsOld [negOutNode];
|
||||||
data->GainSqInv = 1.0 / MAX(((realVal*realVal)
|
data->GainSqInv = 1.0 / MAX(((realVal*realVal)
|
||||||
+ (imagVal*imagVal)),N_MINGAIN);
|
+ (imagVal*imagVal)),N_MINGAIN);
|
||||||
data->lnGainInv = log(data->GainSqInv);
|
data->lnGainInv = log(data->GainSqInv);
|
||||||
|
|
||||||
/* set up a block of "common" data so we don't have to
|
/* set up a block of "common" data so we don't have to
|
||||||
* recalculate it for every device
|
* recalculate it for every device
|
||||||
*/
|
*/
|
||||||
|
|
||||||
data->delFreq = data->freq - data->lstFreq;
|
data->delFreq = data->freq - data->lstFreq;
|
||||||
data->lnFreq = log(MAX(data->freq,N_MINLOG));
|
data->lnFreq = log(MAX(data->freq,N_MINLOG));
|
||||||
data->lnLastFreq = log(MAX(data->lstFreq,N_MINLOG));
|
data->lnLastFreq = log(MAX(data->lstFreq,N_MINLOG));
|
||||||
data->delLnFreq = data->lnFreq - data->lnLastFreq;
|
data->delLnFreq = data->lnFreq - data->lnLastFreq;
|
||||||
|
|
||||||
if ((job->NStpsSm != 0) && ((step % (job->NStpsSm)) == 0)) {
|
if ((job->NStpsSm != 0) && ((step % (job->NStpsSm)) == 0)) {
|
||||||
data->prtSummary = TRUE;
|
data->prtSummary = TRUE;
|
||||||
} else {
|
} else {
|
||||||
data->prtSummary = FALSE;
|
data->prtSummary = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
data->outNumber = 1;
|
data->outNumber = 1;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
data->outNumber = 0;
|
data->outNumber = 0;
|
||||||
/* the frequency will NOT be stored in array[0] as before; instead,
|
/* the frequency will NOT be stored in array[0] as before; instead,
|
||||||
* it will be given in refVal.rValue (see later)
|
* it will be given in refVal.rValue (see later)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
NInzIter(ckt,posOutNode,negOutNode); /* solve the adjoint system */
|
NInzIter(ckt,posOutNode,negOutNode); /* solve the adjoint system */
|
||||||
|
|
||||||
/* now we use the adjoint system to calculate the noise
|
/* now we use the adjoint system to calculate the noise
|
||||||
* contributions of each generator in the circuit
|
* contributions of each generator in the circuit
|
||||||
*/
|
*/
|
||||||
|
|
||||||
error = CKTnoise(ckt,N_DENS,N_CALC,data);
|
error = CKTnoise(ckt,N_DENS,N_CALC,data);
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
data->lstFreq = data->freq;
|
data->lstFreq = data->freq;
|
||||||
|
|
||||||
/* update the frequency */
|
/* update the frequency */
|
||||||
|
|
||||||
switch (job->NstpType) {
|
switch (job->NstpType) {
|
||||||
|
|
||||||
case DECADE:
|
case DECADE:
|
||||||
case OCTAVE:
|
case OCTAVE:
|
||||||
data->freq *= job->NfreqDelta;
|
data->freq *= job->NfreqDelta;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LINEAR:
|
case LINEAR:
|
||||||
data->freq += job->NfreqDelta;
|
data->freq += job->NfreqDelta;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return(E_INTERN);
|
return(E_INTERN);
|
||||||
}
|
}
|
||||||
step++;
|
step++;
|
||||||
|
|
||||||
if ((job->NnumSteps == 1) && (job->NstpType == LINEAR))
|
if ((job->NnumSteps == 1) && (job->NstpType == LINEAR))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = CKTnoise(ckt,N_DENS,N_CLOSE,data);
|
error = CKTnoise(ckt,N_DENS,N_CLOSE,data);
|
||||||
|
|
@ -330,25 +328,25 @@ NOISEan (CKTcircuit *ckt, int restart)
|
||||||
data->outNumber = 0;
|
data->outNumber = 0;
|
||||||
|
|
||||||
if (job->NstartFreq != job->NstopFreq) {
|
if (job->NstartFreq != job->NstopFreq) {
|
||||||
error = CKTnoise(ckt,INT_NOIZ,N_OPEN,data);
|
error = CKTnoise(ckt,INT_NOIZ,N_OPEN,data);
|
||||||
|
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
|
|
||||||
if (src_type == SV_VOLTAGE)
|
if (src_type == SV_VOLTAGE)
|
||||||
fixme_inoise_type =
|
fixme_inoise_type =
|
||||||
data->squared ? SV_SQR_VOLTAGE : SV_VOLTAGE;
|
data->squared ? SV_SQR_VOLTAGE : SV_VOLTAGE;
|
||||||
else
|
else
|
||||||
fixme_inoise_type =
|
fixme_inoise_type =
|
||||||
data->squared ? SV_SQR_CURRENT : SV_CURRENT;
|
data->squared ? SV_SQR_CURRENT : SV_CURRENT;
|
||||||
|
|
||||||
fixme_onoise_type =
|
fixme_onoise_type =
|
||||||
data->squared ? SV_SQR_VOLTAGE : SV_VOLTAGE;
|
data->squared ? SV_SQR_VOLTAGE : SV_VOLTAGE;
|
||||||
|
|
||||||
if (!data->squared)
|
if (!data->squared)
|
||||||
for (i = 0; i < data->numPlots; i++)
|
for (i = 0; i < data->numPlots; i++)
|
||||||
data->squared_value[i] =
|
data->squared_value[i] =
|
||||||
ciprefix("inoise", data->namelist[i]) ||
|
ciprefix("inoise", data->namelist[i]) ||
|
||||||
ciprefix("onoise", data->namelist[i]);
|
ciprefix("onoise", data->namelist[i]);
|
||||||
|
|
||||||
SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob,
|
SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob,
|
||||||
data->squared
|
data->squared
|
||||||
|
|
@ -358,11 +356,11 @@ NOISEan (CKTcircuit *ckt, int restart)
|
||||||
data->numPlots, data->namelist, IF_REAL,
|
data->numPlots, data->namelist, IF_REAL,
|
||||||
&(data->NplotPtr));
|
&(data->NplotPtr));
|
||||||
|
|
||||||
error = CKTnoise(ckt,INT_NOIZ,N_CALC,data);
|
error = CKTnoise(ckt,INT_NOIZ,N_CALC,data);
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
|
|
||||||
error = CKTnoise(ckt,INT_NOIZ,N_CLOSE,data);
|
error = CKTnoise(ckt,INT_NOIZ,N_CLOSE,data);
|
||||||
if (error) return(error);
|
if (error) return(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE(data);
|
FREE(data);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue