From 45fbf558065c0fdac9aa088ecd34e9bf49e81305 Mon Sep 17 00:00:00 2001 From: Cary R Date: Sat, 14 May 2016 10:33:37 -0700 Subject: [PATCH] Add basic support for parameters using typedefs --- parse.y | 5 +++++ pform.cc | 22 ++++++++++++++++++++++ pform.h | 7 +++++++ 3 files changed, 34 insertions(+) diff --git a/parse.y b/parse.y index e3a592fa6..b7a523963 100644 --- a/parse.y +++ b/parse.y @@ -5183,6 +5183,11 @@ param_type param_active_signed = true; param_active_type = IVL_VT_BOOL; } + | TYPE_IDENTIFIER + { pform_set_param_from_type(@1, $1.type, $1.text, param_active_range, + param_active_signed, param_active_type); + delete[]$1.text; + } ; /* parameter and localparam assignment lists are broken into diff --git a/pform.cc b/pform.cc index 8ed8c8dae..a09925761 100644 --- a/pform.cc +++ b/pform.cc @@ -3173,6 +3173,28 @@ void pform_set_defparam(const pform_name_t&name, PExpr*expr) pform_cur_module.front()->defparms.push_back(make_pair(name,expr)); } +void pform_set_param_from_type(const struct vlltype&loc, + const data_type_t *data_type, + const char *name, + list *¶m_range, + bool ¶m_signed, + ivl_variable_type_t ¶m_type) +{ + if (const vector_type_t *vec = dynamic_cast (data_type)) { + param_range = vec->pdims.get(); + param_signed = vec->signed_flag; + param_type = vec->base_type; + return; + } + + param_range = 0; + param_signed = false; + param_type = IVL_VT_NO_TYPE; + cerr << loc.get_fileline() << ": sorry: cannot currently create a " + "parameter of type '" << name << "' which was defined at: " + << data_type->get_fileline() << "." << endl; + error_count += 1; +} /* * Specify paths. */ diff --git a/pform.h b/pform.h index e6e2db539..e9d553127 100644 --- a/pform.h +++ b/pform.h @@ -424,6 +424,13 @@ extern void pform_set_specparam(const struct vlltype&loc, PExpr*expr); extern void pform_set_defparam(const pform_name_t&name, PExpr*expr); +extern void pform_set_param_from_type(const struct vlltype&loc, + const data_type_t *data_type, + const char *name, + list *¶m_range, + bool ¶m_signed, + ivl_variable_type_t ¶m_type); + /* * Functions related to specify blocks. */