various bug fixes

This commit is contained in:
h_vogt 2010-02-25 21:43:03 +00:00
parent da04a0c747
commit 76feebbbfa
16 changed files with 1921 additions and 1389 deletions

View File

@ -1,3 +1,13 @@
2010-02-25 Holger Vogt
* inpcom.c, general.h, mystring.c, numparam.h, spicenum.c, xpressn.c,
include/makefile.am, misc/makefile.am, hash.c, hash.h:
major bug-fix on numparam by Bill Swartz
* subckt.c: bugfix on bxx_printf()
* inp.c memory leak, line 707 wl_free(wl); added
* ifeval.c, inpptree.c, inpptree.h: first try of ternary fcn in B source
by Robert Larice
* vngspice.sln, vngspice.vcproj: new files hash.c, .h added to project
2010-02-22 Dietmar Warning
* xpressn.c, spicenum.c: more characters for real number insertion (up to 15) by
introducing a long long placeholder

View File

@ -704,6 +704,7 @@ inp_dodeck(
eev->va_next = cp_setparse(wl);
else
ct->ci_vars = eev = cp_setparse(wl);
wl_free(wl);
while (eev->va_next)
eev = eev->va_next;
}

View File

@ -1786,7 +1786,7 @@ inp_fix_subckt( char *s )
head = alloc(struct line);
/* create list of parameters that need to get sorted */
while ( ( ptr1 = strstr( beg, "=" ) ) ) {
while ( *beg && (ptr1 = strstr( beg, "=" ) ) ) {
ptr2 = ptr1+1;
ptr1--;
while ( isspace(*ptr1) ) ptr1--;
@ -1797,8 +1797,16 @@ inp_fix_subckt( char *s )
while ( *ptr2 && !isspace(*ptr2) ) ptr2++; /* ptr2 points to end of parameter */
keep = *ptr2;
*ptr2 = '\0';
beg = ptr2+1;
if( keep == '\0' ){
/* End of string - don't go over end. This needed to change because
* strings don't store line size here anymore since we use dynamic
* strings. Previously, we could step on string size which was stored
* at string[length+2] and string[length+2] */
beg = ptr2 ;
} else {
*ptr2 = '\0' ;
beg = ptr2+1 ;
}
newcard = alloc(struct line);
str = strdup(ptr1);

View File

@ -9,40 +9,39 @@
#define Use(x) x=0;x=x
#define Uses(s) s=s
#define Usep(x) x=x
#define Hi(x) (((x) >> 8) & 0xff)
#define Lo(x) ((x) & 0xff)
//#define Strbig(n,a) char a[n+4]={0, (char)Hi(n), (char)Lo(n)}
#define Strbig(n,a) char*(a)=(char*)tmalloc((n+4)*sizeof(char)); \
(a)[0]=0; (a)[1]=(char)Hi(n); (a)[2]=(char)Lo(n)
#define Strdbig(n,a,b) char*(a); char*(b); \
(a)=(char*)tmalloc((n+4)*sizeof(char)); \
(a)[0]=0; (a)[1]=(char)Hi(n); (a)[2]=(char)Lo(n);\
(b)=(char*)tmalloc((n+4)*sizeof(char)); \
(b)[0]=0; (b)[1]=(char)Hi(n); (b)[2]=(char)Lo(n)
/* -----------------------------------------------------------------
* This structure is modified from Tcl. We do this to avoid a
* conflict and later add a conditional compile to just use the Tcl
* code if desired.
----------------------------------------------------------------- */
#define SPICE_DSTRING_STATIC_SIZE 200
typedef struct spice_dstring {
char *string ; /* Points to beginning of string: either
* staticSpace below or a malloced array. */
int length ; /* Number of non-NULL characters in the
* string. */
int spaceAvl ; /* Total number of bytes available for the
* string and its terminating NULL char. */
char staticSpace[SPICE_DSTRING_STATIC_SIZE] ;
/* Space to use in common case where string
* is small. */
} SPICE_DSTRING, *SPICE_DSTRINGPTR ;
#define Strfbig(n,a,b,c,d) char*(a); char*(b); char*(c); char*(d);\
(a)=(char*)tmalloc((n+4)*sizeof(char)); \
(a)[0]=0; (a)[1]=(char)Hi(n); (a)[2]=(char)Lo(n);\
(b)=(char*)tmalloc((n+4)*sizeof(char)); \
(b)[0]=0; (b)[1]=(char)Hi(n); (b)[2]=(char)Lo(n);\
(c)=(char*)tmalloc((n+4)*sizeof(char)); \
(c)[0]=0; (c)[1]=(char)Hi(n); (c)[2]=(char)Lo(n);\
(d)=(char*)tmalloc((n+4)*sizeof(char)); \
(d)[0]=0; (d)[1]=(char)Hi(n); (d)[2]=(char)Lo(n)
/* -----------------------------------------------------------------
* spice_dstring_xxxx routines. Used to manipulate dynamic strings.
----------------------------------------------------------------- */
extern void spice_dstring_init(SPICE_DSTRINGPTR dsPtr) ;
extern char *spice_dstring_append(SPICE_DSTRINGPTR dsPtr,char *string,int length) ;
extern char *spice_dstring_print(SPICE_DSTRINGPTR dsPtr,char *format, ... ) ;
extern char *spice_dstring_setlength(SPICE_DSTRINGPTR dsPtr,int length) ;
extern char *_spice_dstring_setlength(SPICE_DSTRINGPTR dsPtr,int length) ;
extern void spice_dstring_free(SPICE_DSTRINGPTR dsPtr) ;
#define spice_dstring_reinit(x_xz) spice_dstring_setlength(x_xz,0) ;
#define spice_dstring_value(x_xz) ((x_xz)->string)
#define spice_dstring_space(x_xz) ((x_xz)->spaceAvl)
#define spice_dstring_length(x_xz) ((x_xz)->length)
#define Strrem(a) tfree(a)
#define Strdrem(a,b) tfree(a); tfree(b)
#define Strfrem(a,b,c,d) tfree(a); tfree(b); tfree(c); tfree(d)
#define Str(n,a) char a[n+3]={0,0,(char)n} /* n<255 ! */
#define Sini(s) sini(s,sizeof(s)-4)
/* was 255, then 15000, string maxlen, 40000 to catch really big
macros in .model lines, now just a big number, a line length
which never should be exceeded, may be removed later*/
typedef enum {Maxstr=4000000} _nMaxstr;
typedef enum {Esc=27} _nEsc;
typedef enum {Tab=9} _nTab;
typedef enum {Bs=8} _nBs;
@ -52,22 +51,22 @@ typedef enum {Cr=13} _nCr;
typedef char string[258];
void sini( char * s, int i);
void sfix(char * s, int i, int max);
int maxlen(char * s);
char * pscopy( char * s, char * a, int i,int j);
char * pscopy_up( char * s, char * a, int i,int j);
unsigned char scopy( char * a, char * b);
unsigned char scopy_up( char * a, char * b);
unsigned char ccopy( char * a, char c);
unsigned char sadd( char * s, char * t);
unsigned char nadd( char * s, long n);
unsigned char naddll( char * s, long long n);
unsigned char cadd( char * s, char c);
unsigned char sins( char * s, char * t);
unsigned char cins( char * s, char c);
int cpos( char c, char * s);
int spos( char * sub, char * s);
void sfix( SPICE_DSTRINGPTR dstr_p, int len) ;
char * pscopy( SPICE_DSTRINGPTR s, char * a, int i,int j);
char * pscopy_up( SPICE_DSTRINGPTR s, char * a, int i,int j);
unsigned char scopyd( SPICE_DSTRINGPTR a, SPICE_DSTRINGPTR b);
unsigned char scopys( SPICE_DSTRINGPTR a, char *b);
unsigned char scopy_up( SPICE_DSTRINGPTR a, char *str) ;
unsigned char scopy_lower( SPICE_DSTRINGPTR a, char *str) ;
unsigned char ccopy( SPICE_DSTRINGPTR a, char c);
unsigned char sadd( SPICE_DSTRINGPTR s, char * t);
unsigned char nadd( SPICE_DSTRINGPTR s, long n);
unsigned char cadd( SPICE_DSTRINGPTR s, char c);
unsigned char naddll( SPICE_DSTRINGPTR s, long long n);
unsigned char cins( SPICE_DSTRINGPTR s, char c);
unsigned char sins( SPICE_DSTRINGPTR s, char * t);
int cpos( char c, char *s);
int spos_( char * sub, char * s);
int ci_prefix( register char *p, register char *s );
int length(char * s);
unsigned char steq(char * s, char * t);
@ -76,9 +75,9 @@ int scompare(char * a, char * b);
int ord(char c);
int pred(int i);
int succ(int i);
void stri(long n, char * s);
void strif(long n, int f, char * s);
void strf(double x, int a, int b, char * s); /* float -> string */
void stri(long n, SPICE_DSTRINGPTR s);
void strif(long n, int f, SPICE_DSTRINGPTR dstr_p);
void strf(double x, int a, int b, SPICE_DSTRINGPTR dstr_p); /* float -> string */
long ival(char * s, int *err);
double rval(char * s, int *err);
@ -97,10 +96,10 @@ void wc(char c);
void wln(void);
void ws( char * s);
void wi(long i);
void rs( char * s);
void rs( SPICE_DSTRINGPTR s);
char rc(void);
int freadstr(FILE * f, char * s, int max);
int freadstr(FILE * f, SPICE_DSTRINGPTR dstr_p);
char freadc(FILE * f);
long freadi(FILE * f);
@ -116,4 +115,3 @@ unsigned char rewrite(FILE * f);
void rawcopy(void * a, void * b, int la, int lb);
void * new(long sz);
void dispose(void * p);
char * newstring(int n);

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,7 @@
/*** interface to spice frontend subckt.c ***/
#include "numpaif.h"
#include "hash.h"
/***** numparam internals ********/
@ -27,8 +28,6 @@ typedef enum {Defd=15} _nDefd; /* serial numb. of 'defined' keyword. The others
macros in .model lines. Will add 100k of memory compared to previous 25004*/
//typedef enum {Llen=40000} _nLlen;
typedef char str50 [54];
typedef char str80 [84];
//typedef enum {Maxline=70000} _nMaxline; /* Size of initial unexpanded circuit code */
//typedef enum {Maxckt=40000} _nMaxckt; /* Size of expanded circuit code */
@ -36,13 +35,17 @@ typedef char str80 [84];
typedef char * auxtable; /* dummy */
/* -----------------------------------------------------------------
* I believe the entry should be a union of type but I need more info.
* ----------------------------------------------------------------- */
typedef struct _tentry {
char tp; /* type: I)nt R)eal S)tring F)unction M)acro P)ointer */
char nom[100];
char *symbol ;
int level; /* subckt nesting level */
double vl; /* float value if defined */
unsigned short ivl; /*int value or string buffer index*/
char * sbbase; /* string buffer base address if any */
struct _tentry *pointer ; /* pointer chain */
} entry;
typedef struct _tfumas { /*function,macro,string*/
@ -51,19 +54,21 @@ typedef struct _tfumas { /*function,macro,string*/
typedef struct _ttdico {
/* the input scanner data structure */
str80 srcfile; /* last piece of source file name */
SPICE_DSTRING srcfile; /* last piece of source file name */
SPICE_DSTRING option; /* one-character translator options */
SPICE_DSTRING lookup_buf ; /* useful temp buffer for quick symbol lookup */
int srcline;
int oldline;
int errcount;
// entry dat[Maxdico+1];
entry* dyndat;
int nbd; /* number of data entries */
int num_symbols ; /* number of symbols in entry array */
entry **symbol_array ; /* symbol entries in array format for stack ops */
NGHASHPTR symbol_table ; /* hash table of symbols for quick lookup */
int nbd; /* number of data entries */
fumas fms[101];
int nfms; /* number of functions & macros */
int stack[20];
char *inst_name[20];
int tos; /* top of stack index for symbol mark/release mechanics */
str80 option; /* one-character translator options */
auxtable nodetab;
// char * refptr[Maxline]; /* pointers to source code lines */
char **dynrefptr;
@ -75,11 +80,11 @@ typedef struct _ttdico {
void initdico(tdico * dico);
int donedico(tdico * dico);
unsigned char defsubckt( tdico *dico, char * s, int w, char categ);
int findsubckt( tdico *dico, char * s, char * subname);
int findsubckt( tdico *dico, char * s, SPICE_DSTRINGPTR subname);
unsigned char nupa_substitute( tdico *dico, char * s, char * r, unsigned char err);
unsigned char nupa_assignment( tdico *dico, char * s, char mode);
unsigned char nupa_subcktcall( tdico *dico, char * s, char * x, unsigned char err);
void nupa_subcktexit( tdico *dico);
tdico * nupa_fetchinstance(void);
char getidtype( tdico *d, char * s);
int attrib( tdico *dico, char * t, char op );
entry *attrib( tdico *dico, char * t, char op );

View File

@ -32,7 +32,7 @@ Todo:
extern void txfree (void *ptr);
char *nupa_inst_name;
static tdico *inst_dico;
static tdico *inst_dicoS ;
/* number of parameter substitutions, available only after the substitution */
extern long dynsubst; /* spicenum.c:144 */
@ -41,7 +41,7 @@ extern long dynsubst; /* spicenum.c:144 */
extern int dynmaxline; /* inpcom.c:1529 */
/* max. line length in input deck */
unsigned int dynLlen; /* inpcom.c:1531 */
/* unsigned int dynLlen; No longer needed with d strings */ /* inpcom.c:1531 */
/* Uncomment this line to allow debug tracing */
/* #define TRACE_NUMPARAMS */
@ -71,34 +71,43 @@ static long placeholder = 0;
static void
stripsomespace (char *s, unsigned char incontrol)
stripsomespace (SPICE_DSTRINGPTR dstr_p, unsigned char incontrol)
{
/* if s starts with one of some markers, strip leading space */
Str (12, markers);
int i, ls;
scopy (markers, "*.&+#$");
char *sstr ; /* string contained in s */
SPICE_DSTRING markers ;
spice_dstring_init( &markers ) ;
scopys( &markers, "*.&+#$") ;
if (!incontrol)
sadd (markers, "xX");
sadd ( &markers, "xX");
ls = length (s);
sstr = spice_dstring_value(dstr_p) ;
ls = spice_dstring_length (dstr_p);
i = 0;
while ((i < ls) && (s[i] <= ' '))
while ((i < ls) && (sstr[i] <= ' '))
i++;
if ((i > 0) && (i < ls) && (cpos (s[i], markers) > 0))
pscopy (s, s, i + 1, ls);
if ((i > 0) && (i < ls) && (cpos (sstr[i], spice_dstring_value(&markers)) >= 0))
pscopy (dstr_p, sstr, i, ls);
}
static int
stripbraces (char *s)
stripbraces (SPICE_DSTRINGPTR dstr_p)
/* puts the funny placeholders. returns the number of {...} substitutions */
{
int n, i, nest, ls, j;
Strbig (dynLlen, t);
char *s ; /* value of dynamic string */
char *t_p ; /* value of t dynamic string */
SPICE_DSTRING tstr ; /* temporary dynamic string */
n = 0;
ls = length (s);
spice_dstring_init( &tstr ) ;
s = spice_dstring_value( dstr_p ) ;
ls = spice_dstring_length (dstr_p);
i = 0;
while (i < ls)
@ -117,47 +126,54 @@ stripbraces (char *s)
nest--;
j++;
}
pscopy (t, s, 1, i);
pscopy (&tstr, s, 0, i);
placeholder++;
if (t[i - 1] > ' ')
cadd (t, ' ');
t_p = spice_dstring_value(&tstr) ;
cadd (t, ' ');
naddll (t, PlaceHold + placeholder); /* placeholder has 15 digits */
cadd (t, ' ');
if (t_p[i - 1] > ' ')
cadd (&tstr, ' ');
cadd ( &tstr, ' ');
naddll( &tstr, PlaceHold + placeholder); /* placeholder has 15 digits */
cadd ( &tstr, ' ');
if (s[j] >= ' ')
cadd (t, ' ');
cadd ( &tstr, ' ');
i = length (t);
pscopy (s, s, j + 1, ls);
sadd (t, s);
scopy (s, t);
i = spice_dstring_length (&tstr);
pscopy (dstr_p, s, j, ls);
sadd ( &tstr, s);
scopyd ( dstr_p, &tstr);
s = spice_dstring_value( dstr_p ) ;
ls = spice_dstring_length( dstr_p ) ;
}
else
i++;
ls = length (s);
}
dynsubst = placeholder;
Strrem(t);
spice_dstring_free(&tstr);
return n;
}
static int
findsubname (tdico * dico, char *s)
findsubname (tdico * dico, SPICE_DSTRINGPTR dstr_p)
/* truncate the parameterized subckt call to regular old Spice */
/* scan a string from the end, skipping non-idents and {expressions} */
/* then truncate s after the last subckt(?) identifier */
{
Str (80, name);
SPICE_DSTRING name ; /* extract a name */
char *s ; /* current dstring */
int h, j, k, nest, ls;
unsigned char found;
h = 0;
ls = length (s);
k = ls;
ls = spice_dstring_length (dstr_p) ;
s = spice_dstring_value (dstr_p) ;
k = ls - 1 ; /* now a C - string */
found = 0;
spice_dstring_init( &name ) ;
while ((k >= 0) && (!found))
{ /* skip space, then non-space */
@ -191,32 +207,37 @@ findsubname (tdico * dico, char *s)
found = (k >= 0) && alfanum (s[k + 1]); /* suppose an identifier */
if (found)
{ /* check for known subckt name */
scopy (name, "");
spice_dstring_reinit( &name ) ;
j = k + 1;
while (alfanum (s[j]))
{
cadd (name, upcase (s[j]));
cadd ( &name, upcase (s[j]));
j++;
}
found = (getidtype (dico, name) == 'U');
found = (getidtype (dico, spice_dstring_value(&name) ) == 'U');
}
}
if (found && (h < ls))
pscopy (s, s, 1, h);
pscopy (dstr_p, s, 0, h);
return h;
}
static void
modernizeex (char *s)
modernizeex (SPICE_DSTRINGPTR dstr_p)
/* old style expressions &(..) and &id --> new style with braces. */
{
int i, state, ls;
char c, d;
Strbig (dynLlen, t);
char *s ; /* current string */
SPICE_DSTRING t ; /* temporary dyna string */
i = 0;
state = 0;
ls = length (s);
ls = spice_dstring_length (dstr_p);
s = spice_dstring_value( dstr_p ) ;
spice_dstring_init( &t ) ;
while (i < ls)
{
@ -232,11 +253,11 @@ modernizeex (char *s)
}
else if (alfa (d))
{
cadd (t, '{');
cadd (&t, '{');
i++;
while (alfanum (s[i]))
{
cadd (t, s[i]);
cadd (&t, s[i]);
i++;
}
c = '}';
@ -255,15 +276,16 @@ modernizeex (char *s)
}
cadd (t, c);
cadd (&t, c);
i++;
}
scopy (s, t);
Strrem(t);
scopyd (dstr_p, &t);
spice_dstring_free(&t) ;
}
static char
transform (tdico * dico, char *s, unsigned char nostripping, char *u)
transform (tdico * dico, SPICE_DSTRINGPTR dstr_p, unsigned char nostripping,
SPICE_DSTRINGPTR u_p)
/* line s is categorized and crippled down to basic Spice
* returns in u control word following dot, if any
*
@ -288,21 +310,27 @@ transform (tdico * dico, char *s, unsigned char nostripping, char *u)
* 'B' netlist (or .model ?) line that had Braces killed
*/
{
char category;
int i, k, a, n;
Strbig (dynLlen, t);
stripsomespace (s, nostripping);
modernizeex (s); /* required for stripbraces count */
scopy (u, "");
char *s ; /* dstring value of dstr_p */
char *t ; /* dstring value of tstr */
char category;
SPICE_DSTRING tstr ; /* temporary string */
spice_dstring_init(&tstr) ;
spice_dstring_reinit(u_p) ;
stripsomespace (dstr_p, nostripping);
modernizeex (dstr_p); /* required for stripbraces count */
s = spice_dstring_value(dstr_p) ;
if (s[0] == '.')
{ /* check Pspice parameter format */
scopy_up (t, s);
scopy_up (&tstr, spice_dstring_value(dstr_p) ) ;
k = 1;
t = spice_dstring_value(&tstr) ;
while (t[k] > ' ')
{
cadd (u, t[k]);
cadd (u_p, t[k]);
k++;
}
@ -313,9 +341,9 @@ transform (tdico * dico, char *s, unsigned char nostripping, char *u)
}
else if (ci_prefix (".SUBCKT", t) == 1)
{ /* split off any "params" tail */
a = spos ("PARAMS:", t);
if (a > 0)
pscopy (s, s, 1, a - 1);
a = spos_ ("PARAMS:", t);
if (a >= 0)
pscopy (dstr_p, s, 0, a );
category = 'S';
}
else if (ci_prefix (".CONTROL", t) == 1)
@ -327,7 +355,7 @@ transform (tdico * dico, char *s, unsigned char nostripping, char *u)
else
{
category = '.';
n = stripbraces (s);
n = stripbraces (dstr_p);
if (n > 0)
category = 'B'; /* priority category ! */
}
@ -339,14 +367,14 @@ transform (tdico * dico, char *s, unsigned char nostripping, char *u)
}
else if (upcase (s[0]) == 'X')
{ /* strip actual parameters */
i = findsubname (dico, s); /* i= index following last identifier in s */
i = findsubname (dico, dstr_p) ; /* i= index following last identifier in s */
category = 'X';
}
else if (s[0] == '+') /* continuation line */
category = '+';
else if (cpos (s[0], "*$#") <= 0)
else if (cpos (s[0], "*$#") < 0)
{ /* not a comment line! */
n = stripbraces (s);
n = stripbraces (dstr_p);
if (n > 0)
category = 'B'; /* line that uses braces */
else
@ -355,7 +383,7 @@ transform (tdico * dico, char *s, unsigned char nostripping, char *u)
else
category = '*';
Strrem(t);
spice_dstring_free(&tstr) ;
return category;
}
@ -363,21 +391,21 @@ transform (tdico * dico, char *s, unsigned char nostripping, char *u)
/* some day, all these nasty globals will go into the tdico structure
and everything will get hidden behind some "handle" ...
For the time being we will rename this variable to end in S so we know
they are statics within this file for easier reading of the code.
*/
static int linecount = 0; /* global: number of lines received via nupa_copy */
static int evalcount = 0; /* number of lines through nupa_eval() */
static int nblog = 0; /* serial number of (debug) logfile */
static unsigned char inexpansion = 0; /* flag subckt expansion phase */
static unsigned char incontrol = 0; /* flag control code sections */
static unsigned char dologfile = 0; /* for debugging */
static unsigned char firstsignal = 1;
static FILE *logfile = NULL;
static tdico *dico = NULL;
static int linecountS = 0; /* global: number of lines received via nupa_copy */
static int evalcountS = 0; /* number of lines through nupa_eval() */
static int nblogS = 0; /* serial number of (debug) logfile */
static unsigned char inexpansionS = 0; /* flag subckt expansion phase */
static unsigned char incontrolS = 0; /* flag control code sections */
static unsigned char dologfileS = 0; /* for debugging */
static unsigned char firstsignalS = 1;
static FILE *logfileS = NULL;
static tdico *dicoS = NULL;
/* already part of dico : */
/* Str(80, srcfile); source file */
/*
Open ouput to a log file.
takes no action if logging is disabled.
@ -386,30 +414,34 @@ static tdico *dico = NULL;
static void
putlogfile (char c, int num, char *t)
{
Str (20, fname);
Strbig (dynLlen, u);
if (dologfile)
SPICE_DSTRING fname ; /* file name */
SPICE_DSTRING u ; /* temp dynamic variable */
spice_dstring_init( &fname ) ;
spice_dstring_init( &u ) ;
if (dologfileS)
{
if ((logfile == NULL))
if ((logfileS == NULL))
{
scopy (fname, "logfile.");
nblog++;
nadd (fname, nblog);
logfile = fopen (fname, "w");
scopys(&fname, "logfile.") ;
nblogS++;
nadd (&fname, nblogS) ;
logfileS = fopen ( spice_dstring_value(&fname), "w");
}
if ((logfile != NULL))
if ((logfileS != NULL))
{
cadd (u, c);
nadd (u, num);
cadd (u, ':');
cadd (u, ' ');
sadd (u, t);
cadd (u, '\n');
fputs (u, logfile);
cadd (&u, c);
nadd (&u, num);
cadd (&u, ':');
cadd (&u, ' ');
sadd (&u, t);
cadd (&u, '\n');
fputs ( spice_dstring_value(&u), logfileS);
}
}
Strrem(u);
spice_dstring_free(&u) ;
spice_dstring_free(&fname) ;
}
static void
@ -417,42 +449,44 @@ nupa_init (char *srcfile)
{
int i;
/* init the symbol table and so on, before the first nupa_copy. */
evalcount = 0;
linecount = 0;
incontrol = 0;
evalcountS = 0;
linecountS = 0;
incontrolS = 0;
placeholder = 0;
dico = (tdico *)new(sizeof(tdico));
inst_dico = (tdico *)new(sizeof(tdico));
initdico (dico);
initdico (inst_dico);
dicoS = (tdico *)new(sizeof(tdico));
inst_dicoS = (tdico *)new(sizeof(tdico));
initdico (dicoS);
initdico (inst_dicoS);
dico->dynrefptr = (char**)tmalloc((dynmaxline + 1)*sizeof(char*));
dico->dyncategory = (char*)tmalloc((dynmaxline + 1)*sizeof(char));
dicoS->dynrefptr = (char**)tmalloc((dynmaxline + 1)*sizeof(char*));
dicoS->dyncategory = (char*)tmalloc((dynmaxline + 1)*sizeof(char));
for (i = 0; i <= dynmaxline; i++)
{
dico->dynrefptr[i] = NULL;
dico->dyncategory[i] = '?';
dicoS->dynrefptr[i] = NULL;
dicoS->dyncategory[i] = '?';
}
if (srcfile != NULL)
scopy (dico->srcfile, srcfile);
scopys(&dicoS->srcfile, srcfile ) ;
}
static void
nupa_done (void)
{
/* int i; not needed so far, see below */
Str (80, rep);
char *reply ; /* user reply */
SPICE_DSTRING rep ; /* dynamic report */
int dictsize, nerrors;
if (logfile != NULL)
spice_dstring_init(&rep) ;
if (logfileS != NULL)
{
fclose (logfile);
logfile = NULL;
fclose (logfileS);
logfileS = NULL;
}
nerrors = dico->errcount;
dictsize = donedico (dico);
nerrors = dicoS->errcount;
dictsize = donedico (dicoS);
/* We cannot remove dico here because numparam is usedby
the .measure statement, which is invoked only after the
simulation has finished */
@ -472,26 +506,28 @@ nupa_done (void)
if (nerrors)
{
/* debug: ask if spice run really wanted */
scopy (rep, " Copies=");
nadd (rep, linecount);
sadd (rep, " Evals=");
nadd (rep, evalcount);
sadd (rep, " Placeholders=");
nadd (rep, placeholder);
sadd (rep, " Symbols=");
nadd (rep, dictsize);
sadd (rep, " Errors=");
nadd (rep, nerrors);
cadd (rep, '\n');
ws (rep);
sadd (&rep, " Copies=");
nadd (&rep, linecountS);
sadd (&rep, " Evals=");
nadd (&rep, evalcountS);
sadd (&rep, " Placeholders=");
nadd (&rep, placeholder);
sadd (&rep, " Symbols=");
nadd (&rep, dictsize);
sadd (&rep, " Errors=");
nadd (&rep, nerrors);
cadd (&rep, '\n');
ws ( spice_dstring_value(&rep) ) ;
ws ("Numparam expansion errors: Run Spice anyway? y/n ? \n");
rs (rep);
if (upcase (rep[0]) != 'Y')
spice_dstring_reinit(&rep) ;
rs (&rep);
reply = spice_dstring_value(&rep) ;
if (upcase (reply[0]) != 'Y')
controlled_exit(EXIT_FAILURE);
}
linecount = 0;
evalcount = 0;
linecountS = 0;
evalcountS = 0;
placeholder = 0;
/* release symbol table data */ ;
}
@ -502,110 +538,126 @@ nupa_scan (char *s, int linenum, int is_subckt)
{
if (is_subckt)
defsubckt (dico, s, linenum, 'U');
defsubckt (dicoS, s, linenum, 'U');
else
defsubckt (dico, s, linenum, 'O');
defsubckt (dicoS, s, linenum, 'O');
}
static char *
lower_str (char *str)
{
char *s;
for (s = str; *s; s++)
*s = tolower (*s);
return str;
}
static char *
upper_str (char *str)
{
char *s;
for (s = str; *s; s++)
*s = toupper (*s);
return str;
}
/* -----------------------------------------------------------------
* Dump the contents of the symbol table.
* ----------------------------------------------------------------- */
void
nupa_list_params (FILE * cp_out)
{
char *name;
int i;
char *name; /* current symbol */
entry *entry_p ; /* current entry */
tdico *dico_p ; /* local copy for speed */
NGHASHITER iter ; /* hash iterator - thread safe */
dico_p = dicoS ;
fprintf (cp_out, "\n\n");
for (i = 1; i <= dico->nbd; i++)
for (entry_p = nghash_enumerateRE(dico_p->symbol_table,NGHASH_FIRST(&iter)) ;
entry_p ;
entry_p = nghash_enumerateRE(dico_p->symbol_table,&iter))
{
if (dico->dyndat[i].tp == 'R')
if (entry_p->tp == 'R')
{
name = lower_str (strdup (dico->dyndat[i].nom));
fprintf (cp_out, " ---> %s = %g\n", name, dico->dyndat[i].vl);
txfree (name);
spice_dstring_reinit( & dico_p->lookup_buf ) ;
scopy_lower( & dico_p->lookup_buf, entry_p->symbol ) ;
name = spice_dstring_value( & dico_p->lookup_buf ) ;
fprintf (cp_out, " ---> %s = %g\n", name, entry_p->vl) ;
spice_dstring_free( & dico_p->lookup_buf ) ;
}
}
}
/* -----------------------------------------------------------------
* Lookup a parameter value in the symbol table.
* ----------------------------------------------------------------- */
double
nupa_get_param (char *param_name, int *found)
{
char *name = upper_str (strdup (param_name));
double result = 0;
int i;
char *up_name; /* current parameter upper case */
entry *entry_p ; /* current entry */
tdico *dico_p ; /* local copy for speed */
double result = 0; /* parameter value */
dico_p = dicoS ;
spice_dstring_reinit( & dico_p->lookup_buf ) ;
scopy_up( & dico_p->lookup_buf, param_name ) ;
up_name = spice_dstring_value( & dico_p->lookup_buf ) ;
*found = 0;
for (i = 1; i <= dico->nbd + 1; i++)
{
if (strcmp (dico->dyndat[i].nom, name) == 0)
{
result = dico->dyndat[i].vl;
*found = 1;
break;
}
entry_p = nghash_find( dico_p->symbol_table, up_name ) ;
if( entry_p ){
result = entry_p->vl ;
*found = 1;
}
txfree (name);
spice_dstring_free( & dico_p->lookup_buf ) ;
return result;
}
void
nupa_add_param (char *param_name, double value)
{
char *up_name = upper_str (strdup (param_name));
int i = attrib (dico, up_name, 'N');
char *up_name; /* current parameter upper case */
entry *entry_p ; /* current entry */
tdico *dico_p ; /* local copy for speed */
dico->dyndat[i].vl = value;
dico->dyndat[i].tp = 'R';
dico->dyndat[i].ivl = 0;
dico->dyndat[i].sbbase = NULL;
txfree (up_name);
dico_p = dicoS ;
/* -----------------------------------------------------------------
* We use a dynamic string here because most of the time we will
* be using short names and no memory allocation will occur.
* ----------------------------------------------------------------- */
spice_dstring_reinit( & dico_p->lookup_buf ) ;
scopy_up( & dico_p->lookup_buf, param_name ) ;
up_name = spice_dstring_value( & dico_p->lookup_buf ) ;
entry_p = attrib (dicoS, up_name, 'N');
if( entry_p ){
entry_p->vl = value;
entry_p->tp = 'R';
entry_p->ivl = 0;
entry_p->sbbase = NULL;
}
spice_dstring_free( & dico_p->lookup_buf ) ;
}
void
nupa_add_inst_param (char *param_name, double value)
{
char *up_name = upper_str (strdup (param_name));
int i = attrib (inst_dico, up_name, 'N');
char *up_name; /* current parameter upper case */
entry *entry_p ; /* current entry */
tdico *dico_p ; /* local copy for speed */
inst_dico->dyndat[i].vl = value;
inst_dico->dyndat[i].tp = 'R';
inst_dico->dyndat[i].ivl = 0;
inst_dico->dyndat[i].sbbase = NULL;
dico_p = inst_dicoS ;
spice_dstring_reinit( & dico_p->lookup_buf ) ;
scopy_up( & dico_p->lookup_buf, param_name ) ;
up_name = spice_dstring_value( & dico_p->lookup_buf ) ;
txfree (up_name);
entry_p = attrib (dicoS, up_name, 'N');
if( entry_p ){
entry_p->vl = value;
entry_p->tp = 'R';
entry_p->ivl = 0;
entry_p->sbbase = NULL;
}
spice_dstring_free( & dico_p->lookup_buf ) ;
}
void
nupa_copy_inst_dico ()
{
int i;
tdico *idico_p ; /* local copy for speed */
entry *entry_p ; /* current entry */
NGHASHITER iter ; /* hash iterator - thread safe */
for (i = 1; i <= inst_dico->nbd; i++)
nupa_add_param (inst_dico->dyndat[i].nom, inst_dico->dyndat[i].vl);
idico_p = inst_dicoS ;
for (entry_p = nghash_enumerateRE(idico_p->symbol_table,NGHASH_FIRST(&iter)) ;
entry_p ;
entry_p = nghash_enumerateRE(idico_p->symbol_table,&iter))
nupa_add_param ( entry_p->symbol, entry_p->vl) ;
}
char *
@ -626,39 +678,43 @@ nupa_copy (char *s, int linenum)
char *t;
int ls;
char c, d;
Strdbig (dynLlen, u, keywd);
SPICE_DSTRING u ;
SPICE_DSTRING keywd ;
spice_dstring_init(&u) ;
spice_dstring_init(&keywd) ;
ls = length (s);
while ((ls > 0) && (s[ls - 1] <= ' '))
ls--;
pscopy (u, s, 1, ls); /* strip trailing space, CrLf and so on */
dico->srcline = linenum;
pscopy (&u, s, 0, ls); /* strip trailing space, CrLf and so on */
dicoS->srcline = linenum;
if ((!inexpansion) && (linenum >= 0) && (linenum <= dynmaxline))
if ((!inexpansionS) && (linenum >= 0) && (linenum <= dynmaxline))
{
linecount++;
dico->dynrefptr[linenum] = s;
c = transform (dico, u, incontrol, keywd);
linecountS++;
dicoS->dynrefptr[linenum] = s;
c = transform (dicoS, &u, incontrolS, &keywd);
if (c == 'C')
incontrol = 1;
incontrolS = 1;
else if (c == 'E')
incontrol = 0;
incontrolS = 0;
if (incontrol)
if (incontrolS)
c = 'C'; /* force it */
d = dico->dyncategory[linenum]; /* warning if already some strategic line! */
d = dicoS->dyncategory[linenum]; /* warning if already some strategic line! */
if ((d == 'P') || (d == 'S') || (d == 'X'))
fprintf (stderr,
" Numparam warning: overwriting P,S or X line (linenum == %d).\n",
linenum);
dico->dyncategory[linenum] = c;
dicoS->dyncategory[linenum] = c;
} /* keep a local copy and mangle the string */
ls = length (u);
t = strdup (u);
ls = spice_dstring_length (&u);
t = strdup ( spice_dstring_value(&u) );
if (t == NULL)
{
@ -667,12 +723,12 @@ nupa_copy (char *s, int linenum)
}
else
{
if (!inexpansion)
if (!inexpansionS)
{
putlogfile (dico->dyncategory[linenum], linenum, t);
putlogfile (dicoS->dyncategory[linenum], linenum, t);
};
}
Strdrem(u, keywd);
spice_dstring_free(&u) ;
return t;
}
@ -688,12 +744,13 @@ nupa_eval (char *s, int linenum, int orig_linenum)
int idef; /* subckt definition line */
char c, keep, *ptr;
unsigned int i;
Str (80, subname);
SPICE_DSTRING subname ; /* dynamic string for subcircuit name */
unsigned char err = 1;
dico->srcline = linenum;
dico->oldline = orig_linenum;
c = dico->dyncategory[linenum];
spice_dstring_init(&subname) ;
dicoS->srcline = linenum;
dicoS->oldline = orig_linenum;
c = dicoS->dyncategory[linenum];
#ifdef TRACE_NUMPARAMS
fprintf (stderr, "** SJB - in nupa_eval()\n");
fprintf (stderr, "** SJB - processing line %3d: %s\n", linenum, s);
@ -701,10 +758,10 @@ nupa_eval (char *s, int linenum, int orig_linenum)
#endif /* TRACE_NUMPARAMS */
if (c == 'P') { /* evaluate parameters */
// err = nupa_substitute (dico, dico->dynrefptr[linenum], s, 0);
nupa_assignment (dico, dico->dynrefptr[linenum], 'N');
nupa_assignment (dicoS, dicoS->dynrefptr[linenum], 'N');
}
else if (c == 'B') /* substitute braces line */
err = nupa_substitute (dico, dico->dynrefptr[linenum], s, 0);
err = nupa_substitute (dicoS, dicoS->dynrefptr[linenum], s, 0);
else if (c == 'X')
{ /* compute args of subcircuit, if required */
ptr = s;
@ -719,17 +776,17 @@ nupa_eval (char *s, int linenum, int orig_linenum)
for (i = 0; i < strlen (nupa_inst_name); i++)
nupa_inst_name[i] = toupper (nupa_inst_name[i]);
idef = findsubckt (dico, s, subname);
idef = findsubckt (dicoS, s, &subname);
if (idef > 0)
nupa_subcktcall (dico, dico->dynrefptr[idef], dico->dynrefptr[linenum], 0);
nupa_subcktcall (dicoS, dicoS->dynrefptr[idef], dicoS->dynrefptr[linenum], 0);
else
putlogfile ('?', linenum, " illegal subckt call.");
}
else if (c == 'U') /* release local symbols = parameters */
nupa_subcktexit (dico);
nupa_subcktexit (dicoS);
putlogfile ('e', linenum, s);
evalcount++;
evalcountS++;
#ifdef TRACE_NUMPARAMS
fprintf (stderr, "** SJB - leaving nupa_eval(): %s %d\n", s, err);
ws ("** SJB - --> ");
@ -753,23 +810,23 @@ nupa_signal (int sig, char *info)
putlogfile ('!', sig, " Nupa Signal");
if (sig == NUPADECKCOPY)
{
if (firstsignal)
if (firstsignalS)
{
nupa_init (info);
firstsignal = 0;
firstsignalS = 0;
}
}
else if (sig == NUPASUBSTART)
inexpansion = 1;
inexpansionS = 1;
else if (sig == NUPASUBDONE)
{
inexpansion = 0;
inexpansionS = 0;
nupa_inst_name = NULL;
}
else if (sig == NUPAEVALDONE)
{
nupa_done ();
firstsignal = 1;
firstsignalS = 1;
}
return 1;
}
@ -782,3 +839,19 @@ nupa_fetchinstance (void)
return dico;
}
#endif /* USING_NUPATEST */
static void dump_symbols( tdico *dico_p )
{
char *name_p ; /* current symbol */
entry *entry_p ; /* current entry */
void *key ; /* return key */
NGHASHITER iter ; /* hash iterator - thread safe */
fprintf (stderr, "Symbol table\n");
for (entry_p = nghash_enumeratekRE(dico_p->symbol_table,&key,NGHASH_FIRST(&iter)) ;
entry_p ;
entry_p = nghash_enumeratekRE(dico_p->symbol_table,&key,&iter)) {
name_p = (char *) key ;
fprintf (stderr, " ---> %s = %g\n", name_p, entry_p->vl) ;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -781,12 +781,13 @@ bxx_printf(struct bxx_buffer *t, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
while(1) {
int size = t->limit - t->buffer;
int ret = vsnprintf(t->dst, size, fmt, ap);
if(ret == -1) {
int ret;
int size = t->limit - t->dst;
va_start(ap, fmt);
ret = vsnprintf(t->dst, size, fmt, ap);
va_end(ap);
if(ret == -1) {
bxx_extend(t, bxx_chunksize);
} else if(ret >= size) {
bxx_extend(t, ret - size + 1);

View File

@ -46,6 +46,7 @@ noinst_HEADERS = \
gendev.h \
graph.h \
grid.h \
hash.h \
hlpdefs.h \
iferrmsg.h \
ifsim.h \

View File

@ -69,6 +69,7 @@ typedef struct INPparseNode {
#define PT_CONSTANT 7
#define PT_VAR 8
#define PT_COMMA 10
#define PT_TERN 11
/* These are the functions that we support. */

View File

@ -11,6 +11,7 @@ libmisc_la_SOURCES = \
alloc.h \
dup2.c \
dup2.h \
hash.c \
ivars.c \
ivars.h \
mktemp.c \

View File

@ -85,6 +85,25 @@ PTeval(INPparseNode * tree, double gmin, double *res, double *vals)
}
break;
case PT_TERN:
{
INPparseNode *arg1 = tree->left;
INPparseNode *arg2 = tree->right->left;
INPparseNode *arg3 = tree->right->right;
err = PTeval(arg1, gmin, &r1, vals);
if (err != OK)
return (err);
/*FIXME > 0.0, >= 0.5, != 0.0 or what ? */
err = PTeval((r1 != 0.0) ? arg2 : arg3, gmin, &r2, vals);
if (err != OK)
return (err);
*res = r2;
break;
}
case PT_PLUS:
case PT_MINUS:
case PT_TIMES:

View File

@ -2,6 +2,7 @@
Copyright 1990 Regents of the University of California. All rights reserved.
Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group
**********/
// #define TRACE
#include "ngspice.h"
#include "ifsim.h"
@ -227,6 +228,31 @@ static INPparseNode *PTdifferentiate(INPparseNode * p, int varnum)
}
break;
case PT_TERN: /* ternary_fcn(cond,exp1,exp2) */
// naive:
// d/d ternary_fcn(cond,exp1,exp2) --> ternary_fcn(cond, d/d exp1, d/d exp2)
{
INPparseNode *arg1 = p->left;
INPparseNode *arg2 = p->right->left;
INPparseNode *arg3 = p->right->right;
// extern void printTree(INPparseNode *);
//
// printf("debug: %s, PT_TERN: ", __func__);
// printTree(p);
// printf("\n");
newp = mkb(PT_TERN, arg1, mkb(PT_COMMA,
PTdifferentiate(arg2, varnum),
PTdifferentiate(arg3, varnum)));
// printf("debug, %s, returns; ", __func__);
// printTree(newp);
// printf("\n");
return (newp);
}
case PT_FUNCTION:
/* Many cases. Set arg1 to the derivative of the function,
@ -491,11 +517,28 @@ static INPparseNode *mkb(int type, INPparseNode * left,
return (left);
}
break;
case PT_TERN:
if (left->type == PT_CONSTANT)
/*FIXME > 0.0, >= 0.5, != 0.0 or what ? */
return ((left->constant != 0.0) ? right->left : right->right);
if((right->left->type == PT_CONSTANT) &&
(right->right->type == PT_CONSTANT) &&
(right->left->constant == right->right->constant))
return (right->left);
break;
}
p->type = type;
p->left = left;
p->right = right;
if(type == PT_TERN) {
p->function = NULL;
p->funcname = NULL;
return (p);
}
p->type = type;
p->left = left;
p->right = right;
for (i = 0; i < NUM_OPS; i++)
if (ops[i].number == type)
@ -563,6 +606,8 @@ static int PTcheck(INPparseNode * p)
case PT_POWER:
case PT_COMMA:
return (PTcheck(p->left) && PTcheck(p->right));
case PT_TERN:
return (PTcheck(p->left) && PTcheck(p->right->left) && PTcheck(p->right->right));
default:
fprintf(stderr, "Internal error: bad node type %d\n", p->type);
@ -925,6 +970,29 @@ static INPparseNode *mkfnode(char *fname, INPparseNode * arg)
}
p->valueIndex = i;
p->type = PT_VAR;
} else if(!strcmp("ternary_fcn", buf)) {
// extern void printTree(INPparseNode *);
//
// printf("debug: %s ternary_fcn: ", __func__);
// printTree(arg);
// printf("\n");
if(arg->type != PT_COMMA || arg->left->type != PT_COMMA) {
fprintf(stderr, "Error: bogus ternary_fcn form\n");
return (NULL);
} else {
INPparseNode *arg1 = arg->left->left;
INPparseNode *arg2 = arg->left->right;
INPparseNode *arg3 = arg->right;
p->type = PT_TERN;
p->left = arg1;
p->right = mkb(PT_COMMA, arg2, arg3);
}
} else {
for (i = 0; i < NUM_FUNCS; i++)
if (!strcmp(funcs[i].name, buf))
@ -1127,7 +1195,7 @@ static PTelement *PTlexer(char **line)
#ifdef TRACE
printf("PTlexer: token = %d, type = %d, left = '%s'\n",
el.token, el.type, sbuf); */
el.token, el.type, sbuf);
#endif
return (&el);
}
@ -1204,11 +1272,28 @@ void printTree(INPparseNode * pt)
printf(")");
break;
case PT_COMMA:
printf("(");
printTree(pt->left);
printf(") , (");
printTree(pt->right);
printf(")");
break;
case PT_FUNCTION:
printf("%s (", pt->funcname);
printTree(pt->left);
printf(")");
break;
case PT_TERN:
printf("ternary_fcn (");
printTree(pt->left);
printf(") , (");
printTree(pt->right);
printf(")");
break;
default:
printf("oops");

View File

@ -29,12 +29,12 @@ Global
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Debug|Win32.Build.0 = Debug|Win32
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Debug|x64.ActiveCfg = Debug|x64
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Debug|x64.Build.0 = Debug|x64
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Release|Win32.ActiveCfg = Debug|Win32
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Release|Win32.Build.0 = Debug|Win32
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Release|Win32.ActiveCfg = Release|Win32
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Release|Win32.Build.0 = Release|Win32
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Release|x64.ActiveCfg = Release|x64
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.Release|x64.Build.0 = Release|x64
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.release64|Win32.ActiveCfg = release64|Win32
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.release64|Win32.Build.0 = release64|Win32
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.release64|Win32.ActiveCfg = release64|x64
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.release64|Win32.Build.0 = release64|x64
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.release64|x64.ActiveCfg = release64|x64
{83E315C7-EDD3-4F6B-AF28-87A92A4FA49A}.release64|x64.Build.0 = release64|x64
EndGlobalSection

View File

@ -48,7 +48,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;;&quot;C:\Program Files (x86)\Visual Leak Detector\include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;NGDEBUG"
MinimalRebuild="true"
ExceptionHandling="0"
@ -75,6 +75,7 @@
AdditionalDependencies="psapi.lib"
OutputFile="$(OutDir)\bin\vngspice_d.exe"
LinkIncremental="1"
AdditionalLibraryDirectories="&quot;C:\Program Files (x86)\Visual Leak Detector\lib&quot;"
GenerateManifest="false"
GenerateDebugInformation="true"
SubSystem="2"
@ -108,6 +109,96 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
ExcludedFromBuild="false"
/>
<Tool
Name="VCCustomBuildTool"
Description="Custom defined Build: Recompile conf.c with actual date"
CommandLine="del $(IntDir)\conf.obj&#x0D;&#x0A;"
Outputs="$(IntDir)\conf.obj"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;NGDEBUG"
MinimalRebuild="true"
ExceptionHandling="0"
BasicRuntimeChecks="0"
RuntimeLibrary="1"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="psapi.lib"
OutputFile="$(OutDir)\bin\vngspice_d.exe"
LinkIncremental="1"
GenerateManifest="false"
GenerateDebugInformation="true"
SubSystem="2"
HeapReserveSize="0"
HeapCommitSize="0"
StackReserveSize="0"
StackCommitSize="0"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
@ -202,335 +293,6 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="console_debug|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
ExcludedFromBuild="false"
/>
<Tool
Name="VCCustomBuildTool"
Description="Custom defined Build: Recompile conf.c with actual date"
CommandLine="del $(IntDir)\conf.obj&#x0D;&#x0A;"
Outputs="$(IntDir)\conf.obj"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;NGDEBUG;CONSOLE"
MinimalRebuild="true"
ExceptionHandling="0"
BasicRuntimeChecks="0"
RuntimeLibrary="1"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="psapi.lib"
OutputFile="$(OutDir)\bin\vngspice_dc.exe"
LinkIncremental="1"
GenerateManifest="false"
GenerateDebugInformation="true"
SubSystem="1"
HeapReserveSize="0"
HeapCommitSize="0"
StackReserveSize="0"
StackCommitSize="0"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="console_release|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
Description="Custom defined Build: Recompile conf.c with actual date"
CommandLine="del $(IntDir)\conf.obj&#x0D;&#x0A;"
Outputs="$(IntDir)\conf.obj"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="true"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;CONSOLE"
MinimalRebuild="false"
ExceptionHandling="1"
BasicRuntimeChecks="0"
RuntimeLibrary="0"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
UseUnicodeResponseFiles="false"
AdditionalDependencies="psapi.lib"
OutputFile="$(OutDir)\bin\$(ProjectName)c.exe"
LinkIncremental="1"
GenerateDebugInformation="false"
SubSystem="1"
HeapReserveSize="0"
HeapCommitSize="0"
StackReserveSize="0"
StackCommitSize="0"
OptimizeReferences="2"
EnableCOMDATFolding="2"
LinkTimeCodeGeneration="1"
RandomizedBaseAddress="2"
DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="release64|Win32"
ConfigurationType="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
ConfigurationType="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
ExcludedFromBuild="false"
/>
<Tool
Name="VCCustomBuildTool"
Description="Custom defined Build: Recompile conf.c with actual date"
CommandLine="del $(IntDir)\conf.obj&#x0D;&#x0A;"
Outputs="$(IntDir)\conf.obj"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
TargetEnvironment="3"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;NGDEBUG"
MinimalRebuild="true"
ExceptionHandling="0"
BasicRuntimeChecks="0"
RuntimeLibrary="1"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="psapi.lib"
OutputFile="$(OutDir)\bin\vngspice_d.exe"
LinkIncremental="1"
GenerateManifest="false"
GenerateDebugInformation="true"
SubSystem="2"
HeapReserveSize="0"
HeapCommitSize="0"
StackReserveSize="0"
StackCommitSize="0"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -626,6 +388,95 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="console_debug|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
>
<Tool
Name="VCPreBuildEventTool"
CommandLine=""
ExcludedFromBuild="false"
/>
<Tool
Name="VCCustomBuildTool"
Description="Custom defined Build: Recompile conf.c with actual date"
CommandLine="del $(IntDir)\conf.obj&#x0D;&#x0A;"
Outputs="$(IntDir)\conf.obj"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;NGDEBUG;CONSOLE"
MinimalRebuild="true"
ExceptionHandling="0"
BasicRuntimeChecks="0"
RuntimeLibrary="1"
RuntimeTypeInfo="false"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="4"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="psapi.lib"
OutputFile="$(OutDir)\bin\vngspice_dc.exe"
LinkIncremental="1"
GenerateManifest="false"
GenerateDebugInformation="true"
SubSystem="1"
HeapReserveSize="0"
HeapCommitSize="0"
StackReserveSize="0"
StackCommitSize="0"
RandomizedBaseAddress="1"
DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="console_debug|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -716,6 +567,100 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="console_release|Win32"
OutputDirectory="$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
Description="Custom defined Build: Recompile conf.c with actual date"
CommandLine="del $(IntDir)\conf.obj&#x0D;&#x0A;"
Outputs="$(IntDir)\conf.obj"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
WholeProgramOptimization="true"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR;CONSOLE"
MinimalRebuild="false"
ExceptionHandling="1"
BasicRuntimeChecks="0"
RuntimeLibrary="0"
RuntimeTypeInfo="true"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="false"
DebugInformationFormat="3"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
UseUnicodeResponseFiles="false"
AdditionalDependencies="psapi.lib"
OutputFile="$(OutDir)\bin\$(ProjectName)c.exe"
LinkIncremental="1"
GenerateDebugInformation="false"
SubSystem="1"
HeapReserveSize="0"
HeapCommitSize="0"
StackReserveSize="0"
StackCommitSize="0"
OptimizeReferences="2"
EnableCOMDATFolding="2"
LinkTimeCodeGeneration="1"
RandomizedBaseAddress="2"
DataExecutionPrevention="0"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="console_release|x64"
OutputDirectory="$(PlatformName)\$(ConfigurationName)"
@ -811,6 +756,64 @@
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="release64|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="release64|x64"
OutputDirectory="$(SolutionDir)$(PlatformName)\$(ConfigurationName)"
@ -835,6 +838,13 @@
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
FavorSizeOrSpeed="1"
WholeProgramOptimization="true"
AdditionalIncludeDirectories="&quot;$(ProjectDir)..\src\maths\poly&quot;;&quot;$(ProjectDir)..\src\frontend&quot;;&quot;$(ProjectDir)..\src\spicelib\devices&quot;;&quot;$(ProjectDir)..\src\include&quot;;&quot;$(ProjectDir)include&quot;"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;SIMULATOR"
WarningLevel="3"
CompileAs="1"
/>
<Tool
Name="VCManagedResourceCompilerTool"
@ -1788,16 +1798,16 @@
RelativePath="..\src\frontend\plotting\graphdb.h"
>
</File>
<File
RelativePath="..\src\frontend\plotting\grid.h"
>
</File>
<File
RelativePath="..\src\include\grid.h"
>
</File>
<File
RelativePath="..\src\misc\hash.h"
RelativePath="..\src\frontend\plotting\grid.h"
>
</File>
<File
RelativePath="..\src\include\hash.h"
>
</File>
<File
@ -1901,11 +1911,11 @@
>
</File>
<File
RelativePath="..\src\spicelib\parser\inp.h"
RelativePath="..\src\frontend\inp.h"
>
</File>
<File
RelativePath="..\src\frontend\inp.h"
RelativePath="..\src\spicelib\parser\inp.h"
>
</File>
<File
@ -5696,6 +5706,10 @@
RelativePath="..\src\frontend\plotting\grid.c"
>
</File>
<File
RelativePath="..\src\misc\hash.c"
>
</File>
<File
RelativePath="..\src\frontend\hcomp.c"
>