diff --git a/parse.y b/parse.y index eef078c8f..dad645bef 100644 --- a/parse.y +++ b/parse.y @@ -2346,7 +2346,7 @@ task_declaration /* IEEE1800-2005: A.2.7 */ tf_port_declaration /* IEEE1800-2005: A.2.7 */ - : port_direction data_type_or_implicit list_of_identifiers ';' + : port_direction data_type_or_implicit list_of_port_identifiers ';' { $$ = pform_make_task_ports(@1, $1, $2, $3, true); } ; @@ -2367,8 +2367,7 @@ tf_port_item /* IEEE1800-2005: A.2.7 */ NetNet::PortType use_port_type = $1; if ((use_port_type == NetNet::PIMPLICIT) && (gn_system_verilog() || ($2 == 0))) use_port_type = port_declaration_context.port_type; - perm_string name = lex_strings.make($3); - list* ilist = list_from_identifier($3); + list* port_list = make_port_list($3, $4, 0); if (use_port_type == NetNet::PIMPLICIT) { yyerror(@1, "error: missing task/function port direction."); @@ -2383,7 +2382,7 @@ tf_port_item /* IEEE1800-2005: A.2.7 */ } tmp = pform_make_task_ports(@3, use_port_type, port_declaration_context.data_type, - ilist); + port_list); } else { // Otherwise, the decorations for this identifier @@ -2395,12 +2394,7 @@ tf_port_item /* IEEE1800-2005: A.2.7 */ FILE_NAME($2, @3); } port_declaration_context.data_type = $2; - tmp = pform_make_task_ports(@3, use_port_type, $2, ilist); - } - if ($4 != 0) { - if (pform_requires_sv(@4, "Task/function port with unpacked dimensions")) { - pform_set_reg_idx(name, $4); - } + tmp = pform_make_task_ports(@3, use_port_type, $2, port_list); } $$ = tmp; diff --git a/pform.cc b/pform.cc index 8184c7802..e81efd3ca 100644 --- a/pform.cc +++ b/pform.cc @@ -2928,16 +2928,15 @@ static vector*pform_make_task_ports(const struct vlltype&loc, ivl_variable_type_t vtype, bool signed_flag, list*range, - list*names, + list*ports, bool isint = false) { assert(pt != NetNet::PIMPLICIT && pt != NetNet::NOT_A_PORT); - assert(names); + assert(ports); vector*res = new vector(0); - for (list::iterator cur = names->begin() - ; cur != names->end() ; ++ cur ) { - - perm_string name = *cur; + for (list::iterator cur = ports->begin() + ; cur != ports->end() ; ++ cur ) { + perm_string &name = cur->name; /* Look for a preexisting wire. If it exists, set the port direction. If not, create it. */ @@ -2961,6 +2960,11 @@ static vector*pform_make_task_ports(const struct vlltype&loc, curw->set_range(*range, SR_PORT); } + if (cur->udims) { + if (pform_requires_sv(loc, "Task/function port with unpacked dimensions")) + curw->set_unpacked_idx(*cur->udims); + } + res->push_back(pform_tf_port_t(curw)); } @@ -2972,15 +2976,16 @@ static vector*do_make_task_ports(const struct vlltype&loc, NetNet::PortType pt, ivl_variable_type_t var_type, data_type_t*data_type, - list*names) + list*ports) { assert(pt != NetNet::PIMPLICIT && pt != NetNet::NOT_A_PORT); - assert(names); + assert(ports); vector*res = new vector(0); - for (list::iterator cur = names->begin() - ; cur != names->end() ; ++cur) { - perm_string name = *cur; + for (list::iterator cur = ports->begin() + ; cur != ports->end() ; ++cur) { + perm_string &name = cur->name; + PWire*curw = pform_get_wire_in_scope(name); if (curw) { curw->set_port_type(pt); @@ -2991,6 +2996,11 @@ static vector*do_make_task_ports(const struct vlltype&loc, pform_put_wire_in_scope(name, curw); } + if (cur->udims) { + if (pform_requires_sv(loc, "Task/function port with unpacked dimensions")) + curw->set_unpacked_idx(*cur->udims); + } + res->push_back(pform_tf_port_t(curw)); } return res; @@ -2999,7 +3009,7 @@ static vector*do_make_task_ports(const struct vlltype&loc, vector*pform_make_task_ports(const struct vlltype&loc, NetNet::PortType pt, data_type_t*vtype, - list*names, + list*ports, bool allow_implicit) { vector*ret = NULL; @@ -3014,7 +3024,7 @@ vector*pform_make_task_ports(const struct vlltype&loc, list*range_tmp = make_range_from_width(atype->type_code); ret = pform_make_task_ports(loc, pt, IVL_VT_BOOL, atype->signed_flag, - range_tmp, names); + range_tmp, ports); } if (vector_type_t*vec_type = dynamic_cast (vtype)) { @@ -3025,36 +3035,36 @@ vector*pform_make_task_ports(const struct vlltype&loc, ret = pform_make_task_ports(loc, pt, base_type, vec_type->signed_flag, copy_range(vec_type->pdims.get()), - names, vec_type->integer_flag); + ports, vec_type->integer_flag); } if (/*real_type_t*real_type = */ dynamic_cast (vtype)) { ret = pform_make_task_ports(loc, pt, IVL_VT_REAL, - true, 0, names); + true, 0, ports); } if (dynamic_cast (vtype)) { ret = pform_make_task_ports(loc, pt, IVL_VT_STRING, - false, 0, names); + false, 0, ports); } if (class_type_t*class_type = dynamic_cast (vtype)) { - ret = do_make_task_ports(loc, pt, IVL_VT_CLASS, class_type, names); + ret = do_make_task_ports(loc, pt, IVL_VT_CLASS, class_type, ports); } if (! ret) { - ret = do_make_task_ports(loc, pt, IVL_VT_NO_TYPE, vtype, names); + ret = do_make_task_ports(loc, pt, IVL_VT_NO_TYPE, vtype, ports); } if (unpacked_dims) { - for (list::iterator cur = names->begin() - ; cur != names->end() ; ++ cur ) { - PWire*wire = pform_get_wire_in_scope(*cur); + for (list::iterator cur = ports->begin() + ; cur != ports->end() ; ++ cur ) { + PWire*wire = pform_get_wire_in_scope(cur->name); wire->set_unpacked_idx(*unpacked_dims); } } - delete names; + delete ports; return ret; } diff --git a/pform.h b/pform.h index 02c22f32f..b942c7e26 100644 --- a/pform.h +++ b/pform.h @@ -495,7 +495,7 @@ extern void pform_make_pgassign_list(std::list*alist, extern std::vector*pform_make_task_ports(const struct vlltype&loc, NetNet::PortType pt, data_type_t*vtype, - std::list*names, + std::list*ports, bool allow_implicit = false); /* diff --git a/pform_pclass.cc b/pform_pclass.cc index e9facc013..c077521a8 100644 --- a/pform_pclass.cc +++ b/pform_pclass.cc @@ -106,8 +106,8 @@ void pform_set_this_class(const struct vlltype&loc, PTaskFunc*net) if (pform_cur_class == 0) return; - list*this_name = new list; - this_name->push_back(perm_string::literal(THIS_TOKEN)); + list*this_name = new list; + this_name->push_back(pform_port_t(perm_string::literal(THIS_TOKEN), 0, 0)); vector*this_port = pform_make_task_ports(loc, NetNet::PINPUT, pform_cur_class->type,