16
16
17
17
exprt verilog_typecheck_exprt::convert_unary_sva (unary_exprt expr)
18
18
{
19
- if (expr.id () == ID_sva_not)
19
+ if (
20
+ expr.id () == ID_sva_not || expr.id () == ID_sva_always ||
21
+ expr.id () == ID_sva_s_eventually || expr.id () == ID_sva_nexttime ||
22
+ expr.id () == ID_sva_s_nexttime)
20
23
{
21
24
convert_sva (expr.op ());
22
- make_boolean (expr.op ());
23
- expr.type () = bool_typet () ; // always boolean, never x
25
+ require_sva_property (expr.op ());
26
+ expr.type () = bool_typet{} ; // always boolean, never x
24
27
return std::move (expr);
25
28
}
26
29
else if (
27
- expr.id () == ID_sva_always || expr.id () == ID_sva_s_eventually ||
28
30
expr.id () == ID_sva_cycle_delay_plus ||
29
31
expr.id () == ID_sva_cycle_delay_star || expr.id () == ID_sva_weak ||
30
- expr.id () == ID_sva_strong || expr.id () == ID_sva_nexttime ||
31
- expr.id () == ID_sva_s_nexttime)
32
- {
33
- convert_sva (expr.op ());
34
- make_boolean (expr.op ());
35
- expr.type () = bool_typet ();
36
- return std::move (expr);
37
- }
38
- else if (
32
+ expr.id () == ID_sva_strong ||
39
33
expr.id () == ID_sva_sequence_repetition_plus || // x[+]
40
34
expr.id () == ID_sva_sequence_repetition_star) // x[*}
41
35
{
42
- // These both take a sequence as argument.
43
- // The grammar allows properties to implement and/or over
36
+ // These take a sequence as argument.
37
+ // For some, the grammar allows properties to implement and/or over
44
38
// sequences. Check here that the argument is a sequence.
45
39
convert_sva (expr.op ());
46
40
require_sva_sequence (expr.op ());
@@ -63,20 +57,35 @@ void verilog_typecheck_exprt::require_sva_sequence(const exprt &expr) const
63
57
}
64
58
}
65
59
60
+ void verilog_typecheck_exprt::require_sva_property (exprt &expr)
61
+ {
62
+ make_boolean (expr);
63
+ }
64
+
66
65
exprt verilog_typecheck_exprt::convert_binary_sva (binary_exprt expr)
67
66
{
68
- if (
69
- expr.id () == ID_sva_and || expr.id () == ID_sva_or ||
70
- expr.id () == ID_sva_implies || expr.id () == ID_sva_iff)
67
+ if (expr.id () == ID_sva_implies || expr.id () == ID_sva_iff)
71
68
{
72
- for ( auto &op : expr.operands ())
73
- {
74
- convert_sva (op);
75
- make_boolean (op );
76
- }
69
+ convert_sva ( expr.lhs ());
70
+ convert_sva (expr. rhs ());
71
+
72
+ require_sva_property (expr. lhs () );
73
+ require_sva_property (expr. rhs ());
77
74
78
75
// always boolean, never x
79
- expr.type () = bool_typet ();
76
+ expr.type () = bool_typet{};
77
+
78
+ return std::move (expr);
79
+ }
80
+ else if (expr.id () == ID_sva_and || expr.id () == ID_sva_or)
81
+ {
82
+ convert_sva (expr.lhs ());
83
+ make_boolean (expr.lhs ());
84
+
85
+ convert_sva (expr.rhs ());
86
+ make_boolean (expr.rhs ());
87
+
88
+ expr.type () = bool_typet{};
80
89
81
90
return std::move (expr);
82
91
}
@@ -85,11 +94,15 @@ exprt verilog_typecheck_exprt::convert_binary_sva(binary_exprt expr)
85
94
expr.id () == ID_sva_reject_on || expr.id () == ID_sva_sync_accept_on ||
86
95
expr.id () == ID_sva_sync_reject_on)
87
96
{
97
+ // The condition of these is special: They are not sampled,
98
+ // but evaluated directly (1800-2017 16.6).
88
99
convert_expr (to_sva_abort_expr (expr).condition ());
89
100
make_boolean (to_sva_abort_expr (expr).condition ());
101
+
90
102
convert_sva (to_sva_abort_expr (expr).property ());
91
- make_boolean (to_sva_abort_expr (expr).property ());
92
- expr.type () = bool_typet ();
103
+ require_sva_property (to_sva_abort_expr (expr).property ());
104
+ expr.type () = bool_typet{};
105
+
93
106
return std::move (expr);
94
107
}
95
108
else if (expr.id () == ID_sva_indexed_nexttime)
@@ -98,8 +111,8 @@ exprt verilog_typecheck_exprt::convert_binary_sva(binary_exprt expr)
98
111
99
112
auto &op = to_sva_indexed_nexttime_expr (expr).op ();
100
113
convert_sva (op);
101
- make_boolean (op);
102
- expr.type () = bool_typet () ;
114
+ require_sva_property (op);
115
+ expr.type () = bool_typet{} ;
103
116
104
117
return std::move (expr);
105
118
}
@@ -109,8 +122,8 @@ exprt verilog_typecheck_exprt::convert_binary_sva(binary_exprt expr)
109
122
110
123
auto &op = to_sva_indexed_s_nexttime_expr (expr).op ();
111
124
convert_sva (op);
112
- make_boolean (op);
113
- expr.type () = bool_typet () ;
125
+ require_sva_property (op);
126
+ expr.type () = bool_typet{} ;
114
127
115
128
return std::move (expr);
116
129
}
@@ -126,37 +139,29 @@ exprt verilog_typecheck_exprt::convert_binary_sva(binary_exprt expr)
126
139
convert_sva (expr.lhs ());
127
140
require_sva_sequence (expr.lhs ());
128
141
make_boolean (expr.lhs ());
142
+
129
143
convert_sva (expr.rhs ());
130
- make_boolean (expr.rhs ());
131
- expr.type () = bool_typet ();
144
+ require_sva_property (expr.rhs ());
145
+
146
+ expr.type () = bool_typet{};
132
147
return std::move (expr);
133
148
}
134
149
else if (
135
150
expr.id () == ID_sva_until || expr.id () == ID_sva_s_until ||
136
151
expr.id () == ID_sva_until_with || expr.id () == ID_sva_s_until_with)
137
152
{
138
- convert_sva (expr.op0 ());
139
- make_boolean (expr.op0 ());
140
- convert_sva (expr.op1 ());
141
- make_boolean (expr.op1 ());
142
- expr.type () = bool_typet ();
143
-
144
- return std::move (expr);
145
- }
146
- else if (expr.id () == ID_sva_sequence_concatenation) // a ##b c
147
- {
148
- // This requires a sequence on the LHS.
149
- // The grammar allows properties on the LHS to implement and/or over
150
- // sequences. Check here that the LHS is a sequence.
151
153
convert_sva (expr.lhs ());
152
- require_sva_sequence (expr.lhs ());
153
- make_boolean (expr.op0 ());
154
- convert_sva (expr.op1 ());
155
- make_boolean (expr.op1 ());
156
- expr.type () = bool_typet ();
154
+ require_sva_property (expr.lhs ());
155
+
156
+ convert_sva (expr.rhs ());
157
+ require_sva_property (expr.rhs ());
158
+
159
+ expr.type () = bool_typet{};
160
+
157
161
return std::move (expr);
158
162
}
159
163
else if (
164
+ expr.id () == ID_sva_sequence_concatenation || // a ##b c
160
165
expr.id () == ID_sva_sequence_intersect ||
161
166
expr.id () == ID_sva_sequence_within)
162
167
{
@@ -166,21 +171,22 @@ exprt verilog_typecheck_exprt::convert_binary_sva(binary_exprt expr)
166
171
convert_sva (expr.lhs ());
167
172
require_sva_sequence (expr.lhs ());
168
173
make_boolean (expr.lhs ());
169
- convert_sva (expr.rhs ());
170
- make_boolean (expr.rhs ());
171
174
172
- expr.type () = bool_typet ();
175
+ convert_sva (expr.rhs ());
176
+ require_sva_property (expr.rhs ());
177
+ expr.type () = bool_typet{};
173
178
174
179
return std::move (expr);
175
180
}
176
181
else if (expr.id () == ID_sva_sequence_throughout)
177
182
{
178
183
convert_expr (expr.lhs ());
179
184
make_boolean (expr.lhs ());
185
+
180
186
convert_sva (expr.rhs ());
181
187
make_boolean (expr.rhs ());
182
188
183
- expr.type () = bool_typet () ;
189
+ expr.type () = bool_typet{} ;
184
190
185
191
return std::move (expr);
186
192
}
@@ -205,7 +211,7 @@ exprt verilog_typecheck_exprt::convert_binary_sva(binary_exprt expr)
205
211
convert_sva (expr.lhs ());
206
212
make_boolean (expr.lhs ());
207
213
208
- convert_sva (expr.rhs ());
214
+ convert_expr (expr.rhs ());
209
215
210
216
mp_integer n = elaborate_constant_integer_expression (expr.rhs ());
211
217
if (n < 0 )
@@ -234,10 +240,10 @@ exprt verilog_typecheck_exprt::convert_binary_sva(binary_exprt expr)
234
240
}
235
241
236
242
convert_sva (case_item.result ());
237
- make_boolean (case_item.result ());
243
+ require_sva_property (case_item.result ());
238
244
}
239
245
240
- expr.type () = bool_typet () ;
246
+ expr.type () = bool_typet{} ;
241
247
return std::move (expr);
242
248
}
243
249
else
0 commit comments