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

Go to the source code of this file.

Functions

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

Variables

static char * BJTnNames [BJTNSRCS]
 

Function Documentation

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

Definition at line 44 of file bjtnoise.c.

52 {
53  Ndata *data = (Ndata*)dataptr;
54  BJTmodel *model = (BJTmodel *) genmodel;
55  BJTinstance *inst;
56  char name[N_MXVLNTH];
57  double tempOnoise;
58  double tempInoise;
59  double noizDens[BJTNSRCS];
60  double lnNdens[BJTNSRCS];
61  int error;
62  int i;
63 
64 
65  if (operation == N_OPEN) {
66 
67  /* see if we have to to produce a summary report
68  * if so, name all the noise generators
69  */
70 
71  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0)
72  return (OK);
73 
74  if (mode == N_DENS) {
75 
76  for ( ; model; model = model->BJTnextModel) {
77  for (inst = model->BJTinstances; inst;
78  inst = inst->BJTnextInstance) {
79 
80  for (i = 0; i < BJTNSRCS; i++) {
81 
82  (void)sprintf(name,"onoise.%s%s",
83  inst->BJTname,BJTnNames[i]);
84 
85  data->namelist = (IFuid *)
86  trealloc((char *)data->namelist,
87  (data->numPlots + 1)*sizeof(IFuid));
88 
89  if (!data->namelist)
90  return (E_NOMEM);
91 
92  (*(SPfrontEnd->IFnewUid))(ckt,
93  &(data->namelist[data->numPlots++]),
94  (IFuid)NULL,name,UID_OTHER,(GENERIC **)NULL);
95  /* we've added one more plot */
96  }
97  }
98  }
99  return (OK);
100  }
101 
102  if (mode == INT_NOIZ) {
103 
104  for ( ; model; model = model->BJTnextModel) {
105  for (inst = model->BJTinstances; inst;
106  inst = inst->BJTnextInstance) {
107 
108  for (i = 0; i < BJTNSRCS; i++) {
109 
110  (void)sprintf(name,"onoise_total.%s%s",
111  inst->BJTname,BJTnNames[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,"inoise_total.%s%s",
126  inst->BJTname,BJTnNames[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->BJTnextModel) {
151  for (inst = model->BJTinstances; inst;
152  inst = inst->BJTnextInstance) {
153 
154  NevalSrc(&noizDens[BJTRCNOIZ],&lnNdens[BJTRCNOIZ],
155  ckt,THERMNOISE,inst->BJTcolPrimeNode,
156  inst->BJTcolNode,
157  model->BJTcollectorConduct * inst->BJTarea);
158 
159  NevalSrc(&noizDens[BJTRBNOIZ],&lnNdens[BJTRBNOIZ],
160  ckt,THERMNOISE,inst->BJTbasePrimeNode,
161  inst->BJTbaseNode,inst->BJTgx);
162 
163  NevalSrc(&noizDens[BJT_RE_NOISE],&lnNdens[BJT_RE_NOISE],
164  ckt,THERMNOISE,inst->BJTemitPrimeNode,
165  inst->BJTemitNode,
166  model->BJTemitterConduct * inst->BJTarea);
167 
168  NevalSrc(&noizDens[BJTICNOIZ],&lnNdens[BJTICNOIZ],
169  ckt,SHOTNOISE,inst->BJTcolPrimeNode,
170  inst->BJTemitPrimeNode,inst->BJTcc);
171 
172  NevalSrc(&noizDens[BJTIBNOIZ],&lnNdens[BJTIBNOIZ],
173  ckt,SHOTNOISE,inst->BJTbasePrimeNode,
174  inst->BJTemitPrimeNode,inst->BJTcb);
175 
176  NevalSrc(&noizDens[BJTFLNOIZ],(double*)NULL,ckt,
177  N_GAIN,inst->BJTbasePrimeNode,
178  inst->BJTemitPrimeNode,(double)0.0);
179 
180  noizDens[BJTFLNOIZ] *= model->BJTfNcoef *
181  exp(model->BJTfNexp *
182  log(MAX(FABS(inst->BJTcb),N_MINLOG))) /
183  data->freq;
184 
185  lnNdens[BJTFLNOIZ] =
186  log(MAX(noizDens[BJTFLNOIZ],N_MINLOG));
187 
188  noizDens[BJTTOTNOIZ] = noizDens[BJTRCNOIZ] +
189  noizDens[BJTRBNOIZ] + noizDens[BJT_RE_NOISE] +
190  noizDens[BJTICNOIZ] + noizDens[BJTIBNOIZ] +
191  noizDens[BJTFLNOIZ];
192 
193  lnNdens[BJTTOTNOIZ] = log(noizDens[BJTTOTNOIZ]);
194 
195  *OnDens += noizDens[BJTTOTNOIZ];
196 
197  if (data->delFreq == 0.0) {
198 
199  /* if we haven't done any previous integration,
200  * we need to initialize our "history" variables
201  */
202 
203  for (i = 0; i < BJTNSRCS; i++) {
204  inst->BJTnVar[LNLSTDENS][i] = lnNdens[i];
205  }
206 
207  /* clear out our integration variables if it's
208  * the first pass
209  */
210 
211  if (data->freq ==
212  ((NOISEAN*)ckt->CKTcurJob)->AC.fstart) {
213 
214  for (i = 0; i < BJTNSRCS; i++) {
215  inst->BJTnVar[OUTNOIZ][i] = 0.0;
216  inst->BJTnVar[INNOIZ][i] = 0.0;
217  }
218  }
219  }
220  else {
221  /* data->delFreq != 0.0 (we have to integrate) */
222 
223  /* In order to get the best curve fit, we have
224  * to integrate each component separately
225  */
226 
227  for (i = 0; i < BJTNSRCS; i++) {
228 
229  if (i != BJTTOTNOIZ) {
230  tempOnoise =
231  Nintegrate(noizDens[i], lnNdens[i],
232  inst->BJTnVar[LNLSTDENS][i], data);
233  tempInoise =
234  Nintegrate(noizDens[i] * data->GainSqInv,
235  lnNdens[i] + data->lnGainInv,
236  inst->BJTnVar[LNLSTDENS][i] +
237  data->lnGainInv,data);
238 
239  inst->BJTnVar[LNLSTDENS][i] = lnNdens[i];
240  data->outNoiz += tempOnoise;
241  data->inNoise += tempInoise;
242 
243  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm
244  != 0) {
245 
246  inst->BJTnVar[OUTNOIZ][i] += tempOnoise;
247  inst->BJTnVar[OUTNOIZ][BJTTOTNOIZ] +=
248  tempOnoise;
249  inst->BJTnVar[INNOIZ][i] += tempInoise;
250  inst->BJTnVar[INNOIZ][BJTTOTNOIZ] +=
251  tempInoise;
252  }
253  }
254  }
255  }
256  if (data->prtSummary) {
257  for (i = 0; i < BJTNSRCS; i++) {
258  /* print a summary report */
259  data->outpVector[data->outNumber++] =
260  noizDens[i];
261  }
262  }
263  }
264  }
265  return (OK);
266  }
267 
268  if (mode == INT_NOIZ) {
269 
270  /* already calculated, just output */
271 
272  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0)
273  return (OK);
274 
275  for ( ; model; model = model->BJTnextModel) {
276  for (inst = model->BJTinstances; inst;
277  inst = inst->BJTnextInstance) {
278 
279  for (i = 0; i < BJTNSRCS; i++) {
280  data->outpVector[data->outNumber++] =
281  inst->BJTnVar[OUTNOIZ][i];
282  data->outpVector[data->outNumber++] =
283  inst->BJTnVar[INNOIZ][i];
284  }
285  }
286  }
287  }
288  }
289 
290  return (OK);
291 }
#define N_MXVLNTH
Definition: noisedef.h:124
BJTinstance * BJTinstances
Definition: bjtdefs.h:259
#define N_GAIN
Definition: noisedef.h:90
int BJTemitPrimeNode
Definition: bjtdefs.h:30
double BJTcc
Definition: bjtdefs.h:54
#define N_OPEN
Definition: noisedef.h:85
double * outpVector
Definition: noisedef.h:33
struct sBJTmodel * BJTnextModel
Definition: bjtdefs.h:257
Definition: cddefs.h:119
int IFnewUid()
#define MAX(a, b)
Definition: spdefs.h:135
#define LNLSTDENS
Definition: noisedef.h:62
#define BJTRCNOIZ
Definition: bjtdefs.h:210
if(TDesc==NULL)
Definition: cd.c:1326
IFuid * namelist
Definition: noisedef.h:35
double BJTarea
Definition: bjtdefs.h:32
double BJTcollectorConduct
Definition: bjtdefs.h:310
void NevalSrc()
#define BJT_RE_NOISE
Definition: bjtdefs.h:212
IFfrontEnd * SPfrontEnd
Definition: main.c:917
#define BJTRBNOIZ
Definition: bjtdefs.h:211
IFuid BJTname
Definition: bjtdefs.h:22
double BJTnVar[NSTATVARS][BJTNSRCS]
Definition: bjtdefs.h:221
int BJTbasePrimeNode
Definition: bjtdefs.h:29
double lnGainInv
Definition: noisedef.h:25
#define INNOIZ
Definition: noisedef.h:64
struct sBJTinstance * BJTnextInstance
Definition: bjtdefs.h:20
#define N_MINLOG
Definition: noisedef.h:95
double BJTfNcoef
Definition: bjtdefs.h:303
#define OK
Definition: iferrmsg.h:17
GENERIC * IFuid
Definition: ifsim.h:72
unsigned int prtSummary
Definition: noisedef.h:32
int BJTcolPrimeNode
Definition: bjtdefs.h:28
#define NULL
Definition: spdefs.h:121
#define INT_NOIZ
Definition: noisedef.h:84
#define E_NOMEM
Definition: iferrmsg.h:27
#define N_DENS
Definition: noisedef.h:83
double Nintegrate()
#define SHOTNOISE
Definition: noisedef.h:88
int BJTbaseNode
Definition: bjtdefs.h:25
#define BJTTOTNOIZ
Definition: bjtdefs.h:216
double GainSqInv
Definition: noisedef.h:24
static char model[32]
Definition: subckt.c:76
double BJTfNexp
Definition: bjtdefs.h:304
#define FABS(a)
Definition: util.h:41
int outNumber
Definition: noisedef.h:29
return(True)
#define THERMNOISE
Definition: noisedef.h:89
#define BJTNSRCS
Definition: bjtdefs.h:218
#define UID_OTHER
Definition: ifsim.h:85
int numPlots
Definition: noisedef.h:30
double BJTemitterConduct
Definition: bjtdefs.h:311
#define BJTIBNOIZ
Definition: bjtdefs.h:214
static char * BJTnNames[BJTNSRCS]
Definition: bjtnoise.c:28
#define BJTFLNOIZ
Definition: bjtdefs.h:215
double delFreq
Definition: noisedef.h:21
double outNoiz
Definition: noisedef.h:22
double inNoise
Definition: noisedef.h:23
double BJTcb
Definition: bjtdefs.h:55
#define BJTICNOIZ
Definition: bjtdefs.h:213
double freq
Definition: noisedef.h:19
#define N_CALC
Definition: noisedef.h:86
JOB * CKTcurJob
Definition: cktdefs.h:216
int BJTcolNode
Definition: bjtdefs.h:24
#define OUTNOIZ
Definition: noisedef.h:63
char * trealloc()
int BJTemitNode
Definition: bjtdefs.h:26
char GENERIC
Definition: ifsim.h:27
double BJTgx
Definition: bjtdefs.h:60
Definition: noisedef.h:18

Variable Documentation

char* BJTnNames[BJTNSRCS]
static
Initial value:
= {
".rc",
".rb",
".re",
".ic",
".ib",
".1overf",
""
}

Definition at line 28 of file bjtnoise.c.