jfet: indentations as preparation for noise model extension

This commit is contained in:
dwarning 2013-01-26 21:27:39 +01:00
parent f081cf8606
commit 243100cc9d
4 changed files with 196 additions and 201 deletions

View File

@ -2,8 +2,8 @@
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Mathew Lew and Thomas L. Quarles
Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern
Laboratory for Communication Science Engineering
Sydney University Department of Electrical Engineering, Australia
Laboratory for Communication Science Engineering
Sydney University Department of Electrical Engineering, Australia
**********/
/*
*/
@ -39,11 +39,11 @@ JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
case JFET_MOD_LAMBDA:
value->rValue = model->JFETlModulation;
return(OK);
/* Modification for Sydney University JFET model */
case JFET_MOD_B:
value->rValue = model->JFETb;
return(OK);
/* end Sydney University mod */
/* Modification for Sydney University JFET model */
case JFET_MOD_B:
value->rValue = model->JFETb;
return(OK);
/* end Sydney University mod */
case JFET_MOD_RD:
value->rValue = model->JFETdrainResist;
return(OK);
@ -84,9 +84,9 @@ JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
value->rValue = model->JFETbex;
return(OK);
case JFET_MOD_TYPE:
if (model->JFETtype == NJF)
if (model->JFETtype == NJF)
value->sValue = "njf";
else
else
value->sValue = "pjf";
return(OK);
default:

View File

@ -72,28 +72,28 @@ JFETmParam(int param, IFvalue *value, GENmodel *inModels)
model->JFETtype = PJF;
}
break;
case JFET_MOD_KF:
model->JFETfNcoefGiven = TRUE;
model->JFETfNcoef = value->rValue;
break;
case JFET_MOD_AF:
model->JFETfNexpGiven = TRUE;
model->JFETfNexp = value->rValue;
break;
/* Modification for Sydney University JFET model */
case JFET_MOD_B:
model->JFETbGiven = TRUE;
model->JFETb = value->rValue;
return(OK);
/* end Sydney University mod */
case JFET_MOD_TCV:
model->JFETtcvGiven = TRUE;
model->JFETtcv = value->rValue;
break;
case JFET_MOD_BEX:
model->JFETbexGiven = TRUE;
model->JFETbex = value->rValue;
break;
case JFET_MOD_KF:
model->JFETfNcoefGiven = TRUE;
model->JFETfNcoef = value->rValue;
break;
case JFET_MOD_AF:
model->JFETfNexpGiven = TRUE;
model->JFETfNexp = value->rValue;
break;
/* Modification for Sydney University JFET model */
case JFET_MOD_B:
model->JFETbGiven = TRUE;
model->JFETb = value->rValue;
return(OK);
/* end Sydney University mod */
case JFET_MOD_TCV:
model->JFETtcvGiven = TRUE;
model->JFETtcv = value->rValue;
break;
case JFET_MOD_BEX:
model->JFETbexGiven = TRUE;
model->JFETbex = value->rValue;
break;
default:
return(E_BADPARM);
}

View File

