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

Go to the source code of this file.

Functions

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

Function Documentation

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

Definition at line 29 of file swnoise.c.

37 {
38  Ndata *data = (Ndata*)dataptr;
39  SWmodel *model = (SWmodel *) genmodel;
40  SWinstance *inst;
41  char name[N_MXVLNTH];
42  double tempOutNoise;
43  double tempInNoise;
44  double noizDens;
45  double lnNdens;
46  int error;
47  int current_state;
48 
49 
50  if (operation == N_OPEN) {
51 
52  /* see if we have to to produce a summary report
53  * if so, name the noise generator
54  */
55 
56  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0)
57  return (OK);
58 
59  if (mode == N_DENS) {
60 
61  for ( ; model; model = model->SWnextModel) {
62 
63  for (inst = model->SWinstances; inst != NULL;
64  inst = inst->SWnextInstance) {
65 
66  (void)sprintf(name,"onoise.%s",inst->SWname);
67 
68  data->namelist = (IFuid *)
69  trealloc((char *)data->namelist,
70  (data->numPlots + 1)*sizeof(IFuid));
71 
72  if (!data->namelist)
73  return (E_NOMEM);
74 
75  (*(SPfrontEnd->IFnewUid))(ckt,
76  &(data->namelist[data->numPlots++]),
77  (IFuid)NULL,name,UID_OTHER,(GENERIC **)NULL);
78  /* we've added one more plot */
79  }
80  }
81  return (OK);
82  }
83 
84  if (mode == INT_NOIZ) {
85 
86  for ( ; model; model = model->SWnextModel) {
87 
88  for (inst = model->SWinstances; inst != NULL;
89  inst = inst->SWnextInstance) {
90 
91  (void)sprintf(name,"onoise_total.%s",inst->SWname);
92 
93  data->namelist = (IFuid *)
94  trealloc((char *)data->namelist,
95  (data->numPlots + 1)*sizeof(IFuid));
96 
97  if (!data->namelist)
98  return (E_NOMEM);
99 
100  (*(SPfrontEnd->IFnewUid))(ckt,
101  &(data->namelist[data->numPlots++]),
102  (IFuid)NULL,name,UID_OTHER,(GENERIC **)NULL);
103  /* we've added one more plot */
104 
105  (void)sprintf(name,"inoise_total.%s",inst->SWname);
106  data->namelist = (IFuid *)
107  trealloc((char *)data->namelist,
108  (data->numPlots + 1)*sizeof(IFuid));
109 
110  if (!data->namelist)
111  return (E_NOMEM);
112 
113  (*(SPfrontEnd->IFnewUid))(ckt,
114  &(data->namelist[data->numPlots++]),
115  (IFuid)NULL,name,UID_OTHER,(GENERIC **)NULL);
116  /* we've added one more plot */
117  }
118  }
119  }
120  return (OK);
121  }
122 
123  if (operation == N_CALC) {
124 
125  if (mode == N_DENS) {
126 
127  for ( ; model; model = model->SWnextModel) {
128 
129  for (inst = model->SWinstances; inst != NULL;
130  inst = inst->SWnextInstance) {
131 
132  current_state = *(ckt->CKTstate0 + inst->SWstate);
133 
134  NevalSrc(&noizDens,&lnNdens,ckt,THERMNOISE,
135  inst->SWposNode,inst->SWnegNode,
136  current_state ?
137  (model->SWonConduct):(model->SWoffConduct));
138 
139  *OnDens += noizDens;
140 
141  if (data->delFreq == 0.0) {
142 
143  /* if we haven't done any previous
144  * integration, we need to initialize our
145  * "history" variables
146  */
147 
148  inst->SWnVar[LNLSTDENS] = lnNdens;
149 
150  /* clear out our integration variable if
151  * it's the first pass
152  */
153 
154  if (data->freq ==
155  ((NOISEAN*)ckt->CKTcurJob)->AC.fstart) {
156  inst->SWnVar[OUTNOIZ] = 0.0;
157  }
158  }
159  else {
160  /* data->delFreq != 0.0
161  * (we have to integrate)
162  */
163  tempOutNoise = Nintegrate(noizDens, lnNdens,
164  inst->SWnVar[LNLSTDENS], data);
165  tempInNoise = Nintegrate(noizDens * data->GainSqInv,
166  lnNdens + data->lnGainInv,
167  inst->SWnVar[LNLSTDENS] + data->lnGainInv,data);
168  inst->SWnVar[OUTNOIZ] += tempOutNoise;
169  inst->SWnVar[INNOIZ] += tempInNoise;
170  data->outNoiz += tempOutNoise;
171  data->inNoise += tempInNoise;
172  inst->SWnVar[LNLSTDENS] = lnNdens;
173  }
174  if (data->prtSummary) {
175  data->outpVector[data->outNumber++] = noizDens;
176  }
177  }
178  }
179  return (OK);
180  }
181 
182  if (mode == INT_NOIZ) {
183  /* already calculated, just output */
184 
185  if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm == 0)
186  return (OK);
187 
188  for ( ; model; model = model->SWnextModel) {
189 
190  for (inst = model->SWinstances; inst != NULL;
191  inst = inst->SWnextInstance) {
192 
193  data->outpVector[data->outNumber++] =
194  inst->SWnVar[OUTNOIZ];
195  data->outpVector[data->outNumber++] =
196  inst->SWnVar[INNOIZ];
197  }
198  }
199  }
200  }
201 
202  return (OK);
203 }
#define N_MXVLNTH
Definition: noisedef.h:124
#define N_OPEN
Definition: noisedef.h:85
double * outpVector
Definition: noisedef.h:33
Definition: cddefs.h:119
int IFnewUid()
#define LNLSTDENS
Definition: noisedef.h:62
if(TDesc==NULL)
Definition: cd.c:1326
IFuid * namelist
Definition: noisedef.h:35
void NevalSrc()
IFfrontEnd * SPfrontEnd
Definition: main.c:917
int SWnegNode
Definition: swdefs.h:26
double lnGainInv
Definition: noisedef.h:25
#define INNOIZ
Definition: noisedef.h:64
#define OK
Definition: iferrmsg.h:17
GENERIC * IFuid
Definition: ifsim.h:72
unsigned int prtSummary
Definition: noisedef.h:32
#define NULL
Definition: spdefs.h:121
double SWnVar[NSTATVARS]
Definition: swdefs.h:45
#define INT_NOIZ
Definition: noisedef.h:84
#define E_NOMEM
Definition: iferrmsg.h:27
#define N_DENS
Definition: noisedef.h:83
double SWonConduct
Definition: swdefs.h:72
struct sSWinstance * SWnextInstance
Definition: swdefs.h:20
int SWstate
Definition: swdefs.h:23
double Nintegrate()
double GainSqInv
Definition: noisedef.h:24
static char model[32]
Definition: subckt.c:76
int outNumber
Definition: noisedef.h:29
return(True)
#define THERMNOISE
Definition: noisedef.h:89
SWinstance * SWinstances
Definition: swdefs.h:62
#define UID_OTHER
Definition: ifsim.h:85
int numPlots
Definition: noisedef.h:30
IFuid SWname
Definition: swdefs.h:22
double SWoffConduct
Definition: swdefs.h:73
double delFreq
Definition: noisedef.h:21
double outNoiz
Definition: noisedef.h:22
int SWposNode
Definition: swdefs.h:25
double inNoise
Definition: noisedef.h:23
struct sSWmodel * SWnextModel
Definition: swdefs.h:60
double freq
Definition: noisedef.h:19
#define N_CALC
Definition: noisedef.h:86
JOB * CKTcurJob
Definition: cktdefs.h:216
#define OUTNOIZ
Definition: noisedef.h:63
char * trealloc()
char GENERIC
Definition: ifsim.h:27
Definition: noisedef.h:18