Skip to content

Commit 875974d

Browse files
authored
Merge pull request #501 from diffblue/trans-to-netlist-properties
ebmc: trans_to_netlist now takes property map
2 parents 9ef3175 + d3292e2 commit 875974d

File tree

8 files changed

+102
-80
lines changed

8 files changed

+102
-80
lines changed

src/ebmc/bdd_engine.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,23 +174,26 @@ int bdd_enginet::operator()()
174174
transition_system =
175175
get_transition_system(cmdline, message.get_message_handler());
176176

177+
properties = ebmc_propertiest::from_command_line(
178+
cmdline, transition_system, message.get_message_handler());
179+
180+
const auto property_map = properties.make_property_map();
181+
177182
message.status() << "Building netlist" << messaget::eom;
178183

179184
convert_trans_to_netlist(
180185
transition_system.symbol_table,
181186
transition_system.main_symbol->name,
187+
property_map,
182188
netlist,
183189
message.get_message_handler());
184190

185191
message.statistics() << "Latches: " << netlist.var_map.latches.size()
186192
<< ", nodes: " << netlist.number_of_nodes()
187193
<< messaget::eom;
188194

189-
properties = ebmc_propertiest::from_command_line(
190-
cmdline, transition_system, message.get_message_handler());
191-
192-
for(const propertyt &p : properties.properties)
193-
get_atomic_propositions(p.normalized_expr);
195+
for(const auto &[_, expr] : property_map)
196+
get_atomic_propositions(expr);
194197

195198
message.status() << "Building BDD for netlist" << messaget::eom;
196199

src/ebmc/cegar/bmc_cegar.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,9 +230,14 @@ void bmc_cegart::make_netlist()
230230

231231
try
232232
{
233+
std::map<irep_idt, exprt> property_map;
234+
233235
convert_trans_to_netlist(
234-
symbol_table, main_module,
235-
concrete_netlist, get_message_handler());
236+
symbol_table,
237+
main_module,
238+
property_map,
239+
concrete_netlist,
240+
get_message_handler());
236241
}
237242

238243
catch(const std::string &error_msg)

src/ebmc/ebmc_base.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ bool ebmc_baset::make_netlist(netlistt &netlist)
422422
convert_trans_to_netlist(
423423
transition_system.symbol_table,
424424
transition_system.main_symbol->name,
425+
properties.make_property_map(),
425426
netlist,
426427
message.get_message_handler());
427428
}

src/ebmc/ebmc_parse_options.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -263,19 +263,6 @@ int ebmc_parse_optionst::doit()
263263
return 0;
264264
}
265265

266-
if(cmdline.isset("smv-netlist"))
267-
{
268-
netlistt netlist;
269-
if(ebmc_base.make_netlist(netlist))
270-
return 1;
271-
std::cout << "-- Generated by EBMC " << EBMC_VERSION << '\n';
272-
std::cout << "-- Generated from "
273-
<< ebmc_base.transition_system.main_symbol->name << '\n';
274-
std::cout << '\n';
275-
netlist.output_smv(std::cout);
276-
return 0;
277-
}
278-
279266
if(cmdline.isset("dot-netlist"))
280267
{
281268
netlistt netlist;
@@ -292,13 +279,26 @@ int ebmc_parse_optionst::doit()
292279
if(result != -1)
293280
return result;
294281

295-
if(cmdline.isset("compute-ct"))
296-
return ebmc_base.do_compute_ct();
297-
298282
// possibly apply liveness-to-safety
299283
if(cmdline.isset("liveness-to-safety"))
300284
liveness_to_safety(ebmc_base.transition_system, ebmc_base.properties);
301285

286+
if(cmdline.isset("smv-netlist"))
287+
{
288+
netlistt netlist;
289+
if(ebmc_base.make_netlist(netlist))
290+
return 1;
291+
std::cout << "-- Generated by EBMC " << EBMC_VERSION << '\n';
292+
std::cout << "-- Generated from "
293+
<< ebmc_base.transition_system.main_symbol->name << '\n';
294+
std::cout << '\n';
295+
netlist.output_smv(std::cout);
296+
return 0;
297+
}
298+
299+
if(cmdline.isset("compute-ct"))
300+
return ebmc_base.do_compute_ct();
301+
302302
if(cmdline.isset("aig") || cmdline.isset("dimacs"))
303303
return ebmc_base.do_bit_level_bmc();
304304
else

src/ebmc/ebmc_properties.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,16 @@ class ebmc_propertiest
202202

203203
bool select_property(const cmdlinet &, message_handlert &);
204204

205+
/// a map from property identifier to normalized expression
206+
std::map<irep_idt, exprt> make_property_map() const
207+
{
208+
std::map<irep_idt, exprt> result;
209+
for(auto &p : properties)
210+
if(!p.is_disabled())
211+
result.emplace(p.identifier, p.normalized_expr);
212+
return result;
213+
}
214+
205215
// command-line tool exit code, depending on property status
206216
int exit_code() const;
207217
};

