@@ -3076,7 +3076,8 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
3076
3076
else if (
3077
3077
expr.id () == ID_sva_sequence_intersect ||
3078
3078
expr.id () == ID_sva_sequence_throughout ||
3079
- expr.id () == ID_sva_sequence_within)
3079
+ expr.id () == ID_sva_sequence_within ||
3080
+ expr.id () == ID_sva_sequence_first_match)
3080
3081
{
3081
3082
auto &binary_expr = to_binary_expr (expr);
3082
3083
@@ -3206,44 +3207,79 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
3206
3207
expr.type () = bool_typet{};
3207
3208
return std::move (expr);
3208
3209
}
3209
- else
3210
+ else if (
3211
+ expr.id () == ID_plus || expr.id () == ID_minus || expr.id () == ID_mult ||
3212
+ expr.id () == ID_power)
3210
3213
{
3211
- // type is guessed for now
3212
- // hopefully propagate_type will fix it
3213
-
3214
- Forall_operands (it, expr)
3215
- convert_expr (*it);
3214
+ for (auto &op : expr.operands ())
3215
+ convert_expr (op);
3216
3216
3217
3217
tc_binary_expr (expr);
3218
3218
3219
- if (expr.id ()==ID_plus ||
3220
- expr.id ()==ID_minus ||
3221
- expr.id ()==ID_mult ||
3222
- expr.id ()==ID_power)
3223
- no_bool_ops (expr);
3219
+ no_bool_ops (expr);
3224
3220
3225
- expr.type ()=expr.op0 ().type ();
3221
+ expr.type () = expr.op0 ().type ();
3222
+ return std::move (expr);
3223
+ }
3224
+ else if (
3225
+ expr.id () == ID_bitand || expr.id () == ID_bitor || expr.id () == ID_bitxor ||
3226
+ expr.id () == ID_bitxnor || expr.id () == ID_bitnand ||
3227
+ expr.id () == ID_bitnor)
3228
+ {
3229
+ for (auto &op : expr.operands ())
3230
+ convert_expr (op);
3226
3231
3227
- // check Boolean operators
3232
+ tc_binary_expr (expr);
3233
+
3234
+ expr.type () = expr.op0 ().type ();
3228
3235
3229
- if (expr.type ().id ()==ID_bool)
3236
+ // Boolean?
3237
+ if (expr.type ().id () == ID_bool)
3230
3238
{
3231
- if (expr.id ()== ID_bitand)
3239
+ if (expr.id () == ID_bitand)
3232
3240
expr.id (ID_and);
3233
- else if (expr.id ()== ID_bitor)
3241
+ else if (expr.id () == ID_bitor)
3234
3242
expr.id (ID_or);
3235
- else if (expr.id ()== ID_bitxor)
3243
+ else if (expr.id () == ID_bitxor)
3236
3244
expr.id (ID_xor);
3237
- else if (expr.id ()== ID_bitxnor)
3245
+ else if (expr.id () == ID_bitxnor)
3238
3246
expr.id (ID_equal);
3239
- else if (expr.id ()== ID_bitnand)
3247
+ else if (expr.id () == ID_bitnand)
3240
3248
expr.id (ID_nand);
3241
- else if (expr.id ()== ID_bitnor)
3249
+ else if (expr.id () == ID_bitnor)
3242
3250
expr.id (ID_nor);
3243
3251
}
3244
3252
3245
3253
return std::move (expr);
3246
3254
}
3255
+ else if (
3256
+ expr.id () == ID_and || expr.id () == ID_or || expr.id () == ID_xor ||
3257
+ expr.id () == ID_xnor || expr.id () == ID_nand || expr.id () == ID_nor)
3258
+ {
3259
+ for (auto &op : expr.operands ())
3260
+ {
3261
+ convert_expr (op);
3262
+ make_boolean (op);
3263
+ }
3264
+
3265
+ tc_binary_expr (expr);
3266
+
3267
+ expr.type () = expr.op0 ().type ();
3268
+
3269
+ return std::move (expr);
3270
+ }
3271
+ else if (expr.id () == ID_verilog_value_range)
3272
+ {
3273
+ for (auto &op : expr.operands ())
3274
+ convert_expr (op);
3275
+ expr.type () = expr.op0 ().type ();
3276
+ return std::move (expr);
3277
+ }
3278
+ else
3279
+ {
3280
+ throw errort ().with_location (expr.source_location ())
3281
+ << " no conversion for binary expression " << expr.id ();
3282
+ }
3247
3283
}
3248
3284
3249
3285
/* ******************************************************************\
0 commit comments