1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : Structural Verilog Compiler */
6 /* Fichier : mgl_scomp.yac */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Anthony LESTER */
14 /****************************************************************************/
19 #define YYPARSE_PARAM parm
20 #define YYLEX_PARAM parm
22 #define MGL_CONTEXT(x) ((mgl_getcontext(parm))->x)
25 #define yyerror(x) mgl_scomperror(x, (mgl_getcontext(parm)))
37 #include "mgl_parse.h"
39 #include "mgl_error.h"
41 #undef __GNUC__ /* to get round a bug in bison.simple */
43 /*****************************************************************************
44 * function declarations *
45 *****************************************************************************/
47 void mgl_scompclean();
199 %token T_BITWISE_NAND
202 %token T_BITWISE_EXOR
203 %token T_BITWISE_EXNOR
210 %token T_DOES_NOT_EQUAL
212 %token T_LESS_THAN_OR_EQUAL_TO
213 %token T_GREATER_THAN
214 %token T_GREATER_THAN_OR_EQUAL_TO
216 %token T_NOT_IDENTICAL
232 %token <text> Identifier SystemIdentifier
233 %token <decimal> RealLit
234 %token <integer> IntegerLit
235 %token <text> StringLit
236 %token <text> MinTypMaxLit
242 %left T_BITWISE_AND T_BITWISE_EXOR T_BITWISE_EXNOR
243 %left T_EQUALS T_DOES_NOT_EQUAL T_IDENTICAL T_NOT_IDENTICAL
244 %left T_LESS_THAN T_LESS_THAN_OR_EQUAL_TO T_GREATER_THAN T_GREATER_THAN_OR_EQUAL_TO
245 %left T_SHIFT_LEFT T_SHIFT_RIGHT
247 %left T_MULTIPLY T_DIVIDE T_MODULO
248 %right T_BITWISE_NOT T_LOGICAL_NOT T_UNARY_OPERATOR
250 %type <text> name_of_module name_of_module_instance lvalue identifier_hopt
251 %type <name> range range_option expandrange expandrange_option
252 %type <expr> primary expression concatenation
258 verilog_file : description_list
261 description_list : /* empty */
262 | description_list description
268 chain_list *ptassign;
269 losig_list *ptnextsig, *ptsig, *ptprevsig;
271 lofigchain(MGL_CONTEXT(LOFIG));
272 if (MGL_CONTEXT(ASSIGN_LIST) != NULL) {
273 if (MGL_CONTEXT(LOFIG)->MODE != 'P') {
274 for (ptchain = MGL_CONTEXT(ASSIGN_LIST); ptchain; ptchain = ptchain->NEXT) {
275 ptassign = (chain_list *)ptchain->DATA;
276 mgl_assign(MGL_CONTEXT(LOFIG), (char *)ptassign->DATA, (char *)ptassign->NEXT->DATA, MGL_CONTEXT(HSHTAB), mgl_getcontext(parm));
279 /* delete marked signals */
281 for (ptsig = MGL_CONTEXT(LOFIG)->LOSIG; ptsig; ptsig = ptnextsig) {
282 ptnextsig = ptsig->NEXT;
283 if (ptsig->INDEX == 0) {
284 if (ptprevsig == NULL) MGL_CONTEXT(LOFIG)->LOSIG = ptnextsig;
285 else ptprevsig->NEXT = ptnextsig;
287 else ptprevsig = ptsig;
290 freechain(MGL_CONTEXT(ASSIGN_LIST));
291 MGL_CONTEXT(ASSIGN_LIST) = NULL;
293 mgl_fretab(MGL_CONTEXT(HSHTAB));
294 MGL_CONTEXT(HSHTAB) = NULL;
298 mgl_fretab(MGL_CONTEXT(HSHTAB));
299 MGL_CONTEXT(HSHTAB) = NULL;
303 module : T_MODULE Identifier
305 MGL_CONTEXT(HSHTAB) = mgl_initab();
306 MGL_CONTEXT(SIGIDX) = 1;
307 MGL_CONTEXT(FIGNAME) = $2;
308 MGL_CONTEXT(NM1LST) = NULL;
309 MGL_CONTEXT(NM2LST) = NULL;
310 MGL_CONTEXT(NM3LST) = NULL;
311 MGL_CONTEXT(MODEL) = NULL;
312 MGL_CONTEXT(ASSIGN_LIST) = NULL;
313 MGL_CONTEXT(ONLY_ORIENT) = 0;
314 MGL_CONTEXT(BLDFLG) = 1;
316 if (MGL_CONTEXT(TOPFIG) != NULL && MGL_CONTEXT(FIGNAME) == MGL_CONTEXT(TOPFIG)->NAME) {
317 MGL_CONTEXT(LOFIG) = MGL_CONTEXT(TOPFIG);
320 if ((MGL_CONTEXT(LOFIG) = getloadedlofig(MGL_CONTEXT(FIGNAME))) != NULL) {
321 if (!MGL_CONTEXT(LOFIG)->LOINS && !MGL_CONTEXT(LOFIG)->LOTRS) {
322 MGL_CONTEXT(SIGIDX) = getnumberoflosig(MGL_CONTEXT(LOFIG)) + 1;
323 MGL_CONTEXT(BLDFLG) = 1;
324 mgl_clean_lorcnet(MGL_CONTEXT(LOFIG));
326 else MGL_CONTEXT(BLDFLG) = 0;
327 MGL_CONTEXT(ONLY_ORIENT) = 1;
330 MGL_CONTEXT(LOFIG) = addlofig(MGL_CONTEXT(FIGNAME));
331 MGL_CONTEXT(BLDFLG) = 1;
332 MGL_CONTEXT(ONLY_ORIENT) = 0;
335 mgl_addtab(MGL_CONTEXT(HSHTAB), MGL_CONTEXT(FIGNAME), MGL_CONTEXT(FIGNAME), MGL_MODDFN, MGL_FIGDFN);
337 list_of_ports ';' module_item_list T_ENDMODULE
340 list_of_ports : /* empty */
350 port : port_expression_option
353 | '.' Identifier '(' port_expression_option ')'
358 port_expression_option : /*empty */
364 port_expression : port_reference
367 | '{' port_reference_list '}'
372 port_reference_list : port_reference
375 | port_reference_list ',' port_reference
380 port_reference : Identifier
383 | Identifier '[' expression ']'
391 module_item_list : /* empty */
392 | module_item_list module_item
395 module_item : parameter_decl
404 | module_instantiation
414 primitive : T_PRIMITIVE Identifier
416 MGL_CONTEXT(HSHTAB) = mgl_initab();
417 MGL_CONTEXT(SIGIDX) = 1;
418 MGL_CONTEXT(FIGNAME) = $2;
419 MGL_CONTEXT(NM1LST) = NULL;
420 MGL_CONTEXT(NM2LST) = NULL;
421 MGL_CONTEXT(NM3LST) = NULL;
422 MGL_CONTEXT(MODEL) = NULL;
423 MGL_CONTEXT(ASSIGN_LIST) = NULL;
424 MGL_CONTEXT(ONLY_ORIENT) = 0;
425 MGL_CONTEXT(BLDFLG) = 1;
427 if (MGL_CONTEXT(TOPFIG) != NULL && MGL_CONTEXT(FIGNAME) == MGL_CONTEXT(TOPFIG)->NAME) {
428 MGL_CONTEXT(LOFIG) = MGL_CONTEXT(TOPFIG);
431 if ((MGL_CONTEXT(LOFIG) = getloadedlofig(MGL_CONTEXT(FIGNAME))) != NULL) {
432 if (!MGL_CONTEXT(LOFIG)->LOINS && !MGL_CONTEXT(LOFIG)->LOTRS) {
433 MGL_CONTEXT(SIGIDX) = getnumberoflosig(MGL_CONTEXT(LOFIG)) + 1;
434 MGL_CONTEXT(BLDFLG) = 1;
435 mgl_clean_lorcnet(MGL_CONTEXT(LOFIG));
437 else MGL_CONTEXT(BLDFLG) = 0;
438 MGL_CONTEXT(ONLY_ORIENT) = 1;
441 MGL_CONTEXT(LOFIG) = addlofig(MGL_CONTEXT(FIGNAME));
442 MGL_CONTEXT(BLDFLG) = 1;
443 MGL_CONTEXT(ONLY_ORIENT) = 0;
446 mgl_addtab(MGL_CONTEXT(HSHTAB), MGL_CONTEXT(FIGNAME), MGL_CONTEXT(FIGNAME), MGL_MODDFN, MGL_FIGDFN);
448 list_of_ports ';' primitive_decl_list table_definition T_ENDPRIMITIVE
451 primitive_decl_list : /* empty */
452 | primitive_decl_list primitive_decl
455 primitive_decl : input_decl
460 table_definition : T_TABLE table_entries T_ENDTABLE
463 table_entries : combinational_entry_eclr
464 | sequential_entry_eclr
467 combinational_entry_eclr : combinational_entry
468 | combinational_entry_eclr combinational_entry
471 combinational_entry : input_list ':' output_symbol ';'
474 sequential_entry_eclr : sequential_entry
475 | sequential_entry_eclr sequential_entry
478 sequential_entry : input_list ':' state ':' next_state ';'
481 input_list : level_symbol_or_edge_eclr
484 level_symbol_or_edge_eclr : level_symbol_or_edge
485 | level_symbol_or_edge_eclr level_symbol_or_edge
488 level_symbol_or_edge : level_symbol
492 edge : '(' level_symbol level_symbol ')'
499 next_state : output_symbol
529 task : T_TASK Identifier ';'
531 MGL_CONTEXT(BLDFLG) = 0;
533 tf_declaration_list statement_or_null T_ENDTASK
535 MGL_CONTEXT(BLDFLG) = 1;
539 tf_declaration_list : /* empty */
540 | tf_declaration_list tf_declaration
543 tf_declaration : parameter_decl
552 function : T_FUNCTION range_option Identifier ';'
554 MGL_CONTEXT(BLDFLG) = 0;
556 function_decl_list statement_or_null T_ENDFUNCTION
558 MGL_CONTEXT(BLDFLG) = 1;
562 function_decl_list : /* empty */
563 | function_decl_list function_decl
566 function_decl : parameter_decl
573 initial_statement : T_INITIAL statement
578 always_statement : T_ALWAYS statement
583 delay_or_event_control :
588 delay_control : '#' IntegerLit
591 | '#' '(' expression ')'
594 event_control : '@' Identifier
595 | '@' '(' event_expression ')'
596 | '@' '(' or_event_expression ')'
599 or_event_expression : event_expression T_OR event_expression
600 | or_event_expression T_OR event_expression
603 event_expression : expression
606 | T_POSEDGE expression
609 | T_NEGEDGE expression
617 parameter_override : T_DEFPARAM assignment_list ';'
620 parameter_decl : T_PARAMETER range_option assignment_list ';'
623 input_decl : T_INPUT range_option variable_list ';'
625 if (MGL_CONTEXT(BLDFLG) || MGL_CONTEXT(ONLY_ORIENT)) {
629 losig_list *ptprevsig;
630 long prevleft, prevright;
634 if ($2.ERR_FLAG) avt_errmsg(MGL_ERRMSG, "002", AVT_WARNING, MGL_CONTEXT(LINENUM));
635 MGL_CONTEXT(NM1LST) = reverse(MGL_CONTEXT(NM1LST));
636 for (ptchain = MGL_CONTEXT(NM1LST); ptchain; ptchain = ptchain->NEXT) {
637 if (strchr((char *)ptchain->DATA, ' ')) {
638 radical = vectorradical((char *)ptchain->DATA);
639 index = vectorindex((char *)ptchain->DATA);
640 if (MGL_CONTEXT(ONLY_ORIENT)) {
641 ptlocon = mgl_orientlocon(MGL_CONTEXT(LOFIG), IN, (char *)ptchain->DATA, -1, -1);
642 ptlosig = ptlocon->SIG;
645 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), EXTERNAL, '0', (char *)ptchain->DATA, -1, -1);
646 ptlocon = mgl_addlocon(MGL_CONTEXT(LOFIG), ptlosig, IN, (char *)ptchain->DATA, -1, -1);
647 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
649 if ((ptprevsig = (losig_list *)mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN)) != NULL) {
650 prevleft = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN);
651 prevright = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN);
652 if ((prevleft == prevright && abs(index-prevright) != 1)
653 || (prevleft < prevright && index != prevright+1)
654 || (prevleft > prevright && index != prevright-1)) {
655 avt_errmsg(MGL_ERRMSG, "007", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
657 if (!MGL_CONTEXT(ONLY_ORIENT) && !ptlosig->NEXT && radical != vectorradical(ptlosig->NEXT->NAMECHAIN->DATA)) {
658 avt_errmsg(MGL_ERRMSG, "008", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
662 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, index);
664 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
665 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, index);
668 if (mgl_chktab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN) != 0) {
669 avt_errmsg(MGL_ERRMSG, "003", AVT_ERROR, (char *)ptchain->DATA, MGL_CONTEXT(LINENUM));
671 if (MGL_CONTEXT(ONLY_ORIENT)) {
672 ptlocon = mgl_orientlocon(MGL_CONTEXT(LOFIG), IN, (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
673 ptlosig = ptlocon->SIG;
676 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), EXTERNAL, '0', (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
677 ptlocon = mgl_addlocon(MGL_CONTEXT(LOFIG), ptlosig, IN, (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
678 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
680 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
681 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, $2.LEFT);
682 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, $2.RIGHT);
685 freechain(MGL_CONTEXT(NM1LST));
686 MGL_CONTEXT(NM1LST) = NULL;
691 output_decl : T_OUTPUT range_option variable_list ';'
693 if (MGL_CONTEXT(BLDFLG) || MGL_CONTEXT(ONLY_ORIENT)) {
697 losig_list *ptprevsig;
698 long prevleft, prevright;
702 if ($2.ERR_FLAG) avt_errmsg(MGL_ERRMSG, "002", AVT_WARNING, MGL_CONTEXT(LINENUM));
703 MGL_CONTEXT(NM1LST) = reverse(MGL_CONTEXT(NM1LST));
704 for (ptchain = MGL_CONTEXT(NM1LST); ptchain; ptchain = ptchain->NEXT) {
705 if (strchr((char *)ptchain->DATA, ' ')) {
706 radical = vectorradical((char *)ptchain->DATA);
707 index = vectorindex((char *)ptchain->DATA);
708 if (MGL_CONTEXT(ONLY_ORIENT)) {
709 ptlocon = mgl_orientlocon(MGL_CONTEXT(LOFIG), OUT, (char *)ptchain->DATA, -1, -1);
710 ptlosig = ptlocon->SIG;
713 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), EXTERNAL, '0', (char *)ptchain->DATA, -1, -1);
714 ptlocon = mgl_addlocon(MGL_CONTEXT(LOFIG), ptlosig, OUT, (char *)ptchain->DATA, -1, -1);
715 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
717 if ((ptprevsig = (losig_list *)mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN)) != NULL) {
718 prevleft = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN);
719 prevright = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN);
720 if ((prevleft == prevright && abs(index-prevright) != 1)
721 || (prevleft < prevright && index != prevright+1)
722 || (prevleft > prevright && index != prevright-1)) {
723 avt_errmsg(MGL_ERRMSG, "007", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
725 if (!MGL_CONTEXT(ONLY_ORIENT) && !ptlosig->NEXT && radical != vectorradical(ptlosig->NEXT->NAMECHAIN->DATA)) {
726 avt_errmsg(MGL_ERRMSG, "008", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
730 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, index);
732 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
733 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, index);
736 if (mgl_chktab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN) != 0) {
737 avt_errmsg(MGL_ERRMSG, "003", AVT_ERROR, (char *)ptchain->DATA, MGL_CONTEXT(LINENUM));
739 if (MGL_CONTEXT(ONLY_ORIENT)) {
740 ptlocon = mgl_orientlocon(MGL_CONTEXT(LOFIG), OUT, (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
741 ptlosig = ptlocon->SIG;
744 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), EXTERNAL, '0', (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
745 ptlocon = mgl_addlocon(MGL_CONTEXT(LOFIG), ptlosig, OUT, (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
746 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
748 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
749 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, $2.LEFT);
750 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, $2.RIGHT);
753 freechain(MGL_CONTEXT(NM1LST));
754 MGL_CONTEXT(NM1LST) = NULL;
759 inout_decl : T_INOUT range_option variable_list ';'
761 if (MGL_CONTEXT(BLDFLG) || MGL_CONTEXT(ONLY_ORIENT)) {
765 losig_list *ptprevsig;
766 long prevleft, prevright;
770 if ($2.ERR_FLAG) avt_errmsg(MGL_ERRMSG, "002", AVT_WARNING, MGL_CONTEXT(LINENUM));
771 MGL_CONTEXT(NM1LST) = reverse(MGL_CONTEXT(NM1LST));
772 for (ptchain = MGL_CONTEXT(NM1LST); ptchain; ptchain = ptchain->NEXT) {
773 if (strchr((char *)ptchain->DATA, ' ')) {
774 radical = vectorradical((char *)ptchain->DATA);
775 index = vectorindex((char *)ptchain->DATA);
776 if (MGL_CONTEXT(ONLY_ORIENT)) {
777 ptlocon = mgl_orientlocon(MGL_CONTEXT(LOFIG), INOUT, (char *)ptchain->DATA, -1, -1);
778 ptlosig = ptlocon->SIG;
781 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), EXTERNAL, '0', (char *)ptchain->DATA, -1, -1);
782 ptlocon = mgl_addlocon(MGL_CONTEXT(LOFIG), ptlosig, INOUT, (char *)ptchain->DATA, -1, -1);
783 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
785 if ((ptprevsig = (losig_list *)mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN)) != NULL) {
786 prevleft = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN);
787 prevright = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN);
788 if ((prevleft == prevright && abs(index-prevright) != 1)
789 || (prevleft < prevright && index != prevright+1)
790 || (prevleft > prevright && index != prevright-1)) {
791 avt_errmsg(MGL_ERRMSG, "007", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
793 if (!MGL_CONTEXT(ONLY_ORIENT) && !ptlosig->NEXT && radical != vectorradical(ptlosig->NEXT->NAMECHAIN->DATA)) {
794 avt_errmsg(MGL_ERRMSG, "008", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
798 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, index);
800 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
801 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, index);
804 if (mgl_chktab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN) != 0) {
805 avt_errmsg(MGL_ERRMSG, "003", AVT_ERROR, (char *)ptchain->DATA, MGL_CONTEXT(LINENUM));
807 if (MGL_CONTEXT(ONLY_ORIENT)) {
808 ptlocon = mgl_orientlocon(MGL_CONTEXT(LOFIG), INOUT, (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
809 ptlosig = ptlocon->SIG;
812 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), EXTERNAL, '0', (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
813 ptlocon = mgl_addlocon(MGL_CONTEXT(LOFIG), ptlosig, INOUT, (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
814 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
816 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
817 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, $2.LEFT);
818 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, $2.RIGHT);
821 freechain(MGL_CONTEXT(NM1LST));
822 MGL_CONTEXT(NM1LST) = NULL;
827 net_decl : nettype charge_strength expandrange_option delay_option variable_list ';'
829 if (MGL_CONTEXT(BLDFLG) && MGL_CONTEXT(LOFIG)->MODE != 'P') {
832 losig_list *ptprevsig;
833 long prevleft, prevright;
837 if ($3.ERR_FLAG) avt_errmsg(MGL_ERRMSG, "002", AVT_WARNING, MGL_CONTEXT(LINENUM));
838 for (ptchain = MGL_CONTEXT(NM1LST); ptchain; ptchain = ptchain->NEXT) {
839 if (strchr((char *)ptchain->DATA, ' ')) {
840 radical = vectorradical((char *)ptchain->DATA);
841 index = vectorindex((char *)ptchain->DATA);
842 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), INTERNAL, '0', (char *)ptchain->DATA, -1, -1);
843 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
844 if ((ptprevsig = (losig_list *)mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN)) != NULL) {
845 prevleft = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN);
846 prevright = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN);
847 if ((prevleft == prevright && abs(index-prevright) != 1)
848 || (prevleft < prevright && index != prevright+1)
849 || (prevleft > prevright && index != prevright-1)) {
850 avt_errmsg(MGL_ERRMSG, "007", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
852 if (!ptlosig->NEXT || radical != vectorradical(ptlosig->NEXT->NAMECHAIN->DATA)) {
853 avt_errmsg(MGL_ERRMSG, "008", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
857 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, index);
859 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
860 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, index);
863 if (mgl_chktab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN) != 0) {
864 avt_errmsg(MGL_ERRMSG, "004", AVT_WARNING, (char *)ptchain->DATA, MGL_CONTEXT(LINENUM));
867 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), INTERNAL, '0', (char *)ptchain->DATA, $3.LEFT, $3.RIGHT);
868 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
869 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
870 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, $3.LEFT);
871 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, $3.RIGHT);
876 freechain(MGL_CONTEXT(NM1LST));
877 MGL_CONTEXT(NM1LST) = NULL;
879 | nettype expandrange_option delay_option variable_list ';'
881 if (MGL_CONTEXT(BLDFLG) && MGL_CONTEXT(LOFIG)->MODE != 'P') {
884 losig_list *ptprevsig;
885 long prevleft, prevright;
889 for (ptchain = MGL_CONTEXT(NM1LST); ptchain; ptchain = ptchain->NEXT) {
890 if (strchr((char *)ptchain->DATA, ' ')) {
891 radical = vectorradical((char *)ptchain->DATA);
892 index = vectorindex((char *)ptchain->DATA);
893 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), INTERNAL, '0', (char *)ptchain->DATA, -1, -1);
894 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
895 if ((ptprevsig = (losig_list *)mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN)) != NULL) {
896 prevleft = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN);
897 prevright = mgl_chktab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN);
898 if ((prevleft == prevright && abs(index-prevright) != 1)
899 || (prevleft < prevright && index != prevright+1)
900 || (prevleft > prevright && index != prevright-1)) {
901 avt_errmsg(MGL_ERRMSG, "007", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
903 if (!ptlosig->NEXT || radical != vectorradical(ptlosig->NEXT->NAMECHAIN->DATA)) {
904 avt_errmsg(MGL_ERRMSG, "008", AVT_ERROR, radical, MGL_CONTEXT(LINENUM));
908 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, index);
910 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
911 mgl_addtab(MGL_CONTEXT(HSHTAB), radical, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, index);
914 if (mgl_chktab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN) != 0) {
915 avt_errmsg(MGL_ERRMSG, "004", AVT_WARNING, (char *)ptchain->DATA, MGL_CONTEXT(LINENUM));
918 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), INTERNAL, '0', (char *)ptchain->DATA, $2.LEFT, $2.RIGHT);
919 MGL_CONTEXT(SIGIDX) = ptlosig->INDEX + 1;
920 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
921 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, $2.LEFT);
922 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, $2.RIGHT);
927 freechain(MGL_CONTEXT(NM1LST));
928 MGL_CONTEXT(NM1LST) = NULL;
930 | nettype drive_strength expandrange_option delay_option assignment_list ';'
931 | nettype expandrange_option delay_option assignment_list ';'
947 expandrange_option : /* empty */
974 reg_decl : T_REG range_option register_list ';'
975 | T_TIME range_option register_list ';'
978 register_list : register_variable
979 | register_list ',' register_variable
982 register_variable : Identifier range_option
987 integer_decl : T_INTEGER variable_list ';'
990 real_decl : T_REAL variable_list ';'
993 continuous_assign : T_ASSIGN drive_strength_option delay_option assignment_list ';'
996 variable_list : Identifier
998 MGL_CONTEXT(NM1LST) = addchain(NULL, $1);
1000 | variable_list ',' Identifier
1002 MGL_CONTEXT(NM1LST) = addchain(MGL_CONTEXT(NM1LST), $3);
1006 charge_strength : '(' T_SMALL ')'
1011 drive_strength_option : /* empty */
1015 drive_strength : '(' strength0 ',' strength1 ')'
1016 | '(' strength1 ',' strength0 ')'
1021 strength0 : T_SUPPLY0
1028 strength1 : T_SUPPLY1
1035 range_option : /* empty */
1047 range : '[' expression ':' expression ']'
1049 if ($2.TYPE == MGL_RESULT && $4.TYPE == MGL_RESULT) {
1050 $$.LEFT = $2.RESULT;
1051 $$.RIGHT = $4.RESULT;
1062 assignment_list : assignment
1063 | assignment_list ',' assignment
1066 gate_instantiation : gatetype drive_delay_clr gate_instance_list ';'
1069 drive_delay_clr : /* empty */
1070 | drive_delay_clr drive_delay
1073 drive_delay : drive_strength
1095 gate_instance_list : gate_instance
1096 | gate_instance_list ',' gate_instance
1099 gate_instance : name_of_gate_instance range_option '(' terminal_list ')'
1101 freechain(MGL_CONTEXT(NM1LST));
1102 MGL_CONTEXT(NM1LST) = NULL;
1104 | '(' terminal_list ')'
1106 freechain(MGL_CONTEXT(NM1LST));
1107 MGL_CONTEXT(NM1LST) = NULL;
1111 name_of_gate_instance : Identifier
1116 terminal_list : terminal
1117 | terminal_list ',' terminal
1120 terminal : expression
1122 if ($1.TYPE == MGL_IDENT) {
1123 MGL_CONTEXT(NM1LST) = addchain(MGL_CONTEXT(NM1LST), $1.IDENT);
1125 else if ($1.TYPE == MGL_CONCAT) {
1126 MGL_CONTEXT(NM1LST) = append($1.CONCAT, MGL_CONTEXT(NM1LST));
1128 else if ($1.TYPE == MGL_RESULT) {
1129 if ($1.RESULT == 0) {
1130 MGL_CONTEXT(NM1LST) = addchain(MGL_CONTEXT(NM1LST), MGL_VSS);
1132 else if ($1.RESULT == 1) {
1133 MGL_CONTEXT(NM1LST) = addchain(MGL_CONTEXT(NM1LST), MGL_VDD);
1139 module_instantiation : name_of_module
1141 if (MGL_CONTEXT(BLDFLG) && MGL_CONTEXT(LOFIG)->MODE != 'P') {
1142 MGL_CONTEXT(MODELNAME) = $1;
1143 MGL_CONTEXT(MODEL) = getloadedlofig(MGL_CONTEXT(MODELNAME));
1144 if (MGL_CONTEXT(MODEL) == NULL && MGL_USE_LIBRARY) {
1145 MGL_CONTEXT(MODEL) = getlofig(MGL_CONTEXT(MODELNAME), 'P');
1149 parameter_assign_option module_instance_list ';'
1154 name_of_module : Identifier
1160 parameter_assign_option : /* empty */
1164 parameter_assign : '#' '(' expression_list ')'
1167 expression_list : expression
1169 if ($1.TYPE == MGL_IDENT) {
1170 MGL_CONTEXT(NM3LST) = addchain(MGL_CONTEXT(NM3LST), $1.IDENT);
1172 else if ($1.TYPE == MGL_CONCAT) {
1173 MGL_CONTEXT(NM3LST) = append($1.CONCAT, MGL_CONTEXT(NM3LST));
1175 else if ($1.TYPE == MGL_RESULT) {
1176 if ($1.RESULT == 0) {
1177 MGL_CONTEXT(NM3LST) = addchain(MGL_CONTEXT(NM3LST), MGL_VSS);
1179 else if ($1.RESULT == 1) {
1180 MGL_CONTEXT(NM3LST) = addchain(MGL_CONTEXT(NM3LST), MGL_VDD);
1184 | expression_list ',' expression
1186 if ($3.TYPE == MGL_IDENT) {
1187 MGL_CONTEXT(NM3LST) = addchain(MGL_CONTEXT(NM3LST), $3.IDENT);
1189 else if ($3.TYPE == MGL_CONCAT) {
1190 MGL_CONTEXT(NM3LST) = append($3.CONCAT, MGL_CONTEXT(NM3LST));
1192 else if ($3.TYPE == MGL_RESULT) {
1193 if ($3.RESULT == 0) {
1194 MGL_CONTEXT(NM3LST) = addchain(MGL_CONTEXT(NM3LST), MGL_VSS);
1196 else if ($3.RESULT == 1) {
1197 MGL_CONTEXT(NM3LST) = addchain(MGL_CONTEXT(NM3LST), MGL_VDD);
1203 module_instance_list : module_instance
1204 | module_instance_list ',' module_instance
1207 module_instance : name_of_module_instance range_option '(' list_of_module_terminals ')'
1209 if (MGL_CONTEXT(BLDFLG) && MGL_CONTEXT(LOFIG)->MODE != 'P') {
1210 losig_list *ptlosig;
1211 losig_list *ptvddsig = NULL;
1212 losig_list *ptvsssig = NULL;
1213 chain_list *sigchain = NULL;
1214 chain_list *ptchain;
1217 for (ptchain = MGL_CONTEXT(NM1LST); ptchain; ptchain = ptchain->NEXT) {
1218 if (ptchain->DATA == MGL_VDD) {
1219 if (ptvddsig != NULL) ptlosig = ptvddsig;
1221 index = MGL_CONTEXT(SIGIDX);
1222 ptlosig = mgl_givevdd(MGL_CONTEXT(LOFIG), $1, &index);
1224 MGL_CONTEXT(SIGIDX) = index;
1227 else if (ptchain->DATA == MGL_VSS) {
1228 if (ptvsssig != NULL) ptlosig = ptvsssig;
1230 index = MGL_CONTEXT(SIGIDX);
1231 ptlosig = mgl_givevss(MGL_CONTEXT(LOFIG), $1, &index);
1233 MGL_CONTEXT(SIGIDX) = index;
1236 else if ((ptlosig = mgl_getlosig(MGL_CONTEXT(LOFIG), (char *)ptchain->DATA, MGL_CONTEXT(HSHTAB), mgl_getcontext(parm))) == NULL) {
1237 ptlosig = mgl_addlosig(MGL_CONTEXT(LOFIG), MGL_CONTEXT(SIGIDX), INTERNAL, '0', (char *)ptchain->DATA, -1, -1);
1238 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_PNTDFN, (long)ptlosig);
1239 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_LFTDFN, -1);
1240 mgl_addtab(MGL_CONTEXT(HSHTAB), (char *)ptchain->DATA, MGL_CONTEXT(FIGNAME), MGL_RGTDFN, -1);
1241 MGL_CONTEXT(SIGIDX)++;
1243 sigchain = addchain(sigchain, ptlosig);
1245 sigchain = reverse(sigchain);
1246 if ($2.LEFT == -1 || $2.RIGHT == -1) {
1247 if (MGL_CONTEXT(MODEL) == NULL && MGL_CONTEXT(NM2LST) != NULL) {
1248 mgl_addloins(MGL_CONTEXT(LOFIG), MGL_CONTEXT(MODELNAME), $1, MGL_CONTEXT(NM2LST), sigchain);
1251 index = MGL_CONTEXT(SIGIDX);
1252 if (MGL_CONTEXT(NM2LST) != NULL || MGL_CONTEXT(NM1LST) == NULL) sigchain = mgl_sortsig(MGL_CONTEXT(MODEL), $1, MGL_CONTEXT(NM2LST), sigchain, MGL_CONTEXT(LOFIG), &index);
1253 MGL_CONTEXT(SIGIDX) = index;
1254 addloins(MGL_CONTEXT(LOFIG), $1, MGL_CONTEXT(MODEL), sigchain);
1259 freechain(sigchain);
1261 freechain(MGL_CONTEXT(NM1LST));
1262 MGL_CONTEXT(NM1LST) = NULL;
1263 freechain(MGL_CONTEXT(NM2LST));
1264 MGL_CONTEXT(NM2LST) = NULL;
1266 | '(' list_of_module_terminals ')'
1268 freechain(MGL_CONTEXT(NM1LST));
1269 MGL_CONTEXT(NM1LST) = NULL;
1270 freechain(MGL_CONTEXT(NM2LST));
1271 MGL_CONTEXT(NM2LST) = NULL;
1275 name_of_module_instance : Identifier
1281 list_of_module_terminals : /* empty */
1283 | named_port_connection_list
1286 named_port_connection_list : named_port_connection
1287 | named_port_connection_list ',' named_port_connection
1290 named_port_connection : '.' Identifier '(' expression ')'
1292 if ($4.TYPE == MGL_IDENT) {
1293 MGL_CONTEXT(NM1LST) = addchain(MGL_CONTEXT(NM1LST), $4.IDENT);
1294 MGL_CONTEXT(NM2LST) = addchain(MGL_CONTEXT(NM2LST), $2);
1296 else if ($4.TYPE == MGL_CONCAT) {
1298 chain_list *ptchain;
1300 int left, right, increment;
1302 if (MGL_CONTEXT(BLDFLG) && MGL_CONTEXT(LOFIG)->MODE != 'P'
1303 && (ptfig = getloadedlofig(MGL_CONTEXT(MODELNAME))) != NULL) {
1304 mgl_getloconrange(ptfig->LOCON, $2, &left, &right);
1305 for (ptchain = $4.CONCAT; ptchain; ptchain = ptchain->NEXT) i++;
1306 if (left == -1 || right == -1 || abs(right-left)+1 != i) {
1307 avt_errmsg(MGL_ERRMSG, "006", AVT_ERROR, MGL_CONTEXT(LINENUM));
1310 MGL_CONTEXT(NM1LST) = append($4.CONCAT, MGL_CONTEXT(NM1LST));
1312 if (right > left) increment = 1;
1313 else increment = -1;
1314 for (i = left; i != right+increment; i += increment) {
1315 MGL_CONTEXT(NM2LST) = addchain(MGL_CONTEXT(NM2LST), vectorize($2, i));
1320 for (ptchain = $4.CONCAT; ptchain; ptchain = ptchain->NEXT) i++;
1321 MGL_CONTEXT(NM1LST) = append($4.CONCAT, MGL_CONTEXT(NM1LST));
1322 for (i = i-1; i >= 0; i--) {
1323 MGL_CONTEXT(NM2LST) = addchain(MGL_CONTEXT(NM2LST), vectorize($2, i));
1327 else if ($4.TYPE == MGL_RESULT) {
1328 if ($4.RESULT == 0) {
1329 MGL_CONTEXT(NM1LST) = addchain(MGL_CONTEXT(NM1LST), MGL_VSS);
1330 MGL_CONTEXT(NM2LST) = addchain(MGL_CONTEXT(NM2LST), $2);
1332 else if ($4.RESULT == 1) {
1333 MGL_CONTEXT(NM1LST) = addchain(MGL_CONTEXT(NM1LST), MGL_VDD);
1334 MGL_CONTEXT(NM2LST) = addchain(MGL_CONTEXT(NM2LST), $2);
1340 statement : assignment ';'
1341 | T_WAIT '(' expression ')' statement_or_null
1342 | T_IF '(' expression ')' statement_or_null
1343 | T_IF '(' expression ')' statement_or_null T_ELSE statement_or_null
1344 | T_CASE '(' expression ')' case_item_list T_ENDCASE
1345 | T_CASEZ '(' expression ')' case_item_list T_ENDCASE
1346 | T_FOR '(' assignment ';' expression ';' assignment ')' statement
1347 | T_DISABLE Identifier ';'
1348 | T_FOREVER statement
1349 | T_REPEAT '(' expression ')' statement
1350 | T_WHILE '(' expression ')' statement
1351 | delay_or_event_control statement_or_null
1354 | system_task_enable ';'
1355 | T_ASSIGN assignment ';'
1356 | T_DEASSIGN lvalue ';'
1359 statement_or_null : statement
1363 assignment : lvalue '=' expression
1365 chain_list *ptchain;
1367 if ($1 != NULL && $3.TYPE == MGL_IDENT) {
1368 ptchain = addchain(NULL, $3.IDENT);
1369 ptchain = addchain(ptchain, $1);
1370 MGL_CONTEXT(ASSIGN_LIST) = addchain(MGL_CONTEXT(ASSIGN_LIST), ptchain);
1373 | lvalue '=' delay_or_event_control expression
1376 | lvalue T_LESS_THAN_OR_EQUAL_TO expression
1378 chain_list *ptchain;
1380 if ($1 != NULL && $3.TYPE == MGL_IDENT) {
1381 ptchain = addchain(NULL, $3.IDENT);
1382 ptchain = addchain(ptchain, $1);
1383 MGL_CONTEXT(ASSIGN_LIST) = addchain(MGL_CONTEXT(ASSIGN_LIST), ptchain);
1386 | lvalue T_LESS_THAN_OR_EQUAL_TO delay_or_event_control expression
1391 case_item_list : case_item
1392 | case_item_list case_item
1395 case_item : expression_list ':' statement_or_null
1396 | T_DEFAULT ':' statement_or_null
1397 | T_DEFAULT statement_or_null
1400 statement_group : T_BEGIN statement_list T_END
1401 | T_BEGIN ':' Identifier block_decl_list statement_list T_END
1404 statement_list : /* empty */
1405 | statement_list statement
1408 block_decl_list : /* empty */
1409 | block_decl_list block_decl
1412 block_decl : parameter_decl
1418 lvalue : identifier_hopt
1422 | identifier_hopt '[' expression ']'
1424 if ($3.TYPE == MGL_RESULT && $1 != NULL) {
1425 $$ = vectorize($1, $3.RESULT);
1435 expression : primary
1439 | T_MINUS primary %prec T_UNARY_OPERATOR
1442 if ($$.TYPE == MGL_RESULT) {
1443 $$.RESULT = -$$.RESULT;
1446 | T_LOGICAL_NOT primary %prec T_UNARY_OPERATOR
1450 | T_BITWISE_NOT primary %prec T_UNARY_OPERATOR
1454 | T_BITWISE_AND primary %prec T_UNARY_OPERATOR
1458 | T_BITWISE_OR primary %prec T_UNARY_OPERATOR
1462 | T_BITWISE_NAND primary %prec T_UNARY_OPERATOR
1466 | T_BITWISE_NOR primary %prec T_UNARY_OPERATOR
1470 | T_BITWISE_EXOR primary %prec T_UNARY_OPERATOR
1474 | T_BITWISE_EXNOR primary %prec T_UNARY_OPERATOR
1478 | expression T_PLUS expression
1482 | expression T_MINUS expression
1486 | expression T_MULTIPLY expression
1490 | expression T_DIVIDE expression
1494 | expression T_MODULO expression
1498 | expression T_EQUALS expression
1502 | expression T_DOES_NOT_EQUAL expression
1506 | expression T_IDENTICAL expression
1510 | expression T_NOT_IDENTICAL expression
1514 | expression T_LOGICAL_AND expression
1518 | expression T_LOGICAL_OR expression
1522 | expression T_LESS_THAN expression
1526 | expression T_LESS_THAN_OR_EQUAL_TO expression
1530 | expression T_GREATER_THAN expression
1534 | expression T_GREATER_THAN_OR_EQUAL_TO expression
1538 | expression T_BITWISE_AND expression
1542 | expression T_BITWISE_OR expression
1546 | expression T_BITWISE_EXOR expression
1550 | expression T_BITWISE_EXNOR expression
1554 | expression T_SHIFT_LEFT expression
1558 | expression T_SHIFT_RIGHT expression
1562 | expression '?' expression ':' expression
1573 primary : IntegerLit
1575 $$.TYPE = MGL_RESULT;
1580 int left, right, exist, increment, i;
1583 exist = mgl_chktab(MGL_CONTEXT(HSHTAB), $1, MGL_CONTEXT(FIGNAME), MGL_PNTDFN);
1584 left = mgl_chktab(MGL_CONTEXT(HSHTAB), $1, MGL_CONTEXT(FIGNAME), MGL_LFTDFN);
1585 right = mgl_chktab(MGL_CONTEXT(HSHTAB), $1, MGL_CONTEXT(FIGNAME), MGL_RGTDFN);
1586 if (!exist || left == -1 || right == -1) {
1589 $$.TYPE = MGL_IDENT;
1596 $$.TYPE = MGL_CONCAT;
1598 if (left < right) increment = 1;
1599 else increment = -1;
1600 for (i = left; i != right+increment; i += increment) {
1601 $$.CONCAT = addchain($$.CONCAT, (char *)vectorize($1, i));
1608 | identifier_hopt '[' expression ']'
1610 if ($3.TYPE == MGL_RESULT && $1 != NULL) {
1611 $$.TYPE = MGL_IDENT;
1612 $$.IDENT = vectorize($1, $3.RESULT);
1618 | identifier_hopt '[' expression ':' expression ']'
1620 int left, right, increment, i;
1622 if ($3.TYPE == MGL_RESULT && $5.TYPE == MGL_RESULT) {
1625 $$.TYPE = MGL_CONCAT;
1627 if (left < right) increment = 1;
1628 else increment = -1;
1629 for (i = left; i != right+increment; i += increment) {
1630 $$.CONCAT = addchain($$.CONCAT, (char *)vectorize($1, i));
1639 | multiple_concatenation
1647 | '(' expression ')'
1665 identifier_hopt : Identifier
1669 | identifier_hopt '.' Identifier
1675 concatenation : '{' expression_list '}'
1677 if (MGL_CONTEXT(NM3LST) != NULL) {
1678 $$.TYPE = MGL_CONCAT;
1679 $$.CONCAT = MGL_CONTEXT(NM3LST);
1680 MGL_CONTEXT(NM3LST) = NULL;
1685 multiple_concatenation : '{' expression '{' expression_list '}' '}'
1688 function_call : Identifier '(' expression_list ')'
1693 system_call : SystemIdentifier '(' expression_list ')'
1701 task_enable : Identifier '(' expression_list ')'
1709 system_task_enable : SystemIdentifier '(' expression_list ')'
1717 delay_option : /* empty */
1721 delay : '#' IntegerLit
1724 | '#' '(' expression_list ')'
1727 specify_block : T_SPECIFY specify_item_list T_ENDSPECIFY
1730 specify_item_list : /* empty */
1731 | specify_item_list specify_item
1734 specify_item : specparam_declaration
1736 | system_timing_check
1739 specparam_declaration : T_SPECPARAM assignment_list ';'
1742 path_declaration : simple_path_declaration ';'
1743 | edge_sensitive_path_declaration ';'
1744 | state_dependent_path_declaration ';'
1747 list_of_path_inputs : specify_input_terminal_descriptor
1748 | list_of_path_inputs ',' specify_input_terminal_descriptor
1751 specify_input_terminal_descriptor : Identifier
1754 | Identifier '[' expression ']'
1757 | Identifier '[' expression ':' expression ']'
1762 list_of_path_outputs : specify_output_terminal_descriptor
1763 | list_of_path_outputs ',' specify_output_terminal_descriptor
1766 specify_output_terminal_descriptor : Identifier
1769 | Identifier '[' expression ']'
1772 | Identifier '[' expression ':' expression ']'
1777 path_delay_value : path_delay_expression
1778 | '(' path_delay_expression ',' path_delay_expression ')'
1779 | '(' path_delay_expression ',' path_delay_expression ',' path_delay_expression ')'
1780 | '(' path_delay_expression ',' path_delay_expression ',' path_delay_expression ',' path_delay_expression ',' path_delay_expression ',' path_delay_expression ')'
1783 path_delay_expression : expression
1788 polarity_operator : /* empty */
1793 simple_path_declaration :
1794 parallel_path_description '=' path_delay_value
1795 | full_path_description '=' path_delay_value
1798 parallel_path_description :
1799 '(' path_start T_LEADTO list_of_path_outputs ')'
1802 full_path_description :
1803 '(' path_start T_ALLPATH list_of_path_outputs ')'
1806 path_start : edge_identifier list_of_path_inputs polarity_operator
1809 edge_sensitive_path_declaration :
1810 parallel_edge_sensitive_path_description '=' path_delay_value
1811 | full_edge_sensitive_path_description '=' path_delay_value
1814 parallel_edge_sensitive_path_description :
1815 '(' path_start T_LEADTO '(' list_of_path_outputs polarity_operator ':' expression ')' ')'
1818 full_edge_sensitive_path_description :
1819 '(' path_start T_ALLPATH '(' list_of_path_outputs polarity_operator ':' expression ')' ')'
1822 edge_identifier : /* empty */
1827 state_dependent_path_declaration :
1828 T_IF '(' expression ')' simple_path_declaration
1829 | T_IF '(' expression ')' edge_sensitive_path_declaration
1830 | T_IFNONE simple_path_declaration
1833 system_timing_check : SYS_SETUP
1843 /* ###--------------------------------------------------------------### */
1844 /* function : yyerror */
1845 /* ###--------------------------------------------------------------### */
1848 mgl_scomperror(char *str, mgl_scompcontext *context)
1852 avt_errmsg(MGL_ERRMSG, "001", AVT_ERROR, context->LINENUM);
1857 /* ###--------------------------------------------------------------### */
1858 /* function : yyclean */
1859 /* ###--------------------------------------------------------------### */
1862 mgl_scompclean(mgl_scompcontext *context)
1864 if (context->ASSIGN_LIST != NULL) {
1865 freechain(context->ASSIGN_LIST);
1866 context->ASSIGN_LIST = NULL;
1868 if (context->HSHTAB != NULL) {
1869 mgl_fretab(context->HSHTAB);
1870 context->HSHTAB = NULL;