mirror of https://github.com/YosysHQ/yosys.git
muxcover to be undef-sensitive when computing decoders
This commit is contained in:
parent
8ef64a19e7
commit
9cba05285b
|
@ -151,7 +151,7 @@ struct MuxcoverWorker
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
char port_name[3] = {'\\', *path, 0};
|
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 {
|
} else {
|
||||||
ret_bit = bit;
|
ret_bit = bit;
|
||||||
return true;
|
return true;
|
||||||
|
@ -160,7 +160,7 @@ struct MuxcoverWorker
|
||||||
|
|
||||||
int prepare_decode_mux(SigBit &A, SigBit B, SigBit sel, SigBit bit)
|
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;
|
return 0;
|
||||||
|
|
||||||
tuple<SigBit, SigBit, SigBit> key(A, B, sel);
|
tuple<SigBit, SigBit, SigBit> key(A, B, sel);
|
||||||
|
@ -330,13 +330,15 @@ struct MuxcoverWorker
|
||||||
ok = ok && follow_muxtree(S4, tree, bit, "BBS");
|
ok = ok && follow_muxtree(S4, tree, bit, "BBS");
|
||||||
|
|
||||||
if (nodecode)
|
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(T1, tree, bit, "AS");
|
||||||
ok = ok && follow_muxtree(T2, tree, bit, "BS");
|
ok = ok && follow_muxtree(T2, tree, bit, "BS");
|
||||||
|
|
||||||
if (nodecode)
|
if (nodecode)
|
||||||
ok = ok && T1 == T2;
|
ok = ok && (T1 == T2 || T1 == State::Sx || T2 == State::Sx);
|
||||||
|
|
||||||
ok = ok && follow_muxtree(U1, tree, bit, "S");
|
ok = ok && follow_muxtree(U1, tree, bit, "S");
|
||||||
|
|
||||||
|
@ -353,12 +355,13 @@ struct MuxcoverWorker
|
||||||
mux.inputs.push_back(G);
|
mux.inputs.push_back(G);
|
||||||
mux.inputs.push_back(H);
|
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(S1, S2, T1, bit);
|
||||||
mux.cost += prepare_decode_mux(S3, S4, T2, bit);
|
mux.cost += prepare_decode_mux(S3, S4, T2, bit);
|
||||||
|
if (T1 != T2 && T1 != State::Sx && T2 != State::Sx)
|
||||||
mux.cost += prepare_decode_mux(S1, S3, U1, bit);
|
mux.cost += prepare_decode_mux(S1, S3, U1, bit);
|
||||||
|
|
||||||
mux.cost += prepare_decode_mux(T1, T2, U1, bit);
|
|
||||||
|
|
||||||
mux.selects.push_back(S1);
|
mux.selects.push_back(S1);
|
||||||
mux.selects.push_back(T1);
|
mux.selects.push_back(T1);
|
||||||
mux.selects.push_back(U1);
|
mux.selects.push_back(U1);
|
||||||
|
@ -407,7 +410,13 @@ struct MuxcoverWorker
|
||||||
ok = ok && follow_muxtree(S8, tree, bit, "BBBS");
|
ok = ok && follow_muxtree(S8, tree, bit, "BBBS");
|
||||||
|
|
||||||
if (nodecode)
|
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(T1, tree, bit, "AAS");
|
||||||
ok = ok && follow_muxtree(T2, tree, bit, "ABS");
|
ok = ok && follow_muxtree(T2, tree, bit, "ABS");
|
||||||
|
@ -415,13 +424,15 @@ struct MuxcoverWorker
|
||||||
ok = ok && follow_muxtree(T4, tree, bit, "BBS");
|
ok = ok && follow_muxtree(T4, tree, bit, "BBS");
|
||||||
|
|
||||||
if (nodecode)
|
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(U1, tree, bit, "AS");
|
||||||
ok = ok && follow_muxtree(U2, tree, bit, "BS");
|
ok = ok && follow_muxtree(U2, tree, bit, "BS");
|
||||||
|
|
||||||
if (nodecode)
|
if (nodecode)
|
||||||
ok = ok && U1 == U2;
|
ok = ok && (U1 == U2 || U1 == State::Sx || U2 == State::Sx);
|
||||||
|
|
||||||
ok = ok && follow_muxtree(V1, tree, bit, "S");
|
ok = ok && follow_muxtree(V1, tree, bit, "S");
|
||||||
|
|
||||||
|
@ -446,19 +457,27 @@ struct MuxcoverWorker
|
||||||
mux.inputs.push_back(O);
|
mux.inputs.push_back(O);
|
||||||
mux.inputs.push_back(P);
|
mux.inputs.push_back(P);
|
||||||
|
|
||||||
mux.cost += prepare_decode_mux(S1, S2, T1, bit);
|
mux.cost += prepare_decode_mux(U1, U2, V1, 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);
|
|
||||||
|
|
||||||
|
if (U1 != State::Sx && U2 != State::Sx) {
|
||||||
mux.cost += prepare_decode_mux(T1, T2, U1, bit);
|
mux.cost += prepare_decode_mux(T1, T2, U1, bit);
|
||||||
mux.cost += prepare_decode_mux(T3, T4, U2, bit);
|
mux.cost += prepare_decode_mux(T3, T4, U2, bit);
|
||||||
mux.cost += prepare_decode_mux(T1, T3, V1, 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(S1);
|
||||||
mux.selects.push_back(T1);
|
mux.selects.push_back(T1);
|
||||||
|
|
Loading…
Reference in New Issue