From 0c4c79c4c6f8a433ef4b141b1523bccc261f8231 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Mon, 16 Jun 2014 15:02:40 +0200 Subject: [PATCH] Fixed parsing of TOK_INTEGER (implies TOK_SIGNED) --- frontends/verilog/parser.y | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/frontends/verilog/parser.y b/frontends/verilog/parser.y index 57defd56b..37c3232aa 100644 --- a/frontends/verilog/parser.y +++ b/frontends/verilog/parser.y @@ -108,7 +108,7 @@ static void free_attr(std::map *al) %token TOK_SUPPLY0 TOK_SUPPLY1 TOK_TO_SIGNED TOK_TO_UNSIGNED %token TOK_POS_INDEXED TOK_NEG_INDEXED TOK_ASSERT TOK_PROPERTY -%type wire_type range non_opt_range range_or_integer expr basic_expr concat_list rvalue lvalue lvalue_concat_list +%type wire_type range non_opt_range range_or_signed_int expr basic_expr concat_list rvalue lvalue lvalue_concat_list %type opt_label tok_prim_wrapper hierarchical_id %type opt_signed %type attr @@ -322,6 +322,7 @@ wire_type_token: astbuf3->is_reg = true; astbuf3->range_left = 31; astbuf3->range_right = 0; + astbuf3->is_signed = true; } | TOK_GENVAR { astbuf3->type = AST_GENVAR; @@ -362,7 +363,7 @@ range: $$ = NULL; }; -range_or_integer: +range_or_signed_int: range { $$ = $1; } | @@ -370,6 +371,7 @@ range_or_integer: $$ = new AstNode(AST_RANGE); $$->children.push_back(AstNode::mkconst_int(31, true)); $$->children.push_back(AstNode::mkconst_int(0, true)); + $$->is_signed = true; }; module_body: @@ -394,16 +396,19 @@ task_func_decl: current_function_or_task = NULL; ast_stack.pop_back(); } | - TOK_FUNCTION opt_signed range_or_integer TOK_ID ';' { + TOK_FUNCTION opt_signed range_or_signed_int TOK_ID ';' { current_function_or_task = new AstNode(AST_FUNCTION); current_function_or_task->str = *$4; ast_stack.back()->children.push_back(current_function_or_task); ast_stack.push_back(current_function_or_task); AstNode *outreg = new AstNode(AST_WIRE); - if ($3 != NULL) - outreg->children.push_back($3); outreg->str = *$4; outreg->is_signed = $2; + if ($3 != NULL) { + outreg->children.push_back($3); + outreg->is_signed = $2 || $3->is_signed; + $3->is_signed = false; + } current_function_or_task->children.push_back(outreg); current_function_or_task_port_id = 1; delete $4; @@ -436,6 +441,7 @@ param_integer: astbuf1->children.push_back(new AstNode(AST_RANGE)); astbuf1->children.back()->children.push_back(AstNode::mkconst_int(31, true)); astbuf1->children.back()->children.push_back(AstNode::mkconst_int(0, true)); + astbuf1->is_signed = true; } | /* empty */; param_real: -- 2.30.2