diff options
Diffstat (limited to 'frontends/verilog')
-rw-r--r-- | frontends/verilog/lexer.l | 3 | ||||
-rw-r--r-- | frontends/verilog/parser.y | 48 |
2 files changed, 41 insertions, 10 deletions
diff --git a/frontends/verilog/lexer.l b/frontends/verilog/lexer.l index 78f1d3674..cc7590ca5 100644 --- a/frontends/verilog/lexer.l +++ b/frontends/verilog/lexer.l @@ -95,6 +95,7 @@ namespace VERILOG_FRONTEND { "endtask" { return TOK_ENDTASK; } "parameter" { return TOK_PARAMETER; } "localparam" { return TOK_LOCALPARAM; } +"defparam" { return TOK_DEFPARAM; } "assign" { return TOK_ASSIGN; } "always" { return TOK_ALWAYS; } "initial" { return TOK_INITIAL; } @@ -184,7 +185,7 @@ supply1 { return TOK_SUPPLY1; } "$signed" { return TOK_TO_SIGNED; } "$unsigned" { return TOK_TO_UNSIGNED; } -[a-zA-Z_$][a-zA-Z0-9_\.$]* { +[a-zA-Z_$][a-zA-Z0-9_$]* { frontend_verilog_yylval.string = new std::string(std::string("\\") + yytext); return TOK_ID; } diff --git a/frontends/verilog/parser.y b/frontends/verilog/parser.y index 68ac26bf9..ba0efcf51 100644 --- a/frontends/verilog/parser.y +++ b/frontends/verilog/parser.y @@ -94,7 +94,7 @@ static void free_attr(std::map<std::string, AstNode*> *al) %token <string> TOK_STRING TOK_ID TOK_CONST TOK_PRIMITIVE %token ATTR_BEGIN ATTR_END DEFATTR_BEGIN DEFATTR_END -%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM +%token TOK_MODULE TOK_ENDMODULE TOK_PARAMETER TOK_LOCALPARAM TOK_DEFPARAM %token TOK_INPUT TOK_OUTPUT TOK_INOUT TOK_WIRE TOK_REG %token TOK_INTEGER TOK_SIGNED TOK_ASSIGN TOK_ALWAYS TOK_INITIAL %token TOK_BEGIN TOK_END TOK_IF TOK_ELSE TOK_FOR @@ -106,7 +106,7 @@ static void free_attr(std::map<std::string, AstNode*> *al) %token TOK_SUPPLY0 TOK_SUPPLY1 TOK_TO_SIGNED TOK_TO_UNSIGNED %type <ast> wire_type range expr basic_expr concat_list rvalue lvalue lvalue_concat_list -%type <string> opt_label tok_prim_wrapper +%type <string> opt_label tok_prim_wrapper hierarchical_id %type <boolean> opt_signed %type <al> attr @@ -176,19 +176,32 @@ attr_list: attr_list ',' attr_assign; attr_assign: - TOK_ID { + hierarchical_id { if (attr_list.count(*$1) != 0) delete attr_list[*$1]; attr_list[*$1] = AstNode::mkconst_int(0, false, 0); delete $1; } | - TOK_ID '=' expr { + hierarchical_id '=' expr { if (attr_list.count(*$1) != 0) delete attr_list[*$1]; attr_list[*$1] = $3; delete $1; }; +hierarchical_id: + TOK_ID { + $$ = $1; + } | + hierarchical_id '.' TOK_ID { + if ($3->substr(0, 1) == "\\") + *$1 += "." + $3->substr(1); + else + *$1 += "." + *$3; + delete $3; + $$ = $1; + }; + module: attr TOK_MODULE TOK_ID { AstNode *mod = new AstNode(AST_MODULE); @@ -309,7 +322,7 @@ module_body: /* empty */; module_body_stmt: - task_func_decl | param_decl | localparam_decl | wire_decl | assign_stmt | cell_stmt | + task_func_decl | param_decl | localparam_decl | defparam_decl | wire_decl | assign_stmt | cell_stmt | always_stmt | TOK_GENERATE module_gen_body TOK_ENDGENERATE | defattr; task_func_decl: @@ -389,6 +402,23 @@ single_localparam_decl: delete $2; }; +defparam_decl: + TOK_DEFPARAM defparam_decl_list ';'; + +defparam_decl_list: + single_defparam_decl | defparam_decl_list ',' single_defparam_decl; + +single_defparam_decl: + range hierarchical_id '=' expr { + AstNode *node = new AstNode(AST_DEFPARAM); + node->str = *$2; + node->children.push_back($4); + if ($1 != NULL) + node->children.push_back($1); + ast_stack.back()->children.push_back(node); + delete $2; + }; + wire_decl: attr wire_type range { albuf = $1; @@ -671,7 +701,7 @@ simple_behavioral_stmt: behavioral_stmt: defattr | simple_behavioral_stmt ';' | - TOK_ID attr { + hierarchical_id attr { AstNode *node = new AstNode(AST_TCALL); node->str = *$1; delete $1; @@ -808,12 +838,12 @@ case_expr_list: }; rvalue: - TOK_ID '[' expr ']' '.' rvalue { + hierarchical_id '[' expr ']' '.' rvalue { $$ = new AstNode(AST_PREFIX, $3, $6); $$->str = *$1; delete $1; } | - TOK_ID range { + hierarchical_id range { $$ = new AstNode(AST_IDENTIFIER, $2); $$->str = *$1; delete $1; @@ -931,7 +961,7 @@ basic_expr: $$->str = str; delete $1; } | - TOK_ID attr { + hierarchical_id attr { AstNode *node = new AstNode(AST_FCALL); node->str = *$1; delete $1; |