diff --git a/parse.y b/parse.y index b280df164..79202efdf 100644 --- a/parse.y +++ b/parse.y @@ -164,16 +164,6 @@ static std::list* list_from_identifier(list*tmp, char* return tmp; } -list* copy_range(list* orig) -{ - std::list*copy = 0; - - if (orig) - copy = new std::list (*orig); - - return copy; -} - template void append(vector&out, const std::vector&in) { for (size_t idx = 0 ; idx < in.size() ; idx += 1) diff --git a/pform.cc b/pform.cc index 02497c167..bd3a1258d 100644 --- a/pform.cc +++ b/pform.cc @@ -2786,17 +2786,20 @@ void pform_makewire(const struct vlltype&li, * constraints as those of tasks, so this works fine. Functions have * no output or inout ports. */ -static vector*pform_make_task_ports(const struct vlltype&loc, - NetNet::PortType pt, - ivl_variable_type_t vtype, - bool signed_flag, - list*range, - list*ports) +static vector*pform_make_task_ports_vec(const struct vlltype&loc, + NetNet::PortType pt, + vector_type_t *vec_type, + list*ports, + bool allow_implicit) { assert(pt != NetNet::PIMPLICIT && pt != NetNet::NOT_A_PORT); assert(ports); vector*res = new vector(0); - PWSRType rt = vtype != IVL_VT_NO_TYPE ? SR_BOTH : SR_PORT; + + PWSRType rt = SR_BOTH; + + if (allow_implicit && vec_type->implicit_flag) + rt = SR_PORT; for (list::iterator cur = ports->begin() ; cur != ports->end() ; ++ cur ) { @@ -2805,12 +2808,8 @@ static vector*pform_make_task_ports(const struct vlltype&loc, /* Look for a preexisting wire. If it exists, set the port direction. If not, create it. */ PWire*curw = pform_get_or_make_wire(loc, name, NetNet::IMPLICIT_REG, - pt, vtype, rt); - curw->set_signed(signed_flag); - - /* If there is a range involved, it needs to be set. */ - if (range) - curw->set_range(*range, rt); + pt, vec_type->base_type, rt); + pform_set_net_range(curw, vec_type, rt); if (cur->udims) { if (pform_requires_sv(loc, "Task/function port with unpacked dimensions")) @@ -2820,7 +2819,6 @@ static vector*pform_make_task_ports(const struct vlltype&loc, res->push_back(pform_tf_port_t(curw)); } - delete range; return res; } @@ -2874,14 +2872,8 @@ vector*pform_make_task_ports(const struct vlltype&loc, } if (vector_type_t*vec_type = dynamic_cast (vtype)) { - ivl_variable_type_t base_type = vec_type->base_type; - if (allow_implicit && vec_type->implicit_flag) - base_type = IVL_VT_NO_TYPE; - - ret = pform_make_task_ports(loc, pt, base_type, - vec_type->signed_flag, - copy_range(vec_type->pdims.get()), - ports); + ret = pform_make_task_ports_vec(loc, pt, vec_type, ports, + allow_implicit); } if (/*real_type_t*real_type = */ dynamic_cast (vtype)) { diff --git a/pform.h b/pform.h index 509e160ed..2f8ef61f9 100644 --- a/pform.h +++ b/pform.h @@ -96,9 +96,6 @@ struct parmvalue_t { struct str_pair_t { ivl_drive_t str0, str1; }; - -extern std::list* copy_range(std::list* orig); - /* Use this function to transform the parted form of the attribute list to the attribute map that is used later. */ extern void pform_bind_attributes(std::map&attributes,