@@ -2423,62 +2423,63 @@ exprt verilog_typecheck_exprt::convert_trinary_expr(ternary_exprt expr)
2423
2423
expr.id () == ID_verilog_indexed_part_select_plus ||
2424
2424
expr.id () == ID_verilog_indexed_part_select_minus)
2425
2425
{
2426
- exprt &op0 = expr.op0 ();
2427
- convert_expr (op0);
2426
+ auto &part_select = to_verilog_indexed_part_select_plus_or_minus_expr (expr);
2427
+ exprt &src = part_select.src ();
2428
+ convert_expr (src);
2428
2429
2429
- if (op0 .type ().id () == ID_array)
2430
+ if (src .type ().id () == ID_array)
2430
2431
{
2431
- throw errort ().with_location (op0 .source_location ())
2432
+ throw errort ().with_location (src .source_location ())
2432
2433
<< " array type not allowed in part select" ;
2433
2434
}
2434
2435
2435
- if (op0 .type ().id () == ID_verilog_real)
2436
+ if (src .type ().id () == ID_verilog_real)
2436
2437
{
2437
- throw errort ().with_location (op0 .source_location ())
2438
+ throw errort ().with_location (src .source_location ())
2438
2439
<< " real not allowed in part select" ;
2439
2440
}
2440
2441
2441
- mp_integer op0_width = get_width (op0 .type ());
2442
- mp_integer op0_offset = string2integer (op0 .type ().get_string (ID_C_offset));
2442
+ mp_integer src_width = get_width (src .type ());
2443
+ mp_integer src_offset = string2integer (src .type ().get_string (ID_C_offset));
2443
2444
2444
2445
// The index need not be a constant.
2445
- exprt &op1 = expr. op1 ();
2446
- convert_expr (op1 );
2446
+ exprt &index = part_select. index ();
2447
+ convert_expr (index );
2447
2448
2448
2449
// The width of the indexed part select must be an
2449
2450
// elaboration-time constant.
2450
- mp_integer op2 = convert_integer_constant_expression (expr. op2 ());
2451
+ mp_integer width = convert_integer_constant_expression (part_select. width ());
2451
2452
2452
2453
// The width must be positive. 1800-2017 11.5.1
2453
- if (op2 < 0 )
2454
+ if (width < 0 )
2454
2455
{
2455
- throw errort ().with_location (expr. op2 ().source_location ())
2456
+ throw errort ().with_location (part_select. width ().source_location ())
2456
2457
<< " width of indexed part select must be positive" ;
2457
2458
}
2458
2459
2459
2460
// Part-select expressions are unsigned, even if the
2460
2461
// entire expression is selected!
2461
- auto expr_type = unsignedbv_typet{numeric_cast_v<std::size_t >(op2 )};
2462
+ auto expr_type = unsignedbv_typet{numeric_cast_v<std::size_t >(width )};
2462
2463
2463
- mp_integer op1_int ;
2464
- if (is_constant_expression (op1, op1_int ))
2464
+ mp_integer index_int ;
2465
+ if (is_constant_expression (index, index_int ))
2465
2466
{
2466
2467
// Construct the extractbits expression
2467
2468
mp_integer bottom, top;
2468
2469
2469
- if (expr .id () == ID_verilog_indexed_part_select_plus)
2470
+ if (part_select .id () == ID_verilog_indexed_part_select_plus)
2470
2471
{
2471
- bottom = op1_int - op0_offset ;
2472
- top = bottom + op2 ;
2472
+ bottom = index_int - src_offset ;
2473
+ top = bottom + width ;
2473
2474
}
2474
2475
else // ID_verilog_indexed_part_select_minus
2475
2476
{
2476
- top = op1_int - op0_offset ;
2477
- bottom = bottom - op2 ;
2477
+ top = index_int - src_offset ;
2478
+ bottom = bottom - width ;
2478
2479
}
2479
2480
2480
2481
return extractbits_exprt{
2481
- std::move (op0 ),
2482
+ std::move (src ),
2482
2483
from_integer (top, integer_typet{}),
2483
2484
from_integer (bottom, integer_typet{}),
2484
2485
std::move (expr_type)}
@@ -2488,14 +2489,14 @@ exprt verilog_typecheck_exprt::convert_trinary_expr(ternary_exprt expr)
2488
2489
{
2489
2490
// Index not constant.
2490
2491
// Use logical right-shift followed by (constant) extractbits.
2491
- auto op1_adjusted =
2492
- minus_exprt{op1 , from_integer (op0_offset, op1 .type ())};
2492
+ auto index_adjusted =
2493
+ minus_exprt{index , from_integer (src_offset, index .type ())};
2493
2494
2494
- auto op0_shifted = lshr_exprt (op0, op1_adjusted );
2495
+ auto src_shifted = lshr_exprt (src, index_adjusted );
2495
2496
2496
2497
return extractbits_exprt{
2497
- std::move (op0_shifted ),
2498
- from_integer (op2 - 1 , integer_typet{}),
2498
+ std::move (src_shifted ),
2499
+ from_integer (width - 1 , integer_typet{}),
2499
2500
from_integer (0 , integer_typet{}),
2500
2501
std::move (expr_type)}
2501
2502
.with_source_location (expr);
0 commit comments