Skip to content

Commit 9996699

Browse files
committed
Introduce sva_sequence_repetition_exprt
This introduces sva_sequence_repetition_exprt as a base class for the SVA repetition operators [*...], [=...], [->...].
1 parent 78d038d commit 9996699

File tree

6 files changed

+132
-141
lines changed

6 files changed

+132
-141
lines changed

src/trans-word-level/sequence.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ sequence_matchest instantiate_sequence(
277277
{
278278
// x[*n] is syntactic sugar for x ##1 ... ##1 x, with n repetitions
279279
auto &repetition = to_sva_sequence_consecutive_repetition_expr(expr);
280-
return instantiate_sequence(repetition.lower(), t, no_timeframes);
280+
return instantiate_sequence(repetition.repetitions(), t, no_timeframes);
281281
}
282282
else if(
283283
expr.id() == ID_sva_sequence_repetition_plus ||

src/verilog/expr2verilog.cpp

+21-43
Original file line numberDiff line numberDiff line change
@@ -608,31 +608,6 @@ expr2verilogt::resultt expr2verilogt::convert_sva_binary(
608608

609609
/*******************************************************************\
610610
611-
Function: expr2verilogt::convert_sva_binary_repetition
612-
613-
Inputs:
614-
615-
Outputs:
616-
617-
Purpose:
618-
619-
\*******************************************************************/
620-
621-
expr2verilogt::resultt expr2verilogt::convert_sva_binary_repetition(
622-
const std::string &name,
623-
const binary_exprt &expr)
624-
{
625-
auto op0 = convert_rec(expr.lhs());
626-
if(op0.p == verilog_precedencet::MIN)
627-
op0.s = "(" + op0.s + ")";
628-
629-
auto op1 = convert_rec(expr.rhs());
630-
631-
return {verilog_precedencet::MIN, op0.s + " " + name + op1.s + "]"};
632-
}
633-
634-
/*******************************************************************\
635-
636611
Function: expr2verilogt::convert_sva_sequence_consecutive_repetition
637612
638613
Inputs:
@@ -643,20 +618,27 @@ Function: expr2verilogt::convert_sva_sequence_consecutive_repetition
643618
644619
\*******************************************************************/
645620

646-
expr2verilogt::resultt
647-
expr2verilogt::convert_sva_sequence_consecutive_repetition(
648-
const sva_sequence_consecutive_repetition_exprt &expr)
621+
expr2verilogt::resultt expr2verilogt::convert_sva_sequence_repetition(
622+
const std::string &name,
623+
const sva_sequence_repetition_exprt &expr)
649624
{
650625
auto op = convert_rec(expr.op());
651626
if(op.p == verilog_precedencet::MIN)
652627
op.s = "(" + op.s + ")";
653628

654-
std::string dest = op.s + " [*" + convert_rec(expr.from()).s;
629+
std::string dest = op.s + " [" + name;
630+
631+
if(expr.is_range())
632+
{
633+
dest += convert_rec(expr.from()).s;
655634

656-
if(expr.is_unbounded())
657-
dest += ":$";
658-
else if(expr.to().is_not_nil())
659-
dest += ":" + convert_rec(expr.to()).s;
635+
if(expr.is_unbounded())
636+
dest += ":$";
637+
else
638+
dest += ":" + convert_rec(expr.to()).s;
639+
}
640+
else
641+
dest += convert_rec(expr.repetitions()).s;
660642

661643
dest += ']';
662644

@@ -1877,20 +1859,16 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
18771859
// not sure about precedence
18781860

18791861
else if(src.id() == ID_sva_sequence_non_consecutive_repetition)
1880-
return precedence = verilog_precedencet::MIN,
1881-
convert_sva_binary_repetition(
1882-
"[=", to_sva_sequence_non_consecutive_repetition_expr(src));
1883-
// not sure about precedence
1862+
return convert_sva_sequence_repetition(
1863+
"=", to_sva_sequence_non_consecutive_repetition_expr(src));
18841864

18851865
else if(src.id() == ID_sva_sequence_consecutive_repetition)
1886-
return convert_sva_sequence_consecutive_repetition(
1887-
to_sva_sequence_consecutive_repetition_expr(src));
1866+
return convert_sva_sequence_repetition(
1867+
"*", to_sva_sequence_consecutive_repetition_expr(src));
18881868

18891869
else if(src.id() == ID_sva_sequence_goto_repetition)
1890-
return precedence = verilog_precedencet::MIN,
1891-
convert_sva_binary_repetition(
1892-
"[->", to_sva_sequence_goto_repetition_expr(src));
1893-
// not sure about precedence
1870+
return convert_sva_sequence_repetition(
1871+
"->", to_sva_sequence_goto_repetition_expr(src));
18941872

18951873
else if(src.id() == ID_sva_ranged_always)
18961874
{

src/verilog/expr2verilog_class.h

+4-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class sva_abort_exprt;
1616
class sva_case_exprt;
1717
class sva_if_exprt;
1818
class sva_ranged_predicate_exprt;
19-
class sva_sequence_consecutive_repetition_exprt;
19+
class sva_sequence_repetition_exprt;
2020
class sva_sequence_first_match_exprt;
2121

2222
// Precedences (higher means binds more strongly).
@@ -137,11 +137,9 @@ class expr2verilogt
137137

138138
resultt convert_sva_binary(const std::string &name, const binary_exprt &);
139139

140-
resultt
141-
convert_sva_binary_repetition(const std::string &name, const binary_exprt &);
142-
143-
resultt convert_sva_sequence_consecutive_repetition(
144-
const sva_sequence_consecutive_repetition_exprt &);
140+
resultt convert_sva_sequence_repetition(
141+
const std::string &name,
142+
const sva_sequence_repetition_exprt &);
145143

146144
resultt convert_sva_abort(const std::string &name, const sva_abort_exprt &);
147145

src/verilog/sva_expr.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ exprt sva_sequence_consecutive_repetition_exprt::lower() const
4444
PRECONDITION(
4545
op().type().id() == ID_bool || op().type().id() == ID_verilog_sva_sequence);
4646

47-
if(to().is_nil())
47+
if(!is_range())
4848
{
4949
// expand x[*n] into x ##1 x ##1 ...
50-
auto n = numeric_cast_v<mp_integer>(to_constant_expr(from()));
50+
auto n = numeric_cast_v<mp_integer>(repetitions());
5151
DATA_INVARIANT(n >= 1, "number of repetitions must be at least one");
5252

5353
exprt result = op();
@@ -66,11 +66,11 @@ exprt sva_sequence_consecutive_repetition_exprt::lower() const
6666
{
6767
PRECONDITION(false);
6868
}
69-
else
69+
else // bounded range
7070
{
7171
// expand x[*a:b] into x[*a] or x[*a+1] or ... or x[*b]
72-
auto from_int = numeric_cast_v<mp_integer>(to_constant_expr(from()));
73-
auto to_int = numeric_cast_v<mp_integer>(to_constant_expr(to()));
72+
auto from_int = numeric_cast_v<mp_integer>(from());
73+
auto to_int = numeric_cast_v<mp_integer>(to());
7474

7575
DATA_INVARIANT(from_int >= 1, "number of repetitions must be at least one");
7676
DATA_INVARIANT(

0 commit comments

Comments
 (0)