Skip to content

Commit d80a664

Browse files
committed
netlist conversion: track equivalent nodes
This replaces the list of constraints on netlist nodes (netlist nodes that have to evaluate to true) by a list of node equivalences. This is more compact when node equivalences have to be generated, as the AIG nodes for lhs<->rhs do not have to be generated.
1 parent 34b7921 commit d80a664

12 files changed

Lines changed: 82 additions & 55 deletions

src/ebmc/bdd_engine.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ void bdd_enginet::get_atomic_propositions(const exprt &expr)
930930

931931
assert(expr.type().id()==ID_bool);
932932

933-
aig_prop_constraintt aig_prop(netlist, message.get_message_handler());
933+
aig_prop_equivalencest aig_prop(netlist, message.get_message_handler());
934934

935935
literalt l = instantiate_convert(
936936
aig_prop, netlist.var_map, expr, ns, message.get_message_handler());
@@ -989,16 +989,20 @@ void bdd_enginet::build_BDDs()
989989
literalt next=netlist.var_map.get_next(v.first);
990990
transition_BDDs.push_back(aig2bdd(next, BDDs)==v.second.next);
991991
}
992-
993-
// general AIG conditions
994-
for(literalt l : netlist.constraints)
995-
constraints_BDDs.push_back(aig2bdd(l, BDDs));
996-
997-
// initial state conditions
992+
993+
// AIG equivalences
994+
for(auto &[lhs, rhs] : netlist.equivalences)
995+
constraints_BDDs.push_back(aig2bdd(lhs, BDDs) == aig2bdd(rhs, BDDs));
996+
997+
// initial state constraints
998998
for(literalt l : netlist.initial)
999999
initial_BDDs.push_back(aig2bdd(l, BDDs));
1000-
1001-
// transition conditions
1000+
1001+
// invar constraints
1002+
for(literalt l : netlist.invar)
1003+
constraints_BDDs.push_back(aig2bdd(l, BDDs));
1004+
1005+
// transition constraints
10021006
for(literalt l : netlist.transition)
10031007
transition_BDDs.push_back(aig2bdd(l, BDDs));
10041008

src/ic3/r0ead_input.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,13 @@ void CompInfo::form_var_nums()
217217
================================================*/
218218
void ic3_enginet::add_verilog_conv_constrs()
219219
{
220+
PRECONDITION(netlist.equivalences.empty());
220221

221-
for(literalt lit : netlist.constraints) {
222+
for(literalt lit : netlist.invar)
223+
{
222224
if (lit.is_constant()) continue;
223225
std::cout << "constraint literal " << lit.get() << "\n";
224226
Ci.Init_clits.insert(lit.get());
225227
}
226228

227-
228229
} /* end of function add_verlig_conv_constrs */

src/ic3/r1ead_input.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void ic3_enginet::find_prop_lit()
5252
}
5353
assert(Oper.type().id()==ID_bool);
5454

55-
aig_prop_constraintt aig_prop(netlist, message.get_message_handler());
55+
aig_prop_equivalencest aig_prop(netlist, message.get_message_handler());
5656

5757
symbol_tablet symbol_table{};
5858
const namespacet ns(symbol_table);

