@@ -20,7 +20,7 @@ std::string id2smv(const irep_idt &id)
20
20
{
21
21
std::string result;
22
22
23
- for (unsigned i = 0 ; i < id.size (); i++)
23
+ for (std:: size_t i = 0 ; i < id.size (); i++)
24
24
{
25
25
const bool first = i == 0 ;
26
26
char ch = id[i];
@@ -60,7 +60,7 @@ void print_smv(const netlistt &netlist, std::ostream &out, literalt a)
60
60
return ;
61
61
}
62
62
63
- unsigned node_nr = a.var_no ();
63
+ std:: size_t node_nr = a.var_no ();
64
64
DATA_INVARIANT (node_nr < netlist.number_of_nodes (), " node_nr in range" );
65
65
66
66
if (a.sign ())
@@ -88,21 +88,35 @@ void print_smv(const netlistt &netlist, std::ostream &out, const exprt &expr)
88
88
symbol_tablet symbol_table;
89
89
namespacet ns{symbol_table};
90
90
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;
92
101
93
- exprt replaced = expr;
94
- replaced.visit_pre (
95
- [&netlist](exprt &node)
102
+ resultt convert_rec (const exprt &expr) override
96
103
{
97
- if (node .id () == ID_literal)
104
+ if (expr .id () == ID_literal)
98
105
{
99
106
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 ()};
102
113
}
103
- });
114
+ else
115
+ return expr2smvt::convert_rec (expr);
116
+ }
117
+ };
104
118
105
- out << expr2smv (replaced, ns );
119
+ out << expr2smv_netlistt{ns, netlist}. convert (expr );
106
120
}
107
121
108
122
void smv_netlist (const netlistt &netlist, std::ostream &out)
@@ -115,17 +129,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
115
129
116
130
auto &var_map = netlist.var_map ;
117
131
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 )
121
133
{
122
- const var_mapt::vart &var = it-> second ;
134
+ const var_mapt::vart &var = var_it. second ;
123
135
124
- for (unsigned i = 0 ; i < var.bits .size (); i++)
136
+ for (std:: size_t i = 0 ; i < var.bits .size (); i++)
125
137
{
126
138
if (var.is_latch ())
127
139
{
128
- out << " VAR " << id2smv (it-> first );
140
+ out << " VAR " << id2smv (var_it. first );
129
141
if (var.bits .size () != 1 )
130
142
out << " [" << i << " ]" ;
131
143
out << " : boolean;" << ' \n ' ;
@@ -137,17 +149,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
137
149
out << " -- Inputs" << ' \n ' ;
138
150
out << ' \n ' ;
139
151
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 )
143
153
{
144
- const var_mapt::vart &var = it-> second ;
154
+ const var_mapt::vart &var = var_it. second ;
145
155
146
- for (unsigned i = 0 ; i < var.bits .size (); i++)
156
+ for (std:: size_t i = 0 ; i < var.bits .size (); i++)
147
157
{
148
158
if (var.is_input ())
149
159
{
150
- out << " VAR " << id2smv (it-> first );
160
+ out << " VAR " << id2smv (var_it. first );
151
161
if (var.bits .size () != 1 )
152
162
out << " [" << i << " ]" ;
153
163
out << " : boolean;" << ' \n ' ;
@@ -161,7 +171,7 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
161
171
162
172
auto &nodes = netlist.nodes ;
163
173
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++)
165
175
{
166
176
const aig_nodet &node = nodes[node_nr];
167
177
@@ -179,17 +189,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
179
189
out << " -- Next state functions" << ' \n ' ;
180
190
out << ' \n ' ;
181
191
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 )
185
193
{
186
- const var_mapt::vart &var = it-> second ;
194
+ const var_mapt::vart &var = var_it. second ;
187
195
188
- for (unsigned i = 0 ; i < var.bits .size (); i++)
196
+ for (std:: size_t i = 0 ; i < var.bits .size (); i++)
189
197
{
190
198
if (var.is_latch ())
191
199
{
192
- out << " ASSIGN next(" << id2smv (it-> first );
200
+ out << " ASSIGN next(" << id2smv (var_it. first );
193
201
if (var.bits .size () != 1 )
194
202
out << " [" << i << " ]" ;
195
203
out << " ):=" ;
@@ -249,29 +257,8 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
249
257
}
250
258
else if (is_SVA (netlist_expr))
251
259
{
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" );
275
262
}
276
263
else
277
264
{
0 commit comments