|
|
|
@ -21,9 +21,9 @@ Author: 1987 Gary W. Ng |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
CKTnoise (CKTcircuit *ckt, int mode, int operation, Ndata *data) |
|
|
|
CKTnoise(CKTcircuit* ckt, int mode, int operation, Ndata* data) |
|
|
|
{ |
|
|
|
NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; |
|
|
|
NOISEAN* job = (NOISEAN*)ckt->CKTcurJob; |
|
|
|
|
|
|
|
double outNdens; |
|
|
|
int i; |
|
|
|
@ -35,10 +35,10 @@ CKTnoise (CKTcircuit *ckt, int mode, int operation, Ndata *data) |
|
|
|
|
|
|
|
/* let each device decide how many and what type of noise sources it has */ |
|
|
|
|
|
|
|
for (i=0; i < DEVmaxnum; i++) { |
|
|
|
if ( DEVices[i] && DEVices[i]->DEVnoise && ckt->CKThead[i] ) { |
|
|
|
error = DEVices[i]->DEVnoise (mode, operation, ckt->CKThead[i], |
|
|
|
ckt,data, &outNdens); |
|
|
|
for (i = 0; i < DEVmaxnum; i++) { |
|
|
|
if (DEVices[i] && DEVices[i]->DEVnoise && ckt->CKThead[i]) { |
|
|
|
error = DEVices[i]->DEVnoise(mode, operation, ckt->CKThead[i], |
|
|
|
ckt, data, &outNdens); |
|
|
|
if (error) return (error); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -47,102 +47,102 @@ CKTnoise (CKTcircuit *ckt, int mode, int operation, Ndata *data) |
|
|
|
|
|
|
|
case N_OPEN: |
|
|
|
|
|
|
|
/* take care of the noise for the circuit as a whole */ |
|
|
|
/* take care of the noise for the circuit as a whole */ |
|
|
|
|
|
|
|
switch (mode) { |
|
|
|
switch (mode) { |
|
|
|
|
|
|
|
case N_DENS: |
|
|
|
case N_DENS: |
|
|
|
|
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
|
|
|
|
SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "onoise_spectrum", UID_OTHER, NULL); |
|
|
|
SPfrontEnd->IFnewUid(ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "onoise_spectrum", UID_OTHER, NULL); |
|
|
|
|
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
|
|
|
|
SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "inoise_spectrum", UID_OTHER, NULL); |
|
|
|
SPfrontEnd->IFnewUid(ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "inoise_spectrum", UID_OTHER, NULL); |
|
|
|
|
|
|
|
/* we've added two more plots */ |
|
|
|
/* we've added two more plots */ |
|
|
|
|
|
|
|
data->outpVector = |
|
|
|
TMALLOC(double, data->numPlots); |
|
|
|
data->squared_value = |
|
|
|
data->squared ? NULL : TMALLOC(char, data->numPlots); |
|
|
|
data->outpVector = |
|
|
|
TMALLOC(double, data->numPlots); |
|
|
|
data->squared_value = |
|
|
|
data->squared ? NULL : TMALLOC(char, data->numPlots); |
|
|
|
break; |
|
|
|
|
|
|
|
case INT_NOIZ: |
|
|
|
case INT_NOIZ: |
|
|
|
|
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "onoise_total", UID_OTHER, NULL); |
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
SPfrontEnd->IFnewUid(ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "onoise_total", UID_OTHER, NULL); |
|
|
|
|
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
SPfrontEnd->IFnewUid (ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "inoise_total", UID_OTHER, NULL); |
|
|
|
/* we've added two more plots */ |
|
|
|
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); |
|
|
|
SPfrontEnd->IFnewUid(ckt, &(data->namelist[data->numPlots++]), |
|
|
|
NULL, "inoise_total", UID_OTHER, NULL); |
|
|
|
/* we've added two more plots */ |
|
|
|
|
|
|
|
data->outpVector = |
|
|
|
TMALLOC(double, data->numPlots); |
|
|
|
data->squared_value = |
|
|
|
data->squared ? NULL : TMALLOC(char, data->numPlots); |
|
|
|
break; |
|
|
|
data->outpVector = |
|
|
|
TMALLOC(double, data->numPlots); |
|
|
|
data->squared_value = |
|
|
|
data->squared ? NULL : TMALLOC(char, data->numPlots); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
return (E_INTERN); |
|
|
|
return (E_INTERN); |
|
|
|
} |
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
case N_CALC: |
|
|
|
|
|
|
|
switch (mode) { |
|
|
|
switch (mode) { |
|
|
|
|
|
|
|
case N_DENS: |
|
|
|
case N_DENS: |
|
|
|
if ((job->NStpsSm == 0) |
|
|
|
|| data->prtSummary) |
|
|
|
{ |
|
|
|
data->outpVector[data->outNumber++] = outNdens; |
|
|
|
data->outpVector[data->outNumber++] = |
|
|
|
(outNdens * data->GainSqInv); |
|
|
|
|
|
|
|
refVal.rValue = data->freq; /* the reference is the freq */ |
|
|
|
if (!data->squared) |
|
|
|
for (i = 0; i < data->outNumber; i++) |
|
|
|
if (data->squared_value[i]) |
|
|
|
data->outpVector[i] = sqrt(data->outpVector[i]); |
|
|
|
outData.v.numValue = data->outNumber; /* vector number */ |
|
|
|
outData.v.vec.rVec = data->outpVector; /* vector of outputs */ |
|
|
|
SPfrontEnd->OUTpData (data->NplotPtr, &refVal, &outData); |
|
|
|
|| data->prtSummary) |
|
|
|
{ |
|
|
|
data->outpVector[data->outNumber++] = outNdens; |
|
|
|
data->outpVector[data->outNumber++] = |
|
|
|
(outNdens * data->GainSqInv); |
|
|
|
|
|
|
|
refVal.rValue = data->freq; /* the reference is the freq */ |
|
|
|
if (!data->squared) |
|
|
|
for (i = 0; i < data->outNumber; i++) |
|
|
|
if (data->squared_value[i]) |
|
|
|
data->outpVector[i] = sqrt(data->outpVector[i]); |
|
|
|
outData.v.numValue = data->outNumber; /* vector number */ |
|
|
|
outData.v.vec.rVec = data->outpVector; /* vector of outputs */ |
|
|
|
SPfrontEnd->OUTpData(data->NplotPtr, &refVal, &outData); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case INT_NOIZ: |
|
|
|
data->outpVector[data->outNumber++] = data->outNoiz; |
|
|
|
data->outpVector[data->outNumber++] = data->inNoise; |
|
|
|
if (!data->squared) |
|
|
|
for (i = 0; i < data->outNumber; i++) |
|
|
|
if (data->squared_value[i]) |
|
|
|
data->outpVector[i] = sqrt(data->outpVector[i]); |
|
|
|
outData.v.vec.rVec = data->outpVector; /* vector of outputs */ |
|
|
|
outData.v.numValue = data->outNumber; /* vector number */ |
|
|
|
SPfrontEnd->OUTpData (data->NplotPtr, &refVal, &outData); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
return (E_INTERN); |
|
|
|
case INT_NOIZ: |
|
|
|
data->outpVector[data->outNumber++] = data->outNoiz; |
|
|
|
data->outpVector[data->outNumber++] = data->inNoise; |
|
|
|
if (!data->squared) |
|
|
|
for (i = 0; i < data->outNumber; i++) |
|
|
|
if (data->squared_value[i]) |
|
|
|
data->outpVector[i] = sqrt(data->outpVector[i]); |
|
|
|
outData.v.vec.rVec = data->outpVector; /* vector of outputs */ |
|
|
|
outData.v.numValue = data->outNumber; /* vector number */ |
|
|
|
SPfrontEnd->OUTpData(data->NplotPtr, &refVal, &outData); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
return (E_INTERN); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case N_CLOSE: |
|
|
|
SPfrontEnd->OUTendPlot (data->NplotPtr); |
|
|
|
FREE(data->namelist); |
|
|
|
FREE(data->outpVector); |
|
|
|
FREE(data->squared_value); |
|
|
|
SPfrontEnd->OUTendPlot(data->NplotPtr); |
|
|
|
FREE(data->namelist); |
|
|
|
FREE(data->outpVector); |
|
|
|
FREE(data->squared_value); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
return (E_INTERN); |
|
|
|
return (E_INTERN); |
|
|
|
} |
|
|
|
return (OK); |
|
|
|
} |