src/trans-netlist/aig.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,20 @@ class aigt {
103103

104104
std::ostream &operator<<(std::ostream &, const aigt &);
105105

106-
class aig_plus_constraintst : public aigt {
106+
class aig_plus_equivalencest : public aigt
107+
{
107108
public:
108-
typedef std::vector<literalt> constraintst;
109-
constraintst constraints;
109+
// An equivalence between two nodes, given as literalt.
110+
// The use of constants true/false is allowed.
111+
using equivalencet = std::pair<literalt, literalt>;
112+
using equivalencest = std::vector<equivalencet>;
110113

111-
void clear() {
114+
equivalencest equivalences;
115+
116+
void clear()
117+
{
112118
aigt::clear();
113-
constraints.clear();
119+
equivalences.clear();
114120
}
115121
};
116122

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 & 8 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,19 +70,29 @@ class aig_prop_baset : public propt {
7170
aigt &dest;
7271
};
7372

74-
class aig_prop_constraintt : public aig_prop_baset {
73+
class aig_prop_equivalencest : 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_equivalencest(
77+
aig_plus_equivalencest &_dest,
78+
message_handlert &message_handler)
79+
: aig_prop_baset(_dest, message_handler), dest(_dest)
80+
{
81+
}
7982

80-
aig_plus_constraintst &dest;
83+
aig_plus_equivalencest &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 {
86-
dest.constraints.push_back(a ^ !value);
88+
void set_equal(literalt a, literalt b) override
89+
{
90+
dest.equivalences.emplace_back(a, b);
91+
}
92+
93+
void l_set_to(literalt a, bool value) override
94+
{
95+
dest.equivalences.emplace_back(a, const_literal(value));
8796
}
8897

8998
void set_assignment(literalt a, bool value) override {}

src/trans-netlist/netlist.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,14 @@ void netlistt::print(std::ostream &out) const
6565

6666
out << '\n';
6767

68-
out << "State invariant constraints: " << '\n';
68+
out << "AIG equivalences: " << '\n';
6969

70-
for(auto &c : constraints)
70+
for(auto &c : equivalences)
7171
{
7272
out << " ";
73-
print(out, c);
73+
print(out, c.first);
74+
out << '=';
75+
print(out, c.second);
7476
out << '\n';
7577
}
7678

src/trans-netlist/netlist.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Author: Daniel Kroening, kroening@kroening.com
1717
#include <iosfwd>
1818
#include <variant>
1919

20-
class netlistt:public aig_plus_constraintst
20+
class netlistt : public aig_plus_equivalencest
2121
{
2222
public:
2323
var_mapt var_map;
@@ -52,6 +52,7 @@ class netlistt:public aig_plus_constraintst
5252
// additional constraints, given as netlist literals
5353
// these are implicit conjunctions
5454
bvt initial;
55+
bvt invar;
5556
bvt transition;
5657

5758
// Map from property ID to a netlist property,

src/trans-netlist/smv_netlist.cpp

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,15 +244,28 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
244244
}
245245

246246
out << '\n';
247-
out << "-- in-state constraints" << '\n';
247+
out << "-- AIG equivalences" << '\n';
248248
out << '\n';
249249

250-
for(auto &constraint_l : netlist.constraints)
250+
for(auto &constraint_l : netlist.equivalences)
251251
{
252-
if(!constraint_l.is_true())
252+
out << "INVAR ";
253+
print_smv(netlist, out, constraint_l.first);
254+
out << "<->";
255+
print_smv(netlist, out, constraint_l.second);
256+
out << '\n';
257+
}
258+
259+
out << '\n';
260+
out << "-- INVAR" << '\n';
261+
out << '\n';
262+
263+
for(auto &invar_l : netlist.invar)
264+
{
265+
if(!invar_l.is_true())
253266
{
254267
out << "INVAR ";
255-
print_smv(netlist, out, constraint_l);
268+
print_smv(netlist, out, invar_l);
256269
out << '\n';
257270
}
258271
}

src/trans-netlist/trans_to_netlist.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class convert_trans_to_netlistt:public messaget
6565
symbol_table_baset &symbol_table;
6666
const namespacet ns;
6767
netlistt &dest;
68-
aig_prop_constraintt aig_prop;
68+
aig_prop_equivalencest aig_prop;
6969
netlist_boolbvt solver;
7070

7171
literalt new_input();
@@ -285,8 +285,8 @@ void convert_trans_to_netlistt::operator()(
285285
// do the remaining transition constraints
286286
convert_constraints();
287287

288-
dest.constraints.insert(
289-
dest.constraints.end(), invar_constraints.begin(), invar_constraints.end());
288+
dest.invar.insert(
289+
dest.invar.end(), invar_constraints.begin(), invar_constraints.end());
290290

291291
dest.transition.insert(
292292
dest.transition.end(),

0 commit comments

Comments
 (0)