Jspice3
ifeval.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: 1985 Thomas L. Quarles
5  1992 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #include "spice.h"
9 #include <stdio.h>
10 #include "ftedefs.h" /* really don't need this without breakpoints */
11 #include "inpptree.h"
12 #include "iferrmsg.h"
13 
14 #ifdef __STDC__
15 static void init_node(INPparseNode*,double,double);
16 static void PTsetBreaks(INPparseNode*,double);
17 static void PTinit(INPparseNode*,double,double);
18 static void free_parsenode(INPparseNode*);
19 #else /* stdc */
20 static void init_node();
21 static void PTsetBreaks();
22 static void PTinit();
23 static void free_parsenode();
24 #endif /* stdc */
25 
26 extern double PTfudge_factor;
27 
28 #define setbreaks
29 
30 int
31 IFinit(tree,step,finaltime)
32 
33 IFparseTree *tree;
34 double step, finaltime;
35 {
36  struct INPparseTree *pt = (struct INPparseTree*)tree;
37  int i;
38 
39  if (!tree)
40  return (OK);
41  for (i = 0; i < tree->numVars; i++)
42  init_node(pt->derivs[i],step,finaltime);
43  init_node(pt->tree,step,finaltime);
44 
45  return (OK);
46 }
47 
48 
49 static void
50 init_node(p,step,finaltime)
51 
53 double step, finaltime;
54 {
55  if (!p) return;
56  init_node(p->left,step,finaltime);
57  init_node(p->right,step,finaltime);
58  PTinit(p,step,finaltime);
59 }
60 
61 #define V1 p->tranparms[0]
62 #define V2 p->tranparms[1]
63 #define TD p->tranparms[2]
64 #define TR p->tranparms[3]
65 #define TF p->tranparms[4]
66 #define PW p->tranparms[5]
67 #define PER p->tranparms[6]
68 
69 #define SPER p->tranparms[2]
70 #define SDEL p->tranparms[3]
71 
72 #define VO p->tranparms[0]
73 #define VA p->tranparms[1]
74 #define FREQ p->tranparms[2]
75 #define TDL p->tranparms[3]
76 #define THETA p->tranparms[4]
77 
78 #define TD1 p->tranparms[2]
79 #define TAU1 p->tranparms[3]
80 #define TD2 p->tranparms[4]
81 #define TAU2 p->tranparms[5]
82 
83 #define FC p->tranparms[2]
84 #define MDI p->tranparms[3]
85 #define FS p->tranparms[4]
86 
87 
88 #ifdef setbreaks
89 
90 static void
91 PTsetBreaks(p,finaltime)
92 
94 double finaltime;
95 {
96  double time, time1;
97  int i, n;
98 
99  switch (p->funcnum) {
100 
101  case PTF_tPULSE:
102 
103  time1 = TD;
104  time = time1;
105  while (time < finaltime) {
106  if (time > 0)
108  time += TR;
109  if (time >= finaltime)
110  break;
111  if (time > 0)
113  if (PW != 0) {
114  time += PW;
115  if (time >= finaltime)
116  break;
117  if (time > 0)
119  }
120  if (TF != 0) {
121  time += TF;
122  if (time >= finaltime)
123  break;
124  if (time > 0)
126  }
127  time1 += PER;
128  time = time1;
129  }
130  /* set for additional offsets */
131  for (i = 7; i < p->numtrancoeffs; i++) {
132  time1 = p->trancoeffs[i];
133  time = time1;
134  while (time < finaltime) {
135  if (time > 0)
137  time += TR;
138  if (time >= finaltime)
139  break;
140  if (time > 0)
142  if (PW != 0) {
143  time += PW;
144  if (time >= finaltime)
145  break;
146  if (time > 0)
148  }
149  if (TF != 0) {
150  time += TF;
151  if (time >= finaltime)
152  break;
153  if (time > 0)
155  }
156  time1 += PER;
157  time = time1;
158  }
159  }
160  break;
161 
162  case PTF_tPWL:
163 
164  n = p->numtrancoeffs/2;
165  for (i = 0; i < n; i++)
166  CKTsetBreak(ft_curckt->ci_ckt,*(p->trancoeffs + i + i));
167  break;
168  }
169 }
170 #endif
171 
172 
173 static void
174 PTinit(p,step,finaltime)
175 
176 INPparseNode *p;
177 double step, finaltime;
178 {
179  if (p->type != PT_TFUNC)
180  return;
181 
182  switch (p->funcnum) {
183 
184  case PTF_tPULSE:
185  V1 = *p->trancoeffs;
186  V2 = *(p->trancoeffs+1);
187  TD = (p->numtrancoeffs >= 3) ?
188  *(p->trancoeffs+2) : 0;
189  TR = (p->numtrancoeffs >= 4) ?
190  *(p->trancoeffs+3) : 0;
191  TF = (p->numtrancoeffs >= 5) ?
192  *(p->trancoeffs+4) : 0;
193  PW = (p->numtrancoeffs >= 6) ?
194  *(p->trancoeffs+5) : 0;
195  PER = (p->numtrancoeffs >= 7) ?
196  *(p->trancoeffs+6) : 0;
197  if (TR <= 0) TR = step;
198  if (TF > 0 && PW <= 0)
199  PW = 0.0;
200  else {
201  if (TF <= 0) TF = step;
202  if (PW <= 0) PW = finaltime + step;
203  }
204  if (PER <= 0) PER = finaltime + step;
205  else if (PER < TR+PW+TF)
206  PER = TR+PW+TF;
207  p->trancache[0] = (V2 - V1)/TR;
208  p->trancache[1] = (V1 - V2)/TF;
209 #ifdef setbreaks
210  PTsetBreaks(p,finaltime);
211 #endif
212  break;
213 
214 #ifdef setbreaks
215  case PTF_tPWL:
216  PTsetBreaks(p,finaltime);
217  break;
218 #endif
219 
220  case PTF_tSIN:
221  VO = *p->trancoeffs;
222  VA = *(p->trancoeffs+1);
223  FREQ = (p->numtrancoeffs >= 3) ?
224  *(p->trancoeffs+2) : 0;
225  TDL = (p->numtrancoeffs >= 4) ?
226  *(p->trancoeffs+3) : 0;
227  THETA = (p->numtrancoeffs >= 5) ?
228  *(p->trancoeffs+4) : 0;
229  if (!FREQ) FREQ = 1/finaltime;
230  break;
231 
232  case PTF_tSPULSE:
233  V1 = *p->trancoeffs;
234  V2 = *(p->trancoeffs+1);
235  SPER = (p->numtrancoeffs >= 3) ?
236  *(p->trancoeffs+2) : 0;
237  SDEL = (p->numtrancoeffs >= 4) ?
238  *(p->trancoeffs+3) : 0;
239  THETA = (p->numtrancoeffs >= 5) ?
240  *(p->trancoeffs+4) : 0;
241  if (!SPER) SPER = finaltime;
242  break;
243 
244  case PTF_tEXP:
245  V1 = *p->trancoeffs;
246  V2 = *(p->trancoeffs+1);
247  TD1 = (p->numtrancoeffs >= 3) ?
248  *(p->trancoeffs+2) : 0;
249  TAU1 = (p->numtrancoeffs >= 4) ?
250  *(p->trancoeffs+3) : 0;
251  TD2 = (p->numtrancoeffs >= 5) ?
252  *(p->trancoeffs+4) : 0;
253  TAU2 = (p->numtrancoeffs >= 6) ?
254  *(p->trancoeffs+5) : 0;
255  if (!TAU2) TAU2 = step;
256  if (!TD1) TD1 = step;
257  if (!TAU1) TAU1 = step;
258  if (!TD2) TD2 = TD1 + step;
259  break;
260 
261  case PTF_tSFFM:
262  VO = *p->trancoeffs;
263  VA = *(p->trancoeffs+1);
264  FC = (p->numtrancoeffs >= 3) ?
265  *(p->trancoeffs+2) : 0;
266  MDI = (p->numtrancoeffs >= 4) ?
267  *(p->trancoeffs+3) : 0;
268  FS = (p->numtrancoeffs >= 5) ?
269  *(p->trancoeffs+4) : 0;
270  if (!FC) FC = 1/finaltime;
271  if (!FS) FS = 1/finaltime;
272  break;
273  }
274 }
275 
276 
277 int
278 IFeval(tree, gmin, result, vals, derivs, parms)
279 
281 double gmin;
282 double *result;
283 double *vals;
284 double *derivs;
285 double *parms;
286 {
287  int i, err;
288  INPparseTree *myTree = (INPparseTree*) tree;
289 
290 /*
291 INPptPrint("calling PTeval, tree = ", myTree);
292 printf("values:");
293 for (i = 0; i < myTree->p.numVars; i++)
294 printf("\tvar%d = %lg\n", i, vals[i]);
295 */
296 
297  PTfudge_factor = gmin;
298  if ((err = (*myTree->tree->evfunc)(myTree->tree,result,vals,parms))
299  != OK)
300  return (err);
301 
302  for (i = 0; i < myTree->p.numVars; i++)
303  if ((err = (*myTree->derivs[i]->evfunc)(myTree->derivs[i],
304  &derivs[i], vals, parms)) != OK)
305  return (err);
306 
307 /*
308 printf("results: function = %lg\n", *result);
309 for (i = 0; i < myTree->p.numVars; i++)
310 printf("\td / d var%d = %lg\n", i, derivs[i]);
311 */
312 
313  return (OK);
314 }
315 
316 
317 void
319 
321 {
322  struct INPparseTree *pt = (struct INPparseTree*)tree;
323  int i;
324 
325  if (!tree)
326  return;
327  if (tree->line)
328  txfree(tree->line);
329  for (i = 0; i < tree->numVars; i++)
330  if (tree->varTypes[i] == IF_STRING)
331  txfree(tree->vars[i].sValue);
332  txfree((char*)tree->varTypes);
333  txfree((char*)tree->vars);
334  for (i = 0; i < tree->numVars; i++)
335  free_parsenode(pt->derivs[i]);
336  txfree((char*)pt->derivs);
337  free_parsenode(pt->tree);
338  txfree((char*)tree);
339 }
340 
341 
342 static void
344 
345 INPparseNode *p;
346 {
347  if (!p) return;
348  free_parsenode(p->left);
349  free_parsenode(p->right);
350  if (p->type == PT_TFUNC) {
351  if (p->trancoeffs) txfree((char*)p->trancoeffs);
352  if (p->tranparms) txfree((char*)p->tranparms);
353  if (p->trancache) txfree((char*)p->trancache);
354  }
355  txfree((char*)p);
356 }
#define TAU1
Definition: ifeval.c:79
#define TF
Definition: ifeval.c:65
#define MDI
Definition: ifeval.c:84
#define PTF_tPULSE
Definition: inpptree.h:106
#define V2
Definition: ifeval.c:62
IFparseTree p
Definition: inpptree.h:31
static void PTinit()
struct INPparseNode ** derivs
Definition: inpptree.h:33
#define PTF_tSIN
Definition: inpptree.h:108
void IFfree(IFparseTree *tree)
Definition: ifeval.c:318
#define PER
Definition: ifeval.c:67
char * ci_ckt
Definition: ftedefs.h:27
#define SDEL
Definition: ifeval.c:70
#define FC
Definition: ifeval.c:83
#define TD2
Definition: ifeval.c:80
struct INPparseNode * tree
Definition: inpptree.h:32
int(* evfunc)()
Definition: inpptree.h:53
#define TD
Definition: ifeval.c:63
Definition: cddefs.h:215
int CKTsetBreak()
#define TD1
Definition: ifeval.c:78
int IFinit(IFparseTree *tree, double step, double finaltime)
Definition: ifeval.c:31
#define PTF_tSFFM
Definition: inpptree.h:111
static void PTsetBreaks()
#define OK
Definition: iferrmsg.h:17
#define PT_TFUNC
Definition: inpptree.h:79
static void init_node()
void txfree()
struct circ * ft_curckt
Definition: main.c:184
#define PW
Definition: ifeval.c:66
#define VO
Definition: ifeval.c:72
#define VA
Definition: ifeval.c:73
static void free_parsenode()
#define FS
Definition: ifeval.c:85
#define TAU2
Definition: ifeval.c:81
int IFeval(IFparseTree *tree, double gmin, double *result, double *vals, double *derivs, double *parms)
Definition: ifeval.c:278
#define TR
Definition: ifeval.c:64
int numVars
Definition: ifsim.h:159
#define PTF_tPWL
Definition: inpptree.h:107
#define V1
Definition: ifeval.c:61
#define FREQ
Definition: ifeval.c:74
#define PTF_tEXP
Definition: inpptree.h:110
Definition: mfb.h:383
#define TDL
Definition: ifeval.c:75
#define IF_STRING
Definition: ifsim.h:111
#define PTF_tSPULSE
Definition: inpptree.h:109
#define THETA
Definition: ifeval.c:76
double PTfudge_factor
Definition: ptfuncs.c:90
#define SPER
Definition: ifeval.c:69