Support DARRAY objects as port arguments.

This commit is contained in:
Stephen Williams 2013-09-22 19:28:39 -07:00
parent 589bb59268
commit 5494c9ae09
2 changed files with 18 additions and 5 deletions

14
parse.y
View File

@ -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<pform_tf_port_t>*tmp;
NetNet::PortType use_port_type = $1==NetNet::PIMPLICIT? NetNet::PINPUT : $1;
perm_string name = lex_strings.make($3);
list<perm_string>* 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;

View File

@ -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);