diff --git a/parse.y b/parse.y index 606dc2deb..773752440 100644 --- a/parse.y +++ b/parse.y @@ -677,7 +677,7 @@ assignment_pattern /* IEEE1800-2005: A.6.7.1 */ | K_LP '}' { PEVoid*tmp = new PEVoid; FILE_NAME(tmp, @1); - yyerror(@1, "sorry: Assignment patterns (array literals) not supported."); + yyerror(@1, "sorry: Assignment patterns (empty array literals) not supported."); $$ = tmp; } ; @@ -1795,12 +1795,16 @@ tf_port_item /* IEEE1800-2005: A.2.7 */ : port_direction_opt data_type_or_implicit IDENTIFIER range_opt tf_port_item_expr_opt { vector*tmp; NetNet::PortType use_port_type = $1==NetNet::PIMPLICIT? NetNet::PINPUT : $1; + perm_string name = lex_strings.make($3); list* ilist = list_from_identifier($3); if (($2 == 0) && ($1==NetNet::PIMPLICIT)) { // Detect special case this is an undecorated // identifier and we need to get the declaration from // left context. + if ($4 != 0) { + yyerror(@4, "internal error: How can there be an unpacked range here?\n"); + } if (port_declaration_context.var_type == IVL_VT_NO_TYPE) { tmp = pform_make_task_ports(@3, use_port_type, port_declaration_context.data_type, @@ -1829,11 +1833,11 @@ tf_port_item /* IEEE1800-2005: A.2.7 */ port_declaration_context.data_type = $2; tmp = pform_make_task_ports(@3, use_port_type, $2, ilist); } - $$ = tmp; - if ($4) { - yyerror(@4, "sorry: Port variable dimensions not supported yet."); - delete $4; + if ($4 != 0) { + pform_set_reg_idx(name, $4); } + + $$ = tmp; if ($5) { assert(tmp->size()==1); tmp->front().defe = $5; diff --git a/tgt-vvp/draw_ufunc.c b/tgt-vvp/draw_ufunc.c index 88fc519a5..3d1d6f519 100644 --- a/tgt-vvp/draw_ufunc.c +++ b/tgt-vvp/draw_ufunc.c @@ -65,6 +65,12 @@ static void function_argument_class(ivl_signal_t port, ivl_expr_t expr) fprintf(vvp_out, " %%store/obj v%p_0;\n", port); } +static void function_argument_darray(ivl_signal_t port, ivl_expr_t expr) +{ + draw_eval_object(expr); + fprintf(vvp_out, " %%store/obj v%p_0;\n", port); +} + static void function_argument_string(ivl_signal_t port, ivl_expr_t expr) { draw_eval_string(expr); @@ -90,6 +96,9 @@ static void draw_function_argument(ivl_signal_t port, ivl_expr_t expr) case IVL_VT_STRING: function_argument_string(port, expr); break; + case IVL_VT_DARRAY: + function_argument_darray(port, expr); + break; default: fprintf(stderr, "XXXX function argument %s type=%d?!\n", ivl_signal_basename(port), dtype);