1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : GENIUS v1.00 */
6 /* Fichier : gen_model_FCL.c */
8 /* (c) copyright 1999 Laboratoire MASI equipe CAO & VLSI */
9 /* Tous droits reserves */
10 /* Support : e-mail alliance-support@asim.lip6.fr */
12 /* Auteur(s) : Francois DONNET le : 23/06/1999 */
14 /* Modifie par : le : ../../.... */
15 /* Modifie par : le : ../../.... */
16 /* Modifie par : le : ../../.... */
18 /****************************************************************************/
26 #include "gen_execute_VHDL.h"
27 #include "gen_model_utils.h"
28 #include "gen_model_FCL.h"
32 static lofig_list
*FIG
=NULL
; /*current lofig in construction*/
33 static ptype_list
*FOR_ENV
=NULL
; /* local FOR variables with values */
37 /***************************************************************************/
38 /* change a tree of signals in a list */
39 /***************************************************************************/
40 static inline chain_list
*SigTree2chain(tree_list
*tree
, chain_list
*list
)
43 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 233);
44 //fprintf(stderr,"SigTree2chain: NULL pointer\n");
47 switch (TOKEN(tree
)) {
48 /* as an ABL this token is a node */
50 return SigTree2chain(tree
->DATA
,list
);
53 list
=SigTree2chain(tree
->NEXT
->NEXT
,list
); /*not to reverse order*/
54 return SigTree2chain(tree
->NEXT
,list
);
56 case GEN_TOKEN_SIGNAL
:
57 return SigTree2chain(tree
->NEXT
,list
);
59 case GEN_TOKEN_IDENT
: case '(':
60 return addchain(list
,tree
);
63 Error_Tree("SigTree2chain",tree
);
69 /****************************************************************************/
70 /* put in lofigchain of signal the value of its LOCON */
71 /****************************************************************************/
72 static inline void add_lofigchain(locon_list
*locon
, chain_list
*sigchain
)
78 if ((locon
&& !sigchain
) || (!locon
&& sigchain
)) {
79 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 234);
80 // fprintf(stderr,"add_lofigchain: parameters discrepancy\n");
84 if (!locon
|| !sigchain
) return ;
85 else add_lofigchain(locon
->NEXT
,sigchain
->NEXT
);
87 sig
=(losig_list
*) sigchain
->DATA
;
90 p
=getptype(sig
->USER
,LOFIGCHAIN
);
92 sig
->USER
=addptype(sig
->USER
,LOFIGCHAIN
,NULL
);
95 p
->DATA
=addchain(p
->DATA
,locon
);
99 /****************************************************************************/
100 /* build and return the list of losig in tree put on top of sigchain */
101 /* build also the generic of locon list and losig list returned */
102 /* signal from tree */
103 /* signals are sorted in the same order than in locon list */
104 /****************************************************************************/
105 extern chain_list
*Get_Losig_Alliance(locon_list
*locon
, chain_list
*signal
,
106 chain_list
*sigchain
)
109 chain_list
*namechain
;
115 if ((locon
&& !signal
) || (!locon
&& signal
)) {
116 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 235);
117 // fprintf(stderr,"Get_Losig_Alliance: parameters discrepancy\n");
121 if (!locon
|| !signal
) return sigchain
;
122 else sigchain
=Get_Losig_Alliance(locon
->NEXT
,signal
->NEXT
,sigchain
);
124 tree
=(tree_list
*)signal
->DATA
;
126 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 236);
127 // fprintf(stderr,"Get_Losig_Alliance: NULL pointer\n");
132 signame
=getname(tree
);
133 if (TOKEN(tree
)=='(') { /*vector*/
134 if (TOKEN(tree
->NEXT
->NEXT
->DATA
)==GEN_TOKEN_TO
) { /*array*/
136 int lim
=Eval_Exp_VHDL(
137 (tree
->NEXT
->NEXT
->DATA
)->NEXT
/*low bound*/,FOR_ENV
);
139 for (i
=Eval_Exp_VHDL(
140 (tree
->NEXT
->NEXT
->DATA
)->NEXT
->NEXT
/*high bound*/,FOR_ENV
);
142 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
143 SEPAR
=' ';/*nameindex() must be compatible with vectorradical() */
144 name
=nameindex(signame
,i
);
145 SEPAR
=memo_char
; /* put last value in MBK environment */
148 for (sig
=FIG
->LOSIG
; sig
; sig
=sig
->NEXT
) {
149 for (namechain
=sig
->NAMECHAIN
;
151 namechain
=namechain
->NEXT
) {
152 if (((char*)namechain
->DATA
)==name
) {break;}
154 if (namechain
) break;
158 chain_list
*namechain
;
159 namechain
=addchain(NULL
,name
);
160 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,INTERNAL
);
163 sigchain
=addchain(sigchain
,sig
);
166 else if (TOKEN(tree
->NEXT
->NEXT
->DATA
)==GEN_TOKEN_DOWNTO
) { /*array*/
168 int lim
=Eval_Exp_VHDL(
169 (tree
->NEXT
->NEXT
->DATA
)->NEXT
/*high bound*/,FOR_ENV
);
171 for (i
=Eval_Exp_VHDL(
172 (tree
->NEXT
->NEXT
->DATA
)->NEXT
->NEXT
/*low bound*/,FOR_ENV
);
174 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
175 SEPAR
=' ';/*nameindex() must be compatible with vectorradical() */
176 name
=nameindex(signame
,i
);
177 SEPAR
=memo_char
; /* put last value in MBK environment */
180 for (sig
=FIG
->LOSIG
; sig
; sig
=sig
->NEXT
) {
181 for (namechain
=sig
->NAMECHAIN
;
183 namechain
=namechain
->NEXT
) {
184 if (((char*)namechain
->DATA
)==name
) {break;}
186 if (namechain
) break;
190 chain_list
*namechain
;
191 namechain
=addchain(NULL
,name
);
192 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,INTERNAL
);
195 sigchain
=addchain(sigchain
,sig
);
199 else { /*bit vector*/
200 long bitnum
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
->DATA
,FOR_ENV
);
202 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
203 SEPAR
=' '; /* nameindex() must be compatible with vectorradical() */
204 name
=nameindex(signame
,bitnum
);
205 SEPAR
=memo_char
; /* put last value in MBK environment */
208 for (sig
=FIG
->LOSIG
; sig
; sig
=sig
->NEXT
) {
209 for (namechain
=sig
->NAMECHAIN
; namechain
; namechain
=namechain
->NEXT
) {
210 if (((char*)namechain
->DATA
)==name
) {break;}
212 if (namechain
) break;
216 chain_list
*namechain
;
217 namechain
=addchain(NULL
,name
);
218 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,INTERNAL
);
221 sigchain
=addchain(sigchain
,sig
);
228 for (sig
=FIG
->LOSIG
; sig
; sig
=sig
->NEXT
) {
229 for (namechain
=sig
->NAMECHAIN
; namechain
; namechain
=namechain
->NEXT
) {
230 if (((char*)namechain
->DATA
)==signame
) {break;}
232 if (namechain
) break;
236 chain_list
*namechain
;
237 namechain
=addchain(NULL
,signame
);
238 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,INTERNAL
);
241 sigchain
=addchain(sigchain
,sig
);
249 /****************************************************************************/
250 /* return the abl generic function of all created instances in fig */
251 /****************************************************************************/
252 extern tree_list
*Get_Loins_Alliance(tree_list
*tree
)
254 tree_list
*ret
,*ret2
;
257 chain_list
*sigchain
,*signals
;
258 char *modelname
,*insname
;
259 int lineno
=0,limit
,i
; /*hidden in macro PUT_BIN */
265 /* fprintf(stderr,"Get_Loins_Alliance: NULL pointer\n");
269 switch (TOKEN(tree
)) {
272 return Get_Loins_Alliance(tree
->DATA
);
274 /*instance list connexions*/
276 ret
=Get_Loins_Alliance(tree
->NEXT
);
277 ret2
=Get_Loins_Alliance(tree
->NEXT
->NEXT
);
279 file
=FILE_NAME(tree
);
281 if (ret2
) return PUT_BIN(';',ret
,ret2
);
287 limit
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
->NEXT
,FOR_ENV
);
290 file
=FILE_NAME(tree
);
291 FOR_ENV
=addptype(FOR_ENV
,0,tree
->NEXT
);
292 for (i
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
,FOR_ENV
); i
<=limit
; i
++) {
294 ret2
=Get_Loins_Alliance(tree
->NEXT
->NEXT
->NEXT
->NEXT
);
296 if (ret2
) ret
=PUT_BIN(';',ret
,ret2
);
301 FOR_ENV
=FOR_ENV
->NEXT
;
307 i
=Eval_Exp_VHDL(tree
->NEXT
,FOR_ENV
);
308 if (i
) return Get_Loins_Alliance(tree
->NEXT
->NEXT
);
312 insname
=getname(tree
->NEXT
);
313 /*if we are in a loop put an index */
314 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
315 SEPAR
='_'; /* compatible FCL */
316 if (FOR_ENV
) insname
=nameindex(insname
,FOR_ENV
->TYPE
);
317 SEPAR
=memo_char
; /* put last value in MBK environment */
318 modelname
=getname_of(tree
->NEXT
);
319 ins
=getlofig(modelname
,'P'); /* 'P' (partial) for only interface */
321 avt_errmsg(GNS_ERRMSG
, "161", AVT_FATAL
, modelname
);
322 // fprintf(stderr,"Get_Loins: no model %s found\n",modelname);
325 signals
=SigTree2chain(tree
->NEXT
->NEXT
,NULL
);
326 sigchain
=Get_Losig_Alliance(ins
->LOCON
,signals
,NULL
);
327 FIG
->LOINS
=addloins(FIG
,insname
,ins
,sigchain
);
328 add_lofigchain(FIG
->LOINS
->LOCON
,sigchain
);
332 file
=FILE_NAME(tree
);
333 return PUT_ATO(GEN_TOKEN_LOINS
,FIG
->LOINS
);
336 Error_Tree("Get_Loins_Alliance",tree
);
337 EXIT(1); return NULL
;
342 /****************************************************************************/
343 /* build all the locons of and its signals from tree pointing on port */
344 /****************************************************************************/
345 extern void Get_Signals_Alliance(tree_list
*tree
)
347 chain_list
*namechain
;
354 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 237);
355 // fprintf(stderr,"Get_Signals_Alliance: NULL pointer\n");
358 switch (TOKEN(tree
)) {
361 Get_Signals_Alliance(tree
->DATA
);
364 Get_Signals_Alliance(tree
->NEXT
->NEXT
);
365 Get_Signals_Alliance(tree
->NEXT
);
367 case GEN_TOKEN_COMPONENT
:
370 case GEN_TOKEN_INOUT
: case GEN_TOKEN_SIGNAL
:
371 Get_Signals_Alliance(tree
->NEXT
);
373 case GEN_TOKEN_IDENT
: case '(':
374 signame
=getname(tree
);
375 /* search index number */
377 for (sig
=FIG
->LOSIG
; sig
; sig
=sig
->NEXT
) index
++;
378 if (TOKEN(tree
)=='(') { /* vector */
379 if (TOKEN(tree
->NEXT
->NEXT
->DATA
)==GEN_TOKEN_TO
) {
381 int lim
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
->DATA
->NEXT
/*low bound*/,FOR_ENV
);
383 Eval_Exp_VHDL(tree
->NEXT
->NEXT
->DATA
->NEXT
->NEXT
/*high bound*/,FOR_ENV
);
386 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
387 SEPAR
=' '; /* nameindex() must be compatible with vectorradical() */
388 name
=nameindex(signame
,i
);
389 SEPAR
=memo_char
; /* put last value in MBK environment */
390 namechain
=addchain(NULL
,name
);
391 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,INTERNAL
);
395 else if (TOKEN(tree
->NEXT
->NEXT
->DATA
)==GEN_TOKEN_DOWNTO
) {
397 int lim
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
->DATA
->NEXT
/*high bound*/,FOR_ENV
);
399 Eval_Exp_VHDL(tree
->NEXT
->NEXT
->DATA
->NEXT
->NEXT
/*low bound*/,FOR_ENV
);
402 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
403 SEPAR
=' '; /* nameindex() must be compatible with vectorradical() */
404 name
=nameindex(signame
,i
);
405 SEPAR
=memo_char
; /* put last value in MBK environment */
406 namechain
=addchain(NULL
,name
);
407 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,INTERNAL
);
412 Error_Tree("Get_Signals_Alliance",tree
->NEXT
->NEXT
->DATA
);
417 namechain
=addchain(NULL
,signame
);
418 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,INTERNAL
);
422 Error_Tree("Get_Signals_Alliance",tree
);
428 /****************************************************************************/
429 /* build one locon of fig (and also its external signal) */
430 /****************************************************************************/
431 extern void Get_Locon_Alliance(int dir
, tree_list
*tree
)
434 chain_list
*namechain
;
440 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 238);
441 // fprintf(stderr,"Get_Locon_Alliance: NULL pointer\n");
444 switch (TOKEN(tree
)) {
447 Get_Locon_Alliance(dir
,tree
->DATA
);
449 case '(': case GEN_TOKEN_IDENT
:
450 conname
=getname(tree
);
451 /* search new index */
453 for (sig
=FIG
->LOSIG
; sig
; sig
=sig
->NEXT
) index
++;
454 if (TOKEN(tree
)=='(') {/*order of bit vector is very important for GENIUS*/
455 if (TOKEN(tree
->NEXT
->NEXT
->DATA
)==GEN_TOKEN_TO
) {
456 long i
; /*help for verif in Mark_Loins() */
458 tree
=tree
->NEXT
->NEXT
->DATA
; /* TOKEN(tree)=GEN_TOKEN_TO */
459 lim
=Eval_Exp_VHDL(tree
->NEXT
/*low bound*/,FOR_ENV
);
460 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
461 SEPAR
=' '; /* nameindex() must be compatible with vectorradical() */
463 for (i
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
/*high bound*/,FOR_ENV
); i
>=lim
; i
--) {
465 name
=nameindex(conname
,i
);
466 namechain
=addchain(NULL
,name
);
467 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,EXTERNAL
);/*WARN:no more capa*/
468 /*default addlocon set EXTERNAL*/
469 FIG
->LOCON
=addlocon(FIG
,name
,FIG
->LOSIG
,dir
);
471 FIG
->LOCON
->USER
=addptype(FIG
->LOCON
->USER
,GENCONCHAIN
,NULL
);
472 FIG
->LOCON
->USER
->DATA
=addgenconchain(NULL
, Duplicate_Tree(tree
),
473 FIG
->LOSIG
, Duplicate_Tree(tree
));
475 FIG
->LOSIG
->USER
=addptype(FIG
->LOSIG
->USER
,LOFIGCHAIN
,NULL
);
476 FIG
->LOSIG
->USER
->DATA
=addchain(FIG
->LOSIG
->USER
->DATA
,FIG
->LOCON
);
479 SEPAR
=memo_char
; /* put last value in MBK environment */
481 else if (TOKEN(tree
->NEXT
->NEXT
->DATA
)==GEN_TOKEN_DOWNTO
) {
482 long i
; /*help for verif in Mark_Loins() */
484 tree
=tree
->NEXT
->NEXT
->DATA
; /* TOKEN(tree)=GEN_TOKEN_DOWNTO */
485 lim
=Eval_Exp_VHDL(tree
->NEXT
/*high bound*/,FOR_ENV
);
486 memo_char
=SEPAR
; /* MBK variable it is for concatenation*/
487 SEPAR
=' '; /* nameindex() must be compatible with vectorradical() */
489 for (i
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
/*low bound*/,FOR_ENV
); i
<=lim
; i
++) {
491 name
=nameindex(conname
,i
);
492 namechain
=addchain(NULL
,name
);
493 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,EXTERNAL
);/*WARN:no more capa*/
494 /*default addlocon set EXTERNAL*/
495 FIG
->LOCON
=addlocon(FIG
,name
,FIG
->LOSIG
,dir
);
497 FIG
->LOCON
->USER
=addptype(FIG
->LOCON
->USER
,GENCONCHAIN
,NULL
);
498 FIG
->LOCON
->USER
->DATA
=addgenconchain(NULL
, Duplicate_Tree(tree
),
499 FIG
->LOSIG
, Duplicate_Tree(tree
));
501 FIG
->LOSIG
->USER
=addptype(FIG
->LOSIG
->USER
,LOFIGCHAIN
,NULL
);
502 FIG
->LOSIG
->USER
->DATA
=addchain(FIG
->LOSIG
->USER
->DATA
,FIG
->LOCON
);
506 SEPAR
=memo_char
; /* put last value in MBK environment */
509 Error_Tree("Get_Locon_Alliance",tree
->NEXT
->NEXT
->DATA
);
513 int lineno
=LINE(tree
);
514 char* file
=FILE_NAME(tree
);
515 namechain
=addchain(NULL
,conname
);
516 FIG
->LOSIG
=addlosig(FIG
,index
,namechain
,EXTERNAL
); /*WARN:no more capa*/
517 /*default addlocon set EXTERNAL*/
518 FIG
->LOCON
=addlocon(FIG
,conname
,FIG
->LOSIG
,dir
);
520 FIG
->LOCON
->USER
=addptype(FIG
->LOCON
->USER
,GENCONCHAIN
,NULL
);
521 FIG
->LOCON
->USER
->DATA
=addgenconchain(NULL
, PUT_ATO(GEN_TOKEN_DIGIT
,-1),
522 FIG
->LOSIG
, PUT_ATO(GEN_TOKEN_DIGIT
,-1));
524 FIG
->LOSIG
->USER
=addptype(FIG
->LOSIG
->USER
,LOFIGCHAIN
,NULL
);
525 FIG
->LOSIG
->USER
->DATA
=addchain(FIG
->LOSIG
->USER
->DATA
,FIG
->LOCON
);
529 Error_Tree("Get_Locon_Alliance",tree
);
535 /****************************************************************************/
536 /* build all the locons of and its signals from tree pointing on port */
537 /****************************************************************************/
538 extern void Get_Port_Alliance(tree_list
*tree
)
541 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 239);
542 // fprintf(stderr,"Get_Port_Alliance: NULL pointer\n");
545 switch (TOKEN(tree
)) {
548 Get_Port_Alliance(tree
->DATA
);
551 Get_Port_Alliance(tree
->NEXT
);
553 case ',': /*it's a list of different connectors*/
554 Get_Port_Alliance(tree
->NEXT
->NEXT
); /*to avoid reversion of addchain*/
555 Get_Port_Alliance(tree
->NEXT
);
557 case GEN_TOKEN_SIGNAL
:
558 Get_Port_Alliance(tree
->NEXT
);
561 Get_Locon_Alliance(IN
,tree
->NEXT
);
564 Get_Locon_Alliance(OUT
,tree
->NEXT
);
566 case GEN_TOKEN_INOUT
:
567 Get_Locon_Alliance(INOUT
,tree
->NEXT
);
569 case GEN_TOKEN_TRISTATE
:
570 Get_Locon_Alliance(TRISTATE
,tree
->NEXT
);
572 case GEN_TOKEN_TRANSCV
:
573 Get_Locon_Alliance(TRANSCV
,tree
->NEXT
);
576 Error_Tree("Get_Port_Alliance",tree
);
582 /****************************************************************************/
583 /* put environment to good values */
584 /****************************************************************************/
585 extern void Env_Alliance(lofig_list
*lofig
)