Skip to content

Commit bb675f6

Browse files
authored
Merge pull request #1058 from diffblue/smv_netlist2
smv-netlist: use expr2smv for property
2 parents 6420029 + 9d6b2be commit bb675f6

File tree

7 files changed

+89
-72
lines changed

7 files changed

+89
-72
lines changed

regression/ebmc/smv-netlist/smv1.desc

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
smv1.smv
3+
--smv-netlist
4+
^MODULE main$
5+
^VAR smv\.main\.var\.x: boolean;$
6+
^ASSIGN next\(smv\.main\.var\.x\):=\!smv\.main\.var\.x;$
7+
^INIT !smv\.main\.var\.x$
8+
^EXIT=0$
9+
^SIGNAL=0$
10+
--

regression/ebmc/smv-netlist/smv1.smv

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
MODULE main
2+
3+
VAR x: boolean;
4+
5+
ASSIGN next(x):=!x;
6+
ASSIGN init(x):=FALSE;
7+
8+
LTLSPEC G F x
9+
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
verilog1.sv
3+
--smv-netlist
4+
^MODULE main$
5+
^VAR Verilog\.main\.x: boolean;$
6+
^ASSIGN next\(Verilog\.main\.x\):=\!Verilog\.main\.x;$
7+
^INIT !Verilog\.main\.x$
8+
^LTLSPEC G F Verilog\.main\.x$
9+
^EXIT=0$
10+
^SIGNAL=0$
11+
--
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module main(input clk);
2+
3+
reg x;
4+
5+
initial x = 0;
6+
7+
always @(posedge clk)
8+
x = !x;
9+
10+
always assert property (always s_eventually x);
11+
12+
endmodule

src/ebmc/bdd_engine.cpp

+3-5
Original file line numberDiff line numberDiff line change
@@ -1054,12 +1054,10 @@ void bdd_enginet::build_BDDs()
10541054
auto netlist_property = netlist.properties.find(property.identifier);
10551055
CHECK_RETURN(netlist_property != netlist.properties.end());
10561056
DATA_INVARIANT(
1057-
netlist_property->second.id() == ID_sva_always,
1058-
"assumed property must be sva_always");
1059-
auto &p = to_sva_always_expr(netlist_property->second).op();
1057+
netlist_property->second.id() == ID_G, "assumed property must be G");
1058+
auto &p = to_G_expr(netlist_property->second).op();
10601059
DATA_INVARIANT(
1061-
p.id() == ID_literal,
1062-
"assumed property must be sva_assume sva_assert literal");
1060+
p.id() == ID_literal, "assumed property must be G literal");
10631061
auto l = to_literal_expr(p).get_literal();
10641062
constraints_BDDs.push_back(aig2bdd(l, BDDs));
10651063
}

src/trans-netlist/instantiate_netlist.cpp

+4-14
Original file line numberDiff line numberDiff line change
@@ -311,20 +311,10 @@ std::optional<exprt> netlist_property(
311311
}
312312
else if(is_SVA_operator(expr))
313313
{
314-
if(expr.id() == ID_sva_always || expr.id() == ID_sva_assume)
315-
{
316-
auto copy = expr;
317-
auto &op = to_unary_expr(copy).op();
318-
auto op_opt =
319-
netlist_property(solver, var_map, op, ns, message_handler);
320-
if(op_opt.has_value())
321-
{
322-
op = op_opt.value();
323-
return copy;
324-
}
325-
else
326-
return {};
327-
}
314+
// Try to turn into LTL
315+
auto LTL_opt = SVA_to_LTL(expr);
316+
if(LTL_opt.has_value())
317+
return netlist_property(solver, var_map, *LTL_opt, ns, message_handler);
328318
else
329319
return {};
330320
}

src/trans-netlist/smv_netlist.cpp

+40-53
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ std::string id2smv(const irep_idt &id)
2020
{
2121
std::string result;
2222

23-
for(unsigned i = 0; i < id.size(); i++)
23+
for(std::size_t i = 0; i < id.size(); i++)
2424
{
2525
const bool first = i == 0;
2626
char ch = id[i];
@@ -60,7 +60,7 @@ void print_smv(const netlistt &netlist, std::ostream &out, literalt a)
6060
return;
6161
}
6262

63-
unsigned node_nr = a.var_no();
63+
std::size_t node_nr = a.var_no();
6464
DATA_INVARIANT(node_nr < netlist.number_of_nodes(), "node_nr in range");
6565

6666
if(a.sign())
@@ -88,21 +88,35 @@ void print_smv(const netlistt &netlist, std::ostream &out, const exprt &expr)
8888
symbol_tablet symbol_table;
8989
namespacet ns{symbol_table};
9090

91-
// replace literal expressions by symbols
91+
class expr2smv_netlistt : public expr2smvt
92+
{
93+
public:
94+
expr2smv_netlistt(const namespacet &ns, const netlistt &__netlist)
95+
: expr2smvt(ns), netlist(__netlist)
96+
{
97+
}
98+
99+
protected:
100+
const netlistt &netlist;
92101

93-
exprt replaced = expr;
94-
replaced.visit_pre(
95-
[&netlist](exprt &node)
102+
resultt convert_rec(const exprt &expr) override
96103
{
97-
if(node.id() == ID_literal)
104+
if(expr.id() == ID_literal)
98105
{
99106
std::ostringstream buffer;
100-
print_smv(netlist, buffer, to_literal_expr(node).get_literal());
101-
node = symbol_exprt{buffer.str(), node.type()};
107+
auto l = to_literal_expr(expr).get_literal();
108+
print_smv(netlist, buffer, l);
109+
if(l.sign())
110+
return {precedencet::NOT, buffer.str()};
111+
else
112+
return {precedencet::MAX, buffer.str()};
102113
}
103-
});
114+
else
115+
return expr2smvt::convert_rec(expr);
116+
}
117+
};
104118

