1 /******************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : GCF Version 1.00 */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Gilles Augustins */
13 /******************************************************************************/
16 #include "tlf_parse.h"
18 /******************************************************************************/
20 /******************************************************************************/
22 typedef struct gcf_edge {
28 ht *clockht, *vclockht ;
29 chain_list *ch, *vclockchain = NULL ;
30 chain_list *chfrom, *chto ;
32 char *ckname, *ckalias, *alckalias, *chipname ;
33 char *srelative, *hrelative ;
36 float stablerise, unstablerise, stablefall, unstablefall ;
37 float setuprise, holdrise, setupfall, holdfall ;
40 /******************************************************************************/
41 /* function declarations */
42 /******************************************************************************/
50 struct { struct chain *FROMLIST ; struct chain *TOLIST ; } arct ;
58 %token GCF_TOKEN_ARRIVAL
60 %token GCF_TOKEN_CLOCK
61 %token GCF_TOKEN_CSCALE
63 %token GCF_TOKEN_DELIM
64 %token GCF_TOKEN_DEPARTURE
65 %token GCF_TOKEN_DESIGN
66 %token GCF_TOKEN_DISABLE
67 %token <real> GCF_TOKEN_ENUMBER
68 %token GCF_TOKEN_ENVIRONMENT
69 %token GCF_TOKEN_EXCEPTIONS
72 %token GCF_TOKEN_GLOBALS
73 %token GCF_TOKEN_GLOBAL_SUBSET_TIMING
74 %token GCF_TOKEN_HEADER
75 %token <text> GCF_TOKEN_IDENT
76 %token GCF_TOKEN_LEFTPAR
77 %token GCF_TOKEN_NEGEDGE
78 %token <real> GCF_TOKEN_NUMBER
79 %token GCF_TOKEN_POSEDGE
80 %token <text> GCF_TOKEN_QSTRING
81 %token <text> GCF_TOKEN_QIDENT
82 %token GCF_TOKEN_RIGHTPAR
83 %token GCF_TOKEN_RSCALE
84 %token GCF_TOKEN_SUBSET_TIMING
87 %token GCF_TOKEN_TSCALE
88 %token GCF_TOKEN_VERSION
89 %token GCF_TOKEN_VSCALE
90 %token GCF_TOKEN_WAVEFORM
93 %type <text> clockspec
94 %type <text> nconnector
97 %type <list> ident_list
104 gcf_file : GCF_TOKEN_LEFTPAR gcf header globals cell GCF_TOKEN_RIGHTPAR
106 if (GCF_MODE == SPECOUT_DUMP) {
107 for (ch = vclockchain ; ch ; ch = ch->NEXT)
109 freechain (vclockchain) ;
116 if (GCF_MODE == CLOCK_DETECT) {
117 clockht = addht (GCF_SIZEHCK) ;
118 vclockht = addht (GCF_SIZEHCK) ;
121 if (GCF_MODE == CLOCK_DUMP) {
122 fprintf (GCF_OUT, "\nclock connectors\nbegin\n") ;
125 if (GCF_MODE == SPECIN_DUMP) {
126 fprintf (GCF_OUT, "\nspecify input connectors\nbegin\n") ;
129 if (GCF_MODE == SPECOUT_DUMP) {
130 fprintf (GCF_OUT, "\nverify output connectors\nbegin\n") ;
135 header : GCF_TOKEN_LEFTPAR GCF_TOKEN_HEADER version design date delimiters tscale cscale rscale vscale GCF_TOKEN_RIGHTPAR
137 if (GCF_MODE == CLOCK_DETECT) {
138 fprintf (GCF_OUT, "name %s ;\n", chipname) ;
139 fprintf (GCF_OUT, "version 1.00 ;\n") ;
140 fprintf (GCF_OUT, "setuptime 0 ;\n") ;
141 fprintf (GCF_OUT, "holdtime 0 ;\n") ;
146 version : GCF_TOKEN_LEFTPAR GCF_TOKEN_VERSION GCF_TOKEN_QSTRING GCF_TOKEN_RIGHTPAR
147 | GCF_TOKEN_LEFTPAR GCF_TOKEN_VERSION GCF_TOKEN_QIDENT GCF_TOKEN_RIGHTPAR
150 design : GCF_TOKEN_LEFTPAR GCF_TOKEN_DESIGN GCF_TOKEN_QSTRING GCF_TOKEN_RIGHTPAR
152 chipname = stm_unquote ($3) ;
154 | GCF_TOKEN_LEFTPAR GCF_TOKEN_DESIGN GCF_TOKEN_QIDENT GCF_TOKEN_RIGHTPAR
156 chipname = stm_unquote ($3) ;
160 date : GCF_TOKEN_LEFTPAR GCF_TOKEN_DATE GCF_TOKEN_QSTRING GCF_TOKEN_RIGHTPAR
161 | GCF_TOKEN_LEFTPAR GCF_TOKEN_DATE GCF_TOKEN_QIDENT GCF_TOKEN_RIGHTPAR
164 delimiters : GCF_TOKEN_LEFTPAR GCF_TOKEN_DELIM GCF_TOKEN_QSTRING GCF_TOKEN_RIGHTPAR
165 | GCF_TOKEN_LEFTPAR GCF_TOKEN_DELIM GCF_TOKEN_QIDENT GCF_TOKEN_RIGHTPAR
168 tscale : GCF_TOKEN_LEFTPAR GCF_TOKEN_TSCALE number GCF_TOKEN_RIGHTPAR
174 cscale : GCF_TOKEN_LEFTPAR GCF_TOKEN_CSCALE number GCF_TOKEN_RIGHTPAR
177 rscale : GCF_TOKEN_LEFTPAR GCF_TOKEN_RSCALE number GCF_TOKEN_RIGHTPAR
180 vscale : GCF_TOKEN_LEFTPAR GCF_TOKEN_VSCALE number GCF_TOKEN_RIGHTPAR
183 globals : GCF_TOKEN_LEFTPAR GCF_TOKEN_GLOBALS globtmgsubset GCF_TOKEN_RIGHTPAR
186 globtmgsubset : GCF_TOKEN_LEFTPAR GCF_TOKEN_GLOBAL_SUBSET_TIMING wave_list GCF_TOKEN_RIGHTPAR
188 if (GCF_MODE == CLOCK_DUMP) {
189 fprintf (GCF_OUT, "end ;\n") ;
198 wave : GCF_TOKEN_LEFTPAR GCF_TOKEN_WAVEFORM clockname number edges GCF_TOKEN_RIGHTPAR
200 if (GCF_MODE == CLOCK_DUMP && clocktype == REAL_CLOCK)
201 fprintf (GCF_OUT, " period %ld ;\n", ftol ($4 * (1e12 * timescale))) ;
205 clockname : GCF_TOKEN_QIDENT
207 if (GCF_MODE == CLOCK_DUMP) {
208 ckalias = stm_unquote ($1) ;
209 alckalias = namealloc (ckalias) ;
210 ckname = (char*)gethtitem (clockht, alckalias) ;
211 if ((long)ckname == EMPTYHT) {
212 clocktype = VIRTUAL_CLOCK ;
213 ed = (gcf_edge*) mbkalloc (sizeof (struct gcf_edge)) ;
214 addhtitem (vclockht, alckalias, (long)ed) ;
215 vclockchain = addchain (vclockchain, ed) ;
217 fprintf (GCF_OUT, " %s :\n", ckname) ;
218 clocktype = REAL_CLOCK ;
224 edges : posedge negedge
228 posedge : GCF_TOKEN_LEFTPAR GCF_TOKEN_POSEDGE number GCF_TOKEN_RIGHTPAR
230 if (GCF_MODE == CLOCK_DUMP && clocktype == REAL_CLOCK)
231 fprintf (GCF_OUT, " up %ld ;\n", ftol ($3 * (1e12 * timescale))) ;
232 if (GCF_MODE == CLOCK_DUMP && clocktype == VIRTUAL_CLOCK) {
233 ed->POSEDGE = ftol ($3 * (1e12 * timescale)) ;
238 negedge : GCF_TOKEN_LEFTPAR GCF_TOKEN_NEGEDGE number GCF_TOKEN_RIGHTPAR
240 if (GCF_MODE == CLOCK_DUMP && clocktype == REAL_CLOCK)
241 fprintf (GCF_OUT, " down %ld ;\n", ftol ($3 * (1e12 * timescale))) ;
242 if (GCF_MODE == CLOCK_DUMP && clocktype == VIRTUAL_CLOCK) {
243 ed->NEGEDGE = ftol ($3 * (1e12 * timescale)) ;
248 cell : GCF_TOKEN_LEFTPAR GCF_TOKEN_CELL celldef tmgsubset parasubset GCF_TOKEN_RIGHTPAR
251 celldef : GCF_TOKEN_LEFTPAR GCF_TOKEN_RIGHTPAR
254 tmgsubset : GCF_TOKEN_LEFTPAR GCF_TOKEN_SUBSET_TIMING tmgsubsetenv tmgsubsetexc GCF_TOKEN_RIGHTPAR
257 tmgsubsetenv : GCF_TOKEN_LEFTPAR GCF_TOKEN_ENVIRONMENT event_list GCF_TOKEN_RIGHTPAR
259 if (GCF_MODE == SPECIN_DUMP || GCF_MODE == SPECOUT_DUMP) {
260 fprintf (GCF_OUT, "end ;\n") ;
265 tmgsubsetexc : GCF_TOKEN_LEFTPAR beginexcept except_list GCF_TOKEN_RIGHTPAR
267 if (GCF_MODE == DISABLE_DUMP)
268 fprintf (GCF_OUT, "end ;\n") ;
273 beginexcept : GCF_TOKEN_EXCEPTIONS
275 if (GCF_MODE == DISABLE_DUMP)
276 fprintf (GCF_OUT, "\ndisable\nbegin\n") ;
284 except : GCF_TOKEN_LEFTPAR GCF_TOKEN_DISABLE arc GCF_TOKEN_RIGHTPAR
286 if (GCF_MODE == DISABLE_DUMP) {
287 if ($3.FROMLIST && $3.TOLIST) {
288 for (chfrom = $3.FROMLIST ; chfrom ; chfrom = chfrom->NEXT) {
289 nfrom = gethtitem (clockht, namealloc ((char*)chfrom->DATA)) ;
290 for (chto = $3.TOLIST ; chto ; chto = chto->NEXT) {
291 nto = gethtitem (clockht, namealloc ((char*)chto->DATA)) ;
292 if (nfrom != EMPTYHT && nto != EMPTYHT)
293 fprintf (GCF_OUT, " from %s to %s ;\n", (char*)nfrom, (char*)nto) ;
296 freechain ($3.FROMLIST) ;
297 freechain ($3.TOLIST) ;
299 if (!$3.FROMLIST && $3.TOLIST) {
300 for (chto = $3.TOLIST ; chto ; chto = chto->NEXT) {
301 nto = gethtitem (clockht, namealloc ((char*)chto->DATA)) ;
303 fprintf (GCF_OUT, " to %s ;\n", (char*)nto) ;
305 freechain ($3.TOLIST) ;
307 if ($3.FROMLIST && !$3.TOLIST) {
308 for (chfrom = $3.FROMLIST ; chfrom ; chfrom = chfrom->NEXT) {
309 nfrom = gethtitem (clockht, namealloc ((char*)chfrom->DATA)) ;
310 if (nfrom != EMPTYHT)
311 fprintf (GCF_OUT, " from %s ;\n", (char*)nfrom) ;
313 freechain ($3.FROMLIST) ;
319 arc : GCF_TOKEN_LEFTPAR from to GCF_TOKEN_RIGHTPAR
321 if (GCF_MODE == DISABLE_DUMP) {
328 if (GCF_MODE == DISABLE_DUMP) {
335 if (GCF_MODE == DISABLE_DUMP) {
342 from : GCF_TOKEN_LEFTPAR GCF_TOKEN_FROM ident_list GCF_TOKEN_RIGHTPAR
344 if (GCF_MODE == DISABLE_DUMP)
349 to : GCF_TOKEN_LEFTPAR GCF_TOKEN_TO ident_list GCF_TOKEN_RIGHTPAR
351 if (GCF_MODE == DISABLE_DUMP)
358 $$ = addchain (NULL, $1) ;
362 $$ = addchain ($2, $1) ;
375 nconnector : GCF_TOKEN_IDENT
385 arrival : GCF_TOKEN_LEFTPAR GCF_TOKEN_ARRIVAL clockspec number number number number nconnector GCF_TOKEN_RIGHTPAR
387 if (GCF_MODE == SPECIN_DUMP) {
392 alckalias = namealloc (ckalias) ;
393 ckname = (char*)gethtitem (clockht, alckalias) ;
394 fprintf (GCF_OUT, " %s rising :\n", $8) ;
395 if ((long)ckname == EMPTYHT) {
396 ed = (gcf_edge*)gethtitem (vclockht, alckalias) ;
397 if ((long)ed != EMPTYHT) {
398 if (!strcmp ("rising", $3))
399 tedge = ed->POSEDGE ;
401 tedge = ed->NEGEDGE ;
402 fprintf (GCF_OUT, " stable %ld ;\n",
403 ftolstretch (stablerise * (1e12 * timescale)) + tedge) ;
404 fprintf (GCF_OUT, " unstable %ld ;\n",
405 ftolstretch (unstablerise * (1e12 * timescale)) + tedge) ;
408 fprintf (GCF_OUT, " stable %ld after %s %s ;\n",
409 ftolstretch (stablerise * (1e12 * timescale)), ckname, $3) ;
410 fprintf (GCF_OUT, " unstable %ld after %s %s ;\n",
411 ftolstretch (unstablerise * (1e12 * timescale)), ckname, $3) ;
413 fprintf (GCF_OUT, " %s falling :\n", $8) ;
414 if ((long)ckname == EMPTYHT) {
415 ed = (gcf_edge*)gethtitem (vclockht, alckalias) ;
416 if ((long)ed != EMPTYHT) {
417 if (!strcmp ("rising", $3))
418 tedge = ed->POSEDGE ;
420 tedge = ed->NEGEDGE ;
421 fprintf (GCF_OUT, " stable %ld ;\n",
422 ftolstretch (stablefall * (1e12 * timescale)) + tedge) ;
423 fprintf (GCF_OUT, " unstable %ld ;\n",
424 ftolstretch (unstablefall * (1e12 * timescale)) + tedge) ;
427 fprintf (GCF_OUT, " stable %ld after %s %s ;\n",
428 ftolstretch (stablefall * (1e12 * timescale)), ckname, $3) ;
429 fprintf (GCF_OUT, " unstable %ld after %s %s ;\n",
430 ftolstretch (unstablefall * (1e12 * timescale)), ckname, $3) ;
436 departure : GCF_TOKEN_LEFTPAR GCF_TOKEN_DEPARTURE clockspec wnumber wnumber wnumber wnumber nconnector GCF_TOKEN_RIGHTPAR
438 if (GCF_MODE == SPECOUT_DUMP) {
443 alckalias = namealloc (ckalias) ;
444 ckname = (char*)gethtitem (clockht, alckalias) ;
448 if ((long)ckname == EMPTYHT) {
449 ed = (gcf_edge*)gethtitem (vclockht, alckalias) ;
450 if ((long)ed != EMPTYHT) {
451 if (!strcmp ("rising", $3))
452 tedge = ed->POSEDGE ;
454 tedge = ed->NEGEDGE ;
455 if (holdrise == DC && holdfall == DC && setuprise != DC && setupfall != DC) {
456 fprintf (GCF_OUT, " %s rising :\n", $8) ;
457 fprintf (GCF_OUT, " stable %ld ;\n",
458 tedge - ftolstretch (setuprise * (1e12 * timescale))) ;
459 fprintf (GCF_OUT, " unstable %ld ;\n",
460 tedge - ftolstretch (setuprise * (1e12 * timescale)) - 1) ; /* hold = setup - 1 */
462 else if (holdrise != DC && holdfall != DC && setuprise != DC && setupfall != DC) {
463 fprintf (GCF_OUT, " %s rising :\n", $8) ;
464 fprintf (GCF_OUT, " stable %ld ;\n",
465 tedge - ftolstretch (setuprise * (1e12 * timescale))) ;
466 fprintf (GCF_OUT, " unstable %ld ;\n",
467 ftolstretch (holdrise * (1e12 * timescale)) + tedge) ;
469 else if (holdrise != DC && holdfall != DC && setuprise == DC && setupfall == DC) {
470 fprintf (GCF_OUT, " %s rising :\n", $8) ;
471 fprintf (GCF_OUT, " stable %ld ;\n",
472 ftolstretch (holdrise * (1e12 * timescale)) + tedge + 1) ; /* setup = hold + 1 */
473 fprintf (GCF_OUT, " unstable %ld ;\n",
474 ftolstretch (holdrise * (1e12 * timescale)) + tedge) ;
478 if (holdrise == DC && holdfall == DC && setuprise != DC && setupfall != DC) {
479 fprintf (GCF_OUT, " %s rising :\n", $8) ;
480 fprintf (GCF_OUT, " stable %ld before %s %s ;\n",
481 ftolstretch (setuprise * (1e12 * timescale)), ckname, $3) ;
482 fprintf (GCF_OUT, " unstable %ld before %s %s ;\n",
483 ftolstretch (setuprise * (1e12 * timescale)) - 1, ckname, $3) ; /* hold = setup - 1 */
485 else if (holdrise != DC && holdfall != DC && setuprise != DC && setupfall != DC) {
486 fprintf (GCF_OUT, " %s rising :\n", $8) ;
487 fprintf (GCF_OUT, " stable %ld before %s %s ;\n",
488 ftolstretch (setuprise * (1e12 * timescale)), ckname, $3) ;
489 fprintf (GCF_OUT, " unstable %ld after %s %s ;\n",
490 ftolstretch (holdrise * (1e12 * timescale)), ckname, $3) ;
492 else if (holdrise != DC && holdfall != DC && setuprise == DC && setupfall == DC) {
493 fprintf (GCF_OUT, " %s rising :\n", $8) ;
494 fprintf (GCF_OUT, " stable %ld after %s %s ;\n",
495 ftolstretch (setuprise * (1e12 * timescale)) + 1, ckname, $3) ; /* setup = hold + 1 */
496 fprintf (GCF_OUT, " unstable %ld after %s %s ;\n",
497 ftolstretch (holdrise * (1e12 * timescale)), ckname, $3) ;
503 if ((long)ckname == EMPTYHT) {
504 ed = (gcf_edge*)gethtitem (vclockht, alckalias) ;
505 if ((long)ed != EMPTYHT) {
506 if (!strcmp ("falling", $3))
507 tedge = ed->POSEDGE ;
509 tedge = ed->NEGEDGE ;
510 if (holdfall == DC && holdfall == DC && setupfall != DC && setupfall != DC) {
511 fprintf (GCF_OUT, " %s falling :\n", $8) ;
512 fprintf (GCF_OUT, " stable %ld ;\n",
513 tedge - ftolstretch (setupfall * (1e12 * timescale))) ;
514 fprintf (GCF_OUT, " unstable %ld ;\n",
515 tedge - ftolstretch (setupfall * (1e12 * timescale)) - 1) ; /* hold = setup - 1 */
517 else if (holdfall != DC && holdfall != DC && setupfall != DC && setupfall != DC) {
518 fprintf (GCF_OUT, " %s falling :\n", $8) ;
519 fprintf (GCF_OUT, " stable %ld ;\n",
520 tedge - ftolstretch (setupfall * (1e12 * timescale))) ;
521 fprintf (GCF_OUT, " unstable %ld ;\n",
522 ftolstretch (holdfall * (1e12 * timescale)) + tedge) ;
524 else if (holdfall != DC && holdfall != DC && setupfall == DC && setupfall == DC) {
525 fprintf (GCF_OUT, " %s falling :\n", $8) ;
526 fprintf (GCF_OUT, " stable %ld ;\n",
527 ftolstretch (holdfall * (1e12 * timescale)) + tedge + 1) ; /* setup = hold + 1 */
528 fprintf (GCF_OUT, " unstable %ld ;\n",
529 ftolstretch (holdfall * (1e12 * timescale)) + tedge) ;
533 if (holdfall == DC && holdfall == DC && setupfall != DC && setupfall != DC) {
534 fprintf (GCF_OUT, " %s falling :\n", $8) ;
535 fprintf (GCF_OUT, " stable %ld before %s %s ;\n",
536 ftolstretch (setupfall * (1e12 * timescale)), ckname, $3) ;
537 fprintf (GCF_OUT, " unstable %ld before %s %s ;\n",
538 ftolstretch (setupfall * (1e12 * timescale)) - 1, ckname, $3) ; /* hold = setup - 1 */
540 else if (holdfall != DC && holdfall != DC && setupfall != DC && setupfall != DC) {
541 fprintf (GCF_OUT, " %s falling :\n", $8) ;
542 fprintf (GCF_OUT, " stable %ld before %s %s ;\n",
543 ftolstretch (setupfall * (1e12 * timescale)), ckname, $3) ;
544 fprintf (GCF_OUT, " unstable %ld after %s %s ;\n",
545 ftolstretch (holdfall * (1e12 * timescale)), ckname, $3) ;
547 else if (holdfall != DC && holdfall != DC && setupfall == DC && setupfall == DC) {
548 fprintf (GCF_OUT, " %s falling :\n", $8) ;
549 fprintf (GCF_OUT, " stable %ld after %s %s ;\n",
550 ftolstretch (setupfall * (1e12 * timescale)) + 1, ckname, $3) ; /* setup = hold + 1 */
551 fprintf (GCF_OUT, " unstable %ld after %s %s ;\n",
552 ftolstretch (holdfall * (1e12 * timescale)), ckname, $3) ;
559 clockspec : GCF_TOKEN_LEFTPAR GCF_TOKEN_POSEDGE GCF_TOKEN_QIDENT GCF_TOKEN_RIGHTPAR
562 ckalias = stm_unquote ($3) ;
564 | GCF_TOKEN_LEFTPAR GCF_TOKEN_NEGEDGE GCF_TOKEN_QIDENT GCF_TOKEN_RIGHTPAR
567 ckalias = stm_unquote ($3) ;
571 clock : GCF_TOKEN_LEFTPAR GCF_TOKEN_CLOCK GCF_TOKEN_QIDENT GCF_TOKEN_IDENT GCF_TOKEN_RIGHTPAR
573 if (GCF_MODE == CLOCK_DETECT) {
574 ckalias = namealloc (stm_unquote ($3)) ;
576 addhtitem (clockht, ckalias, (long)ckname) ;
581 ident : GCF_TOKEN_IDENT
587 $$ = stm_unquote ($1) ;
607 number : GCF_TOKEN_NUMBER
620 printf ("*** gcf error\n") ;
621 printf ("*** parse error line %d\n", GCF_LINE) ;
622 //printf ("*** cannot match token '%s'\n", yylval.text) ;