Jspice3
jfetnoi.c File Reference
#include "spice.h"
#include <stdio.h>
#include <math.h>
#include "jfetdefs.h"
#include "noisedef.h"
#include "fteconst.h"
#include "iferrmsg.h"
#include "util.h"
Include dependency graph for jfetnoi.c:

Go to the source code of this file.

Functions

int JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, GENERIC *dataptr, double *OnDens)
 

Variables

static char * JFETnNames [JFETNSRCS]
 

Function Documentation

int JFETnoise ( int  mode,
int  operation,
GENmodel genmodel,
CKTcircuit ckt,
GENERIC dataptr,
double *  OnDens 
)

Definition at line 46 of file jfetnoi.c.

54 {
55  Ndata *data = (Ndata*)dataptr;
56  JFETmodel *model = (JFETmodel *) genmodel;
57  JFETinstance *inst;
58  char name[N_MXVLNTH];
59  double tempOnoise;
60  double tempInoise;
61  double noizDens[JFETNSRCS];
62  double lnNdens[JFETNSRCS];
63  int error;
64  int i;
65 
66 
67  if (operation == N_OPEN) {
68 
69  /* see if we have to to produce a summary report
70  * if so, name all the noise generators
71  */
72 
73  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0)
74  return (OK);
75 
76  if (mode == N_DENS) {
77 
78  for ( ; model; model = model->JFETnextModel) {
79  for (inst = model->JFETinstances; inst;
80  inst = inst->JFETnextInstance) {
81 
82  for (i = 0; i < JFETNSRCS; i++) {
83  (void)sprintf(name,
84  "onoise.%s%s",inst->JFETname,JFETnNames[i]);
85 
86  data->namelist = (IFuid *)
87  trealloc((char *)data->namelist,
88  (data->numPlots + 1)*sizeof(IFuid));
89 
90  if (!data->namelist)
91  return (E_NOMEM);
92 
93  (*(SPfrontEnd->IFnewUid))(ckt,
94  &(data->namelist[data->numPlots++]),
95  (IFuid)NULL,name,UID_OTHER,(GENERIC **)NULL);
96  /* we've added one more plot */
97  }
98  }
99  }
100  return (OK);
101  }
102 
103  if (mode == INT_NOIZ) {
104 
105  for ( ; model; model = model->JFETnextModel) {
106  for (inst = model->JFETinstances; inst;
107  inst = inst->JFETnextInstance) {
108 
109  for (i = 0; i < JFETNSRCS; i++) {
110  (void)sprintf(name,
111  "onoise_total.%s%s",inst->JFETname,JFETnNames[i]);
112 
113  data->namelist = (IFuid *)
114  trealloc((char *)data->namelist,
115  (data->numPlots + 1)*sizeof(IFuid));
116 
117  if (!data->namelist)
118  return (E_NOMEM);
119 
120  (*(SPfrontEnd->IFnewUid))(ckt,
121  &(data->namelist[data->numPlots++]),
122  (IFuid)NULL,name,UID_OTHER,(GENERIC **)NULL);
123  /* we've added one more plot */
124 
125  (void)sprintf(name,
126  "inoise_total.%s%s",inst->JFETname,JFETnNames[i]);
127 
128  data->namelist = (IFuid *)
129  trealloc((char *)data->namelist,
130  (data->numPlots + 1)*sizeof(IFuid));
131 
132  if (!data->namelist)
133  return (E_NOMEM);
134 
135  (*(SPfrontEnd->IFnewUid))(ckt,
136  &(data->namelist[data->numPlots++]),
137  (IFuid)NULL,name,UID_OTHER,(GENERIC **)NULL);
138  /* we've added one more plot */
139  }
140  }
141  }
142  }
143  return (OK);
144  }
145 
146  if (operation == N_CALC) {
147 
148  if (mode == N_DENS) {
149 
150  for ( ; model; model = model->JFETnextModel) {
151  for (inst = model->JFETinstances; inst;
152  inst = inst->JFETnextInstance) {
153 
154  NevalSrc(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ],
155  ckt,THERMNOISE,inst->JFETdrainPrimeNode,
156  inst->JFETdrainNode,
157  model->JFETdrainConduct * inst->JFETarea);
158 
159  NevalSrc(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ],
161  inst->JFETsourceNode,
162  model->JFETsourceConduct*inst->JFETarea);
163 
164  NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ],
165  ckt,THERMNOISE,inst->JFETdrainPrimeNode,
166  inst->JFETsourcePrimeNode,
167  (2.0/3.0 * FABS(*(ckt->CKTstate0 + inst->JFETgm))));
168 
169  NevalSrc(&noizDens[JFETFLNOIZ],(double*)NULL,ckt,
171  inst->JFETsourcePrimeNode, (double)0.0);
172 
173  noizDens[JFETFLNOIZ] *= model->JFETfNcoef *
174  exp(model->JFETfNexp *
175  log(MAX(FABS(*(ckt->CKTstate0 + inst->JFETcd)),
176  N_MINLOG))) / data->freq;
177 
178  lnNdens[JFETFLNOIZ] =
179  log(MAX(noizDens[JFETFLNOIZ],N_MINLOG));
180 
181  noizDens[JFETTOTNOIZ] = noizDens[JFETRDNOIZ] +
182  noizDens[JFETRSNOIZ] + noizDens[JFETIDNOIZ] +
183  noizDens[JFETFLNOIZ];
184 
185  lnNdens[JFETTOTNOIZ] =
186  log(MAX(noizDens[JFETTOTNOIZ], N_MINLOG));
187 
188  *OnDens += noizDens[JFETTOTNOIZ];
189 
190  if (data->delFreq == 0.0) {
191 
192  /* if we haven't done any previous integration,
193  * we need to initialize our "history" variables
194  */
195 
196  for (i = 0; i < JFETNSRCS; i++) {
197  inst->JFETnVar[LNLSTDENS][i] = lnNdens[i];
198  }
199 
200  /* clear out our integration variables if it's the
201  * first pass
202  */
203 
204  if (data->freq ==
205  ((NOISEAN*)ckt->CKTcurJob)->AC.fstart) {
206 
207  for (i = 0; i < JFETNSRCS; i++) {
208  inst->JFETnVar[OUTNOIZ][i] = 0.0;
209  inst->JFETnVar[INNOIZ][i] = 0.0;
210  }
211  }
212  }
213  else {
214  /* data->delFreq != 0.0 (we have to integrate) */
215 
216  for (i = 0; i < JFETNSRCS; i++) {
217  if (i != JFETTOTNOIZ) {
218  tempOnoise =
219  Nintegrate(noizDens[i], lnNdens[i],
220  inst->JFETnVar[LNLSTDENS][i], data);
221  tempInoise =
222  Nintegrate(noizDens[i] * data->GainSqInv,
223  lnNdens[i] + data->lnGainInv,
224  inst->JFETnVar[LNLSTDENS][i] +
225  data->lnGainInv,data);
226  inst->JFETnVar[LNLSTDENS][i] = lnNdens[i];
227  data->outNoiz += tempOnoise;
228  data->inNoise += tempInoise;
229  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm
230  != 0) {
231  inst->JFETnVar[OUTNOIZ][i] += tempOnoise;
232  inst->JFETnVar[OUTNOIZ][JFETTOTNOIZ] +=
233  tempOnoise;
234  inst->JFETnVar[INNOIZ][i] += tempInoise;
235  inst->JFETnVar[INNOIZ][JFETTOTNOIZ] +=
236  tempInoise;
237  }
238  }
239  }
240  }
241  if (data->prtSummary) {
242  /* print a summary report */
243  for (i = 0; i < JFETNSRCS; i++) {
244  data->outpVector[data->outNumber++] =
245  noizDens[i];
246  }
247  }
248  }
249  }
250  return (OK);
251  }
252 
253  if (mode == INT_NOIZ) {
254 
255  /* already calculated, just output */
256  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0)
257  return (OK);
258 
259  for ( ; model; model = model->JFETnextModel) {
260  for (inst = model->JFETinstances; inst;
261  inst = inst->JFETnextInstance) {
262 
263  for (i = 0; i < JFETNSRCS; i++) {
264  data->outpVector[data->outNumber++] =
265  inst->JFETnVar[OUTNOIZ][i];
266  data->outpVector[data->outNumber++] =
267  inst->JFETnVar[INNOIZ][i];
268  }
269  }
270  }
271  }
272  }
273 
274  return (OK);
275 }
#define N_MXVLNTH
Definition: noisedef.h:124
#define N_GAIN
Definition: noisedef.h:90
#define N_OPEN
Definition: noisedef.h:85
double JFETnVar[NSTATVARS][JFETNSRCS]
Definition: jfetdefs.h:122
double * outpVector
Definition: noisedef.h:33
Definition: cddefs.h:119
int IFnewUid()
#define MAX(a, b)
Definition: spdefs.h:135
#define LNLSTDENS
Definition: noisedef.h:62
if(TDesc==NULL)
Definition: cd.c:1326
IFuid * namelist
Definition: noisedef.h:35
void NevalSrc()
double JFETdrainConduct
Definition: jfetdefs.h:188
IFfrontEnd * SPfrontEnd
Definition: main.c:917
int JFETdrainPrimeNode
Definition: jfetdefs.h:32
JFETinstance * JFETinstances
Definition: jfetdefs.h:169
double lnGainInv
Definition: noisedef.h:25
#define JFETIDNOIZ
Definition: jfetdefs.h:115
#define INNOIZ
Definition: noisedef.h:64
#define JFETTOTNOIZ
Definition: jfetdefs.h:117
double JFETarea
Definition: jfetdefs.h:134
#define N_MINLOG
Definition: noisedef.h:95
#define OK
Definition: iferrmsg.h:17
GENERIC * IFuid
Definition: ifsim.h:72
double JFETfNexp
Definition: jfetdefs.h:185
unsigned int prtSummary
Definition: noisedef.h:32
#define NULL
Definition: spdefs.h:121
#define INT_NOIZ
Definition: noisedef.h:84
double JFETsourceConduct
Definition: jfetdefs.h:189
#define E_NOMEM
Definition: iferrmsg.h:27
#define N_DENS
Definition: noisedef.h:83
double Nintegrate()
#define JFETRDNOIZ
Definition: jfetdefs.h:113
struct sJFETmodel * JFETnextModel
Definition: jfetdefs.h:167
double GainSqInv
Definition: noisedef.h:24
static char model[32]
Definition: subckt.c:76
int JFETdrainNode
Definition: jfetdefs.h:29
#define FABS(a)
Definition: util.h:41
double JFETfNcoef
Definition: jfetdefs.h:184
int outNumber
Definition: noisedef.h:29
return(True)
#define THERMNOISE
Definition: noisedef.h:89
struct sJFETinstance * JFETnextInstance
Definition: jfetdefs.h:25
#define UID_OTHER
Definition: ifsim.h:85
int numPlots
Definition: noisedef.h:30
int JFETsourcePrimeNode
Definition: jfetdefs.h:33
#define JFETFLNOIZ
Definition: jfetdefs.h:116
#define JFETRSNOIZ
Definition: jfetdefs.h:114
double delFreq
Definition: noisedef.h:21
double outNoiz
Definition: noisedef.h:22
double inNoise
Definition: noisedef.h:23
double freq
Definition: noisedef.h:19
#define N_CALC
Definition: noisedef.h:86
int JFETsourceNode
Definition: jfetdefs.h:31
JOB * CKTcurJob
Definition: cktdefs.h:216
#define OUTNOIZ
Definition: noisedef.h:63
char * trealloc()
#define JFETNSRCS
Definition: jfetdefs.h:119
static char * JFETnNames[JFETNSRCS]
Definition: jfetnoi.c:32
IFuid JFETname
Definition: jfetdefs.h:27
char GENERIC
Definition: ifsim.h:27
Definition: noisedef.h:18

Variable Documentation

char* JFETnNames[JFETNSRCS]
static
Initial value:
= {
".rd",
".rs",
".id",
".1overf",
""
}

Definition at line 32 of file jfetnoi.c.