src/ic3/m1ain.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,23 @@ int ic3_enginet::operator()()
9292
auto transition_system =
9393
get_transition_system(cmdline, message.get_message_handler());
9494

95+
properties = ebmc_propertiest::from_command_line(
96+
cmdline, transition_system, message.get_message_handler());
97+
9598
// make net-list
9699
message.status() << "Generating Netlist" << messaget::eom;
97100

98101
convert_trans_to_netlist(
99102
transition_system.symbol_table,
100103
transition_system.main_symbol->name,
104+
properties.make_property_map(),
101105
netlist,
102106
message.get_message_handler());
103107

104108
message.statistics() << "Latches: " << netlist.var_map.latches.size()
105109
<< ", nodes: " << netlist.number_of_nodes()
106110
<< messaget::eom;
107111

108-
properties = ebmc_propertiest::from_command_line(
109-
cmdline, transition_system, message.get_message_handler());
110-
111112
if(properties.properties.empty())
112113
{
113114
message.error() << "no properties" << messaget::eom;

src/trans-netlist/trans_to_netlist.cpp

Lines changed: 55 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ Author: Daniel Kroening, [email protected]
1717
#include <util/std_expr.h>
1818

1919
#include <solvers/flattening/boolbv_width.h>
20-
#include <temporal-logic/normalize_property.h>
2120
#include <temporal-logic/temporal_expr.h>
2221
#include <temporal-logic/temporal_logic.h>
2322
#include <verilog/sva_expr.h>
@@ -50,8 +49,10 @@ class convert_trans_to_netlistt:public messaget
5049
{
5150
}
5251

53-
void operator()(const irep_idt &module);
54-
52+
void operator()(
53+
const irep_idt &module,
54+
const std::map<irep_idt, exprt> &properties);
55+
5556
protected:
5657
symbol_table_baset &symbol_table;
5758
const namespacet ns;
@@ -250,7 +251,9 @@ Function: convert_trans_to_netlistt::operator()
250251
251252
\*******************************************************************/
252253

253-
void convert_trans_to_netlistt::operator()(const irep_idt &module)
254+
void convert_trans_to_netlistt::operator()(
255+
const irep_idt &module,
256+
const std::map<irep_idt, exprt> &properties)
254257
{
255258
// setup
256259
lhs_map.clear();
@@ -317,73 +320,70 @@ void convert_trans_to_netlistt::operator()(const irep_idt &module)
317320
aig_prop, dest.var_map, trans.init(), ns, get_message_handler()));
318321

