1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : VCD Version 2.00 */
6 /* Fichier : vcd_interface.c */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Gilles Augustins */
13 /****************************************************************************/
15 /****************************************************************************/
17 /****************************************************************************/
20 #include "vcd_parse.h"
22 /****************************************************************************/
24 /****************************************************************************/
26 /****************************************************************************/
28 /****************************************************************************/
33 fprintf (stderr
, "[VCD ERR] no VCD database loaded\n");
39 /****************************************************************************/
47 if (!vcd_db_check ()) return;
49 for (i
= 0; i
< vcd_db
->SIG_IDX
; i
++) {
50 for(chain
= vcd_db
->SIG_TAB
[i
]; chain
; chain
= chain
->NEXT
){
51 signame
= (char*)chain
->DATA
;
52 if (isvss (signame
) || isglobalvss (signame
)) continue;
53 if (isvdd (signame
) || isglobalvdd (signame
)) continue;
54 fprintf (stdout
, " %s\n", signame
);
59 /****************************************************************************/
60 /****************************************************************************/
61 /****************************************************************************/
63 void vcd_print_waveform (trans_list
*waveform
)
68 if (!vcd_db_check ()) return;
70 for(chain
= vcd_db
->SIG_TAB
[waveform
->INDEX
]; chain
; chain
= chain
->NEXT
){
71 fprintf (stdout
, "%s : ", (char*)chain
->DATA
);
73 for (trans
= waveform
; trans
; trans
= trans
->NEXT
)
74 fprintf (stdout
, " (%d, '%s')", trans
->TIME
, trans
->VAL
);
75 fprintf (stdout
, "\n");
77 /****************************************************************************/
79 trans_list
*vcd_get_waveform (char *signal
)
84 if (!vcd_db_check ()) return NULL
;
86 sscanf(signal
,"%[^[][%*d:%*d]",buf
);
88 if ((index
= gethtitem (vcd_db
->SIG_HT
, namealloc (buf
))) == EMPTYHT
) {
89 fprintf (stderr
, "[VCD ERR] signal '%s' does not exist in VCD file\n", signal
);
93 return vcd_db
->SIG_ENTRY
[index
];
96 /****************************************************************************/
98 trans_list
*vcd_get_first_event (trans_list
*waveform
)
103 /****************************************************************************/
105 trans_list
*vcd_get_next_event (trans_list
*event
)
113 /****************************************************************************/
115 trans_list
*vcd_get_prev_event (trans_list
*event
)
123 /****************************************************************************/
125 void vcd_print_event (trans_list
*event
)
127 fprintf (stdout
, "\n (%d, '%s')\n", event
->TIME
, event
->VAL
);
130 /****************************************************************************/
131 /****************************************************************************/
132 /****************************************************************************/
134 chain_list
*vcd_get_current_events ()
137 if (!vcd_db_check ()) return NULL
;
139 return vcd_db
->TIME_ENTRY
[vcd_db
->CUR_TIME_IDX
];
142 /****************************************************************************/
144 long vcd_count_events (chain_list
*events
)
149 if (!vcd_db_check ()) return 0;
151 for (ch
= events
; ch
; ch
= ch
->NEXT
) count
++;
156 /****************************************************************************/
158 void vcd_print_current_events (chain_list
*events
)
164 if (!vcd_db_check ()) return;
166 fprintf (stdout
, "%d : ", ((trans_list
*)events
->DATA
)->TIME
);
167 for (ch
= events
; ch
; ch
= ch
->NEXT
) {
168 trans
= (trans_list
*)ch
->DATA
;
169 for(chain
= vcd_db
->SIG_TAB
[trans
->INDEX
]; chain
; chain
= chain
->NEXT
){
170 fprintf (stdout
, " (%s, '%s')", (char*)chain
->DATA
, trans
->VAL
);
173 fprintf (stdout
, "\n");
176 /****************************************************************************/
177 /****************************************************************************/
178 /****************************************************************************/
180 static void vcd_goto_init_state ()
182 if (vcd_db
->CUR_STATE
) freechain (vcd_db
->CUR_STATE
);
183 vcd_db
->CUR_STATE
= dupchainlst (vcd_db
->TIME_ENTRY
[0]);
186 /****************************************************************************/
188 static void vcd_goto_state (long time
)
194 if (!vcd_db_check ()) return;
196 if (!vcd_db
->CUR_STATE
) { // search from time 0
197 for (i
= 0; i
< vcd_db
->SIG_IDX
; i
++)
198 for (trans
= vcd_db
->SIG_ENTRY
[i
]; trans
; trans
= trans
->NEXT
)
199 if (!trans
->NEXT
|| (trans
->NEXT
->TIME
> time
) || (trans
->TIME
== time
)) {
200 vcd_db
->CUR_STATE
= addchain (vcd_db
->CUR_STATE
, trans
);
204 else if (time
> vcd_db
->TIME_TAB
[vcd_db
->CUR_TIME_IDX
]) { // update current state forward
205 for (ch
= vcd_db
->CUR_STATE
; ch
; ch
= ch
->NEXT
)
206 for (trans
= (trans_list
*)ch
->DATA
; trans
; trans
= trans
->NEXT
)
207 if (!trans
->NEXT
|| (trans
->NEXT
->TIME
> time
) || (trans
->TIME
== time
)) {
212 else if (time
< vcd_db
->TIME_TAB
[vcd_db
->CUR_TIME_IDX
]) // update current state backward
213 for (ch
= vcd_db
->CUR_STATE
; ch
; ch
= ch
->NEXT
)
214 for (trans
= (trans_list
*)ch
->DATA
; trans
; trans
= trans
->PREV
)
215 if (!trans
->PREV
|| (trans
->TIME
<= time
)) {
221 /****************************************************************************/
223 chain_list
*vcd_get_state ()
225 if (!vcd_db_check ()) return NULL
;
227 return vcd_db
->CUR_STATE
;
230 /****************************************************************************/
232 void vcd_print_state (chain_list
*state
)
238 if (!vcd_db_check ()) return;
240 for (ch
= state
; ch
; ch
= ch
->NEXT
) {
241 trans
= (trans_list
*)ch
->DATA
;
242 for(chain
= vcd_db
->SIG_TAB
[trans
->INDEX
]; chain
; chain
= chain
->NEXT
){
243 fprintf (stdout
, "%s : '%s' (t = %d)\n", (char*)chain
->DATA
, trans
->VAL
, trans
->TIME
);
248 /****************************************************************************/
249 /****************************************************************************/
250 /****************************************************************************/
252 long vcd_get_time_from_index (long index
)
254 if (!vcd_db_check ()) return 0;
256 return vcd_db
->TIME_TAB
[index
];
259 /****************************************************************************/
261 float vcd_get_nrj_from_index (long index
)
263 if (!vcd_db_check ()) return 0;
265 return vcd_db
->NRJ_ENTRY
[index
];
268 /****************************************************************************/
270 long vcd_get_max_index ()
272 if (!vcd_db_check ()) return 0;
274 return vcd_db
->TIME_IDX
;
277 /****************************************************************************/
281 if (!vcd_db_check ()) return 0;
283 return vcd_db
->TIME_TAB
[vcd_db
->CUR_TIME_IDX
];
286 /****************************************************************************/
288 void vcd_goto_time (long time
)
292 if (!vcd_db_check ()) return;
294 vcd_goto_state (time
);
296 for (i
= 0; i
< vcd_db
->TIME_IDX
; i
++)
297 if (vcd_db
->TIME_TAB
[i
] >= time
) break;
298 vcd_db
->CUR_TIME_IDX
= i
;
301 /****************************************************************************/
303 char vcd_goto_next_time ()
307 if (!vcd_db_check ()) return 0;
309 if (vcd_db
->CUR_TIME_IDX
< vcd_db
->TIME_IDX
) {
310 vcd_db
->CUR_TIME_IDX
++;
311 time
= vcd_get_time ();
312 vcd_db
->CUR_TIME_IDX
--;
313 vcd_goto_state (time
);
314 vcd_db
->CUR_TIME_IDX
++;
321 /****************************************************************************/
323 void vcd_goto_prev_time ()
327 if (!vcd_db_check ()) return;
329 if (vcd_db
->CUR_TIME_IDX
>= 0) {
330 vcd_db
->CUR_TIME_IDX
--;
331 time
= vcd_get_time ();
332 vcd_db
->CUR_TIME_IDX
++;
333 vcd_goto_state (time
);
334 vcd_db
->CUR_TIME_IDX
--;
338 /****************************************************************************/
340 void vcd_goto_init_time ()
342 if (!vcd_db_check ()) return;
344 vcd_db
->CUR_TIME_IDX
= 0;
345 vcd_goto_init_state ();
348 /****************************************************************************/
350 void vcd_goto_first_time ()
352 if (!vcd_db_check ()) return;
354 vcd_goto_init_state ();
355 vcd_db
->CUR_TIME_IDX
= 0;
357 vcd_db
->CUR_TIME_IDX
= 1;
360 /****************************************************************************/
362 void vcd_add_nrj (float nrj
)
364 if (!vcd_db_check ()) return;
366 vcd_db
->NRJ_ENTRY
[vcd_db
->CUR_TIME_IDX
] = nrj
;
369 /****************************************************************************/
371 void vcd_add_trans_nrj (trans_list
*trans
, float nrj
)
373 if (!vcd_db_check ()) return;