@@ -371,25 +371,27 @@ static ivl_type_t draw_lval_expr(ivl_lval_t lval)
371
371
{
372
372
ivl_lval_t lval_nest = ivl_lval_nest (lval );
373
373
ivl_signal_t lval_sig = ivl_lval_sig (lval );
374
- ivl_type_t sub_type ;
375
374
376
- if (lval_nest ) {
377
- sub_type = draw_lval_expr (lval_nest );
378
- } else {
379
- assert (lval_sig );
380
- sub_type = ivl_signal_net_type (lval_sig );
381
- assert (ivl_type_base (sub_type ) == IVL_VT_CLASS );
375
+ if (lval_sig ) {
382
376
fprintf (vvp_out , " %%load/obj v%p_0;\n" , lval_sig );
377
+ return ivl_signal_net_type (lval_sig );
383
378
}
384
379
380
+ assert (lval_nest );
381
+ ivl_type_t sub_type = draw_lval_expr (lval_nest );
385
382
assert (ivl_type_base (sub_type ) == IVL_VT_CLASS );
386
- if (ivl_lval_idx (lval )) {
383
+
384
+ if (ivl_lval_idx (lval_nest )) {
387
385
fprintf (vvp_out , " ; XXXX Don't know how to handle ivl_lval_idx values here.\n" );
388
386
}
389
387
390
- fprintf (vvp_out , " %%prop/obj %d, 0; draw_lval_expr\n" , ivl_lval_property_idx (lval ));
388
+ int prop_idx = ivl_lval_property_idx (lval_nest );
389
+
390
+ fprintf (vvp_out , " %%prop/obj %d, 0; Load property %s\n" , prop_idx ,
391
+ ivl_type_prop_name (sub_type , prop_idx ));
391
392
fprintf (vvp_out , " %%pop/obj 1, 1;\n" );
392
- return ivl_type_prop_type (sub_type , ivl_lval_property_idx (lval ));
393
+
394
+ return ivl_type_prop_type (sub_type , prop_idx );
393
395
}
394
396
395
397
/*
@@ -407,7 +409,6 @@ static void store_vec4_to_lval(ivl_statement_t net)
407
409
for (unsigned lidx = 0 ; lidx < ivl_stmt_lvals (net ) ; lidx += 1 ) {
408
410
ivl_lval_t lval = ivl_stmt_lval (net ,lidx );
409
411
ivl_signal_t lsig = ivl_lval_sig (lval );
410
- ivl_lval_t nest = ivl_lval_nest (lval );
411
412
unsigned lwid = ivl_lval_width (lval );
412
413
413
414
@@ -461,19 +462,6 @@ static void store_vec4_to_lval(ivl_statement_t net)
461
462
}
462
463
clr_word (offset_index );
463
464
464
- } else if (nest ) {
465
- /* No offset expression, but the l-value is
466
- nested, which probably means that it is a class
467
- member. We will use a property assign
468
- function. */
469
- assert (!lsig );
470
-
471
- ivl_type_t sub_type = draw_lval_expr (nest );
472
- assert (ivl_type_base (sub_type ) == IVL_VT_CLASS );
473
- fprintf (vvp_out , " %%store/prop/v %d, %u;\n" ,
474
- ivl_lval_property_idx (lval ), lwid );
475
- fprintf (vvp_out , " %%pop/obj 1, 0;\n" );
476
-
477
465
} else {
478
466
/* No offset expression, so use simpler store function. */
479
467
assert (lsig );
@@ -1321,17 +1309,14 @@ static int show_stmt_assign_sig_cobject(ivl_statement_t net)
1321
1309
int errors = 0 ;
1322
1310
ivl_lval_t lval = ivl_stmt_lval (net , 0 );
1323
1311
ivl_expr_t rval = ivl_stmt_rval (net );
1324
- ivl_signal_t sig = ivl_lval_sig (lval );
1325
1312
unsigned lwid = ivl_lval_width (lval );
1326
-
1327
1313
int prop_idx = ivl_lval_property_idx (lval );
1328
1314
1315
+
1329
1316
if (prop_idx >= 0 ) {
1330
- ivl_type_t sig_type = ivl_signal_net_type ( sig );
1317
+ ivl_type_t sig_type = draw_lval_expr ( lval );
1331
1318
ivl_type_t prop_type = ivl_type_prop_type (sig_type , prop_idx );
1332
1319
1333
- fprintf (vvp_out , " %%load/obj v%p_0;\n" , sig );
1334
-
1335
1320
if (ivl_type_base (prop_type ) == IVL_VT_BOOL ||
1336
1321
ivl_type_base (prop_type ) == IVL_VT_LOGIC ) {
1337
1322
assert (ivl_type_packed_dimensions (prop_type ) == 0 ||
@@ -1413,6 +1398,9 @@ static int show_stmt_assign_sig_cobject(ivl_statement_t net)
1413
1398
}
1414
1399
1415
1400
} else {
1401
+ ivl_signal_t sig = ivl_lval_sig (lval );
1402
+ assert (!ivl_lval_nest (lval ));
1403
+
1416
1404
if (ivl_expr_type (rval ) == IVL_EX_ARRAY_PATTERN ) {
1417
1405
draw_array_pattern (sig , rval , 0 );
1418
1406
return 0 ;
@@ -1466,7 +1454,8 @@ int show_stmt_assign(ivl_statement_t net)
1466
1454
return show_stmt_assign_sig_queue (net );
1467
1455
}
1468
1456
1469
- if (sig && (ivl_signal_data_type (sig ) == IVL_VT_CLASS )) {
1457
+ if ((sig && (ivl_signal_data_type (sig ) == IVL_VT_CLASS )) ||
1458
+ ivl_lval_nest (lval )) {
1470
1459
return show_stmt_assign_sig_cobject (net );
1471
1460
}
1472
1461
0 commit comments