You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

208 lines
6.0 KiB

/**********
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group
**********/
/*
* faustus@cad.berkeley.edu, ucbvax!faustus
*
* These definitions specify the format of the parse tree parameter type.
* The first four are the elements of IFparseTree, defined in IFsim.h.
*/
#include "ifsim.h"
#ifndef INP_PARSE
#define INP_PARSE
/* This is the parameter value passed to the device routines. To get the
* value of the function, where tree is a pointer to the INPparseTree,
* result is a pointer to where you want the result, derivs is a pointer to
* an vector of numVars doubles, and vals is a pointer to the selected
* elements from the RHS, do
* tree->p.IFeval(&tree, result, vals, derivs)
* This routine will return either OK, E_PARMVAL, or E_PANIC. If an error
* is reported the eval function will have printed something to standard
* out before returning.
*/
typedef struct INPparseTree {
IFparseTree p;
struct INPparseNode *tree; /* The real stuff. */
struct INPparseNode **derivs; /* The derivative parse trees. */
} INPparseTree;
/* This is what is passed as the actual parameter value. The fields will all
* be filled in as needed.
*
* Values with names like v(something) and i(something) are treated specially.
* They are considered voltages at nodes and branch currents through
* voltage sources, respectively. The corresponding parameters will be of
* type IF_NODE and IF_INSTANCE, respectively.
*/
typedef struct INPparseNode {
int type; /* One of PT_*, below. */
struct INPparseNode *left; /* Left operand, or single operand. */
struct INPparseNode *right; /* Right operand, if there is one. */
double constant; /* If INP_CONSTANT. */
int valueIndex; /* If INP_VAR, index into vars array. */
char *funcname; /* If INP_FUNCTION, name of function, */
int funcnum; /* ... one of PTF_*, */
void (*function)(void); /* ... and pointer to the function. */
void *data; /* private data for certain functions, currently PTF_PWL */
} INPparseNode;
/* FIXME, less public
* and replace with static inline functions for better type check
*/
#define PTunary(node_ptr) \
((double(*)(double)) (node_ptr))
#define PTbinary(node_ptr) \
((double(*)(double, double)) (node_ptr))
#define PTunary_with_private(node_ptr) \
((double(*)(double, void*)) (node_ptr))
/* These are the possible types of nodes we can have in the parse tree. The
* numbers for the ops 1 - 5 have to be the same as the token numbers,
* below.
*/
#define PT_PLACEHOLDER 0 /* For i(something) ... */
#define PT_PLUS 1
#define PT_MINUS 2
#define PT_TIMES 3
#define PT_DIVIDE 4
#define PT_POWER 5
#define PT_FUNCTION 6
#define PT_CONSTANT 7
#define PT_VAR 8
#define PT_COMMA 10
#define PT_TERN 11
#define PT_TIME 12
#define PT_TEMPERATURE 13
#define PT_FREQUENCY 14
/* These are the functions that we support. */
#define PTF_ACOS 0
#define PTF_ACOSH 1
#define PTF_ASIN 2
#define PTF_ASINH 3
#define PTF_ATAN 4
#define PTF_ATANH 5
#define PTF_COS 6
#define PTF_COSH 7
#define PTF_EXP 8
#define PTF_LN 9
#define PTF_LOG 10
#define PTF_SIN 11
#define PTF_SINH 12
#define PTF_SQRT 13
#define PTF_TAN 14
#define PTF_TANH 15
#define PTF_UMINUS 16
#define PTF_ABS 17
#define PTF_SGN 18
#define PTF_USTEP 19
#define PTF_URAMP 20
/* MW. PTF_CIF - next function */
#define PTF_USTEP2 21
#define PTF_PWL 22
#define PTF_PWL_DERIVATIVE 23
#define PTF_EQ0 24
#define PTF_NE0 25
#define PTF_GT0 26
#define PTF_LT0 27
#define PTF_GE0 28
#define PTF_LE0 29
#define PTF_POW 30
#define PTF_MIN 31
#define PTF_MAX 32
/* The following things are used by the parser -- these are the token types the
* lexer returns.
*/
#define TOK_END 0
#define TOK_PLUS 1
#define TOK_MINUS 2
#define TOK_TIMES 3
#define TOK_DIVIDE 4
#define TOK_POWER 5
#define TOK_UMINUS 6
#define TOK_LPAREN 7
#define TOK_RPAREN 8
#define TOK_VALUE 9
#define TOK_COMMA 10
/* And the types for value tokens... */
#define TYP_NUM 0
#define TYP_STRING 1
#define TYP_PNODE 2
/* A parser stack element. */
typedef struct PTelement {
int token;
int type;
union {
char *string;
double real;
INPparseNode *pnode;
} value;
} PTelement ;
#define PT_STACKSIZE 200
/* These are things defined in PTfunctions.c */
extern double PTplus(double arg1, double arg2);
extern double PTminus(double arg1, double arg2);
extern double PTtimes(double arg1, double arg2);
extern double PTdivide(double arg1, double arg2);
extern double PTpower(double arg1, double arg2);
extern double PTacos(double arg);
extern double PTabs(double arg);
extern double PTacosh(double arg);
extern double PTasin(double arg);
extern double PTasinh(double arg);
extern double PTatan(double arg);
extern double PTatanh(double arg);
extern double PTcos(double arg);
extern double PTcosh(double arg);
extern double PTexp(double arg);
extern double PTln(double arg);
extern double PTlog(double arg);
extern double PTsgn(double arg);
extern double PTsin(double arg);
extern double PTsinh(double arg);
extern double PTsqrt(double arg);
extern double PTtan(double arg);
extern double PTtanh(double arg);
extern double PTustep(double arg);
/* MW. PTcif declaration */
extern double PTustep2(double arg);
extern double PTpwl(double arg, void *data);
extern double PTpwl_derivative(double arg, void *data);
extern double PTuramp(double arg);
extern double PTuminus(double arg);
extern double PTmin(double arg1, double arg2);
extern double PTmax(double arg1, double arg2);
extern double PTeq0(double arg);
extern double PTne0(double arg);
extern double PTgt0(double arg);
extern double PTlt0(double arg);
extern double PTge0(double arg);
extern double PTle0(double arg);
/* And in IFeval.c */
extern int IFeval(IFparseTree *tree, double gmin, double *result, double *vals, double *derivs);
#endif