@@ -39,100 +39,78 @@ static exprt ltl(const sva_sequence_matcht &match)
39
39
return conjunction (conjuncts);
40
40
}
41
41
42
- // / takes an SVA property as input, and returns an equivalent LTL property,
43
- // / or otherwise {}.
44
- std::optional<exprt> SVA_to_LTL (exprt expr)
42
+ // / takes an SVA property as input, and returns an equivalent LTL property
43
+ exprt SVA_to_LTL (exprt expr)
45
44
{
46
45
// Some SVA is directly mappable to LTL
47
46
if (expr.id () == ID_sva_always)
48
47
{
49
48
auto rec = SVA_to_LTL (to_sva_always_expr (expr).op ());
50
- if (rec.has_value ())
51
- return G_exprt{rec.value ()};
52
- else
53
- return {};
49
+ return G_exprt{rec};
54
50
}
55
51
else if (expr.id () == ID_sva_ranged_always)
56
52
{
57
53
auto &ranged_always = to_sva_ranged_always_expr (expr);
58
54
auto rec = SVA_to_LTL (ranged_always.op ());
59
- if (rec.has_value ())
60
- {
61
- // always [l:u] op ---> X ... X (op ∧ X op ∧ ... ∧ X ... X op)
62
- auto from_int = numeric_cast_v<mp_integer>(ranged_always.from ());
55
+ // always [l:u] op ---> X ... X (op ∧ X op ∧ ... ∧ X ... X op)
56
+ auto from_int = numeric_cast_v<mp_integer>(ranged_always.from ());
63
57
64
- // Is there an upper end of the range?
65
- if (ranged_always.to ().is_constant ())
66
- {
67
- // upper end set
68
- auto to_int =
69
- numeric_cast_v<mp_integer>(to_constant_expr (ranged_always.to ()));
70
- PRECONDITION (to_int >= from_int);
71
- auto diff = to_int - from_int;
58
+ // Is there an upper end of the range?
59
+ if (ranged_always.to ().is_constant ())
60
+ {
61
+ // upper end set
62
+ auto to_int =
63
+ numeric_cast_v<mp_integer>(to_constant_expr (ranged_always.to ()));
64
+ PRECONDITION (to_int >= from_int);
65
+ auto diff = to_int - from_int;
72
66
73
- exprt::operandst conjuncts;
67
+ exprt::operandst conjuncts;
74
68
75
- for (auto i = 0 ; i <= diff; i++)
76
- conjuncts.push_back (n_Xes (i, rec. value () ));
69
+ for (auto i = 0 ; i <= diff; i++)
70
+ conjuncts.push_back (n_Xes (i, rec));
77
71
78
- return n_Xes (from_int, conjunction (conjuncts));
79
- }
80
- else if (ranged_always.to ().id () == ID_infinity)
81
- {
82
- // always [l:$] op ---> X ... X G op
83
- return n_Xes (from_int, G_exprt{rec.value ()});
84
- }
85
- else
86
- PRECONDITION (false );
72
+ return n_Xes (from_int, conjunction (conjuncts));
73
+ }
74
+ else if (ranged_always.to ().id () == ID_infinity)
75
+ {
76
+ // always [l:$] op ---> X ... X G op
77
+ return n_Xes (from_int, G_exprt{rec});
87
78
}
88
79
else
89
- return {} ;
80
+ PRECONDITION ( false ) ;
90
81
}
91
82
else if (expr.id () == ID_sva_s_always)
92
83
{
93
84
auto &ranged_always = to_sva_s_always_expr (expr);
94
85
auto rec = SVA_to_LTL (ranged_always.op ());
95
- if (rec.has_value ())
96
- {
97
- // s_always [l:u] op ---> X ... X (op ∧ X op ∧ ... ∧ X ... X op)
98
- auto from_int = numeric_cast_v<mp_integer>(ranged_always.from ());
99
- auto to_int = numeric_cast_v<mp_integer>(ranged_always.to ());
100
- PRECONDITION (to_int >= from_int);
101
- auto diff = to_int - from_int;
102
86
103
- exprt::operandst conjuncts;
87
+ // s_always [l:u] op ---> X ... X (op ∧ X op ∧ ... ∧ X ... X op)
88
+ auto from_int = numeric_cast_v<mp_integer>(ranged_always.from ());
89
+ auto to_int = numeric_cast_v<mp_integer>(ranged_always.to ());
90
+ PRECONDITION (to_int >= from_int);
91
+ auto diff = to_int - from_int;
104
92
105
- for (auto i = 0 ; i <= diff; i++)
106
- conjuncts.push_back (n_Xes (i, rec.value ()));
93
+ exprt::operandst conjuncts;
107
94
108
- return n_Xes (from_int, conjunction (conjuncts));
109
- }
110
- else
111
- return {} ;
95
+ for ( auto i = 0 ; i <= diff; i++)
96
+ conjuncts. push_back ( n_Xes (i, rec));
97
+
98
+ return n_Xes (from_int, conjunction (conjuncts)) ;
112
99
}
113
100
else if (expr.id () == ID_sva_s_eventually)
114
101
{
115
102
auto rec = SVA_to_LTL (to_sva_s_eventually_expr (expr).op ());
116
- if (rec.has_value ())
117
- return F_exprt{rec.value ()};
118
- else
119
- return {};
103
+ return F_exprt{std::move (rec)};
120
104
}
121
105
else if (expr.id () == ID_sva_s_nexttime)
122
106
{
123
107
auto rec = SVA_to_LTL (to_sva_s_nexttime_expr (expr).op ());
124
- if (rec.has_value ())
125
- return X_exprt{rec.value ()};
126
- else
127
- return {};
108
+ return X_exprt{std::move (rec)};
128
109
}
129
110
else if (expr.id () == ID_sva_nexttime)
130
111
{
131
112
auto rec = SVA_to_LTL (to_sva_nexttime_expr (expr).op ());
132
- if (rec.has_value ())
133
- return X_exprt{rec.value ()};
134
- else
135
- return {};
113
+ return X_exprt{std::move (rec)};
136
114
}
137
115
else if (
138
116
expr.id () == ID_sva_overlapped_implication ||
@@ -150,9 +128,6 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
150
128
151
129
auto property_rec = SVA_to_LTL (implication.property ());
152
130
153
- if (!property_rec.has_value ())
154
- return {};
155
-
156
131
for (auto &match : matches)
157
132
{
158
133
const auto overlapped = expr.id () == ID_sva_overlapped_implication;
@@ -163,7 +138,7 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
163
138
else
164
139
{
165
140
auto delay = match.length () + (overlapped ? 0 : 1 ) - 1 ;
166
- auto delayed_property = n_Xes (delay, property_rec. value () );
141
+ auto delayed_property = n_Xes (delay, property_rec);
167
142
conjuncts.push_back (implies_exprt{ltl (match), delayed_property});
168
143
}
169
144
}
@@ -191,9 +166,6 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
191
166
192
167
auto property_rec = SVA_to_LTL (followed_by.property ());
193
168
194
- if (!property_rec.has_value ())
195
- return {};
196
-
197
169
for (auto &match : matches)
198
170
{
199
171
const auto overlapped = expr.id () == ID_sva_overlapped_followed_by;
@@ -204,7 +176,7 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
204
176
else
205
177
{
206
178
auto delay = match.length () + (overlapped ? 0 : 1 ) - 1 ;
207
- auto delayed_property = n_Xes (delay, property_rec. value () );
179
+ auto delayed_property = n_Xes (delay, property_rec);
208
180
disjuncts.push_back (and_exprt{ltl (match), delayed_property});
209
181
}
210
182
}
@@ -252,21 +224,15 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
252
224
auto &until = to_sva_s_until_expr (expr);
253
225
auto rec_lhs = SVA_to_LTL (until.lhs ());
254
226
auto rec_rhs = SVA_to_LTL (until.rhs ());
255
- if (rec_lhs.has_value () && rec_rhs.has_value ())
256
- return U_exprt{rec_lhs.value (), rec_rhs.value ()};
257
- else
258
- return {};
227
+ return U_exprt{rec_lhs, rec_rhs};
259
228
}
260
229
else if (expr.id () == ID_sva_s_until_with)
261
230
{
262
231
// This is release with swapped operands
263
232
auto &until_with = to_sva_s_until_with_expr (expr);
264
233
auto rec_lhs = SVA_to_LTL (until_with.lhs ());
265
234
auto rec_rhs = SVA_to_LTL (until_with.rhs ());
266
- if (rec_lhs.has_value () && rec_rhs.has_value ())
267
- return R_exprt{rec_rhs.value (), rec_lhs.value ()}; // swapped
268
- else
269
- return {};
235
+ return R_exprt{rec_rhs, rec_lhs}; // swapped
270
236
}
271
237
else if (!has_temporal_operator (expr))
272
238
{
@@ -279,9 +245,7 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
279
245
for (auto &op : expr.operands ())
280
246
{
281
247
auto rec = SVA_to_LTL (op);
282
- if (!rec.has_value ())
283
- return {};
284
- op = rec.value ();
248
+ op = rec;
285
249
}
286
250
return expr;
287
251
}
0 commit comments