@@ -426,7 +426,7 @@ void verilog_typecheck_exprt::no_bool_ops(exprt &expr)
426426
427427/* ******************************************************************\
428428
429- Function: verilog_typecheck_exprt::must_be_integral
429+ Function: verilog_typecheck_exprt::must_be_bit_vector
430430
431431 Inputs:
432432
@@ -436,9 +436,9 @@ Function: verilog_typecheck_exprt::must_be_integral
436436
437437\*******************************************************************/
438438
439- void verilog_typecheck_exprt::must_be_integral ( const exprt &expr)
439+ void verilog_typecheck_exprt::must_be_bit_vector ( exprt &expr)
440440{
441- // Throw an error if the given expression doesn't have an integral type.
441+ // Throw an error if the given expression doesn't have a bitvector type.
442442 const auto &type = expr.type ();
443443 if (type.id () == ID_bool)
444444 {
@@ -452,7 +452,7 @@ void verilog_typecheck_exprt::must_be_integral(const exprt &expr)
452452 }
453453 else
454454 throw errort ().with_location (expr.source_location ())
455- << " operand " << to_string (expr) << " must be integral " ;
455+ << " operand " << to_string (expr) << " must have a bit vector type " ;
456456}
457457
458458/* ******************************************************************\
@@ -490,7 +490,7 @@ exprt verilog_typecheck_exprt::convert_expr_concatenation(
490490 << " unsized literals are not allowed in concatenations" ;
491491 }
492492
493- must_be_integral (*it);
493+ must_be_bit_vector (*it);
494494
495495 const typet &type = it->type ();
496496
@@ -1563,7 +1563,7 @@ exprt verilog_typecheck_exprt::convert_constant(constant_exprt expr)
15631563
15641564 const std::string &value = id2string (expr.get_value ());
15651565
1566- // real or integral ?
1566+ // real or integer ?
15671567 if (
15681568 value.find (' .' ) != std::string::npos ||
15691569 (value.find (' h' ) == std::string::npos &&
@@ -2558,10 +2558,11 @@ exprt verilog_typecheck_exprt::convert_unary_expr(unary_exprt expr)
25582558 {
25592559 // these may produce an 'x' if the operand is a verilog_bv
25602560 convert_expr (expr.op ());
2561- must_be_integral (expr.op ());
2561+ must_be_bit_vector (expr.op ());
25622562
2563- if (expr.op ().type ().id () == ID_verilog_signedbv ||
2564- expr.op ().type ().id () == ID_verilog_unsignedbv)
2563+ if (
2564+ expr.op ().type ().id () == ID_verilog_signedbv ||
2565+ expr.op ().type ().id () == ID_verilog_unsignedbv)
25652566 {
25662567 expr.type ()=verilog_unsignedbv_typet (1 );
25672568 }
@@ -2668,7 +2669,7 @@ exprt verilog_typecheck_exprt::convert_unary_expr(unary_exprt expr)
26682669 // slice_size is defaulted to 1
26692670 PRECONDITION (expr.op ().operands ().size () == 1 );
26702671 convert_expr (expr.op ().operands ()[0 ]);
2671- must_be_integral (expr.op ().operands ()[0 ]);
2672+ must_be_bit_vector (expr.op ().operands ()[0 ]);
26722673 expr.type () = expr.op ().operands ()[0 ].type ();
26732674 return std::move (expr);
26742675 }
@@ -2839,7 +2840,7 @@ exprt verilog_typecheck_exprt::convert_replication_expr(replication_exprt expr)
28392840 exprt &op1=expr.op1 ();
28402841
28412842 convert_expr (op1);
2842- must_be_integral (op1);
2843+ must_be_bit_vector (op1);
28432844
28442845 if (op1.type ().id ()==ID_bool)
28452846 op1 = typecast_exprt{op1, unsignedbv_typet{1 }};
@@ -3069,25 +3070,34 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
30693070 expr.id () == ID_verilog_wildcard_inequality)
30703071 {
30713072 // ==? and !=?
3073+ // 1800-2017 Table 11-1 says that any integral operands are allowed;
3074+ // however, it is unclear how these would apply to types that do not have
3075+ // a bit-encoding.
30723076 convert_relation (expr);
30733077
3074- expr.type () = verilog_unsignedbv_typet (1 );
3078+ must_be_bit_vector (expr.lhs ());
3079+ must_be_bit_vector (expr.rhs ());
3080+
3081+ expr.type () = verilog_unsignedbv_typet{1 };
30753082
30763083 return std::move (expr);
30773084 }
30783085 else if (expr.id ()==ID_verilog_case_equality ||
30793086 expr.id ()==ID_verilog_case_inequality)
30803087 {
30813088 // === and !==
3089+ // Take any operand types except real and shortreal (1800-2017 Table 11-1).
30823090 // The result is always Boolean, and semantically
30833091 // a proper equality is performed.
3084- expr.type ()=bool_typet () ;
3092+ expr.type ()=bool_typet{} ;
30853093
30863094 convert_relation (expr);
30873095
3088- // integral operands only
3089- must_be_integral (expr.lhs ());
3090- must_be_integral (expr.rhs ());
3096+ if (expr.lhs ().type ().id () == ID_verilog_real || expr.lhs ().type ().id () == ID_verilog_shortreal)
3097+ {
3098+ throw errort ().with_location (expr.source_location ())
3099+ << " the case equality operator does not allow real or shortreal" ;
3100+ }
30913101
30923102 return std::move (expr);
30933103 }
@@ -3120,8 +3130,8 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
31203130
31213131 convert_expr (expr.lhs ());
31223132 convert_expr (expr.rhs ());
3123- must_be_integral (expr.lhs ());
3124- must_be_integral (expr.rhs ());
3133+ must_be_bit_vector (expr.lhs ());
3134+ must_be_bit_vector (expr.rhs ());
31253135 no_bool_ops (expr);
31263136
31273137 const typet &lhs_type = expr.lhs ().type ();
@@ -3157,9 +3167,8 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
31573167 // logical right shift >>
31583168 convert_expr (expr.lhs ());
31593169 convert_expr (expr.rhs ());
3160- must_be_integral (expr.lhs ());
3161- must_be_integral (expr.rhs ());
3162- no_bool_ops (expr);
3170+ must_be_bit_vector (expr.lhs ());
3171+ must_be_bit_vector (expr.rhs ());
31633172
31643173 const typet &lhs_type = expr.lhs ().type ();
31653174 const typet &rhs_type = expr.rhs ().type ();
@@ -3191,12 +3200,13 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
31913200 {
31923201 convert_expr (expr.lhs ());
31933202 convert_expr (expr.rhs ());
3194- must_be_integral (expr.lhs ());
3195- must_be_integral (expr.rhs ());
31963203
31973204 tc_binary_expr (expr);
31983205 no_bool_ops (expr);
31993206
3207+ must_be_bit_vector (expr.lhs ());
3208+ must_be_bit_vector (expr.rhs ());
3209+
32003210 expr.type () = expr.lhs ().type ();
32013211
32023212 return std::move (expr);
0 commit comments