Skip to content

Commit c96c90d

Browse files
authored
Merge pull request #1461 from diffblue/show-varmap-sorted
sort AIG variable map before output
2 parents b19ccd8 + 557434c commit c96c90d

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)