Jspice3
senssgen.c File Reference
#include "spice.h"
#include <stdio.h>
#include "util.h"
#include "devdefs.h"
#include "sensgen.h"
#include "uflags.h"
Include dependency graph for senssgen.c:

Go to the source code of this file.

Functions

static int set_inst ()
 
static int set_model ()
 
static int set_dev ()
 
static int set_param ()
 
sgensgen_init (CKTcircuit *ckt, int is_dc)
 
int sgen_next (sgen **xsg)
 
static int set_inst (sgen *sg)
 
static int set_model (sgen *sg)
 
static int set_dev (sgen *sg)
 
static int set_param (sgen *sg)
 

Variables

char * Sfilter = NULL
 
SPICEdevDEVices []
 

Function Documentation

static int set_dev ( )
static
static int set_dev ( sgen sg)
static

Definition at line 230 of file senssgen.c.

233 {
234  return (1);
235 }
static int set_inst ( )
static
static int set_inst ( sgen sg)
static

Definition at line 210 of file senssgen.c.

213 {
214  return (1);
215 }
static int set_model ( )
static
static int set_model ( sgen sg)
static

Definition at line 220 of file senssgen.c.

223 {
224  return (1);
225 }
static int set_param ( )
static
static int set_param ( sgen sg)
static

Definition at line 239 of file senssgen.c.

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 }
#define IF_SETQUERY
Definition: uflags.h:20
#define IF_CHKQUERY
Definition: uflags.h:22
int is_zerook
Definition: sensgen.h:22
#define IF_ASK
Definition: ifsim.h:136
static double e
Definition: vectors.c:17
#define IF_PRINCIPAL
Definition: uflags.h:14
double rValue
Definition: ifsim.h:233
int sens_getp()
#define IF_VECTOR
Definition: ifsim.h:121
#define IF_SET
Definition: ifsim.h:135
double value
Definition: sensgen.h:14
int is_dc
Definition: sensgen.h:18
CKTcircuit * ckt
Definition: sensgen.h:9
#define IF_REAL
Definition: ifsim.h:108
int dataType
Definition: ifsim.h:57
#define FABS(a)
Definition: util.h:41
#define IF_ORQUERY
Definition: uflags.h:21
int is_principle
Definition: sensgen.h:21
IFparm * ptable
Definition: sensgen.h:13
int is_q
Definition: sensgen.h:20
#define IF_AC
Definition: uflags.h:15
#define IF_AC_ONLY
Definition: uflags.h:16
char * keyword
Definition: ifsim.h:55
char * Sfilter
Definition: senssgen.c:15
#define IF_NONSENSE
Definition: uflags.h:18
int param
Definition: sensgen.h:17
#define IF_REDUNDANT
Definition: uflags.h:13
sgen* sgen_init ( CKTcircuit ckt,
int  is_dc 
)

Definition at line 32 of file senssgen.c.

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 }
#define NEW(TYPE)
Definition: util.h:74
GENinstance * instance
Definition: sensgen.h:12
int is_zerook
Definition: sensgen.h:22
GENmodel ** devlist
Definition: sensgen.h:10
int dev
Definition: sensgen.h:15
GENinstance * first_instance
Definition: sensgen.h:12
int is_instparam
Definition: sensgen.h:19
#define NULL
Definition: spdefs.h:121
GENinstance * next_instance
Definition: sensgen.h:12
double value
Definition: sensgen.h:14
int is_dc
Definition: sensgen.h:18
Definition: sensgen.h:8
CKTcircuit * ckt
Definition: sensgen.h:9
int sgen_next(sgen **xsg)
Definition: senssgen.c:62
int istate
Definition: sensgen.h:16
int is_principle
Definition: sensgen.h:21
IFparm * ptable
Definition: sensgen.h:13
int is_q
Definition: sensgen.h:20
GENmodel * CKThead[MAXNUMDEVS]
Definition: cktdefs.h:64
int param
Definition: sensgen.h:17
GENmodel * next_model
Definition: sensgen.h:11
GENmodel * model
Definition: sensgen.h:11
int sgen_next ( sgen **  xsg)

Definition at line 62 of file senssgen.c.

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 =
95  sg->ptable =
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 }
GENinstance * instance
Definition: sensgen.h:12
int * numInstanceParms
Definition: ifsim.h:312
IFparm * instanceParms
Definition: ifsim.h:313
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 FREE(ptr)
Definition: spdefs.h:436
GENinstance * first_instance
Definition: sensgen.h:12
int max_param
Definition: sensgen.h:17
int is_instparam
Definition: sensgen.h:19
#define NULL
Definition: spdefs.h:121
GENinstance * next_instance
Definition: sensgen.h:12
static int set_dev()
Definition: sensgen.h:8
SPICEdev * DEVices[]
Definition: sconfig.c:109
static int set_param()
int istate
Definition: sensgen.h:16
int is_principle
Definition: sensgen.h:21
IFparm * ptable
Definition: sensgen.h:13
GENmodel * first_model
Definition: sensgen.h:11
static int set_inst()
GENinstance * GENinstances
Definition: gendefs.h:43
int param
Definition: sensgen.h:17
int DEVmaxnum
Definition: sconfig.c:166
GENmodel * next_model
Definition: sensgen.h:11
GENmodel * model
Definition: sensgen.h:11

Variable Documentation

SPICEdev* DEVices[]

Definition at line 109 of file sconfig.c.

char* Sfilter = NULL

Definition at line 15 of file senssgen.c.