Skip to content

Commit 1352e26

Browse files
committed
state invariants are now converted into AIG state constraints
The generation of netlists from transition system now uses the state constraint facility of the netlist data structure for state constraints, as opposed to adding everything as a transition constraint. This fixes cases where analyzers over-approximate the model semantics.
1 parent ee122e1 commit 1352e26

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/trans-netlist/trans_to_netlist.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Author: Daniel Kroening, [email protected]
1111
#include <util/arith_tools.h>
1212
#include <util/bitvector_expr.h>
1313
#include <util/ebmc_util.h>
14+
#include <util/expr_util.h>
1415
#include <util/mathematical_expr.h>
1516
#include <util/namespace.h>
1617
#include <util/std_expr.h>
@@ -25,6 +26,8 @@ Author: Daniel Kroening, [email protected]
2526
#include "instantiate_netlist.h"
2627
#include "netlist.h"
2728

29+
#include <algorithm>
30+
2831
/*******************************************************************\
2932
3033
Class: convert_trans_to_netlistt
@@ -78,8 +81,9 @@ class convert_trans_to_netlistt:public messaget
7881

7982
typedef std::list<exprt> constraint_listt;
8083
constraint_listt constraint_list;
81-
bvt transition_constraints;
82-
84+
85+
bvt invar_constraints, transition_constraints;
86+
8387
class rhst
8488
{
8589
public:
@@ -299,7 +303,10 @@ void convert_trans_to_netlistt::operator()(const irep_idt &module)
299303

300304
// do the remaining transition constraints
301305
convert_constraints(aig_prop);
302-
306+
307+
dest.constraints.insert(
308+
dest.constraints.end(), invar_constraints.begin(), invar_constraints.end());
309+
303310
dest.transition.insert(
304311
dest.transition.end(),
305312
transition_constraints.begin(),
@@ -402,6 +409,9 @@ Function: convert_trans_to_netlistt::convert_constraints
402409

403410
void convert_trans_to_netlistt::convert_constraints(propt &prop)
404411
{
412+
invar_constraints.reserve(
413+
transition_constraints.size() + constraint_list.size());
414+
405415
transition_constraints.reserve(
406416
transition_constraints.size()+constraint_list.size());
407417

@@ -412,7 +422,11 @@ void convert_trans_to_netlistt::convert_constraints(propt &prop)
412422
{
413423
literalt l=
414424
instantiate_convert(prop, dest.var_map, *it, ns, get_message_handler());
415-
transition_constraints.push_back(l);
425+
426+
if(has_subexpr(*it, ID_next_symbol))
427+
transition_constraints.push_back(l);
428+
else
429+
invar_constraints.push_back(l);
416430
}
417431
}
418432

0 commit comments

Comments
 (0)