Skip to content

Commit 604f03c

Browse files
committed
SVA-to-Buechi: eventually
This adds support for SVA eventually to the SVA-to-Buechi translation.
1 parent 1ef4ad1 commit 604f03c

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
../../verilog/SVA/eventually1.sv
3+
--buechi --bound 20
4+
^\[main\.p0\] always \(main\.counter == 1 implies \(eventually \[1:2\] main\.counter == 3\)\): PROVED up to bound 20$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
8+
^warning: ignoring
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
../../verilog/SVA/eventually2.sv
3+
--buechi --bound 20
4+
^\[main\.p0\] always \(eventually \[0:2\] main\.counter == 3\): REFUTED$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
--
8+
^warning: ignoring

src/temporal-logic/ltl_sva_to_string.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,20 +184,21 @@ ltl_sva_to_stringt::rec(const exprt &expr, modet mode)
184184
PRECONDITION(mode == PROPERTY);
185185
return prefix("F", expr, mode);
186186
}
187-
else if(expr.id() == ID_sva_ranged_s_eventually)
187+
else if(
188+
expr.id() == ID_sva_ranged_s_eventually || expr.id() == ID_sva_eventually)
188189
{
189190
PRECONDITION(mode == PROPERTY);
190-
auto &s_eventually = to_sva_ranged_s_eventually_expr(expr);
191-
auto new_expr = unary_exprt{ID_sva_ranged_s_eventually, s_eventually.op()};
192-
auto lower = numeric_cast_v<mp_integer>(s_eventually.lower());
193-
if(!s_eventually.is_range())
191+
auto &eventually = to_sva_ranged_predicate_exprt(expr);
192+
auto new_expr = unary_exprt{expr.id(), eventually.op()};
193+
auto lower = numeric_cast_v<mp_integer>(eventually.lower());
194+
if(!eventually.is_range())
194195
return prefix("F[" + integer2string(lower) + "]", new_expr, mode);
195-
else if(s_eventually.is_unbounded())
196+
else if(eventually.is_unbounded())
196197
return prefix("F[" + integer2string(lower) + ":]", new_expr, mode);
197198
else
198199
{
199200
auto upper =
200-
numeric_cast_v<mp_integer>(to_constant_expr(s_eventually.upper()));
201+
numeric_cast_v<mp_integer>(to_constant_expr(eventually.upper()));
201202
return prefix(
202203
"F[" + integer2string(lower) + ":" + integer2string(upper) + "]",
203204
new_expr,

src/verilog/sva_expr.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,20 @@ class sva_ranged_predicate_exprt : public ternary_exprt
330330
using ternary_exprt::op2;
331331
};
332332

333+
static inline const sva_ranged_predicate_exprt &
334+
to_sva_ranged_predicate_exprt(const exprt &expr)
335+
{
336+
sva_ranged_predicate_exprt::check(expr, validation_modet::INVARIANT);
337+
return static_cast<const sva_ranged_predicate_exprt &>(expr);
338+
}
339+
340+
static inline sva_ranged_predicate_exprt &
341+
to_sva_ranged_predicate_exprt(exprt &expr)
342+
{
343+
sva_ranged_predicate_exprt::check(expr, validation_modet::INVARIANT);
344+
return static_cast<sva_ranged_predicate_exprt &>(expr);
345+
}
346+
333347
/// A specialisation of sva_ranged_predicate_exprt where both bounds
334348
/// are constants.
335349
class sva_bounded_range_predicate_exprt : public sva_ranged_predicate_exprt

0 commit comments

Comments
 (0)