105-
out << expr2smv(replaced, ns);
119+
out << expr2smv_netlistt{ns, netlist}.convert(expr);
106120
}
107121

108122
void smv_netlist(const netlistt &netlist, std::ostream &out)
@@ -115,17 +129,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
115129

116130
auto &var_map = netlist.var_map;
117131

118-
for(var_mapt::mapt::const_iterator it = var_map.map.begin();
119-
it != var_map.map.end();
120-
it++)
132+
for(auto &var_it : var_map.map)
121133
{
122-
const var_mapt::vart &var = it->second;
134+
const var_mapt::vart &var = var_it.second;
123135

124-
for(unsigned i = 0; i < var.bits.size(); i++)
136+
for(std::size_t i = 0; i < var.bits.size(); i++)
125137
{
126138
if(var.is_latch())
127139
{
128-
out << "VAR " << id2smv(it->first);
140+
out << "VAR " << id2smv(var_it.first);
129141
if(var.bits.size() != 1)
130142
out << "[" << i << "]";
131143
out << ": boolean;" << '\n';
@@ -137,17 +149,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
137149
out << "-- Inputs" << '\n';
138150
out << '\n';
139151

140-
for(var_mapt::mapt::const_iterator it = var_map.map.begin();
141-
it != var_map.map.end();
142-
it++)
152+
for(auto &var_it : var_map.map)
143153
{
144-
const var_mapt::vart &var = it->second;
154+
const var_mapt::vart &var = var_it.second;
145155

146-
for(unsigned i = 0; i < var.bits.size(); i++)
156+
for(std::size_t i = 0; i < var.bits.size(); i++)
147157
{
148158
if(var.is_input())
149159
{
150-
out << "VAR " << id2smv(it->first);
160+
out << "VAR " << id2smv(var_it.first);
151161
if(var.bits.size() != 1)
152162
out << "[" << i << "]";
153163
out << ": boolean;" << '\n';
@@ -161,7 +171,7 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
161171

162172
auto &nodes = netlist.nodes;
163173

164-
for(unsigned node_nr = 0; node_nr < nodes.size(); node_nr++)
174+
for(std::size_t node_nr = 0; node_nr < nodes.size(); node_nr++)
165175
{
166176
const aig_nodet &node = nodes[node_nr];
167177

@@ -179,17 +189,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
179189
out << "-- Next state functions" << '\n';
180190
out << '\n';
181191

182-
for(var_mapt::mapt::const_iterator it = var_map.map.begin();
183-
it != var_map.map.end();
184-
it++)
192+
for(auto &var_it : var_map.map)
185193
{
186-
const var_mapt::vart &var = it->second;
194+
const var_mapt::vart &var = var_it.second;
187195

188-
for(unsigned i = 0; i < var.bits.size(); i++)
196+
for(std::size_t i = 0; i < var.bits.size(); i++)
189197
{
190198
if(var.is_latch())
191199
{
192-
out << "ASSIGN next(" << id2smv(it->first);
200+
out << "ASSIGN next(" << id2smv(var_it.first);
193201
if(var.bits.size() != 1)
194202
out << "[" << i << "]";
195203
out << "):=";
@@ -249,29 +257,8 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
249257
}
250258
else if(is_SVA(netlist_expr))
251259
{
252-
if(is_SVA_always_p(netlist_expr))
253-
{
254-
out << "-- " << id << '\n';
255-
out << "CTLSPEC AG ";
256-
print_smv(netlist, out, to_sva_always_expr(netlist_expr).op());
257-
out << '\n';
258-
}
259-
else if(is_SVA_always_s_eventually_p(netlist_expr))
260-
{
261-
out << "-- " << id << '\n';
262-
out << "CTLSPEC AG AF ";
263-
print_smv(
264-
netlist,
265-
out,
266-
to_sva_s_eventually_expr(to_sva_always_expr(netlist_expr).op()).op());
267-
out << '\n';
268-
}
269-
else
270-
{
271-
out << "-- " << id << '\n';
272-
out << "-- not translated\n";
273-
out << '\n';
274-
}
260+
// Should have been mapped to LTL
261+
DATA_INVARIANT(false, "smv_netlist got SVA");
275262
}
276263
else
277264
{

0 commit comments

Comments
 (0)