@@ -39,9 +39,9 @@ void demorgan_worker(
39
39
return ;
40
40
41
41
auto insig = sigmap (cell->getPort (" \\ A" ));
42
- log (" Inspecting %s cell %s (%d inputs)\n " , log_id (cell->type ), log_id (cell->name ), insig. size ( ));
42
+ log (" Inspecting %s cell %s (%d inputs)\n " , log_id (cell->type ), log_id (cell->name ), GetSize (insig ));
43
43
int num_inverted = 0 ;
44
- for (int i=0 ; i<insig. size ( ); i++)
44
+ for (int i=0 ; i<GetSize (insig ); i++)
45
45
{
46
46
auto b = insig[i];
47
47
@@ -63,19 +63,19 @@ void demorgan_worker(
63
63
}
64
64
65
65
// Stop if less than half of the inputs are inverted
66
- if (num_inverted*2 < insig. size ( ))
66
+ if (num_inverted*2 < GetSize (insig ))
67
67
{
68
- log (" %d / %d inputs are inverted, not pushing\n " , num_inverted, insig. size ( ));
68
+ log (" %d / %d inputs are inverted, not pushing\n " , num_inverted, GetSize (insig ));
69
69
return ;
70
70
}
71
71
72
72
// More than half of the inputs are inverted! Push through
73
73
cells_changed ++;
74
- log (" %d / %d inputs are inverted, pushing inverter through reduction\n " , num_inverted, insig. size ( ));
74
+ log (" %d / %d inputs are inverted, pushing inverter through reduction\n " , num_inverted, GetSize (insig ));
75
75
76
76
// For each input, either add or remove the inverter as needed
77
77
// TODO: this duplicates the loop up above, can we refactor it?
78
- for (int i=0 ; i<insig. size ( ); i++)
78
+ for (int i=0 ; i<GetSize (insig ); i++)
79
79
{
80
80
auto b = insig[i];
81
81
@@ -110,10 +110,10 @@ void demorgan_worker(
110
110
// Reductions are all commutative, so there's no point in having them in a weird order
111
111
bool same_signal = true ;
112
112
RTLIL::Wire* srcwire = insig[0 ].wire ;
113
- std::map <int , int > seen_bits;
114
- for (int i=0 ; i<insig. size ( ); i++)
113
+ dict <int , int > seen_bits;
114
+ for (int i=0 ; i<GetSize (insig ); i++)
115
115
seen_bits[i] = 0 ;
116
- for (int i=0 ; i<insig. size ( ); i++)
116
+ for (int i=0 ; i<GetSize (insig ); i++)
117
117
{
118
118
seen_bits[insig[i].offset ] ++;
119
119
if (insig[i].wire != srcwire)
@@ -126,7 +126,7 @@ void demorgan_worker(
126
126
{
127
127
// Make sure we've seen every bit exactly once
128
128
bool every_bit_once = true ;
129
- for (int i=0 ; i<insig. size ( ); i++)
129
+ for (int i=0 ; i<GetSize (insig ); i++)
130
130
{
131
131
if (seen_bits[i] != 1 )
132
132
{
@@ -139,12 +139,12 @@ void demorgan_worker(
139
139
// We do have to swap MSB to LSB b/c that's the way the reduction cells seem to work?
140
140
// Unclear on why this isn't sorting properly
141
141
// TODO: can we do SigChunks instead of single bits if we have subsets of a bus?
142
- if (every_bit_once && (insig. size ( ) == srcwire->width ) )
142
+ if (every_bit_once && (GetSize (insig ) == srcwire->width ) )
143
143
{
144
144
log (" Rearranging bits\n " );
145
145
RTLIL::SigSpec newsig;
146
- for (int i=0 ; i<insig. size ( ); i++)
147
- newsig.append (RTLIL::SigBit (srcwire, insig. size ( ) - i - 1 ));
146
+ for (int i=0 ; i<GetSize (insig ); i++)
147
+ newsig.append (RTLIL::SigBit (srcwire, GetSize (insig ) - i - 1 ));
148
148
insig = newsig;
149
149
insig.sort ();
150
150
}
@@ -179,12 +179,12 @@ struct OptDemorganPass : public Pass {
179
179
log (" overall gate count of the circuit\n " );
180
180
log (" \n " );
181
181
}
182
- virtual void execute (std::vector<std::string> /* args*/ , RTLIL::Design *design)
182
+ virtual void execute (std::vector<std::string> args, RTLIL::Design *design)
183
183
{
184
184
log_header (design, " Executing OPT_DEMORGAN pass (push inverters through $reduce_* cells).\n " );
185
185
186
- // int argidx = 0;
187
- // extra_args(args, argidx, design);
186
+ int argidx = 0 ;
187
+ extra_args (args, argidx, design);
188
188
189
189
unsigned int cells_changed = 0 ;
190
190
for (auto module : design->selected_modules ())
0 commit comments