@@ -41,18 +41,50 @@ exprt sva_case_exprt::lowering() const
4141
4242exprt sva_sequence_consecutive_repetition_exprt::lower () const
4343{
44- auto n = numeric_cast_v<mp_integer>(to_constant_expr (rhs ()));
45- DATA_INVARIANT (n >= 1 , " number of repetitions must be at least one" );
44+ PRECONDITION (op ().type ().id () == ID_bool);
4645
47- exprt result = lhs ();
46+ if (to ().is_nil ())
47+ {
48+ // expand x[*n] into x ##1 x ##1 ...
49+ auto n = numeric_cast_v<mp_integer>(to_constant_expr (from ()));
50+ DATA_INVARIANT (n >= 1 , " number of repetitions must be at least one" );
51+
52+ exprt result = op ();
53+
54+ for (; n >= 2 ; --n)
55+ {
56+ auto cycle_delay =
57+ sva_cycle_delay_exprt{from_integer (1 , integer_typet{}), op ()};
58+ result = sva_sequence_concatenation_exprt{
59+ std::move (result), std::move (cycle_delay)};
60+ }
4861
49- for (; n >= 2 ; --n)
62+ return result;
63+ }
64+ else if (is_unbounded ())
5065 {
51- auto cycle_delay =
52- sva_cycle_delay_exprt{from_integer (1 , integer_typet{}), lhs ()};
53- result = sva_sequence_concatenation_exprt{
54- std::move (result), std::move (cycle_delay)};
66+ PRECONDITION (false );
5567 }
68+ else
69+ {
70+ // expand x[*a:b] into x[*a] or x[*a+1] or ... or x[*b]
71+ auto from_int = numeric_cast_v<mp_integer>(to_constant_expr (from ()));
72+ auto to_int = numeric_cast_v<mp_integer>(to_constant_expr (to ()));
5673
57- return result;
74+ DATA_INVARIANT (from_int >= 1 , " number of repetitions must be at least one" );
75+ DATA_INVARIANT (
76+ to_int >= from_int, " number of repetitions must be interval" );
77+
78+ exprt result = sva_sequence_consecutive_repetition_exprt{op (), from ()};
79+
80+ for (mp_integer n = from_int + 1 ; n <= to_int; ++n)
81+ {
82+ auto n_expr = from_integer (n, integer_typet{});
83+ result = sva_or_exprt{
84+ std::move (result),
85+ sva_sequence_consecutive_repetition_exprt{op (), n_expr}};
86+ }
87+
88+ return result;
89+ }
5890}
0 commit comments