Fix event trigger and repeat control parse errors.

This commit is contained in:
steve 1999-12-31 03:24:30 +00:00
parent 6d0edcf58a
commit 5ce35e3e60
2 changed files with 72 additions and 44 deletions

View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) #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 #endif
//# define YYSTYPE lexval //# define YYSTYPE lexval
@ -97,6 +97,7 @@ W [ \t\b\f\r]+
"~^" { return K_NXOR; } "~^" { return K_NXOR; }
"^~" { return K_NXOR; } "^~" { return K_NXOR; }
"~&" { return K_NAND; } "~&" { return K_NAND; }
"->" { return K_TRIGGER; }
[}{;:\[\],()#=.@&!?<>%|^~+*/-] { return yytext[0]; } [}{;:\[\],()#=.@&!?<>%|^~+*/-] { return yytext[0]; }

113
parse.y
View File

@ -19,7 +19,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/ */
#if !defined(WINNT) #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 #endif
# include "parse_misc.h" # include "parse_misc.h"
@ -74,7 +74,7 @@ extern void lex_end_table();
%token <number> NUMBER %token <number> NUMBER
%token <realtime> REALTIME %token <realtime> REALTIME
%token K_LE K_GE K_EG K_EQ K_NE K_CEQ K_CNE K_LS K_RS K_SG %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_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_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 %token K_edge K_else K_end K_endcase K_endfunction K_endmodule
@ -127,7 +127,7 @@ extern void lex_end_table();
%type <expr> expression expr_primary %type <expr> expression expr_primary
%type <expr> lavalue lpvalue %type <expr> lavalue lpvalue
%type <expr> delay_value %type <expr> delay_value
%type <exprs> delay delay_opt delay_value_list %type <exprs> delay1 delay3 delay3_opt
%type <exprs> expression_list %type <exprs> expression_list
%type <exprs> assign assign_list %type <exprs> assign assign_list
@ -275,20 +275,43 @@ defparam_assign_list
| defparam_assign_list ',' defparam_assign | defparam_assign_list ',' defparam_assign
; ;
delay delay1
: '#' delay_value : '#' delay_value
{ svector<PExpr*>*tmp = new svector<PExpr*>(1); { svector<PExpr*>*tmp = new svector<PExpr*>(1);
(*tmp)[0] = $2; (*tmp)[0] = $2;
$$ = tmp; $$ = tmp;
} }
| '#' '(' delay_value_list ')' ;
{ $$ = $3;
delay3
: '#' delay_value
{ svector<PExpr*>*tmp = new svector<PExpr*>(1);
(*tmp)[0] = $2;
$$ = tmp;
}
| '#' '(' delay_value ')'
{ svector<PExpr*>*tmp = new svector<PExpr*>(1);
(*tmp)[0] = $3;
$$ = tmp;
}
| '#' '(' delay_value ',' delay_value ')'
{ svector<PExpr*>*tmp = new svector<PExpr*>(2);
(*tmp)[0] = $3;
(*tmp)[1] = $5;
$$ = tmp;
}
| '#' '(' delay_value ',' delay_value ',' delay_value ')'
{ svector<PExpr*>*tmp = new svector<PExpr*>(3);
(*tmp)[0] = $3;
(*tmp)[1] = $5;
(*tmp)[1] = $7;
$$ = tmp;
} }
; ;
delay_opt delay3_opt
: delay { $$ = $1; } : delay3 { $$ = $1; }
| { $$ = 0; } | { $$ = 0; }
; ;
delay_value delay_value
@ -310,18 +333,11 @@ delay_value
$$ = tmp; $$ = tmp;
delete $1; delete $1;
} }
; | '(' expression ':' expression ':' expression ')'
{ yyerror(@2, "sorry: (min:typ:max) not supported.");
delay_value_list $$ = $4;
: expression delete $2;
{ svector<PExpr*>*tmp = new svector<PExpr*>(1); delete $6;
(*tmp)[0] = $1;
$$ = tmp;
}
| delay_value_list ',' expression
{ svector<PExpr*>*tmp = new svector<PExpr*>(*$1, $3);
delete $1;
$$ = tmp;
} }
; ;
@ -694,12 +710,6 @@ expr_primary
} }
| '(' expression ')' | '(' expression ')'
{ $$ = $2; } { $$ = $2; }
| '(' expression ':' expression ':' expression ')'
{ yyerror(@2, "sorry: (min:typ:max) not supported.");
$$ = $4;
delete $2;
delete $6;
}
| '{' expression_list '}' | '{' expression_list '}'
{ PEConcat*tmp = new PEConcat(*$2); { PEConcat*tmp = new PEConcat(*$2);
tmp->set_file(@2.text); tmp->set_file(@2.text);
@ -1051,7 +1061,7 @@ module_item
} }
delete $3; 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."); { yyerror(@1, "sorry: trireg nets not supported.");
delete $3; delete $3;
} }
@ -1070,14 +1080,14 @@ module_item
delete $2; delete $2;
} }
| K_parameter parameter_assign_list ';' | K_parameter parameter_assign_list ';'
| gatetype delay_opt gate_instance_list ';' | gatetype delay3_opt gate_instance_list ';'
{ pform_makegates($1, $2, $3); { pform_makegates($1, $2, $3);
} }
| IDENTIFIER delay_opt gate_instance_list ';' | IDENTIFIER delay3_opt gate_instance_list ';'
{ pform_make_modgates($1, $2, $3); { pform_make_modgates($1, $2, $3);
delete $1; 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); } { pform_make_pgassign_list($4, $3, @1.text, @1.first_line); }
| K_assign error '=' expression ';' | K_assign error '=' expression ';'
| K_always statement | K_always statement
@ -1141,7 +1151,7 @@ net_decl_assign
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
$$ = $1; $$ = $1;
} }
| delay IDENTIFIER '=' expression | delay1 IDENTIFIER '=' expression
{ PEIdent*id = new PEIdent($2); { PEIdent*id = new PEIdent($2);
PGAssign*tmp = pform_make_pgassign(id, $4, $1); PGAssign*tmp = pform_make_pgassign(id, $4, $1);
tmp->set_file(@2.text); tmp->set_file(@2.text);
@ -1504,6 +1514,10 @@ statement
{ yyerror(@1, "sorry: procedural force assign not supported."); { yyerror(@1, "sorry: procedural force assign not supported.");
$$ = 0; $$ = 0;
} }
| K_TRIGGER IDENTIFIER ';'
{ yyerror(@1, "sorry: event trigger not supported.");
$$ = 0;
}
| K_forever statement | K_forever statement
{ PForever*tmp = new PForever($2); { PForever*tmp = new PForever($2);
tmp->set_file(@1.text); tmp->set_file(@1.text);
@ -1624,10 +1638,9 @@ statement
{ $$ = 0; { $$ = 0;
yyerror(@3, "error: Error in while loop condition."); yyerror(@3, "error: Error in while loop condition.");
} }
| delay statement_opt | delay1 statement_opt
{ PExpr*del = (*$1)[0]; { PExpr*del = (*$1)[0];
if ($1->count() != 1) assert($1->count() == 1);
yyerror(@1, "sorry: delay lists not supported here.");
PDelayStatement*tmp = new PDelayStatement(del, $2); PDelayStatement*tmp = new PDelayStatement(del, $2);
tmp->set_file(@1.text); tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
@ -1655,19 +1668,17 @@ statement
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
$$ = tmp; $$ = tmp;
} }
| lpvalue '=' delay expression ';' | lpvalue '=' delay1 expression ';'
{ PExpr*del = (*$3)[0]; { assert($3->count() == 1);
if ($3->count() != 1) PExpr*del = (*$3)[0];
yyerror(@1, "sorry: Delay lists not supported here.");
PAssign*tmp = new PAssign($1,del,$4); PAssign*tmp = new PAssign($1,del,$4);
tmp->set_file(@1.text); tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
$$ = tmp; $$ = tmp;
} }
| lpvalue K_LE delay expression ';' | lpvalue K_LE delay1 expression ';'
{ PExpr*del = (*$3)[0]; { assert($3->count() == 1);
if ($3->count() != 1) PExpr*del = (*$3)[0];
yyerror(@1, "sorry: Delay lists not supported here.");
PAssignNB*tmp = new PAssignNB($1,del,$4); PAssignNB*tmp = new PAssignNB($1,del,$4);
tmp->set_file(@1.text); tmp->set_file(@1.text);
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
@ -1679,6 +1690,14 @@ statement
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
$$ = tmp; $$ = 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 ';' | lpvalue K_LE event_control expression ';'
{ yyerror(@1, "sorry: Event controls not supported here."); { yyerror(@1, "sorry: Event controls not supported here.");
PAssignNB*tmp = new PAssignNB($1,$4); PAssignNB*tmp = new PAssignNB($1,$4);
@ -1686,6 +1705,14 @@ statement
tmp->set_lineno(@1.first_line); tmp->set_lineno(@1.first_line);
$$ = tmp; $$ = 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 | K_wait '(' expression ')' statement_opt
{ PEventStatement*tmp; { PEventStatement*tmp;
PEEvent*etmp = new PEEvent(NetNEvent::POSITIVE, $3); PEEvent*etmp = new PEEvent(NetNEvent::POSITIVE, $3);