diff --git a/parse.y b/parse.y index 581a87db9..f5bf5a89b 100644 --- a/parse.y +++ b/parse.y @@ -675,7 +675,7 @@ Module::port_t *module_declare_port(const YYLTYPE&loc, char *id, %type tf_port_declaration tf_port_item tf_port_item_list %type tf_port_list tf_port_list_opt tf_port_list_parens_opt -%type modport_simple_port port_name parameter_value_byname +%type named_expression named_expression_opt port_name %type port_name_list parameter_value_byname_list %type port_conn_expression_list_with_nuls @@ -1975,7 +1975,7 @@ modport_item modport_ports_list : modport_ports_declaration | modport_ports_list ',' modport_ports_declaration - | modport_ports_list ',' modport_simple_port + | modport_ports_list ',' named_expression { if (last_modport_port.type == MP_SIMPLE) { pform_add_modport_port(@3, last_modport_port.direction, $3->name, $3->parm); @@ -2009,7 +2009,7 @@ modport_ports_declaration delete[] $3; delete $1; } - | attribute_list_opt port_direction modport_simple_port + | attribute_list_opt port_direction named_expression { last_modport_port.type = MP_SIMPLE; last_modport_port.direction = $2; pform_add_modport_port(@3, $2, $3->name, $3->parm); @@ -2038,16 +2038,6 @@ modport_ports_declaration } ; -modport_simple_port - : '.' IDENTIFIER '(' expression ')' - { named_pexpr_t*tmp = new named_pexpr_t; - tmp->name = lex_strings.make($2); - tmp->parm = $4; - delete[]$2; - $$ = tmp; - } - ; - modport_tf_port : K_task IDENTIFIER tf_port_list_parens_opt | K_function data_type_or_implicit_or_void IDENTIFIER tf_port_list_parens_opt @@ -5550,7 +5540,7 @@ parameter_value_opt { $$ = 0; } ; -parameter_value_byname +named_expression : '.' IDENTIFIER '(' expression ')' { named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($2); @@ -5558,6 +5548,9 @@ parameter_value_byname delete[]$2; $$ = tmp; } + +named_expression_opt + : named_expression | '.' IDENTIFIER '(' ')' { named_pexpr_t*tmp = new named_pexpr_t; tmp->name = lex_strings.make($2); @@ -5568,13 +5561,13 @@ parameter_value_byname ; parameter_value_byname_list - : parameter_value_byname + : named_expression_opt { std::list*tmp = new std::list; tmp->push_back(*$1); delete $1; $$ = tmp; } - | parameter_value_byname_list ',' parameter_value_byname + | parameter_value_byname_list ',' named_expression_opt { std::list*tmp = $1; tmp->push_back(*$3); delete $3; @@ -5643,13 +5636,9 @@ port_opt looking for the ports of a module declaration. */ port_name - : attribute_list_opt '.' IDENTIFIER '(' expression ')' - { named_pexpr_t*tmp = new named_pexpr_t; - tmp->name = lex_strings.make($3); - tmp->parm = $5; - delete[]$3; - delete $1; - $$ = tmp; + : attribute_list_opt named_expression_opt + { delete $1; + $$ = $2; } | attribute_list_opt '.' IDENTIFIER '(' error ')' { yyerror(@3, "error: Invalid port connection expression."); @@ -5660,14 +5649,6 @@ port_name delete $1; $$ = tmp; } - | attribute_list_opt '.' IDENTIFIER '(' ')' - { named_pexpr_t*tmp = new named_pexpr_t; - tmp->name = lex_strings.make($3); - tmp->parm = 0; - delete[]$3; - delete $1; - $$ = tmp; - } | attribute_list_opt '.' IDENTIFIER { pform_requires_sv(@3, "Implicit named port connections"); named_pexpr_t*tmp = new named_pexpr_t;