diff --git a/pform.cc b/pform.cc index d62e35b36..30c2fae81 100644 --- a/pform.cc +++ b/pform.cc @@ -1906,6 +1906,8 @@ void pform_module_define_port(const struct vlltype&li, list*range, list*attr) { + struct_type_t*struct_type = 0; + PWire*cur = pform_get_wire_in_scope(name); if (cur) { ostringstream msg; @@ -1943,6 +1945,11 @@ void pform_module_define_port(const struct vlltype&li, __FILE__, __LINE__); } + } else if (struct_type = dynamic_cast(vtype)) { + data_type = figure_struct_base_type(struct_type); + signed_flag = false; + range = 0; + } else if (vtype) { VLerror(li, "sorry: Given type %s not supported here (%s:%d).", typeid(*vtype).name(), __FILE__, __LINE__); @@ -1958,7 +1965,10 @@ void pform_module_define_port(const struct vlltype&li, cur->set_signed(signed_flag); - if (range == 0) { + if (struct_type) { + cur->set_struct_type(struct_type); + + } else if (range == 0) { cur->set_range_scalar((type == NetNet::IMPLICIT) ? SR_PORT : SR_BOTH); } else { diff --git a/pform_struct_type.cc b/pform_struct_type.cc index 16ef1debd..6a41d5fc5 100644 --- a/pform_struct_type.cc +++ b/pform_struct_type.cc @@ -21,7 +21,7 @@ # include "parse_misc.h" # include "ivl_assert.h" -static ivl_variable_type_t figure_struct_base_type(struct_type_t*struct_type) +ivl_variable_type_t figure_struct_base_type(struct_type_t*struct_type) { ivl_variable_type_t base_type = IVL_VT_BOOL; diff --git a/pform_types.h b/pform_types.h index 08f4fced2..d89631501 100644 --- a/pform_types.h +++ b/pform_types.h @@ -100,6 +100,7 @@ struct struct_type_t : public data_type_t { bool packed_flag; std::auto_ptr< list > members; }; +extern ivl_variable_type_t figure_struct_base_type(struct_type_t*struct_type); struct atom2_type_t : public data_type_t { inline explicit atom2_type_t(int tc, bool flag)