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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
/********************* */
/*! \file theory_bv.h
** \verbatim
** Original author: mdeters
** Major contributors: dejan
** Minor contributors (to current version): barrett
** This file is part of the CVC4 prototype.
** Copyright (c) 2009, 2010 The Analysis of Computer Systems Group (ACSys)
** Courant Institute of Mathematical Sciences
** New York University
** See the file COPYING in the top-level source directory for licensing
** information.\endverbatim
**
** \brief Bitvector theory.
**
** Bitvector theory.
**/
#include "cvc4_private.h"
#ifndef __CVC4__THEORY__BV__THEORY_BV_H
#define __CVC4__THEORY__BV__THEORY_BV_H
#include "theory/theory.h"
#include "context/context.h"
#include "context/cdset.h"
#include "theory/bv/equality_engine.h"
#include "theory/bv/slice_manager.h"
namespace CVC4 {
namespace theory {
namespace bv {
class TheoryBV : public Theory {
public:
class EqualityNotify {
TheoryBV& d_theoryBV;
public:
EqualityNotify(TheoryBV& theoryBV)
: d_theoryBV(theoryBV) {}
bool operator () (size_t triggerId) {
return d_theoryBV.triggerEquality(triggerId);
}
};
struct BVEqualitySettings {
static inline bool descend(TNode node) {
return node.getKind() == kind::BITVECTOR_CONCAT || node.getKind() == kind::BITVECTOR_EXTRACT;
}
/** Returns true if node1 has preference to node2 as a representative, otherwise node2 is used */
static inline bool mergePreference(TNode node1, unsigned node1size, TNode node2, unsigned node2size) {
if (node1.getKind() == kind::CONST_BITVECTOR) {
Assert(node2.getKind() != kind::CONST_BITVECTOR);
return true;
}
if (node2.getKind() == kind::CONST_BITVECTOR) {
Assert(node1.getKind() != kind::CONST_BITVECTOR);
return false;
}
if (node1.getKind() == kind::BITVECTOR_CONCAT) {
Assert(node2.getKind() != kind::BITVECTOR_CONCAT);
return true;
}
if (node2.getKind() == kind::BITVECTOR_CONCAT) {
Assert(node1.getKind() != kind::BITVECTOR_CONCAT);
return false;
}
return node2size < node1size;
}
};
typedef EqualityEngine<TheoryBV, EqualityNotify, BVEqualitySettings> BvEqualityEngine;
private:
/** Equality reasoning engine */
BvEqualityEngine d_eqEngine;
/** Slice manager */
SliceManager<TheoryBV> d_sliceManager;
/** Equality triggers indexed by ids from the equality manager */
std::vector<Node> d_triggers;
/** The asserted stuff */
context::CDSet<TNode, TNodeHashFunction> d_assertions;
/** Called by the equality managere on triggers */
bool triggerEquality(size_t triggerId);
public:
TheoryBV(context::Context* c, OutputChannel& out) :
Theory(THEORY_BV, c, out), d_eqEngine(*this, c, "theory::bv::EqualityEngine"), d_sliceManager(*this, c), d_assertions(c) {
}
BvEqualityEngine& getEqualityEngine() {
return d_eqEngine;
}
void preRegisterTerm(TNode n);
void registerTerm(TNode n) { }
void check(Effort e);
void presolve() { }
void propagate(Effort e) { }
void explain(TNode n) { }
Node getValue(TNode n, Valuation* valuation);
std::string identify() const { return std::string("TheoryBV"); }
};/* class TheoryBV */
}/* CVC4::theory::bv namespace */
}/* CVC4::theory namespace */
}/* CVC4 namespace */
#endif /* __CVC4__THEORY__BV__THEORY_BV_H */
|