@@ -2317,70 +2317,71 @@ exprt verilog_typecheck_exprt::convert_trinary_expr(ternary_exprt expr)
2317
2317
{
2318
2318
if (expr.id () == ID_verilog_non_indexed_part_select)
2319
2319
{
2320
- exprt &op0 = expr.op0 ();
2321
- convert_expr (op0);
2320
+ auto &part_select = to_verilog_non_indexed_part_select_expr (expr);
2321
+ exprt &src = part_select.src ();
2322
+ convert_expr (src);
2322
2323
2323
- if (op0 .type ().id ()== ID_array)
2324
+ if (src .type ().id () == ID_array)
2324
2325
{
2325
- throw errort ().with_location (op0 .source_location ())
2326
+ throw errort ().with_location (src .source_location ())
2326
2327
<< " array type not allowed in part select" ;
2327
2328
}
2328
2329
2329
- if (op0 .type ().id () == ID_verilog_real)
2330
+ if (src .type ().id () == ID_verilog_real)
2330
2331
{
2331
- throw errort ().with_location (op0 .source_location ())
2332
+ throw errort ().with_location (src .source_location ())
2332
2333
<< " real not allowed in part select" ;
2333
2334
}
2334
2335
2335
- mp_integer op0_width = get_width (op0 .type ());
2336
- mp_integer op0_offset = string2integer (op0 .type ().get_string (ID_C_offset));
2336
+ mp_integer src_width = get_width (src .type ());
2337
+ mp_integer src_offset = string2integer (src .type ().get_string (ID_C_offset));
2337
2338
2338
2339
// In non-indexed part-select expressions, both
2339
2340
// indices must be constants (1800-2017 11.5.1).
2340
- mp_integer op1 = convert_integer_constant_expression (expr. op1 ());
2341
- mp_integer op2 = convert_integer_constant_expression (expr. op2 ());
2341
+ mp_integer msb = convert_integer_constant_expression (part_select. msb ());
2342
+ mp_integer lsb = convert_integer_constant_expression (part_select. lsb ());
2342
2343
2343
- if (op1<op2 )
2344
- std::swap (op1, op2 ); // now op1>=op2
2344
+ if (msb < lsb )
2345
+ std::swap (msb, lsb ); // now msb>=lsb
2345
2346
2346
2347
// 1800-2017 sec 11.5.1: out-of-bounds bit-select is
2347
2348
// x for 4-state and 0 for 2-state values. We
2348
2349
// achieve that by padding the operand from either end,
2349
2350
// or both.
2350
- if (op2 < op0_offset )
2351
+ if (lsb < src_offset )
2351
2352
{
2352
- auto padding_width = op0_offset - op2 ;
2353
+ auto padding_width = src_offset - lsb ;
2353
2354
auto padding = from_integer (
2354
2355
0 , unsignedbv_typet{numeric_cast_v<std::size_t >(padding_width)});
2355
2356
auto new_type = unsignedbv_typet{
2356
- numeric_cast_v<std::size_t >(get_width (op0 .type ()) + padding_width)};
2357
- expr. op0 () = concatenation_exprt (expr. op0 () , padding, new_type);
2358
- op2 += padding_width;
2359
- op1 += padding_width;
2357
+ numeric_cast_v<std::size_t >(get_width (src .type ()) + padding_width)};
2358
+ src = concatenation_exprt (src , padding, new_type);
2359
+ lsb += padding_width;
2360
+ msb += padding_width;
2360
2361
}
2361
2362
2362
- if (op1 >= op0_width + op0_offset )
2363
+ if (msb >= src_width + src_offset )
2363
2364
{
2364
- auto padding_width = op1 - (op0_width + op0_offset ) + 1 ;
2365
+ auto padding_width = msb - (src_width + src_offset ) + 1 ;
2365
2366
auto padding = from_integer (
2366
2367
0 , unsignedbv_typet{numeric_cast_v<std::size_t >(padding_width)});
2367
2368
auto new_type = unsignedbv_typet{
2368
- numeric_cast_v<std::size_t >(get_width (op0 .type ()) + padding_width)};
2369
- expr. op0 () = concatenation_exprt (padding, expr. op0 () , new_type);
2369
+ numeric_cast_v<std::size_t >(get_width (src .type ()) + padding_width)};
2370
+ src = concatenation_exprt (padding, src , new_type);
2370
2371
}
2371
2372
2372
2373
// Part-select expressions are unsigned, even if the
2373
2374
// entire expression is selected!
2374
2375
auto expr_type =
2375
- unsignedbv_typet{numeric_cast_v<std::size_t >(op1 - op2 + 1 )};
2376
+ unsignedbv_typet{numeric_cast_v<std::size_t >(msb - lsb + 1 )};
2376
2377
2377
- op2 -= op0_offset ;
2378
- op1 -= op0_offset ;
2378
+ lsb -= src_offset ;
2379
+ msb -= src_offset ;
2379
2380
2380
2381
// Construct the extractbits expression
2381
2382
expr.id (ID_extractbits);
2382
- expr.op1 () = from_integer (op1 , integer_typet ());
2383
- expr.op2 () = from_integer (op2 , integer_typet ());
2383
+ expr.op1 () = from_integer (msb , integer_typet ());
2384
+ expr.op2 () = from_integer (lsb , integer_typet ());
2384
2385
expr.type () = expr_type;
2385
2386
2386
2387
return std::move (expr);
@@ -2389,62 +2390,63 @@ exprt verilog_typecheck_exprt::convert_trinary_expr(ternary_exprt expr)
2389
2390
expr.id () == ID_verilog_indexed_part_select_plus ||
2390
2391
expr.id () == ID_verilog_indexed_part_select_minus)
2391
2392
{
2392
- exprt &op0 = expr.op0 ();
2393
- convert_expr (op0);
2393
+ auto &part_select = to_verilog_indexed_part_select_plus_or_minus_expr (expr);
2394
+ exprt &src = part_select.src ();
2395
+ convert_expr (src);
2394
2396
2395
- if (op0 .type ().id () == ID_array)
2397
+ if (src .type ().id () == ID_array)
2396
2398
{
2397
- throw errort ().with_location (op0 .source_location ())
2399
+ throw errort ().with_location (src .source_location ())
2398
2400
<< " array type not allowed in part select" ;
2399
2401
}
2400
2402
2401
- if (op0 .type ().id () == ID_verilog_real)
2403
+ if (src .type ().id () == ID_verilog_real)
2402
2404
{
2403
- throw errort ().with_location (op0 .source_location ())
2405
+ throw errort ().with_location (src .source_location ())
2404
2406
<< " real not allowed in part select" ;
2405
2407
}
2406
2408
2407
- mp_integer op0_width = get_width (op0 .type ());
2408
- mp_integer op0_offset = string2integer (op0 .type ().get_string (ID_C_offset));
2409
+ mp_integer src_width = get_width (src .type ());
2410
+ mp_integer src_offset = string2integer (src .type ().get_string (ID_C_offset));
2409
2411
2410
2412
// The index need not be a constant.
2411
- exprt &op1 = expr. op1 ();
2412
- convert_expr (op1 );
2413
+ exprt &index = part_select. index ();
2414
+ convert_expr (index );
2413
2415
2414
2416
// The width of the indexed part select must be an
2415
2417
// elaboration-time constant.
2416
- mp_integer op2 = convert_integer_constant_expression (expr. op2 ());
2418
+ mp_integer width = convert_integer_constant_expression (part_select. width ());
2417
2419
2418
2420
// The width must be positive. 1800-2017 11.5.1
2419
- if (op2 < 0 )
2421
+ if (width < 0 )
2420
2422
{
2421
- throw errort ().with_location (expr. op2 ().source_location ())
2423
+ throw errort ().with_location (part_select. width ().source_location ())
2422
2424
<< " width of indexed part select must be positive" ;
2423
2425
}
2424
2426
2425
2427
// Part-select expressions are unsigned, even if the
2426
2428
// entire expression is selected!
2427
- auto expr_type = unsignedbv_typet{numeric_cast_v<std::size_t >(op2 )};
2429
+ auto expr_type = unsignedbv_typet{numeric_cast_v<std::size_t >(width )};
2428
2430
2429
- mp_integer op1_int ;
2430
- if (is_constant_expression (op1, op1_int ))
2431
+ mp_integer index_int ;
2432
+ if (is_constant_expression (index, index_int ))
2431
2433
{
2432
2434
// Construct the extractbits expression
2433
2435
mp_integer bottom, top;
2434
2436
2435
- if (expr .id () == ID_verilog_indexed_part_select_plus)
2437
+ if (part_select .id () == ID_verilog_indexed_part_select_plus)
2436
2438
{
2437
- bottom = op1_int - op0_offset ;
2438
- top = bottom + op2 ;
2439
+ bottom = index_int - src_offset ;
2440
+ top = bottom + width ;
2439
2441
}
2440
2442
else // ID_verilog_indexed_part_select_minus
2441
2443
{
2442
- top = op1_int - op0_offset ;
2443
- bottom = bottom - op2 ;
2444
+ top = index_int - src_offset ;
2445
+ bottom = bottom - width ;
2444
2446
}
2445
2447
2446
2448
return extractbits_exprt{
2447
- std::move (op0 ),
2449
+ std::move (src ),
2448
2450
from_integer (top, integer_typet{}),
2449
2451
from_integer (bottom, integer_typet{}),
2450
2452
std::move (expr_type)}
@@ -2454,14 +2456,14 @@ exprt verilog_typecheck_exprt::convert_trinary_expr(ternary_exprt expr)
2454
2456
{
2455
2457
// Index not constant.
2456
2458
// Use logical right-shift followed by (constant) extractbits.
2457
- auto op1_adjusted =
2458
- minus_exprt{op1 , from_integer (op0_offset, op1 .type ())};
2459
+ auto index_adjusted =
2460
+ minus_exprt{index , from_integer (src_offset, index .type ())};
2459
2461
2460
- auto op0_shifted = lshr_exprt (op0, op1_adjusted );
2462
+ auto src_shifted = lshr_exprt (src, index_adjusted );
2461
2463
2462
2464
return extractbits_exprt{
2463
- std::move (op0_shifted ),
2464
- from_integer (op2 - 1 , integer_typet{}),
2465
+ std::move (src_shifted ),
2466
+ from_integer (width - 1 , integer_typet{}),
2465
2467
from_integer (0 , integer_typet{}),
2466
2468
std::move (expr_type)}
2467
2469
.with_source_location (expr);
0 commit comments