Jspice3
ifeval.c File Reference
#include "spice.h"
#include <stdio.h>
#include "ftedefs.h"
#include "inpptree.h"
#include "iferrmsg.h"
Include dependency graph for ifeval.c:

Go to the source code of this file.

Macros

#define setbreaks
 
#define V1   p->tranparms[0]
 
#define V2   p->tranparms[1]
 
#define TD   p->tranparms[2]
 
#define TR   p->tranparms[3]
 
#define TF   p->tranparms[4]
 
#define PW   p->tranparms[5]
 
#define PER   p->tranparms[6]
 
#define SPER   p->tranparms[2]
 
#define SDEL   p->tranparms[3]
 
#define VO   p->tranparms[0]
 
#define VA   p->tranparms[1]
 
#define FREQ   p->tranparms[2]
 
#define TDL   p->tranparms[3]
 
#define THETA   p->tranparms[4]
 
#define TD1   p->tranparms[2]
 
#define TAU1   p->tranparms[3]
 
#define TD2   p->tranparms[4]
 
#define TAU2   p->tranparms[5]
 
#define FC   p->tranparms[2]
 
#define MDI   p->tranparms[3]
 
#define FS   p->tranparms[4]
 

Functions

static void init_node ()
 
static void PTsetBreaks ()
 
static void PTinit ()
 
static void free_parsenode ()
 
int IFinit (IFparseTree *tree, double step, double finaltime)
 
static void init_node (INPparseNode *p, double step, double finaltime)
 
static void PTsetBreaks (INPparseNode *p, double finaltime)
 
static void PTinit (INPparseNode *p, double step, double finaltime)
 
int IFeval (IFparseTree *tree, double gmin, double *result, double *vals, double *derivs, double *parms)
 
void IFfree (IFparseTree *tree)
 
static void free_parsenode (INPparseNode *p)
 

Variables

double PTfudge_factor
 

Macro Definition Documentation

#define FC   p->tranparms[2]

Definition at line 83 of file ifeval.c.

#define FREQ   p->tranparms[2]

Definition at line 74 of file ifeval.c.

#define FS   p->tranparms[4]

Definition at line 85 of file ifeval.c.

#define MDI   p->tranparms[3]

Definition at line 84 of file ifeval.c.

#define PER   p->tranparms[6]

Definition at line 67 of file ifeval.c.

#define PW   p->tranparms[5]

Definition at line 66 of file ifeval.c.

#define SDEL   p->tranparms[3]

Definition at line 70 of file ifeval.c.

#define setbreaks

Definition at line 28 of file ifeval.c.

#define SPER   p->tranparms[2]

Definition at line 69 of file ifeval.c.

#define TAU1   p->tranparms[3]

Definition at line 79 of file ifeval.c.

#define TAU2   p->tranparms[5]

Definition at line 81 of file ifeval.c.

#define TD   p->tranparms[2]

Definition at line 63 of file ifeval.c.

#define TD1   p->tranparms[2]

Definition at line 78 of file ifeval.c.

#define TD2   p->tranparms[4]

Definition at line 80 of file ifeval.c.

#define TDL   p->tranparms[3]

Definition at line 75 of file ifeval.c.

#define TF   p->tranparms[4]

Definition at line 65 of file ifeval.c.

#define THETA   p->tranparms[4]

Definition at line 76 of file ifeval.c.

#define TR   p->tranparms[3]

Definition at line 64 of file ifeval.c.

#define V1   p->tranparms[0]

Definition at line 61 of file ifeval.c.

#define V2   p->tranparms[1]

Definition at line 62 of file ifeval.c.

#define VA   p->tranparms[1]

Definition at line 73 of file ifeval.c.

#define VO   p->tranparms[0]

Definition at line 72 of file ifeval.c.

Function Documentation

static void free_parsenode ( )
static
static void free_parsenode ( INPparseNode p)
static

Definition at line 343 of file ifeval.c.

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 }
struct INPparseNode * right
Definition: inpptree.h:48
double * trancoeffs
Definition: inpptree.h:55
#define PT_TFUNC
Definition: inpptree.h:79
struct INPparseNode * left
Definition: inpptree.h:47
void txfree()
static void free_parsenode()
double * tranparms
Definition: inpptree.h:56
double * trancache
Definition: inpptree.h:57
int IFeval ( IFparseTree tree,
double  gmin,
double *  result,
double *  vals,
double *  derivs,
double *  parms 
)