@ -39,169 +39,164 @@ 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 */
"_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 */
};
for (model=firstModel; model != NULL; model=model->JFETnextModel) {
for (inst=model->JFETinstances; inst != NULL; inst=inst->JFETnextInstance) {
for (inst=model->JFETinstances; inst != NULL; inst=inst->JFETnextInstance) {
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 < JFETNSRCS; i++) {
(void)sprintf(name,"onoise_%s%s",inst->JFETname,JFETnNames[i]);
case N_DENS:
for (i=0; i < JFETNSRCS; i++) {
(void)sprintf(name,"onoise_%s%s",inst->JFETname,JFETnNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist) return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
/* we've added one more plot */
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist) return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
/* we've added one more plot */
}
break;
case INT_NOIZ:
for (i=0; i < JFETNSRCS; i++) {
(void)sprintf(name,"onoise_total_%s%s",inst->JFETname,JFETnNames[i]);
}
break;
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist) return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
/* we've added one more plot */
case INT_NOIZ:
for (i=0; i < JFETNSRCS; i++) {
(void)sprintf(name,"onoise_total_%s%s",inst->JFETname,JFETnNames[i]);
(void)sprintf(name,"inoise_total_%s%s",inst->JFETname,JFETnNames[i]);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist) return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
/* we've added one more plot */
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist) return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
switch (mode) {
(void)sprintf(name,"inoise_total_%s%s",inst->JFETname,JFETnNames[i]);
case N_DENS:
NevalSrc(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ],
ckt,THERMNOISE,inst->JFETdrainPrimeNode,inst->JFETdrainNode,
model->JFETdrainConduct * inst->JFETarea * inst->JFETm);
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
if (!data->namelist) return(E_NOMEM);
SPfrontEnd->IFnewUid (ckt,
&(data->namelist[data->numPlots++]),
NULL, name, UID_OTHER, NULL);
/* we've added one more plot */
}
break;
}
}
break;
case N_CALC:
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],
ckt,THERMNOISE,inst->JFETsourcePrimeNode,
inst->JFETsourceNode,model->JFETsourceConduct
NevalSrc(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ],
ckt,THERMNOISE,inst->JFETsourcePrimeNode,
inst->JFETsourceNode,model->JFETsourceConduct
* inst->JFETarea * inst->JFETm);
NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ],
ckt,THERMNOISE,inst->JFETdrainPrimeNode,
inst->JFETsourcePrimeNode,
(2.0/3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm))));
NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ],
ckt,THERMNOISE,inst->JFETdrainPrimeNode,
inst->JFETsourcePrimeNode,
(2.0/3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm))));
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;
lnNdens[JFETFLNOIZ] =
log(MAX(noizDens[JFETFLNOIZ],N_MINLOG));
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;
lnNdens[JFETFLNOIZ] =
log(MAX(noizDens[JFETFLNOIZ],N_MINLOG));
noizDens[JFETTOTNOIZ] = noizDens[JFETRDNOIZ] +
noizDens[JFETRSNOIZ] +
noizDens[JFETIDNOIZ] +
noizDens[JFETFLNOIZ];
lnNdens[JFETTOTNOIZ] =
log(MAX(noizDens[JFETTOTNOIZ], N_MINLOG));
noizDens[JFETTOTNOIZ] = noizDens[JFETRDNOIZ] +
noizDens[JFETRSNOIZ] +
noizDens[JFETIDNOIZ] +
noizDens[JFETFLNOIZ];
lnNdens[JFETTOTNOIZ] =
log(MAX(noizDens[JFETTOTNOIZ], N_MINLOG));
*OnDens += noizDens[JFETTOTNOIZ];
*OnDens += noizDens[JFETTOTNOIZ];
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 < JFETNSRCS; i++) {
inst->JFETnVar[LNLSTDENS][i] = lnNdens[i];
}
for (i=0; i < JFETNSRCS; i++) {
inst->JFETnVar[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 < 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++) {
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] = lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if (job->NStpsSm != 0) {
inst->JFETnVar[OUTNOIZ][i] += tempOnoise;
inst->JFETnVar[OUTNOIZ][JFETTOTNOIZ] += tempOnoise;
inst->JFETnVar[INNOIZ][i] += tempInoise;
inst->JFETnVar[INNOIZ][JFETTOTNOIZ] += tempInoise;
if (data->freq == job->NstartFreq) {
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++) {
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] = lnNdens[i];
data->outNoiz += tempOnoise;
data->inNoise += tempInoise;
if (job->NStpsSm != 0) {
inst->JFETnVar[OUTNOIZ][i] += tempOnoise;
inst->JFETnVar[OUTNOIZ][JFETTOTNOIZ] += tempOnoise;
inst->JFETnVar[INNOIZ][i] += tempInoise;
inst->JFETnVar[INNOIZ][JFETTOTNOIZ] += tempInoise;
}
}
}
}
if (data->prtSummary) {
for (i=0; i < JFETNSRCS; i++) { /* print a summary report */
data->outpVector[data->outNumber++] = noizDens[i];
}
}
break;
}
}
}
if (data->prtSummary) {
for (i=0; i < JFETNSRCS; 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 < JFETNSRCS; i++) {
data->outpVector[data->outNumber++] = inst->JFETnVar[OUTNOIZ][i];
data->outpVector[data->outNumber++] = inst->JFETnVar[INNOIZ][i];
}
} /* if */
break;
} /* switch (mode) */
break;
case INT_NOIZ: /* already calculated, just output */
if (job->NStpsSm != 0) {
for (i=0; i < JFETNSRCS; i++) {
data->outpVector[data->outNumber++] = inst->JFETnVar[OUTNOIZ][i];
data->outpVector[data->outNumber++] = inst->JFETnVar[INNOIZ][i];
}
} /* if */
break;
} /* switch (mode) */
break;
case N_CLOSE:
return (OK); /* do nothing, the main calling routine will close */
break; /* the plots */
} /* switch (operation) */
} /* for inst */
case N_CLOSE:
return (OK); /* do nothing, the main calling routine will close */
break; /* the plots */
} /* switch (operation) */
} /* for inst */
} /* for model */
return(OK);

