1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : AVERTEC global tools */
6 /* Fichier : bef_drive_utils.c */
8 /* © copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Antony PINTO */
13 /****************************************************************************/
16 #include "bef_drive_utils.h"
19 #define BEF_INDENT " "
24 static chain_list
*strip_ckedge_int(chain_list
*ptabl
, char *clock
);
25 static void drive_signals_bereg(bef_driver
*driver
);
26 static void drive_signals_bevectreg(bef_driver
*driver
, bevectreg_list
*vreg
);
27 static void drive_signals_bebux(bef_driver
*driver
);
28 static void drive_signals_bevectbux(bef_driver
*driver
, bevectbux_list
*vbux
);
29 static void drive_signals_beaux(bef_driver
*driver
);
30 static void drive_signals_bevectaux(bef_driver
*driver
, bevectaux_list
*vaux
);
32 static inline char *getName(void *be
, long type
);
33 static inline void *getNext(void *be
, long type
);
34 static inline void *vectnam(void *be
, int *left
, int *right
, char **name
, char type
);
35 static inline void getBeobjField(void *be
, long type
, chain_list
**abl
, long *time
, biabl_list
**biabl
, vectbiabl_list
**vbiabl
, char **name
, char *head
, int *left
, int *right
,int *timer
, int *timef
, char *flags
, long *moreflags
);
36 static void drive_one_vpor(bef_driver
*driver
, bevectpor_list
*vpor
);
37 static bepor_list
*drive_one_por(bef_driver
*driver
, bepor_list
*por
);
38 static void drive_vpor(bef_driver
*driver
, bevectpor_list
*vpor
,int cpt
);
39 static void drive_por(bef_driver
*driver
, bepor_list
*por
);
40 static void print_biabl(bef_driver
*driver
, biabl_list
*biabl
, char *name
, char *vname
, int vsize
, int *np
, char *head
, int type
, char flags
);
42 static void drive_process(bef_driver
*driver
, biabl_list
*biabl
, char *name
, char *vname
, int vsize
, int *np
, char *head
, int type
, char flags
);
43 static char *getStrAblReduce(bef_driver
*driver
, chain_list
*abl
, char *buf
, int *bufsize
);
45 static chain_list
*porreg_l
= NULL
;
46 ht
*BEH_TIMEVARS
=NULL
;
48 /****************************************************************************/
50 /****************************************************************************/
51 /*{{{ Declaration des signaux (compatible) */
52 /****************************************************************************/
53 ///*{{{ reverse_takeBiggerNameReg() */
56 ///****************************************************************************/
57 //static bereg_list *reverse_takeBiggerNameReg(bereg_list *reg)
59 // bereg_list *p, *q = NULL;
64 // while ((p = reg->NEXT))
66 // len = strlen(reg->NAME);
79 ///*}}}************************************************************************/
80 ///*{{{ reverse_takeBiggerNameBux() */
83 ///****************************************************************************/
84 //static bebux_list *reverse_takeBiggerNameBux(bebux_list *bux)
86 // bebux_list *p, *q = NULL;
91 // while ((p = bux->NEXT))
93 // len = strlen(bux->NAME);
106 ///*}}}************************************************************************/
107 ///*{{{ reverse_takeBiggerNameAux() */
110 ///****************************************************************************/
111 //static beaux_list *reverse_takeBiggerNameAux(beaux_list *aux)
113 // beaux_list *p, *q = NULL;
118 // while ((p = aux->NEXT))
120 // len = strlen(aux->NAME);
121 // if (MAXNAME < len)
134 static int hasevents(biabl_list
*biabl
)
139 for (biablx
= biabl
; biablx
; biablx
= biablx
->NEXT
)
140 if ((bef_search_stable(biablx
->CNDABL
,&clk
)) > 0) return 1;
144 static char *insert_name(char *name
, char *postfix
, char *buf
)
148 if ((c
=strchr(name
, ' '))!=NULL
)
151 sprintf(buf
, "%s%s %s",name
,postfix
,c
+1);
155 sprintf(buf
, "%s%s", name
, postfix
);
158 ///*}}}************************************************************************/
159 /*{{{ drive_signals_bereg() */
162 /****************************************************************************/
163 static void drive_signals_bereg(bef_driver
*driver
)
168 ht
*porht
= driver
->POR
.PORHT
;
169 int verilog
, inertial
;
172 driver
->FIG
->BEREG
= (bereg_list
*)reverse((chain_list
*)driver
->FIG
->BEREG
);
174 for (reg
= driver
->FIG
->BEREG
; reg
; reg
= reg
->NEXT
)
176 reg
= vectnam(reg
,&left
,&right
,&name
,BEG_TYPE_SINGREG
);
177 inertial
=V_BOOL_TAB
[__MGL_INERTIAL_MEMORY
].VALUE
&& (reg
->FLAGS
& BEH_FLAG_NORMAL
)==0;
178 verilog
=(inertial
&& driver
->VLG
&& !hasevents(reg
->BIABL
) && !beh_isloop(reg
->BIABL
));
181 insert_name(name
, "_prereg", buf
);
182 driver
->SIGNAL(driver
->FP
,buf
,'W',left
,right
);
184 if (porht
&& gethtitem(porht
,namealloc(name
)) != EMPTYHT
)
186 porreg_l
= addchain(porreg_l
,reg
);
187 driver
->SIGNAL(driver
->FP
,name
,'P',left
,right
);
191 driver
->SIGNAL(driver
->FP
,name
,'R',left
,right
);
195 driver
->FIG
->BEREG
= (bereg_list
*)reverse((chain_list
*)driver
->FIG
->BEREG
);
198 /*}}}************************************************************************/
199 /*{{{ drive_signals_bevectreg() */
202 /****************************************************************************/
203 static void drive_signals_bevectreg(bef_driver
*driver
, bevectreg_list
*vreg
)
206 int verilog
, inv
, inertial
;
208 bevectreg_list
*vregx
;
210 vreg
=(bevectreg_list
*)reverse((chain_list
*)vreg
);
211 for(vregx
=vreg
; vregx
; vregx
=vregx
->NEXT
)
213 ht
*porht
= driver
->POR
.PORHT
;
214 // drive_signals_bevectreg(driver,vreg->NEXT);
216 inertial
=V_BOOL_TAB
[__MGL_INERTIAL_MEMORY
].VALUE
&& (vregx
->FLAGS
& BEH_FLAG_NORMAL
)==0;
217 verilog
=(inertial
&& driver
->VLG
&& !hasevents(vregx
->VECTBIABL
->BIABL
) && !beh_isloop(vregx
->VECTBIABL
->BIABL
));
221 insert_name(vregx
->NAME
, "_prereg", buf
);
222 driver
->SIGNAL(driver
->FP
,buf
,'W',vregx
->LEFT
,vregx
->RIGHT
);
225 if (!(porht
&& (gethtitem(porht
,vregx
->NAME
) != EMPTYHT
)))
226 driver
->SIGNAL(driver
->FP
,vregx
->NAME
,'R',vregx
->LEFT
,vregx
->RIGHT
);
229 driver
->SIGNAL(driver
->FP
,vregx
->NAME
,'P',vregx
->LEFT
,vregx
->RIGHT
);
230 porreg_l
= addchain(porreg_l
,vregx
);
233 vreg
=(bevectreg_list
*)reverse((chain_list
*)vreg
);
236 /*}}}************************************************************************/
237 /*{{{ drive_signals_bebux() */
240 /****************************************************************************/
241 static void drive_signals_bebux(bef_driver
*driver
)
246 int verilog
, oldstyle
;
249 driver
->FIG
->BEBUX
= (bebux_list
*)reverse((chain_list
*)driver
->FIG
->BEBUX
);
251 for (bux
= driver
->FIG
->BEBUX
; bux
; bux
= bux
->NEXT
)
253 bux
= vectnam(bux
,&left
,&right
,&name
,BEG_TYPE_SINGBUX
);
254 oldstyle
=V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (bux
->FLAGS
& BEH_FLAG_NORMAL
)!=0;
255 verilog
=(!oldstyle
&& V_BOOL_TAB
[__MGL_TRISTATE_IS_MEMORY
].VALUE
&& (bux
->FLAGS
& BEH_FLAG_FORCEBUS
)==0 && driver
->VLG
&& !hasevents(bux
->BIABL
) && !beh_isloop(bux
->BIABL
));
258 insert_name(name
, "_prereg", buf
);
259 driver
->SIGNAL(driver
->FP
,buf
,'r',left
,right
);
260 driver
->SIGNAL(driver
->FP
,name
,'R',left
,right
);
263 driver
->SIGNAL(driver
->FP
,name
,oldstyle
?'R':'r',left
,right
);
266 driver
->FIG
->BEBUX
= (bebux_list
*)reverse((chain_list
*)driver
->FIG
->BEBUX
);
269 /*}}}************************************************************************/
270 /*{{{ drive_signals_bevectbux() */
273 /****************************************************************************/
274 static void drive_signals_bevectbux(bef_driver
*driver
, bevectbux_list
*vbux
)
276 int verilog
, oldstyle
;
278 bevectbux_list
*vbuxx
;
280 vbux
=(bevectbux_list
*)reverse((chain_list
*)vbux
);
281 for (vbuxx
=vbux
; vbuxx
; vbuxx
=vbuxx
->NEXT
)
283 // drive_signals_bevectbux(driver,vbux->NEXT);
285 oldstyle
=V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (vbuxx
->FLAGS
& BEH_FLAG_NORMAL
)!=0;
286 verilog
=(!oldstyle
&& V_BOOL_TAB
[__MGL_TRISTATE_IS_MEMORY
].VALUE
&& (vbuxx
->FLAGS
& BEH_FLAG_FORCEBUS
)==0 && driver
->VLG
&& !beh_isloop(vbuxx
->VECTBIABL
->BIABL
) && !hasevents(vbuxx
->VECTBIABL
->BIABL
));
289 insert_name(vbuxx
->NAME
, "_prereg", buf
);
290 driver
->SIGNAL(driver
->FP
,buf
,'r',vbuxx
->LEFT
,vbuxx
->RIGHT
);
291 driver
->SIGNAL(driver
->FP
,vbuxx
->NAME
,'R',vbuxx
->LEFT
,vbuxx
->RIGHT
);
294 driver
->SIGNAL(driver
->FP
,vbuxx
->NAME
,oldstyle
?'R':'r',vbuxx
->LEFT
,vbuxx
->RIGHT
);
296 vbux
=(bevectbux_list
*)reverse((chain_list
*)vbux
);
299 /*}}}************************************************************************/
300 /*{{{ drive_signals_bebus() */
303 /****************************************************************************/
305 static void drive_signals_bebus(bef_driver
*driver
)
310 int verilog
, oldstyle
;
313 driver
->FIG
->BEBUS
= (bebus_list
*)reverse((chain_list
*)driver
->FIG
->BEBUS
);
315 for (bus
= driver
->FIG
->BEBUS
; bus
; bus
= bus
->NEXT
)
317 bus
= vectnam(bus
,&left
,&right
,&name
,BEG_TYPE_SINGBUX
);
318 oldstyle
=V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (bus
->FLAGS
& BEH_FLAG_NORMAL
)!=0;
319 verilog
=(!oldstyle
&& V_BOOL_TAB
[__MGL_TRISTATE_IS_MEMORY
].VALUE
&& (bus
->FLAGS
& BEH_FLAG_FORCEBUS
)==0 && driver
->VLG
&& !hasevents(bus
->BIABL
));
322 insert_name(name
, "_prereg", buf
);
323 driver
->SIGNAL(driver
->FP
,buf
,'r',left
,right
);
324 driver
->SIGNAL(driver
->FP
,name
,'b',left
,right
);
327 driver
->SIGNAL(driver
->FP
,name
,'b',left
,right
);
330 driver
->FIG
->BEBUS
= (bebus_list
*)reverse((chain_list
*)driver
->FIG
->BEBUS
);
333 /*}}}************************************************************************/
334 /*{{{ drive_signals_bevectbus() */
337 /****************************************************************************/
338 static void drive_signals_bevectbus(bef_driver
*driver
, bevectbus_list
*vbus
)
340 int verilog
, oldstyle
;
342 bevectbus_list
*vbusx
;
344 vbus
=(bevectbus_list
*)reverse((chain_list
*)vbus
);
345 for (vbusx
=vbus
; vbusx
; vbusx
=vbusx
->NEXT
)
347 // drive_signals_bevectbus(driver,vbus->NEXT);
348 oldstyle
=V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (vbus
->FLAGS
& BEH_FLAG_NORMAL
)!=0;
349 verilog
=(!oldstyle
&& V_BOOL_TAB
[__MGL_TRISTATE_IS_MEMORY
].VALUE
&& (vbus
->FLAGS
& BEH_FLAG_FORCEBUS
)==0 && driver
->VLG
&& !beh_isloop(vbusx
->VECTBIABL
->BIABL
) && !hasevents(vbusx
->VECTBIABL
->BIABL
));
352 insert_name(vbusx
->NAME
, "_prereg", buf
);
353 driver
->SIGNAL(driver
->FP
,buf
,'r',vbusx
->LEFT
,vbusx
->RIGHT
);
354 driver
->SIGNAL(driver
->FP
,vbusx
->NAME
,'b',vbusx
->LEFT
,vbusx
->RIGHT
);
357 driver
->SIGNAL(driver
->FP
,vbusx
->NAME
,'b',vbusx
->LEFT
,vbusx
->RIGHT
);
359 vbus
=(bevectbus_list
*)reverse((chain_list
*)vbus
);
362 /*}}}************************************************************************/
363 /*{{{ drive_signals_beaux() */
366 /****************************************************************************/
367 static void drive_signals_beaux(bef_driver
*driver
)
373 driver
->FIG
->BEAUX
= (beaux_list
*)reverse((chain_list
*)driver
->FIG
->BEAUX
);
375 for (aux
= driver
->FIG
->BEAUX
; aux
; aux
= aux
->NEXT
)
377 aux
= vectnam(aux
,&left
,&right
,&name
,BEG_TYPE_SINGAUX
);
378 driver
->SIGNAL(driver
->FP
,name
,'W',left
,right
);
381 driver
->FIG
->BEAUX
= (beaux_list
*)reverse((chain_list
*)driver
->FIG
->BEAUX
);
384 /*}}}************************************************************************/
385 /*{{{ drive_signals_bevectaux() */
388 /****************************************************************************/
389 static void drive_signals_bevectaux(bef_driver
*driver
, bevectaux_list
*vaux
)
391 bevectaux_list
*vauxx
;
393 vaux
=(bevectaux_list
*)reverse((chain_list
*)vaux
);
394 for (vauxx
=vaux
; vauxx
; vauxx
=vauxx
->NEXT
)
396 // drive_signals_bevectaux(driver,vaux->NEXT);
397 driver
->SIGNAL(driver
->FP
,vauxx
->NAME
,'W',vauxx
->LEFT
,vauxx
->RIGHT
);
399 vaux
=(bevectaux_list
*)reverse((chain_list
*)vaux
);
402 /*}}}************************************************************************/
403 /*{{{ print_biabl() */
406 /****************************************************************************/
407 static void print_biabl(bef_driver
*driver
, biabl_list
*biabl
, char *name
,
408 char *vname
, int vsize
, int *np
, char *head
, int type
, char flags
)
412 else if (!biabl
->CNDABL
)
413 beh_toolbug(19,"print_biabl",name
,0);
414 else if (!biabl
->VALABL
)
415 beh_toolbug(20,"print_biabl",name
,0);
418 // case of with ... select
419 if ((type
!= BEG_MASK_REG
) && (beh_simplifybiabl(biabl
)))
420 driver
->PROC
.WITHSELECT(driver
->FP
,biabl
,vname
,vsize
,driver
->ABUFF
,
424 drive_process(driver
,biabl
,name
,vname
,vsize
,np
,head
,type
,flags
);
428 /*}}}************************************************************************/
429 /*}}}************************************************************************/
430 /*{{{ Utilities (compatible) */
431 /****************************************************************************/
435 /****************************************************************************/
436 static inline char *getName(void *be
, long type
)
442 case BEG_TYPE_SINGPOR
:
443 res
= ((bepor_list
*)be
)->NAME
;
445 case BEG_TYPE_SINGBUX
:
446 res
= ((bebux_list
*)be
)->NAME
;
448 case BEG_TYPE_SINGREG
:
449 res
= ((bereg_list
*)be
)->NAME
;
451 case BEG_TYPE_SINGAUX
:
452 res
= ((beaux_list
*)be
)->NAME
;
454 case BEG_TYPE_SINGBUS
:
455 res
= ((bebus_list
*)be
)->NAME
;
462 /*}}}************************************************************************/
466 /****************************************************************************/
467 static inline void *getNext(void *be
, long type
)
473 case BEG_TYPE_SINGPOR
:
474 res
= ((bepor_list
*)be
)->NEXT
;
476 case BEG_TYPE_SINGBUX
:
477 res
= ((bebux_list
*)be
)->NEXT
;
479 case BEG_TYPE_SINGREG
:
480 res
= ((bereg_list
*)be
)->NEXT
;
482 case BEG_TYPE_SINGAUX
:
483 res
= ((beaux_list
*)be
)->NEXT
;
485 case BEG_TYPE_SINGBUS
:
486 res
= ((bebus_list
*)be
)->NEXT
;
493 /*}}}************************************************************************/
496 /* analyze a list of signal and return the bounds of the vectorised */
497 /* signals, if they occure. */
499 /****************************************************************************/
500 static inline void *vectnam(void *be
, int *left
, int *right
, char **name
,
503 char *blank_space
, *sig_name
, name_tmp
[200], number
[200];
509 sig_name
= getName(be
,type
);
512 *name
= (char*)mbkalloc(strlen(sig_name
) + 1);
513 strcpy(*name
, sig_name
);
514 blank_space
= strchr(*name
,' ');
517 strcpy(number
, blank_space
);
518 *left
= atoi(number
);
525 if (getNext(be
,type
))
527 strcpy(name_tmp
,getName(getNext(be
,type
),type
));
528 blank_space
= strchr(name_tmp
,' ');
531 strcpy(number
,blank_space
);
533 if (!strcmp(*name
,name_tmp
))
535 *right
= atoi(number
);
536 be
= getNext(be
,type
);
553 /*}}}************************************************************************/
554 /*{{{ preprocess_abl() */
557 /****************************************************************************/
558 chain_list
*bef_preprocess_abl(chain_list
*abl
)
564 devabl
= devXorExpr(abl
);
565 simpabl
= simplif10Expr(devabl
);
566 resabl
= flatPolarityExpr(simpabl
, 1);
574 /*}}}************************************************************************/
577 /* print with indentation, keep coherance */
578 /****************************************************************************/
579 void iprint(FILE *fp
,char mode
,char *str
, ... )
582 static int indent
= 0;
584 int i
, usebuf
, par
, old
, hd
, j
, l
;
614 l
= strlen(BEF_INDENT
);
615 vsprintf(buf
,str
,arg
);
616 for (i
= 0, hd
= 0, par
= 0, old
= 0; buf
[i
] != '\0'; i
++)
621 for (j
= i
; j
< indent
*l
- init
+ MAXNAME
+ 2; j
++)
626 for (i
= init
; i
< indent
+ par
; i
++)
627 fprintf(fp
,"%s",BEF_INDENT
);
628 fprintf(fp
,"%s",buf
+hd
);
632 for (i
= init
; i
< indent
; i
++)
633 fprintf(fp
,"%s",BEF_INDENT
);
634 vfprintf(fp
,str
,arg
);
642 /*}}}************************************************************************/
643 /*{{{ strip_ckedge_int() */
646 /****************************************************************************/
647 static chain_list
*strip_ckedge_int(chain_list
*ptabl
, char *clock
)
650 if (VALUE_ATOM(ptabl
) == clock
)
652 return createAtom("'1'");
654 return createAtom("'0'");
656 return addchain(NULL
,ptabl
->DATA
);
657 else if (OPER(ptabl
) == STABLE
)
658 return createAtom("'0'");
661 chain_list
*auxExpr
, *oldExpr
, *expr1
;
664 auxExpr
= createExpr (OPER (ptabl
));
667 while ((ptabl
= CDR (ptabl
)))
668 addQExpr(auxExpr
,bef_strip_ckedge(CAR(ptabl
),clock
));
670 /* on sauvegarde la poubelle */
671 ((chain_list
*)auxExpr
->DATA
)->NEXT
= CDR(CAR(oldExpr
));
677 /*}}}************************************************************************/
678 /*{{{ getBeobjField() */
681 /****************************************************************************/
682 static inline void getBeobjField(void *be
, long type
, chain_list
**abl
,
683 long *time
, biabl_list
**biabl
,
684 vectbiabl_list
**vbiabl
, char **name
,
685 char *head
, int *left
, int *right
, int *timer
, int *timef
, char *flags
, long *moreflags
)
693 case BEG_TYPE_SINGAUX
:
694 if (BEH_TIMEVARS
!=NULL
&& (l
=gethtitem(BEH_TIMEVARS
, ((beaux_list
*)be
)->TIMEVAR
))!=EMPTYHT
)
697 *time
= ((beaux_list
*)be
)->TIME
;
698 *abl
= ((beaux_list
*)be
)->ABL
;
699 *name
= ((beaux_list
*)be
)->NAME
;
700 *timer
=((beaux_list
*)be
)->TIMER
;
701 *timef
=((beaux_list
*)be
)->TIMEF
;
702 *moreflags
=((beaux_list
*)be
)->FLAGS
;
704 case BEG_TYPE_VECTAUX
:
705 if (BEH_TIMEVARS
!=NULL
&& (l
=gethtitem(BEH_TIMEVARS
, ((bevectaux_list
*)be
)->TIMEVAR
))!=EMPTYHT
)
708 *time
= ((bevectaux_list
*)be
)->TIME
;
709 *abl
= ((bevectaux_list
*)be
)->ABL
;
710 *name
= ((bevectaux_list
*)be
)->NAME
;
711 *left
= ((bevectaux_list
*)be
)->LEFT
;
712 *right
= ((bevectaux_list
*)be
)->RIGHT
;
713 *moreflags
=((bevectaux_list
*)be
)->FLAGS
;
715 case BEG_TYPE_SINGOUT
:
716 if (BEH_TIMEVARS
!=NULL
&& (l
=gethtitem(BEH_TIMEVARS
, ((beout_list
*)be
)->TIMEVAR
))!=EMPTYHT
)
719 *time
= ((beout_list
*)be
)->TIME
;
720 *timer
=((beout_list
*)be
)->TIMER
;
721 *timef
=((beout_list
*)be
)->TIMEF
;
722 *abl
= ((beout_list
*)be
)->ABL
;
723 *name
= ((beout_list
*)be
)->NAME
;
724 *moreflags
=((beout_list
*)be
)->FLAGS
;
726 case BEG_TYPE_VECTOUT
:
727 if (BEH_TIMEVARS
!=NULL
&& (l
=gethtitem(BEH_TIMEVARS
, ((bevectout_list
*)be
)->TIMEVAR
))!=EMPTYHT
)
730 *time
= ((bevectout_list
*)be
)->TIME
;
731 *abl
= ((bevectout_list
*)be
)->ABL
;
732 *name
= ((bevectout_list
*)be
)->NAME
;
733 *left
= ((bevectout_list
*)be
)->LEFT
;
734 *right
= ((bevectout_list
*)be
)->RIGHT
;
735 *moreflags
=((bevectout_list
*)be
)->FLAGS
;
737 case BEG_TYPE_VECTBUX
:
738 *vbiabl
= ((bevectbux_list
*)be
)->VECTBIABL
;
739 *name
= ((bevectbux_list
*)be
)->NAME
;
740 *flags
=((bevectbux_list
*)be
)->FLAGS
;
741 sprintf(head
,"VBUX");
743 case BEG_TYPE_SINGBUX
:
744 *biabl
= ((bebux_list
*)be
)->BIABL
;
745 *name
= ((bebux_list
*)be
)->NAME
;
746 *flags
=((bebux_list
*)be
)->FLAGS
;
749 case BEG_TYPE_VECTBUS
:
750 *vbiabl
= ((bevectbus_list
*)be
)->VECTBIABL
;
751 *name
= ((bevectbus_list
*)be
)->NAME
;
752 *flags
=((bevectbus_list
*)be
)->FLAGS
;
753 sprintf(head
,"VBUS");
755 case BEG_TYPE_SINGBUS
:
756 *biabl
= ((bebus_list
*)be
)->BIABL
;
757 *name
= ((bebus_list
*)be
)->NAME
;
758 *flags
=((bebus_list
*)be
)->FLAGS
;
761 case BEG_TYPE_VECTREG
:
762 *vbiabl
= ((bevectreg_list
*)be
)->VECTBIABL
;
763 *name
= ((bevectreg_list
*)be
)->NAME
;
764 *flags
=((bevectreg_list
*)be
)->FLAGS
;
765 sprintf(head
,"VREG");
767 case BEG_TYPE_SINGREG
:
768 *biabl
= ((bereg_list
*)be
)->BIABL
;
769 *name
= ((bereg_list
*)be
)->NAME
;
770 *flags
=((bereg_list
*)be
)->FLAGS
;
774 beh_toolbug(19,"print_one_beobj type",NULL
,0);
778 /*}}}************************************************************************/
779 /*}}}************************************************************************/
780 /*{{{ Driver initialisation (compatible) */
781 /****************************************************************************/
782 /*{{{ bef_driverSet() */
785 /****************************************************************************/
786 void bef_driverSet(bef_driver
*driver
,
791 void (*time
) (FILE*,int,int,int),
792 void (*end_loop
) (FILE*,char,char*,int,int,int,loop_list
*),
793 void (*looplist
) (FILE*,char,char*,int,int*,int,loop_list
*),
794 void (*loop
) (FILE*,char,char*,int,int*,loop_list
*),
795 void (*value
) (FILE*,chain_list
*,char,int,int,int,char**,int*),
796 void (*affected
) (FILE*,char,char,int,int,int,char*,char*,loop_list
*,long),
797 void (*signal
) (FILE*,char*,char,int,int),
798 void (*bebus_ass
) (FILE*,char*,char*,int),
799 int (*isone
) (char*))
803 driver
->ABUFF
= buffer
;
804 driver
->ABUFS
= bufsize
;
806 driver
->END_LOOP
= end_loop
;
807 driver
->LOOP_LIST
= looplist
;
809 driver
->VALUE
= value
;
810 driver
->AFFECTED
= affected
;
811 driver
->SIGNAL
= signal
;
812 driver
->INTER_ASS
= bebus_ass
;
813 driver
->ISONE
= isone
;
816 /*}}}************************************************************************/
817 /*{{{ bef_driverSetAbl() */
820 /****************************************************************************/
821 void bef_driverSetAbl(bef_driver
*driver
,
822 char *(*abl2strBool
)(chain_list
*,char*,int*))
824 driver
->ABL
.TOBOOLSTR
= abl2strBool
;
827 /*}}}************************************************************************/
828 /*{{{ bef_driverSetProcess() */
831 /****************************************************************************/
832 void bef_driverSetProcess(bef_driver
*driver
,
833 void (*withselect
) (FILE*,biabl_list
*,char*,int,char**,int*),
834 chain_list
*(*declar
) (FILE*,biabl_list
*,char*,int,char*,char**,ptype_list
*clock
),
835 void (*begin
) (FILE*,chain_list
*),
837 void (*if_
) (FILE*,char*),
838 void (*elsif
) (FILE*,char*),
839 int (*else_
) (FILE*),
840 int (*endif
) (FILE*,char),
841 int (*edge
) (char*,char*,char,char*))
843 driver
->PROC
.WITHSELECT
= withselect
;
844 driver
->PROC
.DECLAR
= declar
;
845 driver
->PROC
.BEGIN
= begin
;
846 driver
->PROC
.END
= end
;
847 driver
->PROC
.IF
= if_
;
848 driver
->PROC
.ELSIF
= elsif
;
849 driver
->PROC
.ELSE
= else_
;
850 driver
->PROC
.ENDIF
= endif
;
851 driver
->PROC
.EDGE
= edge
;
854 /*}}}************************************************************************/
855 /*{{{ bef_driverSetStr() */
858 /****************************************************************************/
859 void bef_driverSetStr(bef_driver
*driver
,
860 char *(*name
) (char*),
861 char *(*vname
) (char*,int,int),
862 char *(*vector
) (char*, char *),
863 char *(*bitstr
) (char*,char*),
864 char *(*bebus
) (char*),
865 char *(*bereg
) (char*))
867 driver
->STR
.NAME
= name
;
868 driver
->STR
.VNAME
= vname
;
869 driver
->STR
.VECTOR
= vector
;
870 driver
->STR
.BITSTR
= bitstr
;
871 driver
->STR
.BEBUS
= bebus
;
872 driver
->STR
.BEREG
= bereg
;
875 /*}}}************************************************************************/
876 /*{{{ bef_driverSetPor() */
879 /****************************************************************************/
880 void bef_driverSetPor(bef_driver
*driver
,
881 void (*por
) (FILE*,char*,char,int,int),
883 void (*start
) (FILE*),
887 driver
->POR
.POR
= por
;
888 driver
->POR
.END
= end
;
889 driver
->POR
.START
= start
;
890 driver
->POR
.PORHT
= porht
;
893 /*}}}************************************************************************/
894 /*}}}************************************************************************/
895 /*{{{ Enable from outside (compatible) */
896 /****************************************************************************/
897 /*{{{ bef_gettimeunit() */
900 /****************************************************************************/
901 char *bef_gettimeunit (unsigned char time_unit_char
)
903 switch (time_unit_char
)
906 return(namealloc("fs"));
908 return(namealloc("ps"));
910 return(namealloc("ns"));
912 return(namealloc("us"));
914 return(namealloc("ms"));
916 beh_error (200, NULL
);
922 /*}}}************************************************************************/
923 /*{{{ bef_strip_ckedge() */
925 /* strip the clock edge condition */
926 /****************************************************************************/
927 chain_list
*bef_strip_ckedge(chain_list
*ptabl
, char *clock
)
929 chain_list
*temp_expr
, *res_expr
;
931 temp_expr
= strip_ckedge_int(ptabl
,clock
);
932 res_expr
= simplif10Expr(temp_expr
);
938 /*}}}************************************************************************/
939 /*{{{ bef_search_stable() */
941 /* detecte la presence de STABLE */
942 /****************************************************************************/
943 int bef_search_stable(chain_list
*ptabl
, char **clock
)
949 if (OPER(ptabl
) == STABLE
)
951 *clock
= VALUE_ATOM(CADR(ptabl
));
956 while ((ptabl
= CDR(ptabl
)) != NULL
)
957 num
+= bef_search_stable(CAR(ptabl
),clock
);
962 /*}}}************************************************************************/
963 /*{{{ bef_get_stable_attribute() */
965 /* recupere l'attribut de STABLE */
966 /****************************************************************************/
967 int bef_get_stable_attribute(chain_list
*ptabl
, char **clock
)
974 if (OPER(ptabl
) == STABLE
)
976 *clock
= VALUE_ATOM(CADR(ptabl
));
978 num
= VALUE_ATTRIB(ptabl
);
981 while ((ptabl
= CDR(ptabl
)))
982 if ((num
= bef_get_stable_attribute(CAR(ptabl
),clock
)))
988 /*}}}************************************************************************/
989 /*{{{ search_notck_int() */
991 /* detecte la presence not ck ou ck */
992 /****************************************************************************/
993 static int search_notck_int(chain_list
* ptabl
, char *clock
)
1000 /* on verifie si le prochain signal est la clock */
1001 if (OPER(ptabl
) == NOT
)
1002 if (VALUE_ATOM(CADR(ptabl
)) == clock
)
1003 /* if (CDR(CADR(ptabl)) &&
1004 VALUE_ATOM(CADR(CADR(ptabl))) == clock)*/
1012 while ((ptabl
= CDR(ptabl
)) != NULL
)
1013 num
+= search_notck_int(CAR(ptabl
),clock
);
1018 /*}}}************************************************************************/
1019 /*{{{ bef_search_notck() */
1021 /* detecte la presence not ck ou ck */
1022 /****************************************************************************/
1023 int bef_search_notck(chain_list
* ptabl
, char *clock
)
1027 return search_notck_int(ptabl
,clock
);
1030 /*}}}************************************************************************/
1031 /*{{{ bef_drive_sigDeclaration() */
1034 /****************************************************************************/
1035 void bef_drive_sigDeclaration(bef_driver
*driver
)
1037 drive_signals_bevectbus (driver
,driver
->FIG
->BEVECTBUS
);
1038 drive_signals_bebus (driver
);
1039 drive_signals_bevectreg (driver
,driver
->FIG
->BEVECTREG
);
1040 drive_signals_bereg (driver
);
1041 drive_signals_bevectbux (driver
,driver
->FIG
->BEVECTBUX
);
1042 drive_signals_bebux (driver
);
1043 drive_signals_bevectaux (driver
,driver
->FIG
->BEVECTAUX
);
1044 drive_signals_beaux (driver
);
1047 /*}}}************************************************************************/
1048 /*{{{ bef_print_one_beobj() */
1050 /* print a process for a single signal */
1052 /****************************************************************************/
1054 static void bef_print_reg_case(bef_driver
*driver
, char *input
, char *output
, char *outputv
)
1056 char *name0
, *stg
="1'b0, 1'b1: ";
1058 if (V_INT_TAB
[__MGL_DRIVE_CONFLICT
].VALUE
)
1059 stg
="1'b0, 1'b1, 1'bx: ";
1060 name0
=driver
->STR
.VECTOR(input
, NULL
);
1061 iprint(driver
->FP
,'i',"always @( %s )\n",name0
);
1062 driver
->PROC
.BEGIN(driver
->FP
,NULL
);
1063 iprint(driver
->FP
,0,"case ( %s )\n", name0
);
1064 iprint(driver
->FP
,'>',stg
);
1065 // iprint(driver->FP,'>',"1'b0, 1'b1: ");
1066 driver
->AFFECTED(driver
->FP
,0,'R',0,0,0,output
,outputv
,NULL
,0);
1067 temp
=createAtom(input
);
1068 driver
->VALUE (driver
->FP
,temp
,'R',0,0,0,driver
->ABUFF
, driver
->ABUFS
);
1070 iprint(driver
->FP
, '<' ,"endcase\n");
1071 iprint(driver
->FP
,'-',NULL
);
1072 driver
->PROC
.END(driver
->FP
);
1076 void bef_print_one_beobj(bef_driver
*driver
, void *be
, int *np
,long type
)
1081 vectbiabl_list
*vbiabl
, *vbiablx
;
1086 long singorvect
, moreflags
;
1088 char *save_name
, flags
;
1089 int timer
, timef
, verilogbus
, verilogreg
;
1092 getBeobjField(be
,type
,&abl
,&time
,&biabl
,&vbiabl
,&name
,head
,&left
,&right
,&timer
,&timef
,&flags
,&moreflags
);
1094 singorvect
= type
& BEG_MASK_TYPE
;
1095 type
= type
& ~BEG_MASK_TYPE
;
1097 verilogbus
=(!(V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (flags
& BEH_FLAG_NORMAL
)!=0) && V_BOOL_TAB
[__MGL_TRISTATE_IS_MEMORY
].VALUE
&& (flags
& BEH_FLAG_FORCEBUS
)==0 && driver
->VLG
);
1098 verilogreg
=(V_BOOL_TAB
[__MGL_INERTIAL_MEMORY
].VALUE
&& (flags
& BEH_FLAG_NORMAL
)==0 && driver
->VLG
);
1102 case BEG_MASK_VECT
:
1107 for (vbiablx
=vbiabl
; vbiablx
; vbiablx
= vbiablx
->NEXT
)
1108 if (hasevents(vbiablx
->BIABL
) || beh_isloop(vbiablx
->BIABL
)) break;
1109 if (verilogbus
&& vbiablx
==NULL
&& vbiabl
!=NULL
&& vbiabl
->LEFT
==vbiabl
->RIGHT
&& type
!=BEG_MASK_BUS
)
1113 char *name0
, *oname
=name
;
1114 insert_name(name
, "_prereg", buf
);
1115 name
= driver
->STR
.NAME(buf
);
1117 iprint(driver
->FP
,'i',"\n");
1119 if (type
==BEG_MASK_BUS
)
1120 save_name
= driver
->STR
.BEBUS(oname
);
1122 for (; vbiabl
; vbiabl
= vbiabl
->NEXT
)
1124 iprint(driver
->FP
,'i',"\n");
1125 left
= vbiabl
->LEFT
;
1126 right
= vbiabl
->RIGHT
;
1127 vname
= driver
->STR
.VNAME(name
,left
,right
);
1128 vectsize
= abs(left
- right
) + 1;
1129 biabl
= vbiabl
->BIABL
;
1131 name0
= driver
->STR
.VNAME(name
,left
,right
);
1132 print_biabl(driver
,biabl
, name
, name0
,vectsize
,np
,head
,type
,flags
);
1136 name0
= driver
->STR
.NAME(save_name
);
1137 vname
= driver
->STR
.VNAME(name0
,left
,right
);
1138 sprintf(buf0
,"%s %d", buf
, vbiabl
->LEFT
);
1139 bef_print_reg_case(driver
,buf0
,name0
,vname
);
1143 if (type
==BEG_MASK_BUS
)
1145 driver
->INTER_ASS(driver
->FP
,oname
,save_name
,0);
1150 name
= driver
->STR
.NAME(name
);
1151 if ((V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (flags
& BEH_FLAG_NORMAL
)!=0) && type
==BEG_MASK_BUS
)
1154 name
= driver
->STR
.BEBUS(name
);
1156 for (; vbiabl
; vbiabl
= vbiabl
->NEXT
)
1158 iprint(driver
->FP
,'i',"\n");
1159 left
= vbiabl
->LEFT
;
1160 right
= vbiabl
->RIGHT
;
1161 vname
= driver
->STR
.VNAME(name
,left
,right
);
1162 vectsize
= abs(left
- right
) + 1;
1163 biabl
= vbiabl
->BIABL
;
1165 print_biabl(driver
,biabl
,name
,vname
,vectsize
,np
,head
,type
,flags
);
1168 if ((V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (flags
& BEH_FLAG_NORMAL
)!=0) && type
==BEG_MASK_BUS
)
1169 driver
->INTER_ASS(driver
->FP
,save_name
,name
,0);
1172 case BEG_MASK_REG
:// case BEG_MASK_BUX :
1173 for (vbiablx
=vbiabl
; vbiablx
; vbiablx
= vbiablx
->NEXT
)
1174 if (hasevents(vbiablx
->BIABL
) || beh_isloop(vbiablx
->BIABL
)) break;
1175 if (verilogreg
&& vbiablx
==NULL
&& vbiabl
!=NULL
&& vbiabl
->LEFT
==vbiabl
->RIGHT
)
1179 char *name0
, *oname
=name
;
1180 insert_name(name
, "_prereg", buf
);
1181 name
= driver
->STR
.NAME(buf
);
1183 iprint(driver
->FP
,'i',"\n");
1184 if (porreg_l
&& porreg_l
->DATA
== be
)
1186 save_name
= driver
->STR
.BEREG(name
);
1188 for (; vbiabl
; vbiabl
= vbiabl
->NEXT
)
1190 iprint(driver
->FP
,'i',"\n");
1191 left
= vbiabl
->LEFT
;
1192 right
= vbiabl
->RIGHT
;
1193 // vname = driver->STR.VNAME(name,left,right);
1194 vectsize
= abs(left
- right
) + 1;
1195 biabl
= vbiabl
->BIABL
;
1197 name0
= driver
->STR
.VNAME(name
,left
,right
);
1199 print_biabl(driver
,biabl
,name
,name0
,vectsize
,np
,head
,type
,flags
);
1202 name0
= driver
->STR
.NAME(save_name
);
1203 vname
= driver
->STR
.VNAME(name0
,left
,right
);
1204 sprintf(buf0
,"%s %d", buf
, vbiabl
->LEFT
);
1206 bef_print_reg_case(driver
,buf0
,name0
,vname
);
1214 name
= driver
->STR
.NAME(name
);
1215 if (porreg_l
&& porreg_l
->DATA
== be
)
1218 name
= driver
->STR
.BEREG(name
);
1220 for (; vbiabl
; vbiabl
= vbiabl
->NEXT
)
1222 iprint(driver
->FP
,'i',"\n");
1223 left
= vbiabl
->LEFT
;
1224 right
= vbiabl
->RIGHT
;
1225 vname
= driver
->STR
.VNAME(name
,left
,right
);
1226 vectsize
= abs(left
- right
) + 1;
1227 biabl
= vbiabl
->BIABL
;
1228 print_biabl(driver
,biabl
,name
,vname
,vectsize
,np
,head
,type
,flags
);
1231 if (porreg_l
&& porreg_l
->DATA
== be
)
1233 porreg_l
= delchain(porreg_l
,porreg_l
);
1234 driver
->INTER_ASS(driver
->FP
,save_name
,name
,0);
1238 case BEG_MASK_OUT
: case BEG_MASK_AUX
:
1240 beh_error(40, vname
);
1242 /* added by zinaps */
1243 if (abs(right
-left
)<128)
1245 name
= driver
->STR
.NAME(name
);
1246 vname
= driver
->STR
.VNAME(name
,left
,right
);
1247 driver
->AFFECTED(driver
->FP
,'0','W',time
,timer
,timef
,NULL
,vname
,NULL
,moreflags
);
1248 driver
->VALUE (driver
->FP
,abl
,'W',time
,timer
,timef
,driver
->ABUFF
,
1262 name
= driver
->STR
.NAME(name
);
1263 for (i
= left
; i
<= right
; i
++)
1265 vname
= driver
->STR
.VNAME(name
,i
,i
);
1266 driver
->AFFECTED(driver
->FP
,'0','W',time
,timer
,timef
,NULL
,vname
,NULL
,moreflags
);
1268 cl
= getAblAtPos(abl
, i
-left
);
1270 cl
= getAblAtPos(abl
, right
-i
);
1271 driver
->VALUE(driver
->FP
,cl
,'W',time
,timer
,timef
,driver
->ABUFF
,driver
->ABUFS
);
1276 /* ^^^^^^^^^^^^^^ */
1281 case BEG_MASK_SING
:
1286 if (verilogbus
&& type
!=BEG_MASK_BUS
&& !beh_isloop(biabl
) && !hasevents(biabl
))
1292 iprint(driver
->FP
,'i',"\n");
1293 insert_name(name
, "_prereg", buf
);
1295 if (type
==BEG_MASK_BUS
)
1298 name
= driver
->STR
.BEBUS(name
);
1301 print_biabl(driver
,biabl
,buf
,buf
,1,np
,head
,type
,flags
);
1303 bef_print_reg_case(driver
,buf
,name
,name
);
1305 if (type
==BEG_MASK_BUS
)
1306 driver
->INTER_ASS(driver
->FP
,save_name
,name
,1);
1310 if ((V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (flags
& BEH_FLAG_NORMAL
)!=0) && type
==BEG_MASK_BUS
)
1313 name
= driver
->STR
.BEBUS(name
);
1315 iprint(driver
->FP
,'i',"\n");
1316 print_biabl(driver
,biabl
,name
,name
,1,np
,head
,type
,flags
);
1317 if ((V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (flags
& BEH_FLAG_NORMAL
)!=0) && type
==BEG_MASK_BUS
)
1318 driver
->INTER_ASS(driver
->FP
,save_name
,name
,1);
1323 if (porreg_l
&& porreg_l
->DATA
== be
)
1325 name
= driver
->STR
.BEREG(name
);
1327 if (verilogreg
&& !beh_isloop(biabl
) && !hasevents(biabl
))
1329 insert_name(save_name
, "_prereg", buf
);
1330 iprint(driver
->FP
,'i',"\n");
1331 print_biabl(driver
,biabl
,buf
,buf
,1,np
,head
,type
,flags
);
1332 bef_print_reg_case(driver
,buf
,name
,name
);
1336 iprint(driver
->FP
,'i',"\n");
1337 print_biabl(driver
,biabl
,name
,name
,1,np
,head
,type
,flags
);
1339 if (porreg_l
&& porreg_l
->DATA
== be
)
1341 porreg_l
= delchain(porreg_l
,porreg_l
);
1342 driver
->INTER_ASS(driver
->FP
,save_name
,name
,1);
1345 case BEG_MASK_OUT
: case BEG_MASK_AUX
:
1347 beh_error(40, name
);
1348 driver
->AFFECTED(driver
->FP
,'0','W',time
,timer
,timef
,name
,name
,NULL
,moreflags
);
1349 driver
->VALUE (driver
->FP
,abl
,'W',time
,timer
,timef
,driver
->ABUFF
,
1359 /*}}}************************************************************************/
1360 /*}}}************************************************************************/
1361 /*{{{ Traitements des signaux simples (compatible) */
1362 /****************************************************************************/
1363 /*{{{ bef_driver_aux() */
1366 /****************************************************************************/
1367 void bef_drive_aux(bef_driver
*driver
)
1369 beaux_list
*aux
= driver
->FIG
->BEAUX
;
1370 bevectaux_list
*vaux
= driver
->FIG
->BEVECTAUX
;
1373 iprint(driver
->FP
,'i',"\n");
1375 for (; aux
; aux
= aux
->NEXT
)
1376 bef_print_one_beobj(driver
, aux
, NULL
, BEG_TYPE_SINGAUX
);
1377 for (; vaux
; vaux
= vaux
->NEXT
)
1378 bef_print_one_beobj(driver
, vaux
, NULL
, BEG_TYPE_VECTAUX
);
1381 /*}}}************************************************************************/
1382 /*{{{ bef_drive_out() */
1385 /****************************************************************************/
1386 void bef_drive_out(bef_driver
*driver
)
1388 bevectout_list
*vout
= driver
->FIG
->BEVECTOUT
;
1389 beout_list
*out
= driver
->FIG
->BEOUT
;
1392 iprint(driver
->FP
,'i',"\n");
1394 for (; out
; out
= out
->NEXT
)
1395 bef_print_one_beobj(driver
, out
, NULL
, BEG_TYPE_SINGOUT
);
1396 for (; vout
; vout
= vout
->NEXT
)
1397 bef_print_one_beobj(driver
, vout
, NULL
, BEG_TYPE_VECTOUT
);
1400 /*}}}************************************************************************/
1401 /*}}}************************************************************************/
1402 /*{{{ Traitement des bus (compatible) */
1403 /****************************************************************************/
1404 /*{{{ bef_drive_bux() */
1407 /****************************************************************************/
1408 void bef_drive_bux(bef_driver
*driver
)
1411 bevectbux_list
*vbux
;
1414 for (bux
= driver
->FIG
->BEBUX
; bux
; bux
= bux
->NEXT
)
1415 bef_print_one_beobj(driver
,bux
,&numprocess
,BEG_TYPE_SINGBUX
);
1418 for(vbux
=driver
->FIG
->BEVECTBUX
;vbux
;vbux
=vbux
->NEXT
)
1419 bef_print_one_beobj(driver
,vbux
,&numprocess
,BEG_TYPE_VECTBUX
);
1422 /*}}}************************************************************************/
1423 /*{{{ bef_drive_bus() */
1426 /****************************************************************************/
1427 void bef_drive_bus(bef_driver
*driver
)
1430 bevectbus_list
*vbus
;
1433 for (bus
= driver
->FIG
->BEBUS
; bus
; bus
= bus
->NEXT
)
1434 bef_print_one_beobj(driver
,bus
,&numprocess
,BEG_TYPE_SINGBUS
);
1437 for(vbus
= driver
->FIG
->BEVECTBUS
;vbus
;vbus
=vbus
->NEXT
)
1438 bef_print_one_beobj(driver
,vbus
,&numprocess
,BEG_TYPE_VECTBUS
);
1441 /*}}}************************************************************************/
1442 /*}}}************************************************************************/
1443 /*{{{ Traitement des registres (compatible) */
1444 /****************************************************************************/
1445 /*{{{ bef_drive_reg() */
1448 /****************************************************************************/
1449 void bef_drive_reg(bef_driver
*driver
)
1452 bevectreg_list
*vreg
;
1455 for (reg
= driver
->FIG
->BEREG
; reg
; reg
= reg
->NEXT
)
1456 bef_print_one_beobj(driver
,reg
,&numprocess
,BEG_TYPE_SINGREG
);
1459 for(vreg
=driver
->FIG
->BEVECTREG
;vreg
;vreg
=vreg
->NEXT
)
1460 bef_print_one_beobj(driver
,vreg
,&numprocess
,BEG_TYPE_VECTREG
);
1463 /*}}}************************************************************************/
1464 /*}}}************************************************************************/
1465 /*{{{ Declaration des connecteurs */
1466 /****************************************************************************/
1467 /*{{{ reverse_takeBiggerNamePor() */
1470 /****************************************************************************/
1471 static bepor_list
*reverse_takeBiggerNamePor(bepor_list
*por
)
1473 bepor_list
*p
, *q
= NULL
;
1478 while ((p
= por
->NEXT
))
1480 len
= strlen(por
->NAME
);
1492 /*}}}************************************************************************/
1493 /*{{{ porGetDir() */
1496 /****************************************************************************/
1498 char porGetDir(bepor_list
*st
, bepor_list
*ed
)
1504 for (; st
!= ed
->NEXT
; st
= st
->NEXT
)
1505 if (st
->DIRECTION
!= 'X')
1507 if (res != 'X' && res != st->DIRECTION)
1510 res
= st
->DIRECTION
;
1515 /*}}}************************************************************************/
1516 /*{{{ drive_one_por() */
1519 /****************************************************************************/
1520 static bepor_list
*drive_one_por(bef_driver
*driver
, bepor_list
*por
)
1526 porx
= vectnam(por
,&left
,&right
,&name
,BEG_TYPE_SINGPOR
);
1527 dir
= porGetDir(por
,porx
);
1528 if (driver
->POR
.PORHT
)
1529 addhtitem(driver
->POR
.PORHT
,namealloc(name
),BEG_TYPE_SINGPOR
);
1530 driver
->POR
.POR(driver
->FP
,name
,dir
,left
,right
);
1537 /*}}}************************************************************************/
1538 /*{{{ drive_one_vpor() */
1541 /****************************************************************************/
1542 static void drive_one_vpor(bef_driver
*driver
, bevectpor_list
*vpor
)
1544 driver
->POR
.POR(driver
->FP
,vpor
->NAME
,vpor
->DIRECTION
,
1545 vpor
->LEFT
,vpor
->RIGHT
);
1546 if (driver
->POR
.PORHT
)
1547 addhtitem(driver
->POR
.PORHT
,vpor
->NAME
,0);
1550 /*}}}************************************************************************/
1551 /*{{{ bef_initMaxname() */
1554 /****************************************************************************/
1555 void bef_initMaxname(void)
1560 /*}}}************************************************************************/
1561 /*{{{ bef_drive_vpor() */
1564 /****************************************************************************/
1565 static void drive_vpor(bef_driver
*driver
, bevectpor_list
*vpor
,int cpt
)
1571 len
= strlen(vpor
->NAME
);
1574 drive_vpor(driver
,vpor
->NEXT
,cpt
+1);
1575 drive_one_vpor(driver
,vpor
);
1577 fprintf(driver
->FP
,";\n");
1582 /*}}}************************************************************************/
1583 /*{{{ bef_drive_por() */
1586 /****************************************************************************/
1587 static void drive_por(bef_driver
*driver
, bepor_list
*por
)
1593 por
= reverse_takeBiggerNamePor(por
);
1595 for (porx
= por
; porx
; )
1596 if ((porx
= drive_one_por(driver
, porx
)->NEXT
))
1597 fprintf(driver
->FP
,";\n");
1599 por
= (bepor_list
*)reverse((chain_list
*)por
);
1603 /*}}}************************************************************************/
1604 /*{{{ port_declaration() */
1607 /****************************************************************************/
1608 void bef_drive_porDeclaration(bef_driver
*driver
)
1611 driver
->POR
.START(driver
->FP
);
1612 drive_vpor (driver
,driver
->FIG
->BEVECTPOR
,driver
->FIG
->BEPOR
? 1 : 0);
1613 drive_por (driver
,driver
->FIG
->BEPOR
);
1614 driver
->POR
.END(driver
->FP
);
1618 /*}}}************************************************************************/
1619 /*}}}************************************************************************/
1620 /*{{{ Drive structures of behavior */
1621 /****************************************************************************/
1622 /*{{{ drive_cnd_abl() */
1625 /****************************************************************************/
1626 static void drive_cnd_abl(bef_driver
*driver
, char *buffer
, int *done_endif
,
1627 int *done_else
, int first
, int sameckcnd
,
1628 long flag
, void *next
, int drive_edge
)
1635 driver
->PROC
.IF(driver
->FP
,buffer
);
1637 // the last for else
1638 else if (!next
&& driver
->ISONE(buffer
))
1640 *done_else
= driver
->PROC
.ELSE(driver
->FP
);
1644 else if (!(flag
&BEH_CND_PRECEDE
))
1649 *done_endif
= driver
->PROC
.ENDIF(driver
->FP
,'0');
1651 driver
->PROC
.IF(driver
->FP
,buffer
);
1654 iprint(driver
->FP
,'+',NULL
);
1657 else if (flag
&BEH_CND_LAST
)
1658 *done_else
= driver
->PROC
.ELSE(driver
->FP
);
1659 else if (!sameckcnd
)
1660 driver
->PROC
.ELSIF(driver
->FP
,buffer
);
1663 /*}}}************************************************************************/
1664 /*{{{ drive_end_of_process() */
1667 /****************************************************************************/
1668 static void drive_end_of_process(bef_driver
*driver
, loop_list
*lastloop
,
1669 int done_endif
, int done_else
, int cpt
,
1670 char *name
, char *vname
, int vsize
,
1671 int np
, char *head
, int type
)
1675 if ( (type
!= BEG_MASK_REG
) && !done_else
)
1677 driver
->PROC
.ELSE(driver
->FP
);
1678 driver
->AFFECTED(driver
->FP
,'-','R',0,0,0,name
,vname
,lastloop
,0);
1679 if (lastloop
&& lastloop
->INDEX
)
1680 fprintf(driver
->FP
,"%s;\n",driver
->STR
.BITSTR(genHZBitStr(1),buf
));
1682 fprintf(driver
->FP
,"%s;\n",driver
->STR
.BITSTR(genHZBitStr(vsize
),buf
));
1685 driver
->PROC
.ENDIF(driver
->FP
,'-');
1686 driver
->END_LOOP(driver
->FP
,'-',head
,np
,cpt
,0,lastloop
);
1689 /*}}}************************************************************************/
1690 /*{{{ drive_one_biabl() */
1693 /****************************************************************************/
1694 static void drive_one_biabl(bef_driver
*driver
, biabl_list
*biabl
,
1695 loop_list
**lastloop
, char **oldckcnd
,
1696 int *done_endif
, int *done_else
, int *cpt
,
1697 int first
, char *name
,
1698 char *vname
, int vsize
, int *np
, char *head
,
1699 int type
, char **buffer
, int *bsize
)
1701 long flag
= biabl
->FLAG
;
1702 FILE *fp
= driver
->FP
;
1703 bef_process proc
= driver
->PROC
;
1704 int isEdgeCondition
;
1709 char *clock
, buf
[4096];
1715 // detect edge condition
1716 if (type
== BEG_MASK_REG
)
1717 isEdgeCondition
= bef_search_stable(biabl
->CNDABL
,&clock
);
1720 isEdgeCondition
= 0;
1721 flag
|=BEH_CND_PRECEDE
;
1723 // case of edge condition
1724 if (isEdgeCondition
)
1726 char ckstate
, *ckname
, *signame
;
1728 if (bef_search_notck(biabl
->CNDABL
,clock
) > 0)
1732 beg_get_vectname(clock
,&signame
,NULL
,NULL
,BEG_SEARCH_ABL
);
1733 signame
= driver
->STR
.NAME(signame
);
1734 ckname
= driver
->STR
.VECTOR(clock
,buf
);
1736 drive_edge
= proc
.EDGE(*buffer
,ckname
,ckstate
,signame
);
1738 sameckcnd
= *oldckcnd
&& !strcmp(*oldckcnd
,*buffer
);
1741 *oldckcnd
= mbkstrdup(*buffer
);
1746 *buffer
= getStrAblReduce(driver
,biabl
->CNDABL
,*buffer
,bsize
);
1754 if (!*done_endif
&& !(flag
&BEH_CND_PRECEDE
) && !(flag
&BEH_CND_LAST
))
1756 if (type
!= BEG_MASK_REG
&& !*done_else
)
1760 driver->AFFECTED(fp,'-','R',0,0,0,name,vname,*lastloop);
1761 if (*lastloop && (*lastloop)->INDEX)
1762 fprintf(fp,"%s;\n",driver->STR.BITSTR(genHZBitStr(1),buf));
1764 fprintf(fp,"%s;\n",driver->STR.BITSTR(genHZBitStr(vsize),buf));
1768 *done_endif
= proc
.ENDIF(fp
,'0');
1771 loop
= beh_getloop(biabl
);
1772 sameloop
= beh_isSameLoop(loop
,*lastloop
);
1773 driver
->END_LOOP (fp
,'<',head
,*np
,*cpt
,sameloop
,*lastloop
);
1774 driver
->LOOP_LIST(fp
,'+',head
,*np
,cpt
,sameloop
,loop
);
1776 drive_cnd_abl(driver
,*buffer
,done_endif
,done_else
,first
,sameckcnd
,
1777 flag
,next
,drive_edge
);
1779 // supplementary condition in case of register
1780 if (isEdgeCondition
)
1784 cndabl
= bef_strip_ckedge(biabl
->CNDABL
,clock
);
1785 sndckcnd
= (!(ATOM(cndabl
) &&
1786 !(strcmp(VALUE_ATOM(cndabl
),"'1'") &&
1787 strcmp(VALUE_ATOM(cndabl
),"'0'"))));
1790 *buffer
= getStrAblReduce(driver
,cndabl
,*buffer
,bsize
);
1791 drive_cnd_abl(driver
,*buffer
,done_endif
,done_else
,first
,0,flag
,next
,1);
1803 if (BEH_TIMEVARS
!=NULL
&& (l
=gethtitem(BEH_TIMEVARS
, biabl
->TIMEVAR
))!=EMPTYHT
)
1807 if (biabl
->TIMER
!=0 || biabl
->TIMEF
!=0)
1808 time
=(int)((biabl
->TIMER
+biabl
->TIMEF
)/2.0+0.5);
1809 driver
->AFFECTED(fp
,'-','R',time
,0,0,name
,vname
,loop
,biabl
->FLAG
);
1810 driver
->VALUE (fp
,biabl
->VALABL
,'R',time
,0,0,driver
->ABUFF
,
1814 beh_toolbug(20, "drive_process",name
, 0);
1817 if (!drive_edge
&& !sndckcnd
)
1823 if (sndckcnd
&& !(next
&& next
->FLAG
& BEH_CND_PRECEDE
))
1829 /*}}}************************************************************************/
1830 /*{{{ getStrAblReduce() */
1833 /****************************************************************************/
1834 static char *getStrAblReduce(bef_driver
*driver
, chain_list
*abl
,
1835 char *buffer
, int *bsize
)
1839 red
= bef_preprocess_abl(abl
);
1841 buffer
= driver
->ABL
.TOBOOLSTR(red
,buffer
,bsize
);
1847 /*}}}************************************************************************/
1848 /*{{{ drive_process() */
1851 /****************************************************************************/
1852 static ptype_list
*getevents(biabl_list
*biabl
, int *others
)
1856 ptype_list
*all
=NULL
, *pt
;
1860 for (biablx
= biabl
; biablx
; biablx
= biablx
->NEXT
)
1861 if ((bef_search_stable(biablx
->CNDABL
,&clk
)) > 0)
1863 if (bef_search_notck(biablx
->CNDABL
,clk
) > 0) dir
=0;
1866 for (pt
=all
; pt
!=NULL
&& !(pt
->DATA
==clk
&& pt
->TYPE
==dir
); pt
=pt
->NEXT
) ;
1868 all
=addptype(all
, dir
,clk
);
1871 return (ptype_list
*)reverse((chain_list
*)all
);
1874 static void drive_process(bef_driver
*driver
, biabl_list
*biabl
, char *name
,
1875 char *vname
, int vsize
, int *np
, char *head
,
1876 int type
, char flags
)
1878 chain_list
*loopchain
;
1880 int done_endif
, done_else
, cpt
, first
, go
, others
;
1882 loop_list
*lastloop
;
1883 ptype_list
*events
, *pt
;
1889 driver
->PROC
.EDGE(buf
,"",0,"");
1891 if (driver
->VLG
) // verilog
1892 events
=getevents(biabl
, &others
);
1896 if ((!(V_BOOL_TAB
[__MGL_OLD_STYLE_BUS
].VALUE
|| (flags
& BEH_FLAG_NORMAL
)!=0) &&
1897 ((type
& ~BEG_MASK_TYPE
)== BEG_MASK_BUS
|| (type
& ~BEG_MASK_TYPE
)==BEG_MASK_BUX
) && driver
->VLG
&& vsize
==1 && !beh_isloop(biabl
))
1899 (V_BOOL_TAB
[__MGL_INERTIAL_MEMORY
].VALUE
&& (flags
& BEH_FLAG_NORMAL
)==0 &&
1900 ((type
& ~BEG_MASK_TYPE
)== BEG_MASK_REG
) && driver
->VLG
&& vsize
==1 && !beh_isloop(biabl
) && events
==NULL
)
1903 iprint(driver
->FP
,'i',"/* %s '%s' */\n",(type
& ~BEG_MASK_TYPE
)== BEG_MASK_REG
?"REGISTER":"BUS",vname
);
1904 for (biablx
= biabl
; biablx
; biablx
= biablx
->NEXT
)
1906 if (BEH_TIMEVARS
!=NULL
&& (l
=gethtitem(BEH_TIMEVARS
, biablx
->TIMEVAR
))!=EMPTYHT
)
1910 *driver
->ABUFF
= getStrAblReduce(driver
,biablx
->CNDABL
,*driver
->ABUFF
, driver
->ABUFS
);
1911 if (driver
->ISONE(*driver
->ABUFF
)) l
=BEH_CND_WEAK
;
1913 driver
->AFFECTED(driver
->FP
,'0','w',time
, biablx
->TIMER
, biablx
->TIMEF
, name
, vname
, NULL
,biablx
->FLAG
| l
);
1916 fprintf(driver
->FP
, "(%s) ? ", *driver
->ABUFF
);
1918 driver
->VALUE (driver
->FP
,biablx
->VALABL
,'w',biablx
->TIME
, biablx
->TIMER
, biablx
->TIMEF
,driver
->ABUFF
, driver
->ABUFS
);
1920 fprintf(driver
->FP
, " : 1'bz;\n");
1922 fprintf(driver
->FP
, " ;\n");
1924 iprint(driver
->FP
,'i',"/* ---------------------------- */\n",name
);
1928 if (events
==NULL
) events
=addptype(events
, 0, NULL
);
1929 else if (others
>0) events
=addptype(events
, 1, NULL
);
1931 if (driver
->VLG
&& events
!=NULL
&& events
->NEXT
!=NULL
)
1932 iprint(driver
->FP
,'i',"/* Event split for '%s' */\n",vname
);
1934 for (pt
=events
; pt
!=NULL
; pt
=pt
->NEXT
)
1937 if (pt
->TYPE
==0 && pt
->DATA
==NULL
)
1938 loopchain
= driver
->PROC
.DECLAR(driver
->FP
,biabl
,name
,*np
,head
,
1939 driver
->ABUFF
,NULL
);
1941 loopchain
= driver
->PROC
.DECLAR(driver
->FP
,biabl
,name
,*np
,head
,
1952 driver
->PROC
.BEGIN(driver
->FP
,loopchain
);
1953 for (biablx
= biabl
; biablx
; biablx
= biablx
->NEXT
, first
= 0)
1956 if (pt
->TYPE
==0 && pt
->DATA
==NULL
) go
=1;
1962 hasclk
=bef_search_stable(biablx
->CNDABL
,&clk
);
1963 if (pt
->TYPE
==1 && pt
->DATA
==NULL
&& hasclk
<=0) go
=1;
1964 else if (hasclk
>0 && clk
==pt
->DATA
)
1966 if (bef_search_notck(biablx
->CNDABL
,clk
) > 0) dir
=0;
1968 if (dir
==pt
->TYPE
) go
=1;
1972 drive_one_biabl(driver
,biablx
,&lastloop
,&oldckcnd
,&done_endif
,&done_else
,
1973 &cpt
,first
,name
,vname
,vsize
,np
,head
,type
,
1974 driver
->ABUFF
,driver
->ABUFS
);
1978 drive_end_of_process(driver
,lastloop
,done_endif
,done_else
,cpt
,name
,vname
,
1979 vsize
,*np
,head
,type
);
1980 driver
->PROC
.END(driver
->FP
);
1985 if (pt
->NEXT
!=NULL
) iprint(driver
->FP
,'i',"\n");
1987 if (driver
->VLG
&& events
!=NULL
&& events
->NEXT
!=NULL
)
1988 iprint(driver
->FP
,'i',"/* ---------------------------- */\n");
1993 /*}}}************************************************************************/
1994 /*}}}************************************************************************/
1995 /*}}}************************************************************************/