Skip to content

Commit 84fda78

Browse files
committed
SMV: add a lowering pass
We currently expect that our solver backends support all expressions generated by the SMV-front-end as-is. To avoid introducing additional, redundant expressions, this adds a lowering pass to the SMV type checker. The lowering pass lowers SMV extend, resize, signed, and unsigned expressions to typecast expressions.
1 parent bb675f6 commit 84fda78

File tree

11 files changed

+115
-10
lines changed

11 files changed

+115
-10
lines changed

regression/smv/word/extend1.desc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
KNOWNBUG
1+
CORE
22
extend1.smv
33

4+
^\[p0\] extend\(0ud1_1, 7\) = 0ud8_1: PROVED$
5+
^\[p1\] extend\(-0sd1_1, 7\) = -0sd8_1: PROVED$
46
^EXIT=0$
57
^SIGNAL=0$
68
--

regression/smv/word/extend1.smv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
MODULE main
22

3-
SPEC extend(uwconst(1, 1), 7) = uwconst(1, 8)
4-
SPEC extend(swconst(-1, 1), 7) = swconst(-1, 8)
3+
SPEC NAME p0 := extend(uwconst(1, 1), 7) = uwconst(1, 8)
4+
SPEC NAME p1 := extend(swconst(-1, 1), 7) = swconst(-1, 8)

regression/smv/word/resize1.desc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
KNOWNBUG
1+
CORE
22
resize1.smv
33

4+
^\[p0\] resize\(0ud1_1, 8\) = 0ud8_1: PROVED$
5+
^\[p1\] resize\(-0sd1_1, 1\) = -0sd1_1: PROVED$
46
^EXIT=0$
57
^SIGNAL=0$
68
--

regression/smv/word/resize1.smv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
MODULE main
22

3-
SPEC resize(uwconst(1, 1), 8) = uwconst(1, 8)
4-
SPEC resize(swconst(123, 1), 1) = swconst(-1, 1)
3+
SPEC NAME p0 := resize(uwconst(1, 1), 8) = uwconst(1, 8)
4+
SPEC NAME p1 := resize(swconst(123, 1), 1) = swconst(-1, 1)

regression/smv/word/signed1.desc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
KNOWNBUG
1+
CORE
22
signed1.smv
33

4+
^\[p0\] signed\(0ud1_1\) = -0sd1_1: PROVED$
45
^EXIT=0$
56
^SIGNAL=0$
67
--

regression/smv/word/signed1.smv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
MODULE main
22

3-
SPEC signed(uwconst(1, 1)) = swconst(-1, 1)
3+
SPEC NAME p0 := signed(uwconst(1, 1)) = swconst(-1, 1)

regression/smv/word/unsigned1.desc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
KNOWNBUG
1+
CORE
22
unsigned1.smv
33

4+
^\[p0\] unsigned\(-0sd1_1\) = 0ud1_1: PROVED$
45
^EXIT=0$
56
^SIGNAL=0$
67
--

regression/smv/word/unsigned1.smv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
MODULE main
22

3-
SPEC unsigned(swconst(-1, 1)) = uwconst(1, 1)
3+
SPEC NAME p0 := unsigned(swconst(-1, 1)) = uwconst(1, 1)

src/smvlang/expr2smv.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,43 @@ expr2smvt::resultt expr2smvt::convert_binary(
124124

125125
/*******************************************************************\
126126
127+
Function: expr2smvt::convert_function_application
128+
129+
Inputs:
130+
131+
Outputs:
132+
133+
Purpose:
134+
135+
\*******************************************************************/
136+
137+
expr2smvt::resultt expr2smvt::convert_function_application(
138+
const std::string &symbol,
139+
const exprt &src)
140+
{
141+
bool first = true;
142+
143+
std::string dest = symbol + '(';
144+
145+
for(auto &op : src.operands())
146+
{
147+
if(first)
148+
first = false;
149+
else
150+
{
151+
dest += ',';
152+
dest += ' ';
153+
}
154+
155+
auto op_rec = convert_rec(op);
156+
dest += op_rec.s;
157+
}
158+
159+
return {precedencet::MAX, dest + ')'};
160+
}
161+
162+
/*******************************************************************\
163+
127164
Function: expr2smvt::convert_rtctl
128165
129166
Inputs:
@@ -584,6 +621,18 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
584621
return convert_binary(to_binary_expr(src), ">>", precedencet::SHIFT);
585622
}
586623

624+
else if(src.id() == ID_smv_extend)
625+
return convert_function_application("extend", src);
626+
627+
else if(src.id() == ID_smv_resize)
628+
return convert_function_application("resize", src);
629+
630+
else if(src.id() == ID_smv_signed_cast)
631+
return convert_function_application("signed", src);
632+
633+
else if(src.id() == ID_smv_unsigned_cast)
634+
return convert_function_application("unsigned", src);
635+
587636
else if(src.id() == ID_typecast)
588637
{
589638
return convert_rec(to_typecast_expr(src).op());

src/smvlang/expr2smv_class.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ class expr2smvt
116116

117117
resultt convert_cond(const exprt &);
118118

119+
resultt
120+
convert_function_application(const std::string &symbol, const exprt &);
121+
119122
resultt convert_norep(const exprt &);
120123
};
121124

0 commit comments

Comments
 (0)