16
16
17
17
#include " temporal_expr.h"
18
18
#include " temporal_logic.h"
19
+ #include " trivial_sva.h"
19
20
20
21
exprt normalize_pre_not (not_exprt expr)
21
22
{
@@ -73,16 +74,6 @@ exprt normalize_pre_implies(implies_exprt expr)
73
74
return or_exprt{not_exprt{expr.lhs ()}, expr.rhs ()};
74
75
}
75
76
76
- exprt normalize_pre_sva_overlapped_implication (
77
- sva_overlapped_implication_exprt expr)
78
- {
79
- // Same as regular implication if lhs is not a sequence.
80
- if (!is_SVA_sequence (expr.lhs ()))
81
- return or_exprt{not_exprt{expr.lhs ()}, expr.rhs ()};
82
- else
83
- return std::move (expr);
84
- }
85
-
86
77
exprt normalize_pre_sva_non_overlapped_implication (
87
78
sva_non_overlapped_implication_exprt expr)
88
79
{
@@ -97,30 +88,6 @@ exprt normalize_pre_sva_non_overlapped_implication(
97
88
return std::move (expr);
98
89
}
99
90
100
- exprt normalize_pre_sva_not (sva_not_exprt expr)
101
- {
102
- // Same as regular 'not'. These do not apply to sequences.
103
- return normalize_pre_not (not_exprt{expr.op ()});
104
- }
105
-
106
- exprt normalize_pre_sva_and (sva_and_exprt expr)
107
- {
108
- // Same as a ∧ b if lhs and rhs are not sequences.
109
- if (!is_SVA_sequence (expr.lhs ()) && !is_SVA_sequence (expr.rhs ()))
110
- return and_exprt{expr.lhs (), expr.rhs ()};
111
- else
112
- return std::move (expr);
113
- }
114
-
115
- exprt normalize_pre_sva_or (sva_or_exprt expr)
116
- {
117
- // Same as a ∧ b if lhs or rhs are not sequences.
118
- if (!is_SVA_sequence (expr.lhs ()) && !is_SVA_sequence (expr.rhs ()))
119
- return or_exprt{expr.lhs (), expr.rhs ()};
120
- else
121
- return std::move (expr);
122
- }
123
-
124
91
exprt normalize_pre_sva_cycle_delay (sva_cycle_delay_exprt expr)
125
92
{
126
93
if (expr.is_unbounded ())
@@ -143,37 +110,16 @@ exprt normalize_pre_sva_cycle_delay(sva_cycle_delay_exprt expr)
143
110
return std::move (expr);
144
111
}
145
112
146
- exprt normalize_property (exprt expr)
113
+ exprt normalize_property_rec (exprt expr)
147
114
{
148
115
// pre-traversal
149
116
if (expr.id () == ID_not)
150
117
expr = normalize_pre_not (to_not_expr (expr));
151
118
else if (expr.id () == ID_implies)
152
119
expr = normalize_pre_implies (to_implies_expr (expr));
153
- else if (expr.id () == ID_sva_cover)
154
- expr = G_exprt{not_exprt{to_sva_cover_expr (expr).op ()}};
155
- else if (expr.id () == ID_sva_overlapped_implication)
156
- expr = normalize_pre_sva_overlapped_implication (
157
- to_sva_overlapped_implication_expr (expr));
158
120
else if (expr.id () == ID_sva_non_overlapped_implication)
159
121
expr = normalize_pre_sva_non_overlapped_implication (
160
122
to_sva_non_overlapped_implication_expr (expr));
161
- else if (expr.id () == ID_sva_iff)
162
- {
163
- expr =
164
- equal_exprt{to_sva_iff_expr (expr).lhs (), to_sva_iff_expr (expr).rhs ()};
165
- }
166
- else if (expr.id () == ID_sva_implies)
167
- {
168
- expr = implies_exprt{
169
- to_sva_implies_expr (expr).lhs (), to_sva_implies_expr (expr).rhs ()};
170
- }
171
- else if (expr.id () == ID_sva_and)
172
- expr = normalize_pre_sva_and (to_sva_and_expr (expr));
173
- else if (expr.id () == ID_sva_not)
174
- expr = normalize_pre_sva_not (to_sva_not_expr (expr));
175
- else if (expr.id () == ID_sva_or)
176
- expr = normalize_pre_sva_or (to_sva_or_expr (expr));
177
123
else if (expr.id () == ID_sva_nexttime)
178
124
{
179
125
auto one = natural_typet{}.one_expr ();
@@ -209,40 +155,6 @@ exprt normalize_property(exprt expr)
209
155
{
210
156
expr = sva_s_eventually_exprt{to_sva_cycle_delay_star_expr (expr).op ()};
211
157
}
212
- else if (expr.id () == ID_sva_sequence_concatenation)
213
- {
214
- auto &sequence_concatenation = to_sva_sequence_concatenation_expr (expr);
215
- if (!is_SVA_sequence (sequence_concatenation.lhs ()))
216
- {
217
- // a ##0 b --> a && b if a is not a sequence
218
- expr =
219
- and_exprt{sequence_concatenation.lhs (), sequence_concatenation.rhs ()};
220
- }
221
- }
222
- else if (expr.id () == ID_sva_if)
223
- {
224
- auto &sva_if_expr = to_sva_if_expr (expr);
225
- auto false_case = sva_if_expr.false_case ().is_nil ()
226
- ? true_exprt{}
227
- : sva_if_expr.false_case ();
228
- expr = if_exprt{sva_if_expr.cond (), sva_if_expr.true_case (), false_case};
229
- }
230
- else if (expr.id () == ID_sva_disable_iff)
231
- {
232
- auto &disable_iff_expr = to_sva_disable_iff_expr (expr);
233
- expr = or_exprt{disable_iff_expr.lhs (), disable_iff_expr.rhs ()};
234
- }
235
- else if (expr.id () == ID_sva_accept_on || expr.id () == ID_sva_sync_accept_on)
236
- {
237
- auto &sva_abort_expr = to_sva_abort_expr (expr);
238
- expr = or_exprt{sva_abort_expr.condition (), sva_abort_expr.property ()};
239
- }
240
- else if (expr.id () == ID_sva_reject_on || expr.id () == ID_sva_sync_reject_on)
241
- {
242
- auto &sva_abort_expr = to_sva_abort_expr (expr);
243
- expr = and_exprt{
244
- not_exprt{sva_abort_expr.condition ()}, sva_abort_expr.property ()};
245
- }
246
158
else if (expr.id () == ID_sva_strong)
247
159
{
248
160
expr = to_sva_strong_expr (expr).op ();
@@ -251,16 +163,26 @@ exprt normalize_property(exprt expr)
251
163
{
252
164
expr = to_sva_weak_expr (expr).op ();
253
165
}
254
- else if (expr.id () == ID_sva_case)
255
- {
256
- expr = to_sva_case_expr (expr).lowering ();
257
- }
258
166
259
167
// normalize the operands
260
168
for (auto &op : expr.operands ())
261
- op = normalize_property (op);
169
+ op = normalize_property_rec (op); // recursive call
262
170
263
171
// post-traversal
264
172
265
173
return expr;
266
174
}
175
+
176
+ exprt normalize_property (exprt expr)
177
+ {
178
+ // top-level only
179
+ if (expr.id () == ID_sva_cover)
180
+ expr = G_exprt{not_exprt{to_sva_cover_expr (expr).op ()}};
181
+
182
+ expr = trivial_sva (expr);
183
+
184
+ // now do recursion
185
+ expr = normalize_property_rec (expr);
186
+
187
+ return expr;
188
+ }
0 commit comments