2 * test routine for WaveFile data file readers
4 * $Log: not supported by cvs2svn $
5 * Revision 1.5 2003/07/30 06:18:49 sgt
6 * better handling of the last point in a wavevar,
7 * in particular when wv_interp_val asks for a point beyond the end of the iv range
8 * enhance test_read.c to
10 * Revision 1.4 2000/08/09 23:37:39 sgt
11 * ss_hspice.c - wrote sf_guessrows_hsbin routine.
12 * others - instrumented to count reallocs and print out the number.
14 * Revision 1.3 2000/01/07 05:04:48 tell
15 * updating with old changes as we construct the CVS
17 * Revision 1.2 1998/09/17 18:25:09 tell
18 * prints out variable type
20 * Revision 1.1 1998/08/31 21:00:28 tell
34 void test_interp(WvTable
*wt
, double mytm
);
35 void dump_table_info(WvTable
*wt
);
36 void dump_wavevar(gpointer p
, gpointer u
);
39 main(int argc
, char **argv
)
51 char *filetype
= NULL
;
54 while ((c
= getopt (argc
, argv
, "alt:vx")) != EOF
) {
77 if(errflg
|| optind
>= argc
) {
78 fprintf(stderr
, "usage: %s [-altvx] file\n", argv
[0]);
82 spicestream_msg_level
= DBG
;
83 wf
= wf_read(argv
[optind
], filetype
);
87 fprintf(stderr
, "test_read: unable to read file\n");
90 printf("filename: \"%s\" #tables=%d\n",
91 wf
->wf_filename
, wf
->wf_ntables
);
93 for(i
= 0; i
< wf
->wf_ntables
; i
++) {
94 printf("table %d", i
);
95 wt
= wf_wtable(wf
, i
);
97 printf(" %s=%g", wt
->name
, wt
->swval
);
102 wf_foreach_wavevar(wf
, dump_wavevar
, NULL
);
104 wt
= wf_wtable(wf
, 0);
105 if(a_flag
&& wt
->wt_ndv
> 2) {
106 // test wf_add_var();
113 printf("before add: ndv=%d\n", wt
->wt_ndv
);
114 dv1
= wt_dv(wt
, wt
->wt_ndv
-2);
115 name_len
= strlen(dv1
->wv_name
);
116 dv2
= wt_dv(wt
, wt
->wt_ndv
-1);
117 name_len
+= strlen(dv2
->wv_name
);
119 nname
= g_new0(char, name_len
);
121 sprintf(nname
, "calc( %s - %s )",
125 wf_add_var(wf
, nname
, 1, MATH
, NULL
);
126 printf("after add: ndv=%d\n", wt
->wt_ndv
);
127 dvn
= wt_dv(wt
, wt
->wt_ndv
-1);
129 for(j
= 0; j
< wt
->nvalues
; j
++) {
130 wf_set_point(&dvn
->wds
[0], j
,
131 wds_get_point(&dv1
->wds
[0], j
) -
132 wds_get_point(&dv2
->wds
[0], j
));
140 for(t
= 0; t
< wf
->wf_ntables
; t
++) {
141 printf("table %d: ", t
);
142 wt
= wf_wtable(wf
, t
);
144 printf(" %s=%g", wt
->name
, wt
->swval
);
147 printf(" %10s", wt
->iv
->wv_name
);
148 for(i
= 0; i
< wt
->wt_ndv
; i
++) {
150 printf(" %10s", dv
->wv_name
);
153 for(j
= 0; j
< wt
->nvalues
; j
++) {
154 printf("[%3d] %10g", j
, wds_get_point(wt
->iv
->wds
, j
));
155 for(i
= 0; i
< wt
->wt_ndv
; i
++) {
158 wds_get_point(&dv
->wds
[0], j
));
165 wt
= wf_wtable(wf
, 0);
170 mytm
= wds_get_point(wt
->iv
->wds
, 0);
171 delta
= (wds_get_point(wt
->iv
->wds
, wt
->nvalues
-1) - mytm
) / 40.0;
172 printf("40 divisions, delta=%g\n", delta
);
173 for(i
= 0; i
<= 41; i
++, mytm
+= delta
) {
174 test_interp(wt
, mytm
);
176 mytm
= wds_get_point(wt
->iv
->wds
, wt
->nvalues
-2);
178 test_interp(wt
, mytm
);
184 void dump_table_info(WvTable
*wt
)
186 WaveFile
*wf
= wt
->wf
;
188 printf("independent variable:\n");
189 printf(" name: \"%s\"\n", wt
->iv
->wv_name
);
190 printf(" type: %s\n", vartype_name_str(wt
->iv
->wv_type
));
191 printf(" npts: %d\n", wt
->nvalues
);
192 printf(" min: %g\n", wt
->iv
->wds
->min
);
193 printf(" max: %g\n", wt
->iv
->wds
->max
);
194 printf(" blocks: %d/%d\n", wt
->iv
->wds
->bpused
, wt
->iv
->wds
->bpsize
);
195 printf(" reallocs: %d\n", wt
->iv
->wds
->nreallocs
);
197 printf("columns: %d\n", wf
->wf_ncols
);
198 printf("dependent variables: %d\n", wf
->wf_ndv
);
202 dump_wavevar(gpointer p
, gpointer u
)
204 WaveVar
*wv
= (WaveVar
*)p
;
207 printf(" dv %p \"%s\" ", wv
, wv
->wv_name
);
208 printf(" (type=%s)", vartype_name_str(wv
->wv_type
));
211 printf(" (%d columns)\n", wv
->wv_ncols
);
213 for(j
= 0; j
< wv
->wv_ncols
; j
++) {
215 printf(" col[%d] ", j
);
216 printf("blocks=%d/%d ",
217 wv
->wds
[j
].bpused
, wv
->wds
[j
].bpsize
);
218 printf("min=%g ",wv
->wds
[j
].min
);
219 printf("max=%g ", wv
->wds
[j
].max
);
220 printf("first=%g ", wds_get_point(&wv
->wds
[j
], 0));
221 printf("last=%g\n", wds_get_point(&wv
->wds
[j
],
227 test_interp(WvTable
*wt
, double mytm
)
231 idx
= wf_find_point(wt
->iv
, mytm
);
232 printf("last %8s < %14.8g is %14.8g at [%4d];",
235 wds_get_point(wt
->iv
->wds
, idx
),
239 printf("%8s at %8s=%14.8g is %14.8g\n",
243 wv_interp_value(wv
, mytm
));