Skip to content

Commit 9c8c9cb

Browse files
committed
netlist conversion: track equivalent nodes
This augments the list of constraints on netlist nodes (netlist nodes that have to evaluate to true) by a list of node equivalences. This avoids the need for expensive re-discovery of such equivalences by methods such as SAT sweeping.
1 parent 2bdd568 commit 9c8c9cb

3 files changed

Lines changed: 32 additions & 22 deletions

File tree

src/trans-netlist/aig.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,27 @@ class aigt {
154154

155155
std::ostream &operator<<(std::ostream &, const aigt &);
156156

157-
class aig_plus_constraintst : public aigt {
157+
class aig_plus_constraintst : public aigt
158+
{
158159
public:
159160
typedef std::vector<literalt> constraintst;
160161
constraintst constraints;
161162

162-
void clear() {
163+
// An equivalence between two nodes, given as literalt.
164+
// This avoids the need to re-discover functionally
165+
// equivalent nodes via SAT sweeping or the like.
166+
// The use of constants true/false is allowed.
167+
// These are redundantly stored as constraints as well.
168+
using equivalencet = std::pair<literalt, literalt>;
169+
using equivalencest = std::vector<equivalencet>;
170+
171+
equivalencest equivalences;
172+
173+
void clear()
174+
{
163175
aigt::clear();
164176
constraints.clear();
177+
equivalences.clear();
165178
}
166179
};
167180

src/trans-netlist/aig_prop.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -112,17 +112,3 @@ literalt aig_prop_baset::lselect(literalt a, literalt b,
112112

113113
return lor(land(a, b), land(neg(a), c));
114114
}
115-
116-
void aig_prop_baset::set_equal(literalt a, literalt b) {
117-
#ifdef USE_AIG_COMPACT
118-
// The compact encoding should reduce this
119-
l_set_to_true(lequal(a, b));
120-
121-
#else
122-
// we produce two constraints:
123-
// a|!b !a|b
124-
125-
l_set_to_true(lor(pos(a), neg(b)));
126-
l_set_to_true(lor(neg(a), pos(b)));
127-
#endif
128-
}

src/trans-netlist/aig_prop.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ class aig_prop_baset : public propt {
3939
literalt lequal(literalt a, literalt b) override;
4040
literalt limplies(literalt a, literalt b) override;
4141
literalt lselect(literalt a, literalt b, literalt c) override; // a?b:c
42-
void set_equal(literalt a, literalt b) override;
4342

4443
void l_set_to(literalt a, bool value) override
4544
{
@@ -71,18 +70,30 @@ class aig_prop_baset : public propt {
7170
aigt &dest;
7271
};
7372

74-
class aig_prop_constraintt : public aig_prop_baset {
73+
class aig_prop_constraintt : public aig_prop_baset
74+
{
7575
public:
76-
explicit aig_prop_constraintt(aig_plus_constraintst &_dest,
77-
message_handlert &message_handler)
78-
: aig_prop_baset(_dest, message_handler), dest(_dest) {}
76+
explicit aig_prop_constraintt(
77+
aig_plus_constraintst &_dest,
78+
message_handlert &message_handler)
79+
: aig_prop_baset(_dest, message_handler), dest(_dest)
80+
{
81+
}
7982

8083
aig_plus_constraintst &dest;
8184
bool has_set_to() const override { return true; }
8285

8386
void lcnf(const bvt &clause) override { l_set_to_true(lor(clause)); }
8487

85-
void l_set_to(literalt a, bool value) override {
88+
void set_equal(literalt a, literalt b) override
89+
{
90+
dest.equivalences.emplace_back(a, b);
91+
dest.constraints.push_back(lequal(a, b));
92+
}
93+
94+
void l_set_to(literalt a, bool value) override
95+
{
96+
dest.equivalences.emplace_back(a, const_literal(value));
8697
dest.constraints.push_back(a ^ !value);
8798
}
8899

0 commit comments

Comments
 (0)