@@ -2350,70 +2350,71 @@ exprt verilog_typecheck_exprt::convert_trinary_expr(ternary_exprt expr)
2350
2350
{
2351
2351
if (expr.id () == ID_verilog_non_indexed_part_select)
2352
2352
{
2353
- exprt &op0 = expr.op0 ();
2354
- convert_expr (op0);
2353
+ auto &part_select = to_verilog_non_indexed_part_select_expr (expr);
2354
+ exprt &src = part_select.src ();
2355
+ convert_expr (src);
2355
2356
2356
- if (op0 .type ().id ()== ID_array)
2357
+ if (src .type ().id () == ID_array)
2357
2358
{
2358
- throw errort ().with_location (op0 .source_location ())
2359
+ throw errort ().with_location (src .source_location ())
2359
2360
<< " array type not allowed in part select" ;
2360
2361
}
2361
2362
2362
- if (op0 .type ().id () == ID_verilog_real)
2363
+ if (src .type ().id () == ID_verilog_real)
2363
2364
{
2364
- throw errort ().with_location (op0 .source_location ())
2365
+ throw errort ().with_location (src .source_location ())
2365
2366
<< " real not allowed in part select" ;
2366
2367
}
2367
2368
2368
- mp_integer op0_width = get_width (op0 .type ());
2369
- mp_integer op0_offset = string2integer (op0 .type ().get_string (ID_C_offset));
2369
+ mp_integer src_width = get_width (src .type ());
2370
+ mp_integer src_offset = string2integer (src .type ().get_string (ID_C_offset));
2370
2371
2371
2372
// In non-indexed part-select expressions, both
2372
2373
// indices must be constants (1800-2017 11.5.1).
2373
- mp_integer op1 = convert_integer_constant_expression (expr. op1 ());
2374
- mp_integer op2 = convert_integer_constant_expression (expr. op2 ());
2374
+ mp_integer msb = convert_integer_constant_expression (part_select. msb ());
2375
+ mp_integer lsb = convert_integer_constant_expression (part_select. lsb ());
2375
2376
2376
- if (op1<op2 )
2377
- std::swap (op1, op2 ); // now op1>=op2
2377
+ if (msb < lsb )
2378
+ std::swap (msb, lsb ); // now msb>=lsb
2378
2379
2379
2380
// 1800-2017 sec 11.5.1: out-of-bounds bit-select is
2380
2381
// x for 4-state and 0 for 2-state values. We
2381
2382
// achieve that by padding the operand from either end,
2382
2383
// or both.
2383
- if (op2 < op0_offset )
2384
+ if (lsb < src_offset )
2384
2385
{
2385
- auto padding_width = op0_offset - op2 ;
2386
+ auto padding_width = src_offset - lsb ;
2386
2387
auto padding = from_integer (
2387
2388
0 , unsignedbv_typet{numeric_cast_v<std::size_t >(padding_width)});
2388
2389
auto new_type = unsignedbv_typet{
2389
- numeric_cast_v<std::size_t >(get_width (op0 .type ()) + padding_width)};
2390
- expr. op0 () = concatenation_exprt (expr. op0 () , padding, new_type);
2391
- op2 += padding_width;
2392
- op1 += padding_width;
2390
+ numeric_cast_v<std::size_t >(get_width (src .type ()) + padding_width)};
2391
+ src = concatenation_exprt (src , padding, new_type);
2392
+ lsb += padding_width;
2393
+ msb += padding_width;
2393
2394
}
2394
2395
2395
- if (op1 >= op0_width + op0_offset )
2396
+ if (msb >= src_width + src_offset )
2396
2397
{
2397
- auto padding_width = op1 - (op0_width + op0_offset ) + 1 ;
2398
+ auto padding_width = msb - (src_width + src_offset ) + 1 ;
2398
2399
auto padding = from_integer (
2399
2400
0 , unsignedbv_typet{numeric_cast_v<std::size_t >(padding_width)});
2400
2401
auto new_type = unsignedbv_typet{
2401
- numeric_cast_v<std::size_t >(get_width (op0 .type ()) + padding_width)};
2402
- expr. op0 () = concatenation_exprt (padding, expr. op0 () , new_type);
2402
+ numeric_cast_v<std::size_t >(get_width (src .type ()) + padding_width)};
2403
+ src = concatenation_exprt (padding, src , new_type);
2403
2404
}
2404
2405
2405
2406
// Part-select expressions are unsigned, even if the
2406
2407
// entire expression is selected!
2407
2408
auto expr_type =
2408
- unsignedbv_typet{numeric_cast_v<std::size_t >(op1 - op2 + 1 )};
2409
+ unsignedbv_typet{numeric_cast_v<std::size_t >(msb - lsb + 1 )};
2409
2410
2410
- op2 -= op0_offset ;
2411
- op1 -= op0_offset ;
2411
+ lsb -= src_offset ;
2412
+ msb -= src_offset ;
2412
2413
2413
2414
// Construct the extractbits expression
2414
2415
expr.id (ID_extractbits);
2415
- expr.op1 () = from_integer (op1 , integer_typet ());
2416
- expr.op2 () = from_integer (op2 , integer_typet ());
2416
+ expr.op1 () = from_integer (msb , integer_typet ());
2417
+ expr.op2 () = from_integer (lsb , integer_typet ());
2417
2418
expr.type () = expr_type;
2418
2419
2419
2420
return std::move (expr);
0 commit comments