@@ -39,100 +39,78 @@ static exprt ltl(const sva_sequence_matcht &match)
3939 return conjunction (conjuncts);
4040}
4141
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)
4544{
4645 // Some SVA is directly mappable to LTL
4746 if (expr.id () == ID_sva_always)
4847 {
4948 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};
5450 }
5551 else if (expr.id () == ID_sva_ranged_always)
5652 {
5753 auto &ranged_always = to_sva_ranged_always_expr (expr);
5854 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 ());
6357
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;
7266
73- exprt::operandst conjuncts;
67+ exprt::operandst conjuncts;
7468
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));
7771
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});
8778 }
8879 else
89- return {} ;
80+ PRECONDITION ( false ) ;
9081 }
9182 else if (expr.id () == ID_sva_s_always)
9283 {
9384 auto &ranged_always = to_sva_s_always_expr (expr);
9485 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;
10286
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;
10492
105- for (auto i = 0 ; i <= diff; i++)
106- conjuncts.push_back (n_Xes (i, rec.value ()));
93+ exprt::operandst conjuncts;
10794
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)) ;
11299 }
113100 else if (expr.id () == ID_sva_s_eventually)
114101 {
115102 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)};
120104 }
121105 else if (expr.id () == ID_sva_s_nexttime)
122106 {
123107 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)};
128109 }
129110 else if (expr.id () == ID_sva_nexttime)
130111 {
131112 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)};
136114 }
137115 else if (
138116 expr.id () == ID_sva_overlapped_implication ||
@@ -150,9 +128,6 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
150128
151129 auto property_rec = SVA_to_LTL (implication.property ());
152130
153- if (!property_rec.has_value ())
154- return {};
155-
156131 for (auto &match : matches)
157132 {
158133 const auto overlapped = expr.id () == ID_sva_overlapped_implication;
@@ -163,16 +138,16 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
163138 else
164139 {
165140 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);
167142 conjuncts.push_back (implies_exprt{ltl (match), delayed_property});
168143 }
169144 }
170145
171146 return conjunction (conjuncts);
172147 }
173- catch (sva_sequence_match_unsupportedt)
148+ catch (sva_sequence_match_unsupportedt error )
174149 {
175- return { };
150+ throw sva_to_ltl_unsupportedt{ std::move (error. expr ) };
176151 }
177152 }
178153 else if (
@@ -191,9 +166,6 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
191166
192167 auto property_rec = SVA_to_LTL (followed_by.property ());
193168
194- if (!property_rec.has_value ())
195- return {};
196-
197169 for (auto &match : matches)
198170 {
199171 const auto overlapped = expr.id () == ID_sva_overlapped_followed_by;
@@ -204,16 +176,16 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
204176 else
205177 {
206178 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);
208180 disjuncts.push_back (and_exprt{ltl (match), delayed_property});
209181 }
210182 }
211183
212184 return disjunction (disjuncts);
213185 }
214- catch (sva_sequence_match_unsupportedt)
186+ catch (sva_sequence_match_unsupportedt error )
215187 {
216- return { };
188+ throw sva_to_ltl_unsupportedt{ std::move (error. expr ) };
217189 }
218190 }
219191 else if (expr.id () == ID_sva_sequence_property)
@@ -242,31 +214,25 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
242214
243215 return disjunction (disjuncts);
244216 }
245- catch (sva_sequence_match_unsupportedt)
217+ catch (sva_sequence_match_unsupportedt error )
246218 {
247- return { };
219+ throw sva_to_ltl_unsupportedt{ std::move (error. expr ) };
248220 }
249221 }
250222 else if (expr.id () == ID_sva_s_until)
251223 {
252224 auto &until = to_sva_s_until_expr (expr);
253225 auto rec_lhs = SVA_to_LTL (until.lhs ());
254226 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};
259228 }
260229 else if (expr.id () == ID_sva_s_until_with)
261230 {
262231 // This is release with swapped operands
263232 auto &until_with = to_sva_s_until_with_expr (expr);
264233 auto rec_lhs = SVA_to_LTL (until_with.lhs ());
265234 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
270236 }
271237 else if (!has_temporal_operator (expr))
272238 {
@@ -279,12 +245,12 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
279245 for (auto &op : expr.operands ())
280246 {
281247 auto rec = SVA_to_LTL (op);
282- if (!rec.has_value ())
283- return {};
284- op = rec.value ();
248+ op = rec;
285249 }
286250 return expr;
287251 }
288252 else
289- return {};
253+ {
254+ throw sva_to_ltl_unsupportedt{std::move (expr)};
255+ }
290256}
0 commit comments