Skip to content

Commit 0ab525a

Browse files
authored
Merge pull request #1080 from diffblue/sva_sequence_repetition_exprt
Introduce `sva_sequence_repetition_exprt`
2 parents 06125e7 + 649411d commit 0ab525a

File tree

6 files changed

+170
-162
lines changed

6 files changed

+170
-162
lines changed

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/parser.y

+18-2
Original file line numberDiff line numberDiff line change
@@ -2707,12 +2707,28 @@ consecutive_repetition:
27072707

27082708
non_consecutive_repetition:
27092709
"[=" const_or_range_expression ']'
2710-
{ init($$, ID_sva_sequence_non_consecutive_repetition); mto($$, $2); }
2710+
{ init($$, ID_sva_sequence_non_consecutive_repetition);
2711+
if(stack_expr($2).id() == ID_sva_cycle_delay)
2712+
swapop($$, $2);
2713+
else
2714+
{
2715+
mto($$, $2);
2716+
stack_expr($$).add_to_operands(nil_exprt{});
2717+
}
2718+
}
27112719
;
27122720

27132721
goto_repetition:
27142722
"[->" const_or_range_expression ']'
2715-
{ init($$, ID_sva_sequence_goto_repetition); mto($$, $2); }
2723+
{ init($$, ID_sva_sequence_goto_repetition);
2724+
if(stack_expr($2).id() == ID_sva_cycle_delay)
2725+
swapop($$, $2);
2726+
else
2727+
{
2728+
mto($$, $2);
2729+
stack_expr($$).add_to_operands(nil_exprt{});
2730+
}
2731+
}
27162732
;
27172733

27182734
cycle_delay_range:

src/verilog/sva_expr.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ exprt sva_sequence_consecutive_repetition_exprt::lower() const
6262
PRECONDITION(
6363
op().type().id() == ID_bool || op().type().id() == ID_verilog_sva_sequence);
6464

65-
if(to().is_nil())
65+
if(!is_range())
6666
{
6767
// expand x[*n] into x ##1 x ##1 ...
68-
auto n = numeric_cast_v<mp_integer>(to_constant_expr(from()));
68+
auto n = numeric_cast_v<mp_integer>(repetitions());
6969
DATA_INVARIANT(n >= 1, "number of repetitions must be at least one");
7070

7171
exprt result = op();
@@ -84,11 +84,11 @@ exprt sva_sequence_consecutive_repetition_exprt::lower() const
8484
{
8585
PRECONDITION(false);
8686
}
87-
else
87+
else // bounded range
8888
{
8989
// expand x[*a:b] into x[*a] or x[*a+1] or ... or x[*b]
90-
auto from_int = numeric_cast_v<mp_integer>(to_constant_expr(from()));
91-
auto to_int = numeric_cast_v<mp_integer>(to_constant_expr(to()));
90+
auto from_int = numeric_cast_v<mp_integer>(from());
91+
auto to_int = numeric_cast_v<mp_integer>(to());
9292

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

0 commit comments

Comments
 (0)