Jspice3
senssgen.c
Go to the documentation of this file.
1 /***************************************************************************
2 JSPICE3 adaptation of Spice3f2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California. All rights reserved.
4 Authors: UCB CAD Group
5  1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #include "spice.h"
9 #include <stdio.h>
10 #include "util.h"
11 #include "devdefs.h"
12 #include "sensgen.h"
13 #include "uflags.h"
14 
15 char *Sfilter = NULL;
16 extern SPICEdev *DEVices[];
17 
18 #ifdef __STDC__
19 static int set_inst(sgen*);
20 static int set_model(sgen*);
21 static int set_dev(sgen*);
22 static int set_param(sgen*);
23 #else
24 static int set_inst();
25 static int set_model();
26 static int set_dev();
27 static int set_param();
28 #endif
29 
30 
31 sgen *
32 sgen_init(ckt, is_dc)
33 
34 CKTcircuit *ckt;
35 int is_dc;
36 {
37  sgen *sg;
38 
39  sg = NEW(sgen);
40  sg->param = 99999;
41  sg->is_instparam = 0;
42  sg->dev = -1;
43  sg->istate = 0;
44  sg->ckt = ckt;
45  sg->devlist = ckt->CKThead;
46  sg->instance = sg->first_instance = sg->next_instance = NULL;
47  sg->model = sg->next_model = NULL;
48  sg->ptable = NULL;
49  sg->is_dc = is_dc;
50  sg->is_principle = 0;
51  sg->is_q = 0;
52  sg->is_zerook = 0;
53  sg->value = 0.0;
54 
55  sgen_next(&sg); /* get the ball rolling XXX check return val? */
56 
57  return sg;
58 }
59 
60 
61 int
63 
64 sgen **xsg;
65 {
66  sgen *sg = *xsg;
67  int good, done;
68  int i;
69 
70  done = 0;
71  i = sg->dev;
72 
73  do {
74  if (sg->instance) {
75  if (sg->ptable) {
76  do {
77  sg->param += 1;
78  }
79  while (sg->param < sg->max_param
80  && !set_param(sg));
81  }
82  else {
83  sg->max_param = -1;
84  }
85 
86  if (sg->param < sg->max_param) {
87  done = 1;
88  }
89  else if (!sg->is_instparam) {
90  /* Try instance parameters now */
91  sg->is_instparam = 1;
92  sg->param = -1;
93  sg->max_param =
94  *DEVices[i]->DEVpublic.numInstanceParms;
95  sg->ptable =
96  DEVices[i]->DEVpublic.instanceParms;
97  }
98  else {
99  sg->is_principle = 0;
101  sg->next_instance;
102  sg->instance->GENstate = sg->istate;
103  sg->instance = NULL;
104  }
105 
106  }
107  else if (sg->model) {
108 
109  /* Find the first/next good instance for this model */
110  for (good = 0; !good && sg->next_instance;
111  good = set_inst(sg))
112  {
113  sg->instance = sg->next_instance;
114  sg->next_instance =
116  }
117 
118 
119  if (good) {
120  sg->is_principle = 0;
121  sg->istate = sg->instance->GENstate;
123  sg->model->GENinstances = sg->instance;
124  if (DEVices[i]->DEVpublic.modelParms) {
125  sg->max_param =
126  *DEVices[i]->DEVpublic.
127  numModelParms;
128  sg->ptable =
129  DEVices[i]->DEVpublic.
130  modelParms;
131  } else {
132  sg->ptable = NULL;
133  }
134  sg->param = -1;
135  sg->is_instparam = 0;
136  }
137  else {
138  /* No good instances of this model */
139  sg->model->GENinstances = sg->first_instance;
140  sg->model->GENnextModel = sg->next_model;
141  sg->model = NULL;
142  }
143 
144  }
145  else if (i >= 0) {
146 
147  /* Find the first/next good model for this device */
148  for (good = 0; !good && sg->next_model;
149  good = set_inst(sg))
150  {
151  sg->model = sg->next_model;
152  sg->next_model = sg->model->GENnextModel;
153  }
154 
155  if (good) {
156  sg->model->GENnextModel = NULL;
157  sg->devlist[i] = sg->model;
158  if (DEVices[i]->DEVpublic.modelParms) {
159  sg->max_param =
160  *DEVices[i]->DEVpublic.
161  numModelParms;
162  sg->ptable =
163  DEVices[i]->DEVpublic.
164  modelParms;
165  } else {
166  sg->ptable = NULL;
167  }
168  sg->next_instance = sg->first_instance
169  = sg->model->GENinstances;
170  }
171  else {
172  /* No more good models for this device */
173  sg->devlist[i] = sg->first_model;
174  i = -1; /* Try the next good device */
175  }
176 
177  }
178  else if (i < DEVmaxnum && sg->dev < DEVmaxnum) {
179 
180  /* Find the next good device in this circuit */
181 
182  do
183  sg->dev++;
184  while (sg->dev < DEVmaxnum && sg->devlist[sg->dev]
185  && !set_dev(sg));
186 
187  i = sg->dev;
188 
189  if (i > DEVmaxnum)
190  done = 1;
191  sg->first_model = sg->next_model = sg->devlist[i];
192 
193  }
194  else {
195  done = 1;
196  }
197 
198  } while (!done);
199 
200  if (sg->dev >= DEVmaxnum) {
201  FREE(sg);
202  *xsg = NULL;
203  }
204  return 1;
205 }
206 
207 
208 /* ARGSUSED */
209 static int
211 
212 sgen *sg;
213 {
214  return (1);
215 }
216 
217 
218 /* ARGSUSED */
219 static int
221 
222 sgen *sg;
223 {
224  return (1);
225 }
226 
227 
228 /* ARGSUSED */
229 static int
231 
232 sgen *sg;
233 {
234  return (1);
235 }
236 
237 
238 static int
240 
241 sgen *sg;
242 {
243  IFvalue ifval;
244 
245  if (!sg->ptable[sg->param].keyword)
246  return 0;
247  if (Sfilter && strncmp(sg->ptable[sg->param].keyword, Sfilter,
248  strlen(Sfilter)))
249  return 0;
250  if ((sg->ptable[sg->param].dataType &
252  != (IF_SET|IF_ASK|IF_REAL))
253  return 0;
254  if (sg->is_dc &&
255  (sg->ptable[sg->param].dataType & (IF_AC | IF_AC_ONLY)))
256  return 0;
257  if ((sg->ptable[sg->param].dataType & IF_CHKQUERY) && !sg->is_q)
258  return 0;
259 
260  if (sens_getp(sg, sg->ckt, &ifval))
261  return 0;
262 
263  if (FABS(ifval.rValue) < 1e-30) {
264  if (sg->ptable[sg->param].dataType & IF_SETQUERY)
265  sg->is_q = 0;
266 
267  if (!sg->is_zerook
268  && !(sg->ptable[sg->param].dataType & IF_PRINCIPAL))
269  return 0;
270 
271  }
272  else if (sg->ptable[sg->param].dataType & (IF_SETQUERY|IF_ORQUERY))
273  sg->is_q = 1;
274 
275  if (sg->ptable[sg->param].dataType & IF_PRINCIPAL)
276  sg->is_principle += 1;
277 
278  sg->value = ifval.rValue;
279 
280  return 1;
281 }
282 
283 
284 #ifdef notdef
285 void
286 sgen_suspend(sg)
287 
288 sgen *sg;
289 {
290  sg->devlist[sg->dev] = sg->first_model;
291  sg->model->GENnextModel = sg->next_model;
292  sg->instance->GENnextInstance = sg->next_instance;
293  sg->model->GENinstances = sg->first_instance;
294 }
295 
296 
297 void
298 sgen_restore(sg)
299 
300 sgen *sg;
301 {
302  sg->devlist[sg->dev] = sg->model;
303  sg->model->GENnextModel = NULL;
304  sg->instance->GENnextInstance = NULL;
305  sg->model->GENinstances = sg->instance;
306 }
307 #endif
#define NEW(TYPE)
Definition: util.h:74
static int set_model()
#define IF_SETQUERY
Definition: uflags.h:20
#define IF_CHKQUERY
Definition: uflags.h:22
GENinstance * instance
Definition: sensgen.h:12
int * numInstanceParms
Definition: ifsim.h:312
int is_zerook
Definition: sensgen.h:22
#define IF_ASK
Definition: ifsim.h:136
IFparm * instanceParms
Definition: ifsim.h:313
static double e
Definition: vectors.c:17
struct sGENinstance * GENnextInstance
Definition: gendefs.h:26
IFdevice DEVpublic
Definition: devdefs.h:44
GENmodel ** devlist
Definition: sensgen.h:10
int dev
Definition: sensgen.h:15
struct sGENmodel * GENnextModel
Definition: gendefs.h:41
int GENstate
Definition: gendefs.h:29
#define IF_PRINCIPAL
Definition: uflags.h:14
#define FREE(ptr)
Definition: spdefs.h:436
GENinstance * first_instance
Definition: sensgen.h:12
double rValue
Definition: ifsim.h:233
int sens_getp()
int max_param
Definition: sensgen.h:17
int is_instparam
Definition: sensgen.h:19
#define IF_VECTOR
Definition: ifsim.h:121
#define IF_SET
Definition: ifsim.h:135
#define NULL
Definition: spdefs.h:121
GENinstance * next_instance
Definition: sensgen.h:12
double value
Definition: sensgen.h:14
static int set_dev()
int is_dc
Definition: sensgen.h:18
Definition: sensgen.h:8
CKTcircuit * ckt
Definition: sensgen.h:9
#define IF_REAL
Definition: ifsim.h:108
SPICEdev * DEVices[]
Definition: sconfig.c:109
static int set_param()
int sgen_next(sgen **xsg)
Definition: senssgen.c:62
#define FABS(a)
Definition: util.h:41
int istate
Definition: sensgen.h:16
#define IF_ORQUERY
Definition: uflags.h:21
int is_principle
Definition: sensgen.h:21
IFparm * ptable
Definition: sensgen.h:13
GENmodel * first_model
Definition: sensgen.h:11
int is_q
Definition: sensgen.h:20
#define IF_AC
Definition: uflags.h:15
static int set_inst()
GENinstance * GENinstances
Definition: gendefs.h:43
#define IF_AC_ONLY
Definition: uflags.h:16
char * Sfilter
Definition: senssgen.c:15
#define IF_NONSENSE
Definition: uflags.h:18
int param
Definition: sensgen.h:17
int DEVmaxnum
Definition: sconfig.c:166
#define IF_REDUNDANT
Definition: uflags.h:13
GENmodel * next_model
Definition: sensgen.h:11
GENmodel * model
Definition: sensgen.h:11
sgen * sgen_init(CKTcircuit *ckt, int is_dc)
Definition: senssgen.c:32