Definition at line 278 of file ifeval.c.

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 }
IFparseTree p
Definition: inpptree.h:31
struct INPparseNode ** derivs
Definition: inpptree.h:33
struct INPparseNode * tree
Definition: inpptree.h:32
int(* evfunc)()
Definition: inpptree.h:53
#define OK
Definition: iferrmsg.h:17
int numVars
Definition: ifsim.h:159
Definition: mfb.h:383
double PTfudge_factor
Definition: ptfuncs.c:90
void IFfree ( IFparseTree tree)

Definition at line 318 of file ifeval.c.

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 }
struct INPparseNode ** derivs
Definition: inpptree.h:33
int * varTypes
Definition: ifsim.h:160
struct INPparseNode * tree
Definition: inpptree.h:32
void txfree()
char * line
Definition: ifsim.h:161
static void free_parsenode()
int numVars
Definition: ifsim.h:159
char * sValue
Definition: ifsim.h:235
#define IF_STRING
Definition: ifsim.h:111
union uIFvalue * vars
Definition: ifsim.h:162
int IFinit ( IFparseTree tree,
double  step,
double  finaltime 
)

Definition at line 31 of file ifeval.c.

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 }
struct INPparseNode ** derivs
Definition: inpptree.h:33
struct INPparseNode * tree
Definition: inpptree.h:32
#define OK
Definition: iferrmsg.h:17
static void init_node()
int numVars
Definition: ifsim.h:159
static void init_node ( )
static
static void init_node ( INPparseNode p,
double  step,
double  finaltime 
)
static

Definition at line 50 of file ifeval.c.

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 }
static void PTinit()
struct INPparseNode * right
Definition: inpptree.h:48
static void init_node()
struct INPparseNode * left
Definition: inpptree.h:47
static void PTinit ( )
static
static void PTinit ( INPparseNode p,
double  step,
double  finaltime 
)
static

Definition at line 174 of file ifeval.c.

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 }
#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
#define PTF_tSIN
Definition: inpptree.h:108
#define PER
Definition: ifeval.c:67
#define SDEL
Definition: ifeval.c:70
#define FC
Definition: ifeval.c:83
#define TD2
Definition: ifeval.c:80
#define TD
Definition: ifeval.c:63
#define TD1
Definition: ifeval.c:78
#define PTF_tSFFM
Definition: inpptree.h:111
int funcnum
Definition: inpptree.h:52
static void PTsetBreaks()
double * trancoeffs
Definition: inpptree.h:55
#define PT_TFUNC
Definition: inpptree.h:79
#define PW
Definition: ifeval.c:66
#define VO
Definition: ifeval.c:72
#define VA
Definition: ifeval.c:73
#define FS
Definition: ifeval.c:85
#define TAU2
Definition: ifeval.c:81
#define TR
Definition: ifeval.c:64
#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
int numtrancoeffs
Definition: inpptree.h:58
#define TDL
Definition: ifeval.c:75
double * trancache
Definition: inpptree.h:57
#define PTF_tSPULSE
Definition: inpptree.h:109
#define THETA
Definition: ifeval.c:76
#define SPER
Definition: ifeval.c:69
static void PTsetBreaks ( )
static
static void PTsetBreaks ( INPparseNode p,
double  finaltime 
)
static

Definition at line 91 of file ifeval.c.

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 }
#define TF
Definition: ifeval.c:65
#define PTF_tPULSE
Definition: inpptree.h:106
#define PER
Definition: ifeval.c:67
char * ci_ckt
Definition: ftedefs.h:27
#define TD
Definition: ifeval.c:63
int CKTsetBreak()
int funcnum
Definition: inpptree.h:52
double * trancoeffs
Definition: inpptree.h:55
struct circ * ft_curckt
Definition: main.c:184
#define PW
Definition: ifeval.c:66
#define TR
Definition: ifeval.c:64
#define PTF_tPWL
Definition: inpptree.h:107
int numtrancoeffs
Definition: inpptree.h:58

Variable Documentation

double PTfudge_factor

Definition at line 90 of file ptfuncs.c.