319322
// properties
320-
for(const auto &[id, symbol] : symbol_table)
323+
for(const auto &[id, property_expr] : properties)
321324
{
322-
if(symbol.module == module && symbol.is_property)
323-
{
324-
auto expr = normalize_property(symbol.value);
325+
auto expr = property_expr; // copy
326+
327+
// we also convert propositions in assumptions
328+
if(expr.id() == ID_sva_assume)
329+
expr = to_sva_assume_expr(expr).op();
325330

326-
// we also convert propositions in assumptions
327-
if(expr.id() == ID_sva_assume)
328-
expr = to_sva_assume_expr(expr).op();
331+
auto convert = [&aig_prop, this](const exprt &expr) -> literalt {
332+
return instantiate_convert(
333+
aig_prop, dest.var_map, expr, ns, get_message_handler());
334+
};
329335

330-
auto convert = [&aig_prop, this](const exprt &expr) -> literalt {
331-
return instantiate_convert(
332-
aig_prop, dest.var_map, expr, ns, get_message_handler());
336+
if(expr.id() == ID_AG || expr.id() == ID_G || expr.id() == ID_sva_always)
337+
{
338+
auto get_phi = [](const exprt &expr) {
339+
if(expr.id() == ID_AG)
340+
return to_AG_expr(expr).op();
341+
else if(expr.id() == ID_G)
342+
return to_G_expr(expr).op();
343+
else if(expr.id() == ID_sva_always)
344+
return to_sva_always_expr(expr).op();
345+
else
346+
PRECONDITION(false);
333347
};
334348

335-
if(expr.id() == ID_AG || expr.id() == ID_G || expr.id() == ID_sva_always)
349+
auto phi = get_phi(expr);
350+
351+
if(!has_temporal_operator(phi))
352+
{
353+
// G p
354+
dest.properties.emplace(id, netlistt::Gpt{convert(phi)});
355+
}
356+
else if(
357+
phi.id() == ID_AF || phi.id() == ID_F ||
358+
phi.id() == ID_sva_s_eventually)
336359
{
337-
auto get_phi = [](const exprt &expr) {
338-
if(expr.id() == ID_AG)
339-
return to_AG_expr(expr).op();
340-
else if(expr.id() == ID_G)
341-
return to_G_expr(expr).op();
342-
else if(expr.id() == ID_sva_always)
343-
return to_sva_always_expr(expr).op();
360+
auto get_psi = [](const exprt &expr) {
361+
if(expr.id() == ID_AF)
362+
return to_AF_expr(expr).op();
363+
else if(expr.id() == ID_F)
364+
return to_F_expr(expr).op();
365+
else if(expr.id() == ID_sva_s_eventually)
366+
return to_sva_s_eventually_expr(expr).op();
344367
else
345368
PRECONDITION(false);
346369
};
347370

348-
auto phi = get_phi(expr);
371+
auto psi = get_psi(phi);
349372

350-
if(!has_temporal_operator(phi))
351-
{
352-
// G p
353-
dest.properties.emplace(id, netlistt::Gpt{convert(phi)});
354-
}
355-
else if(
356-
phi.id() == ID_AF || phi.id() == ID_F ||
357-
phi.id() == ID_sva_s_eventually)
373+
if(!has_temporal_operator(psi))
358374
{
359-
auto get_psi = [](const exprt &expr) {
360-
if(expr.id() == ID_AF)
361-
return to_AF_expr(expr).op();
362-
else if(expr.id() == ID_F)
363-
return to_F_expr(expr).op();
364-
else if(expr.id() == ID_sva_s_eventually)
365-
return to_sva_s_eventually_expr(expr).op();
366-
else
367-
PRECONDITION(false);
368-
};
369-
370-
auto psi = get_psi(phi);
371-
372-
if(!has_temporal_operator(psi))
373-
{
374-
// G F p
375-
dest.properties.emplace(id, netlistt::GFpt{convert(psi)});
376-
}
377-
else
378-
{
379-
// unsupported
380-
}
375+
// G F p
376+
dest.properties.emplace(id, netlistt::GFpt{convert(psi)});
381377
}
382378
else
383379
{
384380
// unsupported
385381
}
386382
}
383+
else
384+
{
385+
// unsupported
386+
}
387387
}
388388
}
389389

@@ -810,10 +810,11 @@ Function: convert_trans_to_netlist
810810
void convert_trans_to_netlist(
811811
symbol_table_baset &symbol_table,
812812
const irep_idt &module,
813+
const std::map<irep_idt, exprt> &properties,
813814
netlistt &dest,
814815
message_handlert &message_handler)
815816
{
816817
convert_trans_to_netlistt c(symbol_table, dest, message_handler);
817818

818-
c(module);
819+
c(module, properties);
819820
}

src/trans-netlist/trans_to_netlist.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Author: Daniel Kroening, [email protected]
1717
void convert_trans_to_netlist(
1818
symbol_table_baset &,
1919
const irep_idt &module,
20+
const std::map<irep_idt, exprt> &properties,
2021
class netlistt &dest,
2122
message_handlert &);
2223

0 commit comments

Comments
 (0)