Skip to content

Commit 2b65db0

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 6732c86 commit 2b65db0

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_sequence_match.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ sva_sequence_matcht concat(sva_sequence_matcht a, const sva_sequence_matcht &b)
2929
return a;
3030
}
3131

32+
// nonoverlapping concatenation
33+
sva_sequence_matcht repeat(sva_sequence_matcht m, const mp_integer &n)
34+
{
35+
sva_sequence_matcht result;
36+
for(mp_integer i = 0; i < n; ++i)
37+
result.cond_vector.insert(
38+
result.cond_vector.end(), m.cond_vector.begin(), m.cond_vector.end());
39+
return result;
40+
}
41+
3242
// overlapping concatenation
3343
sva_sequence_matcht
3444
overlapping_concat(sva_sequence_matcht a, sva_sequence_matcht b)
@@ -71,6 +81,47 @@ std::vector<sva_sequence_matcht> LTL_sequence_matches(const exprt &sequence)
7181
}
7282
return result;
7383
}
84+
else if(sequence.id() == ID_sva_sequence_repetition_star) // [*n], [*n:m]
85+
{
86+
auto &repetition = to_sva_sequence_repetition_star_expr(sequence);
87+
auto matches_op = LTL_sequence_matches(repetition.op());
88+
89+
if(matches_op.empty())
90+
return {};
91+
92+
std::vector<sva_sequence_matcht> result;
93+
94+
if(repetition.repetitions_given())
95+
{
96+
if(repetition.is_range())
97+
{
98+
if(repetition.is_unbounded()) // [*n:$]
99+
{
100+
return {}; // no support
101+
}
102+
else // [*n:m]
103+
{
104+
auto from = numeric_cast_v<mp_integer>(repetition.from());
105+
auto to = numeric_cast_v<mp_integer>(repetition.to());
106+
107+
for(mp_integer n = from; n < to; ++n)
108+
for(auto &match_op : matches_op)
109+
result.push_back(repeat(match_op, n));
110+
}
111+
}
112+
else // [*n]
113+
{
114+
auto n = numeric_cast_v<mp_integer>(repetition.repetitions());
115+
116+
for(auto &match_op : matches_op)
117+
result.push_back(repeat(match_op, n));
118+
}
119+
}
120+
else // [*]
121+
return {}; // no support
122+
123+
return result;
124+
}
74125
else if(sequence.id() == ID_sva_cycle_delay)
75126
{
76127
auto &delay = to_sva_cycle_delay_expr(sequence);

0 commit comments

Comments
 (0)