1 /****************************************************************************/
3 /* Chaine de CAO & VLSI Alliance */
5 /* Produit : GENIUS v1.00 */
6 /* Fichier : gen_verif_exp_VHDL.c */
8 /* Auteur(s) : Francois DONNET le : 10/06/1999 */
10 /* (c) copyright 1999 Laboratoire MASI equipe CAO & VLSI */
11 /* Tous droits reserves */
12 /* Support : e-mail alliance-support@asim.lip6.fr */
15 /****************************************************************************/
23 #include "gen_verif_utils.h"
24 #include "gen_verif_exp_VHDL.h"
28 /***************************************************************************/
29 /* Control the expression of FOR in VHDL for later searching */
30 /* env list of variables with their values */
31 /***************************************************************************/
32 extern int Verif_HighBound_FOR(tree
,env
)
38 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 208);
39 //fprintf(stderr,"Verif_HighBound_FOR: NULL pointer\n");
42 switch (TOKEN(tree
)) {
43 case '+': case '-': case '*': case '/':
44 var1
=Verif_HighBound_FOR(tree
->NEXT
,env
);
45 var2
=Verif_HighBound_FOR(tree
->NEXT
->NEXT
,env
);
47 avt_errmsg(GNS_ERRMSG
, "134", AVT_ERROR
, FILE_NAME(tree
),LINE(tree
));
48 // fprintf(stderr,"%s:%d: Only one variable authorized in a 'for' expression. Use Hierarchy!\n",FILE_NAME(tree),LINE(tree));
55 var1
=Verif_HighBound_FOR(tree
->NEXT
,env
);
56 var2
=Verif_HighBound_FOR(tree
->NEXT
->NEXT
,env
);
58 avt_errmsg(GNS_ERRMSG
, "134", AVT_ERROR
, FILE_NAME(tree
),LINE(tree
));
59 // fprintf(stderr,"%s:%d: Only one variable authorized in a 'for' expression. Use Hierarchy!\n",FILE_NAME(tree),LINE(tree));
64 avt_errmsg(GNS_ERRMSG
, "135", AVT_ERROR
, FILE_NAME(tree
),LINE(tree
),"rem");
65 // fprintf(stderr,"%s:%d: forbidden operator 'rem' on variable\n",FILE_NAME(tree),LINE(tree));
71 var1
=Verif_HighBound_FOR(tree
->NEXT
,env
);
72 var2
=Verif_HighBound_FOR(tree
->NEXT
->NEXT
,env
);
74 avt_errmsg(GNS_ERRMSG
, "134", AVT_ERROR
, FILE_NAME(tree
),LINE(tree
));
75 // fprintf(stderr,"%s:%d: Only one variable authorized in a 'for' expression. Use Hierarchy!\n",FILE_NAME(tree),LINE(tree));
80 avt_errmsg(GNS_ERRMSG
, "135", AVT_ERROR
, FILE_NAME(tree
),LINE(tree
),"mod");
81 // fprintf(stderr,"%s:%d: forbidden operator 'mod' on variable\n",FILE_NAME(tree),LINE(tree));
87 var1
=Verif_HighBound_FOR(tree
->NEXT
,env
);
88 var2
=Verif_HighBound_FOR(tree
->NEXT
->NEXT
,env
);
90 avt_errmsg(GNS_ERRMSG
, "134", AVT_ERROR
, FILE_NAME(tree
),LINE(tree
));
91 // fprintf(stderr,"%s:%d: Only one variable authorized in a 'for' expression. Use Hierarchy!\n",FILE_NAME(tree),LINE(tree));
96 avt_errmsg(GNS_ERRMSG
, "135", AVT_ERROR
, FILE_NAME(tree
),LINE(tree
),"**");
97 // fprintf(stderr,"%s:%d: forbidden operator '**' on variable\n",FILE_NAME(tree),LINE(tree));
104 return Verif_HighBound_FOR(tree
->DATA
,env
);
106 case GEN_TOKEN_OPPOSITE
:
107 return Verif_HighBound_FOR(tree
->NEXT
,env
);
109 case GEN_TOKEN_DIGIT
:
112 case GEN_TOKEN_IDENT
:
116 Error_Tree("Verif_HighBound_FOR",tree
);
122 /***************************************************************************/
123 /* eval and verify a scalar expression in VHDL */
124 /* env list of variables with their values */
125 /***************************************************************************/
126 extern int Verif_Exp_VHDL(tree_list
*tree
, ptype_list
*env
)
130 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 209);
131 // fprintf(stderr,"Verif_Exp_VHDL: NULL pointer\n");
134 switch (TOKEN(tree
)) {
137 return Verif_Exp_VHDL(tree
->DATA
,env
);
140 return Verif_Exp_VHDL(tree
->NEXT
,env
)+Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
143 return Verif_Exp_VHDL(tree
->NEXT
,env
)-Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
146 return Verif_Exp_VHDL(tree
->NEXT
,env
)*Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
149 ope
=Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
151 /*here LINE represents where the 2nd operand ends*/
152 avt_errmsg(GNS_ERRMSG
, "136", AVT_FATAL
, FILE_NAME(tree
),LINE(tree
));
153 // fprintf(stderr,"%s:%d: division by zero could appear\n",FILE_NAME(tree),LINE(tree));
155 return Verif_Exp_VHDL(tree
->NEXT
,env
);
157 return Verif_Exp_VHDL(tree
->NEXT
,env
)/ope
;
160 ope
=Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
162 /*here LINE represents where the 2nd operand ends*/
163 avt_errmsg(GNS_ERRMSG
, "136", AVT_FATAL
, FILE_NAME(tree
),LINE(tree
));
164 // fprintf(stderr,"%s:%d: division by zero could appear\n",FILE_NAME(tree),LINE(tree));
166 return Verif_Exp_VHDL(tree
->NEXT
,env
);
168 return Verif_Exp_VHDL(tree
->NEXT
,env
)%ope
;
171 ope
=Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
173 /*here LINE represents where the 2nd operand ends*/
174 avt_errmsg(GNS_ERRMSG
, "136", AVT_FATAL
, FILE_NAME(tree
),LINE(tree
));
175 // fprintf(stderr,"%s:%d: division by zero could appear\n",FILE_NAME(tree),LINE(tree));
177 return Verif_Exp_VHDL(tree
->NEXT
,env
);
179 ope
=Verif_Exp_VHDL(tree
->NEXT
,env
)%ope
;
180 return ope
<0?-ope
:ope
;
184 ope
=Verif_Exp_VHDL(tree
->NEXT
,env
);
185 for (i
=Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);i
>0;i
--) ope2
*=ope
;
188 case GEN_TOKEN_OPPOSITE
:
189 return -Verif_Exp_VHDL(tree
->NEXT
,env
);
191 case GEN_TOKEN_DIGIT
:
192 return (int)(long)tree
->DATA
;
194 case GEN_TOKEN_IDENT
:
195 ope
=fetch_value(tree
,env
); /*check if exists and take the value*/
199 Error_Tree("Verif_Exp_VHDL",tree
);
205 /***************************************************************************/
206 /* Verify and Evaluate a boolean expression in VHDL */
207 /* env list of variables with their values */
208 /***************************************************************************/
209 extern int Verif_Bool_VHDL(tree
, env
)
214 avt_errmsg(GNS_ERRMSG
, "004", AVT_FATAL
, 210);
215 // fprintf(stderr,"Verif_Bool_VHDL: NULL pointer\n");
218 switch (TOKEN(tree
)) {
221 return Verif_Bool_VHDL(tree
->DATA
,env
);
225 Verif_Bool_VHDL(tree
->NEXT
,env
)&&Verif_Bool_VHDL(tree
->NEXT
->NEXT
,env
);
229 Verif_Bool_VHDL(tree
->NEXT
,env
)||Verif_Bool_VHDL(tree
->NEXT
->NEXT
,env
);
233 (Verif_Bool_VHDL(tree
->NEXT
,env
)^Verif_Bool_VHDL(tree
->NEXT
->NEXT
,env
));
236 return !Verif_Bool_VHDL(tree
->NEXT
,env
);
240 Verif_Exp_VHDL(tree
->NEXT
,env
)<Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
244 Verif_Exp_VHDL(tree
->NEXT
,env
)>Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
248 Verif_Exp_VHDL(tree
->NEXT
,env
)==Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
250 case GEN_TOKEN_SUPEG
:
252 Verif_Exp_VHDL(tree
->NEXT
,env
)>=Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
254 case GEN_TOKEN_INFEG
:
256 Verif_Exp_VHDL(tree
->NEXT
,env
)<=Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
258 case GEN_TOKEN_NOTEG
:
260 Verif_Exp_VHDL(tree
->NEXT
,env
)!=Verif_Exp_VHDL(tree
->NEXT
->NEXT
,env
);
263 Error_Tree("Verif_Bool_VHDL",tree
);