Jspice3
Main Page
Data Structures
Files
File List
Globals
swnoise.c
Go to the documentation of this file.
1
/***************************************************************************
2
JSPICE3 adaptation of Spice3e2 - Copyright (c) Stephen R. Whiteley 1992
3
Copyright 1990 Regents of the University of California. All rights reserved.
4
Authors: 1987 Gary W. Ng
5
1992 Stephen R. Whiteley
6
****************************************************************************/
7
8
#include "
spice.h
"
9
#include <stdio.h>
10
#include <math.h>
11
#include "
swdefs.h
"
12
#include "
noisedef.h
"
13
#include "
fteconst.h
"
14
#include "
iferrmsg.h
"
15
#include "
util.h
"
16
17
/*
18
* SWnoise (mode, operation, firstModel, ckt, data, OnDens)
19
* This routine names and evaluates all of the noise sources
20
* associated with voltage- controlled switches. It starts with the
21
* model *firstModel and traverses all of its instances. It then
22
* proceeds to any other models on the linked list. The total output
23
* noise density generated by the SW's is summed in the variable
24
* "OnDens".
25
*/
26
27
28
int
29
SWnoise
(mode, operation, genmodel, ckt, dataptr, OnDens)
30
31
int mode;
32
int
operation;
33
GENmodel
*genmodel;
34
CKTcircuit
*ckt;
35
GENERIC
*dataptr;
36
double
*OnDens;
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
}
N_MXVLNTH
#define N_MXVLNTH
Definition:
noisedef.h:124
N_OPEN
#define N_OPEN
Definition:
noisedef.h:85
Ndata::outpVector
double * outpVector
Definition:
noisedef.h:33
LNLSTDENS
#define LNLSTDENS
Definition:
noisedef.h:62
CKTcircuit
Definition:
cktdefs.h:62
Ndata::namelist
IFuid * namelist
Definition:
noisedef.h:35
sSWinstance
Definition:
swdefs.h:18
NevalSrc
void NevalSrc()
SPfrontEnd
IFfrontEnd * SPfrontEnd
Definition:
main.c:917
noisedef.h
sSWinstance::SWnegNode
int SWnegNode
Definition:
swdefs.h:26
Ndata::lnGainInv
double lnGainInv
Definition:
noisedef.h:25
swdefs.h
INNOIZ
#define INNOIZ
Definition:
noisedef.h:64
OK
#define OK
Definition:
iferrmsg.h:17
SWnoise
int SWnoise(int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, GENERIC *dataptr, double *OnDens)
Definition:
swnoise.c:29
IFuid
GENERIC * IFuid
Definition:
ifsim.h:72
sSWmodel
Definition:
swdefs.h:58
Ndata::prtSummary
unsigned int prtSummary
Definition:
noisedef.h:32
NULL
#define NULL
Definition:
spdefs.h:121
sSWinstance::SWnVar
double SWnVar[NSTATVARS]
Definition:
swdefs.h:45
INT_NOIZ
#define INT_NOIZ
Definition:
noisedef.h:84
NOISEAN
Definition:
noisedef.h:41
E_NOMEM
#define E_NOMEM
Definition:
iferrmsg.h:27
N_DENS
#define N_DENS
Definition:
noisedef.h:83
sSWmodel::SWonConduct
double SWonConduct
Definition:
swdefs.h:72
sSWinstance::SWnextInstance
struct sSWinstance * SWnextInstance
Definition:
swdefs.h:20
sSWinstance::SWstate
int SWstate
Definition:
swdefs.h:23
util.h
Nintegrate
double Nintegrate()
fteconst.h
spice.h
iferrmsg.h
sGENmodel
Definition:
gendefs.h:39
Ndata::GainSqInv
double GainSqInv
Definition:
noisedef.h:24
model
static char model[32]
Definition:
subckt.c:76
Ndata::outNumber
int outNumber
Definition:
noisedef.h:29
THERMNOISE
#define THERMNOISE
Definition:
noisedef.h:89
sSWmodel::SWinstances
SWinstance * SWinstances
Definition:
swdefs.h:62
UID_OTHER
#define UID_OTHER
Definition:
ifsim.h:85
Ndata::numPlots
int numPlots
Definition:
noisedef.h:30
sSWinstance::SWname
IFuid SWname
Definition:
swdefs.h:22
sSWmodel::SWoffConduct
double SWoffConduct
Definition:
swdefs.h:73
Ndata::delFreq
double delFreq
Definition:
noisedef.h:21
Ndata::outNoiz
double outNoiz
Definition:
noisedef.h:22
sSWinstance::SWposNode
int SWposNode
Definition:
swdefs.h:25
Ndata::inNoise
double inNoise
Definition:
noisedef.h:23
sSWmodel::SWnextModel
struct sSWmodel * SWnextModel
Definition:
swdefs.h:60
Ndata::freq
double freq
Definition:
noisedef.h:19
N_CALC
#define N_CALC
Definition:
noisedef.h:86
CKTcircuit::CKTcurJob
JOB * CKTcurJob
Definition:
cktdefs.h:216
OUTNOIZ
#define OUTNOIZ
Definition:
noisedef.h:63
trealloc
char * trealloc()
GENERIC
char GENERIC
Definition:
ifsim.h:27
Ndata
Definition:
noisedef.h:18
src
lib
dev
sw
swnoise.c
Generated by
1.8.11