View File

@ -3,8 +3,8 @@ Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1985 Thomas L. Quarles
Modified: 2000 AlansFixes
Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern
Laboratory for Communication Science Engineering
Sydney University Department of Electrical Engineering, Australia
Laboratory for Communication Science Engineering
Sydney University Department of Electrical Engineering, Australia
**********/
#include "ngspice/ngspice.h"
@ -62,25 +62,25 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
if(!model->JFETdepletionCapCoeffGiven) {
model->JFETdepletionCapCoeff = .5;
}
if(!model->JFETfNcoefGiven) {
model->JFETfNcoef = 0;
}
if(!model->JFETfNexpGiven) {
model->JFETfNexp = 1;
}
if(!model->JFETfNcoefGiven) {
model->JFETfNcoef = 0;
}
if(!model->JFETfNexpGiven) {
model->JFETfNexp = 1;
}
/* Modification for Sydney University JFET model */
if(!model->JFETbGiven) {
model->JFETb = 1.0;
}
/* end Sydney University mod */
/* Modification for Sydney University JFET model */
if(!model->JFETbGiven) {
model->JFETb = 1.0;
}
/* end Sydney University mod */
if(!model->JFETtcvGiven) {
model->JFETtcv = 0.0;
}
if(!model->JFETbexGiven) {
model->JFETbex = 0.0;
}
if(!model->JFETtcvGiven) {
model->JFETtcv = 0.0;
}
if(!model->JFETbexGiven) {
model->JFETbex = 0.0;
}
if(model->JFETdrainResist != 0) {
model->JFETdrainConduct = 1/model->JFETdrainResist;
@ -113,8 +113,8 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
here->JFETsourcePrimeNode = tmp->number;
if (ckt->CKTcopyNodesets) {
CKTnode *tmpNode;
IFuid tmpName;
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
@ -135,8 +135,8 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
here->JFETdrainPrimeNode = tmp->number;
if (ckt->CKTcopyNodesets) {
CKTnode *tmpNode;
IFuid tmpName;
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
@ -190,24 +190,24 @@ JFETunsetup(GENmodel *inModel, CKTcircuit *ckt)
JFETinstance *here;
for (model = (JFETmodel *)inModel; model != NULL;
model = model->JFETnextModel)
model = model->JFETnextModel)
{
for (here = model->JFETinstances; here != NULL;
here=here->JFETnextInstance)
{
if (here->JFETsourcePrimeNode
&& here->JFETsourcePrimeNode != here->JFETsourceNode)
{
CKTdltNNum(ckt, here->JFETsourcePrimeNode);
here->JFETsourcePrimeNode = 0;
}
if (here->JFETdrainPrimeNode
&& here->JFETdrainPrimeNode != here->JFETdrainNode)
{
CKTdltNNum(ckt, here->JFETdrainPrimeNode);
here->JFETdrainPrimeNode = 0;
}
}
{
if (here->JFETsourcePrimeNode
&& here->JFETsourcePrimeNode != here->JFETsourceNode)
{
CKTdltNNum(ckt, here->JFETsourcePrimeNode);
here->JFETsourcePrimeNode = 0;
}
if (here->JFETdrainPrimeNode
&& here->JFETdrainPrimeNode != here->JFETdrainNode)
{
CKTdltNNum(ckt, here->JFETdrainPrimeNode);
here->JFETdrainPrimeNode = 0;
}
}
}
return OK;
}