Parse a lot more specify syntax.

This commit is contained in:
steve 2001-07-01 23:44:43 +00:00
parent ef9c7c4a30
commit 7eab75ded1
2 changed files with 130 additions and 6 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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: lexor.lex,v 1.58 2001/06/18 00:51:23 steve Exp $" #ident "$Id: lexor.lex,v 1.59 2001/07/01 23:44:43 steve Exp $"
#endif #endif
//# define YYSTYPE lexval //# define YYSTYPE lexval
@ -130,11 +130,14 @@ W [ \t\b\f\r]+
"!==" { return K_CNE; } "!==" { return K_CNE; }
"||" { return K_LOR; } "||" { return K_LOR; }
"&&" { return K_LAND; } "&&" { return K_LAND; }
"&&&" { return K_TAND; }
"~|" { return K_NOR; } "~|" { return K_NOR; }
"~^" { return K_NXOR; } "~^" { return K_NXOR; }
"^~" { return K_NXOR; } "^~" { return K_NXOR; }
"~&" { return K_NAND; } "~&" { return K_NAND; }
"->" { return K_TRIGGER; } "->" { return K_TRIGGER; }
"+:" { return K_PO_POS; }
"-:" { return K_PO_NEG; }
[}{;:\[\],()#=.@&!?<>%|^~+*/-] { return yytext[0]; } [}{;:\[\],()#=.@&!?<>%|^~+*/-] { return yytext[0]; }
@ -197,6 +200,16 @@ W [ \t\b\f\r]+
\$([a-zA-Z0-9$_]+) { \$([a-zA-Z0-9$_]+) {
if (strcmp(yytext,"$attribute") == 0) if (strcmp(yytext,"$attribute") == 0)
return KK_attribute; return KK_attribute;
if (strcmp(yytext,"$hold") == 0)
return K_Shold;
if (strcmp(yytext,"$period") == 0)
return K_Speriod;
if (strcmp(yytext,"$recovery") == 0)
return K_Srecovery;
if (strcmp(yytext,"$setup") == 0)
return K_Ssetup;
if (strcmp(yytext,"$width") == 0)
return K_Swidth;
yylval.text = strdup(yytext); yylval.text = strdup(yytext);
return SYSTEM_IDENTIFIER; } return SYSTEM_IDENTIFIER; }

121
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) && !defined(macintosh) #if !defined(WINNT) && !defined(macintosh)
#ident "$Id: parse.y,v 1.123 2001/06/23 00:31:06 steve Exp $" #ident "$Id: parse.y,v 1.124 2001/07/01 23:44:43 steve Exp $"
#endif #endif
# include "parse_misc.h" # include "parse_misc.h"
@ -85,6 +85,7 @@ static struct str_pair_t decl_strength = { PGate::STRONG, PGate::STRONG };
%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_PO_POS K_PO_NEG
%token K_LOR K_LAND K_NAND K_NOR K_NXOR K_TRIGGER %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
@ -104,6 +105,7 @@ static struct str_pair_t decl_strength = { PGate::STRONG, PGate::STRONG };
%token K_trior K_trireg K_vectored K_wait K_wand K_weak0 K_weak1 %token K_trior K_trireg K_vectored K_wait K_wand K_weak0 K_weak1
%token K_while K_wire %token K_while K_wire
%token K_wor K_xnor K_xor %token K_wor K_xnor K_xor
%token K_Shold K_Speriod K_Srecovery K_Ssetup K_Swidth
%token KK_attribute %token KK_attribute
@ -156,6 +158,7 @@ static struct str_pair_t decl_strength = { PGate::STRONG, PGate::STRONG };
%type <statement> statement statement_opt %type <statement> statement statement_opt
%type <statement_list> statement_list %type <statement_list> statement_list
%token K_TAND
%right '?' ':' %right '?' ':'
%left K_LOR %left K_LOR
%left K_LAND %left K_LAND
@ -1305,10 +1308,18 @@ module_item
/* specify blocks are parsed but ignored. */ /* specify blocks are parsed but ignored. */
| K_specify K_endspecify
{ /* empty lists are legal syntax. */ }
| K_specify specify_item_list K_endspecify | K_specify specify_item_list K_endspecify
{ {
} }
| K_specify error K_endspecify
{ yyerror(@1, "error: syntax error in specify block");
yyerrok;
}
/* These rules match various errors that the user can type into /* These rules match various errors that the user can type into
module items. These rules try to catch them at a point where a module items. These rules try to catch them at a point where a
reasonable error message can be produced. */ reasonable error message can be produced. */
@ -1813,12 +1824,64 @@ register_variable_list
specify_item specify_item
: K_specparam specparam_list ';' : K_specparam specparam_list ';'
| specify_simple_path '=' '(' specify_delay_value_list ')' ';' | specify_simple_path_decl ';'
{ {
} }
| specify_simple_path '=' delay_value_simple ';' | specify_edge_path_decl ';'
{ {
} }
| K_if '(' expression ')' specify_simple_path_decl ';'
{
}
| K_if '(' expression ')' specify_edge_path_decl ';'
{
}
| K_Shold '(' spec_reference_event ',' spec_reference_event
',' expression ')' ';'
{ delete $7;
}
| K_Shold '(' spec_reference_event ',' spec_reference_event
',' expression ',' identifier ')' ';'
{ delete $7;
delete $9;
}
| K_Speriod '(' spec_reference_event ',' expression ')' ';'
{ delete $5;
}
| K_Speriod '(' spec_reference_event ',' expression ','
identifier ')' ';'
{ delete $5;
delete $7;
}
| K_Srecovery '(' spec_reference_event ',' spec_reference_event
',' expression ')' ';'
{ delete $7;
}
| K_Srecovery '(' spec_reference_event ',' spec_reference_event
',' expression ',' identifier ')' ';'
{ delete $7;
delete $9;
}
| K_Ssetup '(' spec_reference_event ',' spec_reference_event
',' expression ')' ';'
{ delete $7;
}
| K_Ssetup '(' spec_reference_event ',' spec_reference_event
',' expression ',' identifier ')' ';'
{ delete $7;
delete $9;
}
| K_Swidth '(' spec_reference_event ',' expression ',' expression
',' identifier ')' ';'
{ delete $5;
delete $7;
delete $9;
}
| K_Swidth '(' spec_reference_event ',' expression
',' expression ')' ';'
{ delete $5;
delete $7;
}
; ;
specify_delay_value_list specify_delay_value_list
@ -1831,9 +1894,37 @@ specify_item_list
| specify_item_list specify_item | specify_item_list specify_item
; ;
specify_edge_path_decl
: specify_edge_path '=' '(' specify_delay_value_list ')'
;
specify_edge_path
: '(' K_posedge specify_path_identifiers spec_polarity
K_EG IDENTIFIER ')'
| '(' K_posedge specify_path_identifiers spec_polarity
K_EG '(' IDENTIFIER K_PO_POS expression ')' ')'
| '(' K_posedge specify_path_identifiers spec_polarity
K_SG IDENTIFIER ')'
| '(' K_posedge specify_path_identifiers spec_polarity
K_SG '(' IDENTIFIER K_PO_POS expression ')' ')'
| '(' K_negedge specify_path_identifiers spec_polarity
K_EG IDENTIFIER ')'
| '(' K_negedge specify_path_identifiers spec_polarity
K_EG '(' IDENTIFIER K_PO_POS expression ')' ')'
| '(' K_negedge specify_path_identifiers spec_polarity
K_SG IDENTIFIER ')'
| '(' K_negedge specify_path_identifiers spec_polarity
K_SG '(' IDENTIFIER K_PO_POS expression ')' ')'
;
specify_simple_path_decl
: specify_simple_path '=' '(' specify_delay_value_list ')'
| specify_simple_path '=' delay_value_simple
;
specify_simple_path specify_simple_path
: '(' specify_path_identifiers spec_polarity K_EG IDENTIFIER ')' : '(' specify_path_identifiers spec_polarity K_EG expression ')'
| '(' specify_path_identifiers spec_polarity K_SG IDENTIFIER ')' | '(' specify_path_identifiers spec_polarity K_SG expression ')'
; ;
specify_path_identifiers specify_path_identifiers
@ -1846,6 +1937,12 @@ specparam
{ delete $1; { delete $1;
delete $3; delete $3;
} }
| IDENTIFIER '=' expression ':' expression ':' expression
{ delete $1;
delete $3;
delete $5;
delete $7;
}
; ;
specparam_list specparam_list
@ -1855,6 +1952,20 @@ specparam_list
spec_polarity: '+' | '-' | ; spec_polarity: '+' | '-' | ;
spec_reference_event
: K_posedge IDENTIFIER
{ delete $2; }
| K_negedge IDENTIFIER
{ delete $2; }
| K_posedge IDENTIFIER K_TAND expression
{ delete $2;
delete $4;
}
| K_negedge IDENTIFIER K_TAND expression
{ delete $2;
delete $4;
}
;
statement statement