Skip to content

Commit 7eae75c

Browse files
authored
Merge pull request #1449 from diffblue/verilog-integral-to-bit-vector
Verilog: fix integral vs. bit vector terminology
2 parents c6f7e41 + 02076d4 commit 7eae75c

File tree

11 files changed

+46
-33
lines changed

11 files changed

+46
-33
lines changed

regression/verilog/expressions/concatenation5.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
concatenation5.v
33

4-
^file .* line 4: operand 1.1 must be integral$
4+
^file .* line 4: operand 1.1 must have a bit vector type$
55
^EXIT=2$
66
^SIGNAL=0$
77
--

regression/verilog/expressions/equality3.desc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
CORE
22
equality3.v
33

4+
^file .* line 4: the case equality operator does not allow real or shortreal$
45
^EXIT=2$
56
^SIGNAL=0$
67
--

regression/verilog/expressions/mod2.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
mod2.v
33

4-
^file .* line 4: operand 1\.1 must be integral$
4+
^file .* line 4: operand 1\.1 must have a bit vector type$
55
^EXIT=2$
66
^SIGNAL=0$
77
--

regression/verilog/expressions/reduction2.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
reduction2.v
33

4-
^file .* line 4: operand 1\.1 must be integral$
4+
^file .* line 4: operand 1\.1 must have a bit vector type$
55
^EXIT=2$
66
^SIGNAL=0$
77
--

regression/verilog/expressions/replication3.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
replication3.v
33

4-
^file .* line 3: operand 1\.1 must be integral$
4+
^file .* line 3: operand 1\.1 must have a bit vector type$
55
^EXIT=2$
66
^SIGNAL=0$
77
--

regression/verilog/expressions/shr2.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
shr2.v
33

4-
^file .* line 4: operand 1\.1 must be integral$
4+
^file .* line 4: operand 1\.1 must have a bit vector type$
55
^EXIT=2$
66
^SIGNAL=0$
77
--

regression/verilog/expressions/streaming_concatenation2.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
streaming_concatenation2.sv
33

4-
^file .* line 4: operand 1\.1 must be integral$
4+
^file .* line 4: operand 1\.1 must have a bit vector type$
55
^EXIT=2$
66
^SIGNAL=0$
77
--

regression/verilog/expressions/wildcard_equality2.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
2-
wildcard_equality2.v
2+
wildcard_equality2.sv
33

4-
^file .* line 4: operand 1\.1 must be integral$
4+
^file .* line 4: operand 1\.1 must have a bit vector type$
55
^EXIT=2$
66
^SIGNAL=0$
77
--
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module main;
22

33
// ==? only takes integral types
4-
wire x = 1.1 === 1.2;
4+
wire x = 1.1 ==? 1.2;
55

66
endmodule

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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,36 @@ 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(
3097+
expr.lhs().type().id() == ID_verilog_real ||
3098+
expr.lhs().type().id() == ID_verilog_shortreal)
3099+
{
3100+
throw errort().with_location(expr.source_location())
3101+
<< "the case equality operator does not allow real or shortreal";
3102+
}
30913103

30923104
return std::move(expr);
30933105
}
@@ -3120,8 +3132,8 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
31203132

31213133
convert_expr(expr.lhs());
31223134
convert_expr(expr.rhs());
3123-
must_be_integral(expr.lhs());
3124-
must_be_integral(expr.rhs());
3135+
must_be_bit_vector(expr.lhs());
3136+
must_be_bit_vector(expr.rhs());
31253137
no_bool_ops(expr);
31263138

31273139
const typet &lhs_type = expr.lhs().type();
@@ -3157,9 +3169,8 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
31573169
// logical right shift >>
31583170
convert_expr(expr.lhs());
31593171
convert_expr(expr.rhs());
3160-
must_be_integral(expr.lhs());
3161-
must_be_integral(expr.rhs());
3162-
no_bool_ops(expr);
3172+
must_be_bit_vector(expr.lhs());
3173+
must_be_bit_vector(expr.rhs());
31633174

31643175
const typet &lhs_type = expr.lhs().type();
31653176
const typet &rhs_type = expr.rhs().type();
@@ -3191,12 +3202,13 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
31913202
{
31923203
convert_expr(expr.lhs());
31933204
convert_expr(expr.rhs());
3194-
must_be_integral(expr.lhs());
3195-
must_be_integral(expr.rhs());
31963205

31973206
tc_binary_expr(expr);
31983207
no_bool_ops(expr);
31993208

3209+
must_be_bit_vector(expr.lhs());
3210+
must_be_bit_vector(expr.rhs());
3211+
32003212
expr.type() = expr.lhs().type();
32013213

32023214
return std::move(expr);

0 commit comments

Comments
 (0)