Skip to content

Commit b4375fc

Browse files
committed
fix trivial_sva(...)
The rewrites in trivial_sva that depend on the operands must be done post-traversal, not pre-traversal.
1 parent a81b944 commit b4375fc

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

src/temporal-logic/trivial_sva.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ static std::optional<exprt> is_state_predicate(const exprt &expr)
2323
exprt trivial_sva(exprt expr)
2424
{
2525
// pre-traversal
26+
27+
// rewrite the operands, recursively
28+
for(auto &op : expr.operands())
29+
op = trivial_sva(op);
30+
31+
// post-traversal
2632
if(expr.id() == ID_sva_overlapped_implication)
2733
{
2834
// Same as regular implication if lhs and rhs are not sequences.
@@ -115,13 +121,7 @@ exprt trivial_sva(exprt expr)
115121
{
116122
expr = to_sva_case_expr(expr).lower();
117123
}
118-
119-
// rewrite the operands, recursively
120-
for(auto &op : expr.operands())
121-
op = trivial_sva(op);
122-
123-
// post-traversal
124-
if(
124+
else if(
125125
expr.id() == ID_sva_weak || expr.id() == ID_sva_strong ||
126126
expr.id() == ID_sva_implicit_weak || expr.id() == ID_sva_implicit_strong)
127127
{

unit/temporal-logic/trivial_sva.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ SCENARIO("Simplifying a trivial SVA formula")
5454
trivial_sva(weak(sva_and_exprt{
5555
sva_and_exprt{seq(p), seq(q), sequence_type}})) == and_exprt{p, q});
5656

57-
// The below fails
58-
// REQUIRE(trivial_sva(weak(sva_and_exprt{sva_and_exprt{p_seq, sva_or_exprt{q_seq, r_seq, sequence_type}, sequence_type}})) == and_exprt{p, or_exprt{q, r}});
57+
REQUIRE(
58+
trivial_sva(weak(sva_and_exprt{sva_and_exprt{
59+
seq(p),
60+
sva_or_exprt{seq(q), seq(r), sequence_type},
61+
sequence_type}})) == and_exprt{p, or_exprt{q, r}});
5962
}
6063
}

0 commit comments

Comments
 (0)