diff --git a/lexor.lex b/lexor.lex index 7950fbd38..92a7d641b 100644 --- a/lexor.lex +++ b/lexor.lex @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: lexor.lex,v 1.39 1999/12/16 01:20:17 steve Exp $" +#ident "$Id: lexor.lex,v 1.40 1999/12/31 03:24:30 steve Exp $" #endif //# define YYSTYPE lexval @@ -97,6 +97,7 @@ W [ \t\b\f\r]+ "~^" { return K_NXOR; } "^~" { return K_NXOR; } "~&" { return K_NAND; } +"->" { return K_TRIGGER; } [}{;:\[\],()#=.@&!?<>%|^~+*/-] { return yytext[0]; } diff --git a/parse.y b/parse.y index d47d933b0..bce55f25c 100644 --- a/parse.y +++ b/parse.y @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: parse.y,v 1.77 1999/12/30 19:06:14 steve Exp $" +#ident "$Id: parse.y,v 1.78 1999/12/31 03:24:31 steve Exp $" #endif # include "parse_misc.h" @@ -74,7 +74,7 @@ extern void lex_end_table(); %token NUMBER %token REALTIME %token K_LE K_GE K_EG K_EQ K_NE K_CEQ K_CNE K_LS K_RS K_SG -%token K_LOR K_LAND K_NAND K_NOR K_NXOR +%token K_LOR K_LAND K_NAND K_NOR K_NXOR K_TRIGGER %token K_always K_and K_assign K_begin K_buf K_bufif0 K_bufif1 K_case %token K_casex K_casez K_cmos K_deassign K_default K_defparam K_disable %token K_edge K_else K_end K_endcase K_endfunction K_endmodule @@ -127,7 +127,7 @@ extern void lex_end_table(); %type expression expr_primary %type lavalue lpvalue %type delay_value -%type delay delay_opt delay_value_list +%type delay1 delay3 delay3_opt %type expression_list %type assign assign_list @@ -275,20 +275,43 @@ defparam_assign_list | defparam_assign_list ',' defparam_assign ; -delay +delay1 : '#' delay_value { svector*tmp = new svector(1); (*tmp)[0] = $2; $$ = tmp; } - | '#' '(' delay_value_list ')' - { $$ = $3; + ; + +delay3 + : '#' delay_value + { svector*tmp = new svector(1); + (*tmp)[0] = $2; + $$ = tmp; + } + | '#' '(' delay_value ')' + { svector*tmp = new svector(1); + (*tmp)[0] = $3; + $$ = tmp; + } + | '#' '(' delay_value ',' delay_value ')' + { svector*tmp = new svector(2); + (*tmp)[0] = $3; + (*tmp)[1] = $5; + $$ = tmp; + } + | '#' '(' delay_value ',' delay_value ',' delay_value ')' + { svector*tmp = new svector(3); + (*tmp)[0] = $3; + (*tmp)[1] = $5; + (*tmp)[1] = $7; + $$ = tmp; } ; -delay_opt - : delay { $$ = $1; } - | { $$ = 0; } +delay3_opt + : delay3 { $$ = $1; } + | { $$ = 0; } ; delay_value @@ -310,18 +333,11 @@ delay_value $$ = tmp; delete $1; } - ; - -delay_value_list - : expression - { svector*tmp = new svector(1); - (*tmp)[0] = $1; - $$ = tmp; - } - | delay_value_list ',' expression - { svector*tmp = new svector(*$1, $3); - delete $1; - $$ = tmp; + | '(' expression ':' expression ':' expression ')' + { yyerror(@2, "sorry: (min:typ:max) not supported."); + $$ = $4; + delete $2; + delete $6; } ; @@ -694,12 +710,6 @@ expr_primary } | '(' expression ')' { $$ = $2; } - | '(' expression ':' expression ':' expression ')' - { yyerror(@2, "sorry: (min:typ:max) not supported."); - $$ = $4; - delete $2; - delete $6; - } | '{' expression_list '}' { PEConcat*tmp = new PEConcat(*$2); tmp->set_file(@2.text); @@ -1051,7 +1061,7 @@ module_item } delete $3; } - | K_trireg charge_strength_opt range_opt delay_opt list_of_variables ';' + | K_trireg charge_strength_opt range_opt delay3_opt list_of_variables ';' { yyerror(@1, "sorry: trireg nets not supported."); delete $3; } @@ -1070,14 +1080,14 @@ module_item delete $2; } | K_parameter parameter_assign_list ';' - | gatetype delay_opt gate_instance_list ';' + | gatetype delay3_opt gate_instance_list ';' { pform_makegates($1, $2, $3); } - | IDENTIFIER delay_opt gate_instance_list ';' + | IDENTIFIER delay3_opt gate_instance_list ';' { pform_make_modgates($1, $2, $3); delete $1; } - | K_assign drive_strength_opt delay_opt assign_list ';' + | K_assign drive_strength_opt delay3_opt assign_list ';' { pform_make_pgassign_list($4, $3, @1.text, @1.first_line); } | K_assign error '=' expression ';' | K_always statement @@ -1141,7 +1151,7 @@ net_decl_assign tmp->set_lineno(@1.first_line); $$ = $1; } - | delay IDENTIFIER '=' expression + | delay1 IDENTIFIER '=' expression { PEIdent*id = new PEIdent($2); PGAssign*tmp = pform_make_pgassign(id, $4, $1); tmp->set_file(@2.text); @@ -1504,6 +1514,10 @@ statement { yyerror(@1, "sorry: procedural force assign not supported."); $$ = 0; } + | K_TRIGGER IDENTIFIER ';' + { yyerror(@1, "sorry: event trigger not supported."); + $$ = 0; + } | K_forever statement { PForever*tmp = new PForever($2); tmp->set_file(@1.text); @@ -1624,10 +1638,9 @@ statement { $$ = 0; yyerror(@3, "error: Error in while loop condition."); } - | delay statement_opt + | delay1 statement_opt { PExpr*del = (*$1)[0]; - if ($1->count() != 1) - yyerror(@1, "sorry: delay lists not supported here."); + assert($1->count() == 1); PDelayStatement*tmp = new PDelayStatement(del, $2); tmp->set_file(@1.text); tmp->set_lineno(@1.first_line); @@ -1655,19 +1668,17 @@ statement tmp->set_lineno(@1.first_line); $$ = tmp; } - | lpvalue '=' delay expression ';' - { PExpr*del = (*$3)[0]; - if ($3->count() != 1) - yyerror(@1, "sorry: Delay lists not supported here."); + | lpvalue '=' delay1 expression ';' + { assert($3->count() == 1); + PExpr*del = (*$3)[0]; PAssign*tmp = new PAssign($1,del,$4); tmp->set_file(@1.text); tmp->set_lineno(@1.first_line); $$ = tmp; } - | lpvalue K_LE delay expression ';' - { PExpr*del = (*$3)[0]; - if ($3->count() != 1) - yyerror(@1, "sorry: Delay lists not supported here."); + | lpvalue K_LE delay1 expression ';' + { assert($3->count() == 1); + PExpr*del = (*$3)[0]; PAssignNB*tmp = new PAssignNB($1,del,$4); tmp->set_file(@1.text); tmp->set_lineno(@1.first_line); @@ -1679,6 +1690,14 @@ statement tmp->set_lineno(@1.first_line); $$ = tmp; } + | lpvalue '=' K_repeat '(' expression ')' event_control expression ';' + { PAssign*tmp = new PAssign($1,$7,$8); + tmp->set_file(@1.text); + tmp->set_lineno(@1.first_line); + yyerror(@3, "sorry: repeat event control not supported."); + delete $5; + $$ = tmp; + } | lpvalue K_LE event_control expression ';' { yyerror(@1, "sorry: Event controls not supported here."); PAssignNB*tmp = new PAssignNB($1,$4); @@ -1686,6 +1705,14 @@ statement tmp->set_lineno(@1.first_line); $$ = tmp; } + | lpvalue K_LE K_repeat '(' expression ')' event_control expression ';' + { yyerror(@1, "sorry: Event controls not supported here."); + delete $5; + PAssignNB*tmp = new PAssignNB($1,$8); + tmp->set_file(@1.text); + tmp->set_lineno(@1.first_line); + $$ = tmp; + } | K_wait '(' expression ')' statement_opt { PEventStatement*tmp; PEEvent*etmp = new PEEvent(NetNEvent::POSITIVE, $3);