Skip to content

Commit 557434c

Browse files
committed
sort AIG variable map before output
To obtain deterministic results, sort the AIG variable map before outputting it, or before outputting data based on the variable map.
1 parent efa2b5f commit 557434c

File tree

8 files changed

+61
-39
lines changed

8 files changed

+61
-39
lines changed

src/trans-netlist/counterexample_netlist.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ void show_state(
3939
std::cout << "Transition system state " << timeframe << "\n";
4040
std::cout << "----------------------------------------------------\n";
4141

42-
for(var_mapt::mapt::const_iterator
43-
it=map.var_map.map.begin();
44-
it!=map.var_map.map.end(); it++)
42+
for(auto it : map.var_map.sorted())
4543
{
4644
const var_mapt::vart &var=it->second;
4745

src/trans-netlist/ldg.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,8 @@ void ldgt::compute(
5959
nodes[*l_it].is_source_latch=true;
6060

6161
// get the next state nodes
62-
63-
for(var_mapt::mapt::const_iterator
64-
m_it=netlist.var_map.map.begin();
65-
m_it!=netlist.var_map.map.end();
66-
m_it++)
62+
63+
for(auto m_it : netlist.var_map.sorted())
6764
{
6865
const var_mapt::vart &var=m_it->second;
6966
if(var.is_latch())

src/trans-netlist/netlist.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ void netlistt::print(std::ostream &out) const
3232
out << '\n';
3333
out << "Next state functions:" << '\n';
3434

35-
for(var_mapt::mapt::const_iterator
36-
it=var_map.map.begin();
37-
it!=var_map.map.end(); it++)
35+
// use a sorted var_map to get determistic output
36+
for(auto it : var_map.sorted())
3837
{
3938
const var_mapt::vart &var=it->second;
4039

@@ -190,11 +189,9 @@ void netlistt::output_dot(std::ostream &out) const
190189
{
191190
aigt::output_dot(out);
192191

193-
// add the sinks
194-
for(var_mapt::mapt::const_iterator
195-
it=var_map.map.begin();
196-
it!=var_map.map.end();
197-
it++)
192+
// Add the sinks.
193+
// Use a sorted var_map to get deterministic results.
194+
for(auto it : var_map.sorted())
198195
{
199196
const var_mapt::vart &var=it->second;
200197

src/trans-netlist/smv_netlist.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,17 +127,19 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
127127
out << "-- Variables" << '\n';
128128
out << '\n';
129129

130+
// We use the sorted var map to get deterministic output
130131
auto &var_map = netlist.var_map;
132+
const auto sorted_var_map = var_map.sorted();
131133

132-
for(auto &var_it : var_map.map)
134+
for(auto var_it : sorted_var_map)
133135
{
134-
const var_mapt::vart &var = var_it.second;
136+
const var_mapt::vart &var = var_it->second;
135137

136138
for(std::size_t i = 0; i < var.bits.size(); i++)
137139
{
138140
if(var.is_latch())
139141
{
140-
out << "VAR " << id2smv(var_it.first);
142+
out << "VAR " << id2smv(var_it->first);
141143
if(var.bits.size() != 1)
142144
out << "[" << i << "]";
143145
out << ": boolean;" << '\n';
@@ -149,15 +151,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
149151
out << "-- Inputs" << '\n';
150152
out << '\n';
151153

152-
for(auto &var_it : var_map.map)
154+
for(auto var_it : sorted_var_map)
153155
{
154-
const var_mapt::vart &var = var_it.second;
156+
const var_mapt::vart &var = var_it->second;
155157

156158
for(std::size_t i = 0; i < var.bits.size(); i++)
157159
{
158160
if(var.is_input())
159161
{
160-
out << "VAR " << id2smv(var_it.first);
162+
out << "VAR " << id2smv(var_it->first);
161163
if(var.bits.size() != 1)
162164
out << "[" << i << "]";
163165
out << ": boolean;" << '\n';
@@ -189,15 +191,15 @@ void smv_netlist(const netlistt &netlist, std::ostream &out)
189191
out << "-- Next state functions" << '\n';
190192
out << '\n';
191193

192-
for(auto &var_it : var_map.map)
194+
for(auto var_it : sorted_var_map)
193195
{
194-
const var_mapt::vart &var = var_it.second;
196+
const var_mapt::vart &var = var_it->second;
195197

196198
for(std::size_t i = 0; i < var.bits.size(); i++)
197199
{
198200
if(var.is_latch())
199201
{
200-
out << "ASSIGN next(" << id2smv(var_it.first);
202+
out << "ASSIGN next(" << id2smv(var_it->first);
201203
if(var.bits.size() != 1)
202204
out << "[" << i << "]";
203205
out << "):=";

src/trans-netlist/trans_trace_netlist.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,16 @@ trans_tracet compute_trans_trace(
106106
trans_tracet dest;
107107

108108
dest.states.reserve(bmc_map.get_no_timeframes());
109-
109+
110+
// use a sorted var_map to get deterministic results
111+
const auto sorted_var_map = bmc_map.var_map.sorted();
112+
110113
for(unsigned t=0; t<bmc_map.get_no_timeframes(); t++)
111114
{
112115
dest.states.push_back(trans_tracet::statet());
113116
trans_tracet::statet &state=dest.states.back();
114-
115-
for(var_mapt::mapt::const_iterator
116-
it=bmc_map.var_map.map.begin();
117-
it!=bmc_map.var_map.map.end();
118-
it++)
117+
118+
for(auto it : sorted_var_map)
119119
{
120120
const var_mapt::vart &var=it->second;
121121

src/trans-netlist/unwind_netlist.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,7 @@ void unwind(
8383
if(!last)
8484
{
8585
// joining the latches between timeframe and timeframe+1
86-
for(var_mapt::mapt::const_iterator
87-
v_it=netlist.var_map.map.begin();
88-
v_it!=netlist.var_map.map.end();
89-
v_it++)
86+
for(auto v_it : netlist.var_map.sorted())
9087
{
9188
const var_mapt::vart &var=v_it->second;
9289
if(var.is_latch())

src/trans-netlist/var_map.cpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,35 @@ const bv_varidt &var_mapt::reverse(unsigned v) const
179179

180180
/*******************************************************************\
181181
182+
Function: var_mapt::sorted
183+
184+
Inputs:
185+
186+
Outputs:
187+
188+
Purpose:
189+
190+
\*******************************************************************/
191+
192+
std::vector<var_mapt::mapt::const_iterator> var_mapt::sorted() const
193+
{
194+
using iteratort = mapt::const_iterator;
195+
std::vector<iteratort> iterators;
196+
iterators.reserve(map.size());
197+
198+
for(auto it = map.begin(); it != map.end(); it++)
199+
iterators.push_back(it);
200+
201+
std::sort(
202+
iterators.begin(),
203+
iterators.end(),
204+
[](iteratort a, iteratort b) { return a->first.compare(b->first) < 0; });
205+
206+
return iterators;
207+
}
208+
209+
/*******************************************************************\
210+
182211
Function: var_mapt::output
183212
184213
Inputs:
@@ -193,14 +222,14 @@ void var_mapt::output(std::ostream &out) const
193222
{
194223
out << "Variable map:" << '\n';
195224

196-
for(mapt::const_iterator it=map.begin();
197-
it!=map.end(); it++)
225+
// sort by identifier to get stable output
226+
for(auto map_it : sorted())
198227
{
199-
const vart &var=it->second;
228+
const vart &var = map_it->second;
200229

201230
for(std::size_t i=0; i<var.bits.size(); i++)
202231
{
203-
out << " " << it->first;
232+
out << " " << map_it->first;
204233
if(var.bits.size()!=1) out << "[" << i << "]";
205234
out << "=";
206235

src/trans-netlist/var_map.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ class var_mapt
128128
wires.clear();
129129
map.clear();
130130
}
131+
132+
std::vector<mapt::const_iterator> sorted() const;
131133
};
132134

133135
#endif

0 commit comments

Comments
 (0)