Skip to content

Commit 9b692d0

Browse files
authored
Merge pull request #1060 from diffblue/smv-lower
SMV: add a lowering pass
2 parents 1194d7a + 84fda78 commit 9b692d0

11 files changed

+115
-10
lines changed

Diff for: regression/smv/word/extend1.desc

+3-1
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
--

Diff for: regression/smv/word/extend1.smv

+2-2
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)

Diff for: regression/smv/word/resize1.desc

+3-1
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
--

Diff for: regression/smv/word/resize1.smv

+2-2
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)

Diff for: regression/smv/word/signed1.desc

+2-1
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
--

Diff for: regression/smv/word/signed1.smv

+1-1
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)

Diff for: regression/smv/word/unsigned1.desc

+2-1
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
--

Diff for: regression/smv/word/unsigned1.smv

+1-1
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)

Diff for: src/smvlang/expr2smv.cpp

+49
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());

Diff for: src/smvlang/expr2smv_class.h

+3
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

Diff for: src/smvlang/smv_typecheck.cpp

+47
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ class smv_typecheckt:public typecheckt
137137
else
138138
return id;
139139
}
140+
141+
void lower_node(exprt &) const;
142+
143+
void lower(exprt &expr) const
144+
{
145+
expr.visit_post([this](exprt &expr) { lower_node(expr); });
146+
}
140147
};
141148

142149
/*******************************************************************\
@@ -1227,6 +1234,40 @@ void smv_typecheckt::typecheck_expr_rec(exprt &expr, modet mode)
12271234

12281235
/*******************************************************************\
12291236
1237+
Function: smv_typecheckt::lower_node
1238+
1239+
Inputs:
1240+
1241+
Outputs:
1242+
1243+
Purpose:
1244+
1245+
\*******************************************************************/
1246+
1247+
void smv_typecheckt::lower_node(exprt &expr) const
1248+
{
1249+
if(expr.id() == ID_smv_extend)
1250+
{
1251+
auto &binary = to_binary_expr(expr);
1252+
expr = typecast_exprt{binary.lhs(), expr.type()};
1253+
}
1254+
else if(expr.id() == ID_smv_resize)
1255+
{
1256+
auto &binary = to_binary_expr(expr);
1257+
expr = typecast_exprt{binary.lhs(), expr.type()};
1258+
}
1259+
else if(expr.id() == ID_smv_signed_cast)
1260+
{
1261+
expr = typecast_exprt{to_unary_expr(expr).op(), expr.type()};
1262+
}
1263+
else if(expr.id() == ID_smv_unsigned_cast)
1264+
{
1265+
expr = typecast_exprt{to_unary_expr(expr).op(), expr.type()};
1266+
}
1267+
}
1268+
1269+
/*******************************************************************\
1270+
12301271
Function: smv_typecheckt::convert_expr_to
12311272
12321273
Inputs:
@@ -1814,6 +1855,9 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
18141855
transt{ID_trans, conjunction(trans_invar), conjunction(trans_init),
18151856
conjunction(trans_trans), module_symbol.type};
18161857

1858+
// lowering
1859+
lower(module_symbol.value);
1860+
18171861
module_symbol.pretty_name = strip_smv_prefix(module_symbol.name);
18181862

18191863
symbol_table.add(module_symbol);
@@ -1851,6 +1895,9 @@ void smv_typecheckt::convert(smv_parse_treet::modulet &smv_module)
18511895
else
18521896
spec_symbol.pretty_name = strip_smv_prefix(spec_symbol.name);
18531897

1898+
// lowering
1899+
lower(spec_symbol.value);
1900+
18541901
symbol_table.add(spec_symbol);
18551902
}
18561903
}

0 commit comments

Comments
 (0)