Skip to content

Commit f7dbfcb

Browse files
committed
Fix wreduce speed issue
1 parent d704eba commit f7dbfcb

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@
7070
"valarray": "cpp",
7171
"variant": "cpp",
7272
"algorithm": "cpp",
73-
"*.inc": "cpp"
73+
"*.inc": "cpp",
74+
"tuple": "cpp"
7475
},
7576
"cmake.sourceDirectory": "/Users/akashlevy/Documents/preqorsor/third_party/yosys/abc"
7677
}

passes/opt/wreduce.cc

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ struct WreduceWorker
107107
log("Removed cell %s.%s (%s).\n", log_id(module), log_id(cell), log_id(cell->type));
108108
module->connect(sig_y, sig_removed);
109109
module->remove(cell);
110+
mi.notify_blackout(module);
110111
return;
111112
}
112113

@@ -136,8 +137,12 @@ struct WreduceWorker
136137
cell->setPort(ID::B, new_sig_b);
137138
cell->setPort(ID::Y, new_sig_y);
138139
cell->fixup_parameters();
140+
mi.notify_connect(cell, ID::A, sig_a, new_sig_a);
141+
mi.notify_connect(cell, ID::B, sig_b, new_sig_b);
142+
mi.notify_connect(cell, ID::Y, sig_y, new_sig_y);
139143

140144
module->connect(sig_y.extract(n_kept, n_removed), sig_removed);
145+
mi.notify_connect(module, SigSig(sig_y.extract(n_kept, n_removed), sig_removed));
141146
}
142147

143148
void run_cell_dff(Cell *cell)
@@ -146,6 +151,8 @@ struct WreduceWorker
146151

147152
SigSpec sig_d = mi.sigmap(cell->getPort(ID::D));
148153
SigSpec sig_q = mi.sigmap(cell->getPort(ID::Q));
154+
SigSpec sig_d_orig = mi.sigmap(cell->getPort(ID::D));
155+
SigSpec sig_q_orig = mi.sigmap(cell->getPort(ID::Q));
149156
bool has_reset = false;
150157
Const initval = initvals(sig_q), rst_value;
151158

@@ -170,6 +177,7 @@ struct WreduceWorker
170177
if (zero_ext && sig_d[i] == State::S0 && (initval[i] == State::S0 || (!config->keepdc && initval[i] == State::Sx)) &&
171178
(!has_reset || i >= GetSize(rst_value) || rst_value[i] == State::S0 || (!config->keepdc && rst_value[i] == State::Sx))) {
172179
module->connect(sig_q[i], State::S0);
180+
mi.notify_connect(module, SigSig(sig_q[i], State::S0));
173181
initvals.remove_init(sig_q[i]);
174182
sig_d.remove(i);
175183
sig_q.remove(i);
@@ -179,6 +187,7 @@ struct WreduceWorker
179187
if (sign_ext && i > 0 && sig_d[i] == sig_d[i-1] && initval[i] == initval[i-1] && (!config->keepdc || initval[i] != State::Sx) &&
180188
(!has_reset || i >= GetSize(rst_value) || (rst_value[i] == rst_value[i-1] && (!config->keepdc || rst_value[i] != State::Sx)))) {
181189
module->connect(sig_q[i], sig_q[i-1]);
190+
mi.notify_connect(module, SigSig(sig_q[i], sig_q[i-1]));
182191
initvals.remove_init(sig_q[i]);
183192
sig_d.remove(i);
184193
sig_q.remove(i);
@@ -206,6 +215,7 @@ struct WreduceWorker
206215
if (GetSize(sig_q) == 0) {
207216
log("Removed cell %s.%s (%s).\n", log_id(module), log_id(cell), log_id(cell->type));
208217
module->remove(cell);
218+
mi.notify_blackout(module);
209219
return;
210220
}
211221

@@ -230,11 +240,14 @@ struct WreduceWorker
230240
cell->setPort(ID::D, sig_d);
231241
cell->setPort(ID::Q, sig_q);
232242
cell->fixup_parameters();
243+
mi.notify_connect(cell, ID::D, sig_d_orig, sig_d);
244+
mi.notify_connect(cell, ID::Q, sig_q_orig, sig_q);
233245
}
234246

235247
void run_reduce_inport(Cell *cell, char port, int max_port_size, bool &port_signed, bool &did_something)
236248
{
237249
port_signed = cell->getParam(stringf("\\%c_SIGNED", port)).as_bool();
250+
SigSpec sig_orig = mi.sigmap(cell->getPort(stringf("\\%c", port)));
238251
SigSpec sig = mi.sigmap(cell->getPort(stringf("\\%c", port)));
239252

240253
if (port == 'B' && cell->type.in(ID($shl), ID($shr), ID($sshl), ID($sshr)))
@@ -260,6 +273,7 @@ struct WreduceWorker
260273
log_debug("Removed top %d bits (of %d) from port %c of cell %s.%s (%s).\n",
261274
bits_removed, GetSize(sig) + bits_removed, port, log_id(module), log_id(cell), log_id(cell->type));
262275
cell->setPort(stringf("\\%c", port), sig);
276+
mi.notify_connect(cell, stringf("\\%c", port), sig_orig, sig);
263277
did_something = true;
264278
}
265279
}
@@ -291,6 +305,7 @@ struct WreduceWorker
291305
return run_cell_dff(cell);
292306

293307
SigSpec sig = mi.sigmap(cell->getPort(ID::Y));
308+
SigSpec sig_orig = mi.sigmap(cell->getPort(ID::Y));
294309

295310
if (sig.has_const())
296311
return;
@@ -427,19 +442,22 @@ struct WreduceWorker
427442

428443
SigBit padbit = is_signed ? sig[GetSize(sig)-1] : State::S0;
429444
module->connect(extra_bits, SigSpec(padbit, GetSize(extra_bits)));
445+
mi.notify_connect(module, SigSig(extra_bits, SigSpec(padbit, GetSize(extra_bits))));
430446
}
431447
}
432448

433449
if (GetSize(sig) == 0) {
434450
log("Removed cell %s.%s (%s).\n", log_id(module), log_id(cell), log_id(cell->type));
435451
module->remove(cell);
452+
mi.notify_blackout(module);
436453
return;
437454
}
438455

439456
if (bits_removed) {
440457
log_debug("Removed top %d bits (of %d) from port Y of cell %s.%s (%s).\n",
441458
bits_removed, GetSize(sig) + bits_removed, log_id(module), log_id(cell), log_id(cell->type));
442459
cell->setPort(ID::Y, sig);
460+
mi.notify_connect(cell, ID::Y, sig_orig, sig);
443461
did_something = true;
444462
}
445463

@@ -563,7 +581,7 @@ struct WreduceWorker
563581
Wire *nw = module->addWire(module->uniquify(IdString(w->name.str() + "_wreduce")), GetSize(w) - unused_top_bits);
564582
module->connect(nw, SigSpec(w).extract(0, GetSize(nw)));
565583
module->swap_names(w, nw);
566-
mi.reload_module(); // TODO: SILIMATE: CAN WE SPEED THIS UP?
584+
mi.notify_blackout(module);
567585
}
568586
}
569587
};

0 commit comments

Comments
 (0)