diff options
author | Clifford Wolf <clifford@clifford.at> | 2015-10-24 13:44:35 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-10-24 13:44:35 +0200 |
commit | 2a0f577f839bc43a5045ddf5a2b580bba8cabeab (patch) | |
tree | 11dcfe50c8a777f66a6bf52c620b0fb3959ea6f1 /passes | |
parent | 4cec1c058d5cef6960e12bc4d5371aa853cb72d9 (diff) | |
download | yosys-2a0f577f839bc43a5045ddf5a2b580bba8cabeab.tar.gz yosys-2a0f577f839bc43a5045ddf5a2b580bba8cabeab.tar.bz2 yosys-2a0f577f839bc43a5045ddf5a2b580bba8cabeab.zip |
Fixed handling of driver-driver conflicts in wreduce
Diffstat (limited to 'passes')
-rw-r--r-- | passes/opt/wreduce.cc | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/passes/opt/wreduce.cc b/passes/opt/wreduce.cc index c194d428d..e2d9a2c4f 100644 --- a/passes/opt/wreduce.cc +++ b/passes/opt/wreduce.cc @@ -66,6 +66,9 @@ struct WreduceWorker SigSpec sig_y = mi.sigmap(cell->getPort("\\Y")); std::vector<SigBit> bits_removed; + if (sig_y.has_const()) + return; + for (int i = GetSize(sig_y)-1; i >= 0; i--) { auto info = mi.query(sig_y[i]); @@ -173,6 +176,11 @@ struct WreduceWorker if (cell->type.in("$mux", "$pmux")) return run_cell_mux(cell); + SigSpec sig = mi.sigmap(cell->getPort("\\Y")); + + if (sig.has_const()) + return; + // Reduce size of ports A and B based on constant input bits and size of output port @@ -180,8 +188,8 @@ struct WreduceWorker int max_port_b_size = cell->hasPort("\\B") ? GetSize(cell->getPort("\\B")) : -1; if (cell->type.in("$not", "$pos", "$neg", "$and", "$or", "$xor", "$add", "$sub")) { - max_port_a_size = std::min(max_port_a_size, GetSize(cell->getPort("\\Y"))); - max_port_b_size = std::min(max_port_b_size, GetSize(cell->getPort("\\Y"))); + max_port_a_size = std::min(max_port_a_size, GetSize(sig)); + max_port_b_size = std::min(max_port_b_size, GetSize(sig)); } bool port_a_signed = false; @@ -196,8 +204,6 @@ struct WreduceWorker // Reduce size of port Y based on sizes for A and B and unused bits in Y - SigSpec sig = mi.sigmap(cell->getPort("\\Y")); - int bits_removed = 0; if (port_a_signed && cell->type == "$shr") { // do not reduce size of output on $shr cells with signed A inputs @@ -358,10 +364,12 @@ struct WreducePass : public Pass { "$lt", "$le", "$eq", "$ne", "$eqx", "$nex", "$ge", "$gt", "$logic_not", "$logic_and", "$logic_or") && GetSize(c->getPort("\\Y")) > 1) { SigSpec sig = c->getPort("\\Y"); - c->setPort("\\Y", sig[0]); - c->setParam("\\Y_WIDTH", 1); - sig.remove(0); - module->connect(sig, Const(0, GetSize(sig))); + if (!sig.has_const()) { + c->setPort("\\Y", sig[0]); + c->setParam("\\Y_WIDTH", 1); + sig.remove(0); + module->connect(sig, Const(0, GetSize(sig))); + } } WreduceWorker worker(&config, module); |