Skip to content

Commit a9e8922

Browse files
committed
Verilog: typechecking for remaining binary expressions
1 parent 3c029fa commit a9e8922

File tree

1 file changed

+57
-21
lines changed

1 file changed

+57
-21
lines changed

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3076,7 +3076,8 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
30763076
else if(
30773077
expr.id() == ID_sva_sequence_intersect ||
30783078
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)
30803081
{
30813082
auto &binary_expr = to_binary_expr(expr);
30823083

@@ -3206,44 +3207,79 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
32063207
expr.type() = bool_typet{};
32073208
return std::move(expr);
32083209
}
3209-
else
3210+
else if(
3211+
expr.id() == ID_plus || expr.id() == ID_minus || expr.id() == ID_mult ||
3212+
expr.id() == ID_power)
32103213
{
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);
32163216

32173217
tc_binary_expr(expr);
32183218

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);
32243220

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);
32263231

3227-
// check Boolean operators
3232+
tc_binary_expr(expr);
3233+
3234+
expr.type() = expr.op0().type();
32283235

3229-
if(expr.type().id()==ID_bool)
3236+
// Boolean?
3237+
if(expr.type().id() == ID_bool)
32303238
{
3231-
if(expr.id()==ID_bitand)
3239+
if(expr.id() == ID_bitand)
32323240
expr.id(ID_and);
3233-
else if(expr.id()==ID_bitor)
3241+
else if(expr.id() == ID_bitor)
32343242
expr.id(ID_or);
3235-
else if(expr.id()==ID_bitxor)
3243+
else if(expr.id() == ID_bitxor)
32363244
expr.id(ID_xor);
3237-
else if(expr.id()==ID_bitxnor)
3245+
else if(expr.id() == ID_bitxnor)
32383246
expr.id(ID_equal);
3239-
else if(expr.id()==ID_bitnand)
3247+
else if(expr.id() == ID_bitnand)
32403248
expr.id(ID_nand);
3241-
else if(expr.id()==ID_bitnor)
3249+
else if(expr.id() == ID_bitnor)
32423250
expr.id(ID_nor);
32433251
}
32443252

32453253
return std::move(expr);
32463254
}
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+
}
32473283
}
32483284

32493285
/*******************************************************************\

0 commit comments

Comments
 (0)