From: Eddie Hung Date: Wed, 26 Jun 2019 23:06:30 +0000 (-0700) Subject: muxcover to be undef-sensitive when computing decoders X-Git-Tag: working-ls180~1208^2~62^2~3 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9cba05285b14ffb3433e2e9d9e44b755311562f5;p=yosys.git muxcover to be undef-sensitive when computing decoders --- diff --git a/passes/techmap/muxcover.cc b/passes/techmap/muxcover.cc index b0722134e..61471e446 100644 --- a/passes/techmap/muxcover.cc +++ b/passes/techmap/muxcover.cc @@ -151,7 +151,7 @@ struct MuxcoverWorker return true; } char port_name[3] = {'\\', *path, 0}; - return follow_muxtree(ret_bit, tree, sigmap(tree.muxes.at(bit)->getPort(port_name)), path+1, false); + return follow_muxtree(ret_bit, tree, tree.muxes.at(bit)->getPort(port_name), path+1, false); } else { ret_bit = bit; return true; @@ -160,7 +160,7 @@ struct MuxcoverWorker int prepare_decode_mux(SigBit &A, SigBit B, SigBit sel, SigBit bit) { - if (A == B || sel == State::Sx) + if (A == B || sel == State::Sx || A == State::Sx || B == State::Sx) return 0; tuple key(A, B, sel); @@ -330,13 +330,15 @@ struct MuxcoverWorker ok = ok && follow_muxtree(S4, tree, bit, "BBS"); if (nodecode) - ok = ok && S1 == S2 && S2 == S3 && S3 == S4; + ok = ok && (S1 == S2 || S1 == State::Sx || S2 == State::Sx) && + /*S2 == S3 && */ + (S3 == S4 || S3 == State::Sx || S4 == State::Sx); ok = ok && follow_muxtree(T1, tree, bit, "AS"); ok = ok && follow_muxtree(T2, tree, bit, "BS"); if (nodecode) - ok = ok && T1 == T2; + ok = ok && (T1 == T2 || T1 == State::Sx || T2 == State::Sx); ok = ok && follow_muxtree(U1, tree, bit, "S"); @@ -353,11 +355,12 @@ struct MuxcoverWorker mux.inputs.push_back(G); mux.inputs.push_back(H); + mux.cost += prepare_decode_mux(T1, T2, U1, bit); + mux.cost += prepare_decode_mux(S1, S2, T1, bit); mux.cost += prepare_decode_mux(S3, S4, T2, bit); - mux.cost += prepare_decode_mux(S1, S3, U1, bit); - - mux.cost += prepare_decode_mux(T1, T2, U1, bit); + if (T1 != T2 && T1 != State::Sx && T2 != State::Sx) + mux.cost += prepare_decode_mux(S1, S3, U1, bit); mux.selects.push_back(S1); mux.selects.push_back(T1); @@ -407,7 +410,13 @@ struct MuxcoverWorker ok = ok && follow_muxtree(S8, tree, bit, "BBBS"); if (nodecode) - ok = ok && S1 == S2 && S2 == S3 && S3 == S4 && S4 == S5 && S5 == S6 && S6 == S7 && S7 == S8; + ok = ok && (S1 == S2 || S1 == State::Sx || S2 == State::Sx) && + /*S2 == S3 &&*/ + (S3 == S4 || S3 == State::Sx || S4 == State::Sx) && + /*S4 == S5 &&*/ + (S5 == S6 || S5 == State::Sx || S6 == State::Sx) && + /*S6 == S7 &&*/ + (S7 == S8 || S7 == State::Sx || S8 == State::Sx); ok = ok && follow_muxtree(T1, tree, bit, "AAS"); ok = ok && follow_muxtree(T2, tree, bit, "ABS"); @@ -415,13 +424,15 @@ struct MuxcoverWorker ok = ok && follow_muxtree(T4, tree, bit, "BBS"); if (nodecode) - ok = ok && T1 == T2 && T2 == T3 && T3 == T4; + ok = ok && (T1 == T2 || T1 == State::Sx || T2 == State::Sx) && + /*T2 == T3 &&*/ + (T3 == T4 || T3 == State::Sx || T4 == State::Sx); ok = ok && follow_muxtree(U1, tree, bit, "AS"); ok = ok && follow_muxtree(U2, tree, bit, "BS"); if (nodecode) - ok = ok && U1 == U2; + ok = ok && (U1 == U2 || U1 == State::Sx || U2 == State::Sx); ok = ok && follow_muxtree(V1, tree, bit, "S"); @@ -446,19 +457,27 @@ struct MuxcoverWorker mux.inputs.push_back(O); mux.inputs.push_back(P); - mux.cost += prepare_decode_mux(S1, S2, T1, bit); - mux.cost += prepare_decode_mux(S3, S4, T2, bit); - mux.cost += prepare_decode_mux(S5, S6, T3, bit); - mux.cost += prepare_decode_mux(S7, S8, T4, bit); - mux.cost += prepare_decode_mux(S1, S3, U1, bit); - mux.cost += prepare_decode_mux(S5, S7, U2, bit); - mux.cost += prepare_decode_mux(S1, S5, V1, bit); + mux.cost += prepare_decode_mux(U1, U2, V1, bit); - mux.cost += prepare_decode_mux(T1, T2, U1, bit); - mux.cost += prepare_decode_mux(T3, T4, U2, bit); - mux.cost += prepare_decode_mux(T1, T3, V1, bit); + if (U1 != State::Sx && U2 != State::Sx) { + mux.cost += prepare_decode_mux(T1, T2, U1, bit); + mux.cost += prepare_decode_mux(T3, T4, U2, bit); + mux.cost += prepare_decode_mux(T1, T3, V1, bit); + } - mux.cost += prepare_decode_mux(U1, U2, V1, bit); + if (T1 != T2 && T1 != State::Sx && T2 != State::Sx) { + mux.cost += prepare_decode_mux(S1, S2, T1, bit); + mux.cost += prepare_decode_mux(S3, S4, T2, bit); + mux.cost += prepare_decode_mux(S1, S3, U1, bit); + } + if (T3 != T4 && T3 != State::Sx && T4 != State::Sx) { + mux.cost += prepare_decode_mux(S5, S6, T3, bit); + mux.cost += prepare_decode_mux(S7, S8, T4, bit); + mux.cost += prepare_decode_mux(S5, S7, U2, bit); + } + if (T1 != T2 && T1 != State::Sx && T2 != State::Sx && + T3 != T4 && T3 != State::Sx && T4 != State::Sx) + mux.cost += prepare_decode_mux(S1, S5, V1, bit); mux.selects.push_back(S1); mux.selects.push_back(T1);