Skip to content

Commit dc2efe2

Browse files
committed
SVA-to-LTL: [*n], [*n:m]
This adds a conversion for the SVA sequence operators [*n] and [*n:m] to LTL.
1 parent 2edd9ab commit dc2efe2

File tree

5 files changed

+94
-0
lines changed

5 files changed

+94
-0
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
CORE
2+
sequence_repetition1.sv
3+
--bdd
4+
^\[.*\] main\.half_x == 0 \[\*2\]: PROVED$
5+
^\[.*\] main\.half_x == 0 \[->2\]: FAILURE: property not supported by BDD engine$
6+
^\[.*\] main\.half_x == 0 \[=2\]: FAILURE: property not supported by BDD engine$
7+
^\[.*\] main\.x == 0 \[\*2\]: REFUTED$
8+
^\[.*\] main\.x == 0 \[->2\]: FAILURE: property not supported by BDD engine$
9+
^\[.*\] main\.x == 0 \[=2\]: FAILURE: property not supported by BDD engine$
10+
^EXIT=10$
11+
^SIGNAL=0$
12+
--
13+
--
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
sequence_repetition3.sv
3+
--bdd
4+
^\[main\.p0\] \(main\.x == 0 \[\*1\]\) #=# \(main\.x == 1 \[\*1\]\): PROVED$
5+
^\[main\.p1\] \(main\.half_x == 0 \[\*2\]\) #=# \(main\.half_x == 1 \[\*2\]\): PROVED$
6+
^\[main\.p2\] main\.half_x == 0 \[\*3\]: REFUTED$
7+
^EXIT=10$
8+
^SIGNAL=0$
9+
--
10+
^warning: ignoring
11+
--
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
sequence_repetition4.sv
3+
--bdd
4+
^\[main\.p0\] \(main\.x == 0 ##1 main\.x == 1\) \[\*2\]: PROVED$
5+
^\[main\.p1\] \(main\.x == 0 ##1 main\.x == 1 ##1 main\.x == 0\) \[\*2\]: REFUTED$
6+
^EXIT=10$
7+
^SIGNAL=0$
8+
--
9+
^warning: ignoring
10+
--
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CORE
2+
sequence_repetition7.sv
3+
--bdd
4+
^\[.*\] \(main\.a ##1 main\.b\) \[\*5\]: PROVED$
5+
^\[.*\] \(\!main\.b ##1 \!main\.a\) \[\*5\]: PROVED$
6+
^EXIT=0$
7+
^SIGNAL=0$
8+
--
9+
--

src/temporal-logic/sva_to_ltl.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@ ltl_sequence_matcht concat(ltl_sequence_matcht a, const ltl_sequence_matcht &b)
7979
return a;
8080
}
8181

82+
// nonoverlapping concatenation
83+
ltl_sequence_matcht repeat(ltl_sequence_matcht m, const mp_integer &n)
84+
{
85+
ltl_sequence_matcht result;
86+
for(mp_integer i = 0; i < n; ++i)
87+
result.cond_vector.insert(
88+
result.cond_vector.end(), m.cond_vector.begin(), m.cond_vector.end());
89+
return result;
90+
}
91+
8292
// overlapping concatenation
8393
ltl_sequence_matcht
8494
overlapping_concat(ltl_sequence_matcht a, ltl_sequence_matcht b)
@@ -121,6 +131,47 @@ std::vector<ltl_sequence_matcht> LTL_sequence_matches(const exprt &sequence)
121131
}
122132
return result;
123133
}
134+
else if(sequence.id() == ID_sva_sequence_repetition_star) // [*n], [*n:m]
135+
{
136+
auto &repetition = to_sva_sequence_repetition_star_expr(sequence);
137+
auto matches_op = LTL_sequence_matches(repetition.op());
138+
139+
if(matches_op.empty())
140+
return {};
141+
142+
std::vector<ltl_sequence_matcht> result;
143+
144+
if(repetition.repetitions_given())
145+
{
146+
if(repetition.is_range())
147+
{
148+
if(repetition.is_unbounded()) // [*n:$]
149+
{
150+
return {}; // no support
151+
}
152+
else // [*n:m]
153+
{
154+
auto from = numeric_cast_v<mp_integer>(repetition.from());
155+
auto to = numeric_cast_v<mp_integer>(repetition.to());
156+
157+
for(mp_integer n = from; n < to; ++n)
158+
for(auto &match_op : matches_op)
159+
result.push_back(repeat(match_op, n));
160+
}
161+
}
162+
else // [*n]
163+
{
164+
auto n = numeric_cast_v<mp_integer>(repetition.repetitions());
165+
166+
for(auto &match_op : matches_op)
167+
result.push_back(repeat(match_op, n));
168+
}
169+
}
170+
else // [*]
171+
return {}; // no support
172+
173+
return result;
174+
}
124175
else if(sequence.id() == ID_sva_cycle_delay)
125176
{
126177
auto &delay = to_sva_cycle_delay_expr(sequence);

0 commit comments

Comments
 (0)