-
Notifications
You must be signed in to change notification settings - Fork 273
/
Copy pathguard_bdd.cpp
85 lines (70 loc) · 1.63 KB
/
guard_bdd.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*******************************************************************\
Module: Guard Data Structure
Author: Romain Brenguier, [email protected]
\*******************************************************************/
/// \file
/// Implementation of guards using BDDs
#include "guard_bdd.h"
#include <solvers/prop/bdd_expr.h>
#include <util/expr_util.h>
#include <util/invariant.h>
#include <util/std_expr.h>
guard_bddt::guard_bddt(const exprt &e, bdd_exprt &manager)
: manager(manager), bdd(manager.from_expr(e))
{
}
guard_bddt &guard_bddt::operator=(const guard_bddt &other)
{
PRECONDITION(&manager == &other.manager);
bdd = other.bdd;
return *this;
}
guard_bddt &guard_bddt::operator=(guard_bddt &&other)
{
PRECONDITION(&manager == &other.manager);
std::swap(bdd, other.bdd);
return *this;
}
exprt guard_bddt::guard_expr(exprt expr) const
{
if(is_true())
{
// do nothing
return expr;
}
else
{
if(expr.is_constant() && to_constant_expr(expr).is_false())
{
return boolean_negate(as_expr());
}
else
{
return implies_exprt{as_expr(), expr};
}
}
}
guard_bddt &guard_bddt::append(const guard_bddt &guard)
{
bdd = bdd.bdd_and(guard.bdd);
return *this;
}
guard_bddt &guard_bddt::add(const exprt &expr)
{
bdd = bdd.bdd_and(manager.from_expr(expr));
return *this;
}
guard_bddt &operator-=(guard_bddt &g1, const guard_bddt &g2)
{
g1.bdd = g1.bdd.constrain(g2.bdd.bdd_or(g1.bdd));
return g1;
}
guard_bddt &operator|=(guard_bddt &g1, const guard_bddt &g2)
{
g1.bdd = g1.bdd.bdd_or(g2.bdd);
return g1;
}
exprt guard_bddt::as_expr() const
{
return manager.as_expr(bdd);
}