1 /*
2  * spicefile.h - definitions for a file reader for the analog
3  * output files of various spice-like simulators.
4  *
5  * Copyright 1998,1999 Stephen G. Tell.
6  *
7  *
8  */
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 typedef struct _SpiceStream SpiceStream;
15 typedef struct _SpiceVar SpiceVar;
16 
17 
18 typedef enum {
19 	UNKNOWN = 0,
20 	TIME = 1,
21 	VOLTAGE = 2,
22 	CURRENT = 3,
23 	FREQUENCY = 4,
24 } VarType;
25 
26 typedef enum SSMsgLevel_tag {DBG = -1, INFO = 0, WARN = 1, ERR = 2} SSMsgLevel;
27 extern FILE *ss_error_file;
28 typedef void (*SSMsgHook) (char *s);
29 extern SSMsgHook ss_error_hook;
30 extern SSMsgLevel spicestream_msg_level;
31 
32 /* header data on each variable mentioned in the file
33  * For sweep parameters, ncols will be 0.
34  */
35 struct _SpiceVar {
36 	char *name;
37 	VarType type;
38 	int col;    /* index of (first) column of data that goes with this variable */
39 	int ncols;  /* number of columns of data for this variable; complex numbers have two */
40 };
41 
42 typedef int (*SSReadRow) (SpiceStream *sf, double *ivar, double *dvars);
43 typedef int (*SSReadSweep) (SpiceStream *sf, double *spar);
44 
45 struct _SpiceStream {
46 	char *filename;
47 	int filetype;
48 	int ndv;	/* number of dependent variables */
49 	int ncols;	/* number of columns of data readrow will fill in */
50 	SpiceVar *ivar; /* ptr to independent-variable info */
51 	SpiceVar *dvar; /* ptr to array of dependent variable info */
52 	SpiceVar *spar; /* ptr to array of sweep parameter info */
53 
54 	SSReadRow readrow;  /* func to read one row of data points */
55 	SSReadSweep readsweep;  /* func to read one row of data points */
56 	int ntables;	/* number of data tables in the file; not
57 			* reliable for all file formats */
58 	int nsweepparam; /* number of implicit sweep parameter values at the start
59 			  * of each table; may be 0 even for a multi-variate
60 			  * sweep in some file formats */
61 
62 	/* the following stuff is for private use of reader routines */
63 	FILE *fp;
64 	int flags;
65 	int lineno;
66 	char *linebuf;
67 	int line_length;
68 	int lbufsize;
69 	int expected_vals;
70 	int read_vals;
71 	int read_rows;
72 	int read_tables;
73 	int read_sweepparam;
74 	char *linep;
75 	double ivval;
76 
77 	/* following for nsout format */
78 	double voltage_resolution;
79 	double current_resolution;
80 	double time_resolution;
81 	int maxindex;
82 	double *datrow;	/* temporary data row indexed by ns indices */
83 	int *nsindexes; /* indexed by dvar, contains ns index number */
84 };
85 
86 /* values for flags field */
87 #define SSF_ESWAP 1
88 #define SSF_PUSHBACK 2
89 
90 #define ss_readrow(sf, ivp, dvp) ((sf->readrow)(sf, ivp, dvp))
91 #define ss_readsweep(sf, swp) ((sf->readsweep)(sf, swp))
92 
93 extern SpiceStream *ss_open(char *filename, char *type);
94 extern SpiceStream *ss_open_fp(FILE *fp, char *type);
95 extern SpiceStream *ss_open_internal(FILE *fp, char *name, char *type);
96 extern SpiceStream *ss_new(FILE *fp, char *name, int ndv, int nspar);
97 extern void ss_close(SpiceStream *sf);
98 extern void ss_delete(SpiceStream *ss);
99 extern char *ss_var_name(SpiceVar *sv, int col, char *buf, int n);
100 extern char *vartype_name_str(VarType type);
101 extern int fread_line(FILE *fp, char **bufp, int *bufsize);
102 extern void ss_msg(SSMsgLevel type, const char *id, const char *msg, ...);
103 extern char *ss_filetype_name(int n);
104 
105 
106 #ifdef __cplusplus
107 	   }
108 #endif
109