diff --git a/src/V3DfgPeephole.cpp b/src/V3DfgPeephole.cpp index c48bdbbe7..089655971 100644 --- a/src/V3DfgPeephole.cpp +++ b/src/V3DfgPeephole.cpp @@ -1274,6 +1274,33 @@ class V3DfgPeephole final : public DfgVisitor { } } + void visit(DfgMux* const vtxp) override { + DfgVertex* const fromp = vtxp->fromp(); + DfgVertex* const lsbp = vtxp->lsbp(); + FileLine* const flp = vtxp->fileline(); + + if (DfgConst* const lsbConstp = lsbp->cast()) { + APPLYING(REPLACE_MUX_WITH_SEL) { + replace(make(vtxp, fromp, lsbConstp->num().toUInt())); + return; + } + } + + if (isZero(fromp)) { + APPLYING(FOLD_MUX_FROM_ZERO) { + replace(makeZero(flp, vtxp->width())); + return; + } + } + + if (isOnes(fromp)) { + APPLYING(FOLD_MUX_FROM_ONES) { + replace(makeOnes(flp, vtxp->width())); + return; + } + } + } + //========================================================================= // DfgVertexBinary - bitwise //========================================================================= diff --git a/src/V3DfgPeepholePatterns.h b/src/V3DfgPeepholePatterns.h index 5910167bd..b8aa011c9 100644 --- a/src/V3DfgPeepholePatterns.h +++ b/src/V3DfgPeepholePatterns.h @@ -31,6 +31,8 @@ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_ASSOC_BINARY_LHS_OF_RHS) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_ASSOC_BINARY_RHS_OF_LHS) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_BINARY) \ + _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_MUX_FROM_ONES) \ + _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_MUX_FROM_ZERO) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_SEL) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_SELF_EQ) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, FOLD_SELF_GT) \ @@ -117,6 +119,7 @@ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_EXTEND) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_LOGAND_WITH_AND) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_LOGOR_WITH_OR) \ + _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_MUX_WITH_SEL) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_NESTED_CONCAT_OF_ADJOINING_SELS_ON_LHS) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_NESTED_CONCAT_OF_ADJOINING_SELS_ON_RHS) \ _FOR_EACH_DFG_PEEPHOLE_OPTIMIZATION_APPLY(macro, REPLACE_NOT_EQ) \ diff --git a/test_regress/t/t_dfg_peephole.v b/test_regress/t/t_dfg_peephole.v index c580708d7..15b6100d1 100644 --- a/test_regress/t/t_dfg_peephole.v +++ b/test_regress/t/t_dfg_peephole.v @@ -33,6 +33,8 @@ module t ( wire logic [127:0] rand_aa = {2{rand_a}}; wire logic [63:0] const_a; wire logic [63:0] const_b; + wire logic [63:0] zero; + wire logic [63:0] ones; wire logic signed [63:0] sconst_a; wire logic signed [63:0] sconst_b; logic [63:0] array [3:0]; @@ -305,6 +307,9 @@ module t ( `signal(FOLD_SELF_LTS, srand_a < srand_a); `signal(FOLD_SELF_LE, rand_a <= rand_a); `signal(FOLD_SELF_LES, srand_a <= srand_a); + `signal(FOLD_MUX_FROM_ONES, ones[rand_a[5:0]]); + `signal(FOLD_MUX_FROM_ZERO, zero[rand_a[5:0]]); + `signal(REPLACE_MUX_WITH_SEL, rand_a[const_a[5:0]]); // Operators that should work wiht mismatched widths `signal(MISMATCHED_ShiftL,const_a << 4'd2); @@ -366,4 +371,6 @@ module t ( assign const_b = 64'h98badefc10325647; assign sconst_a = 64'hfedcba9876543210; assign sconst_b = 64'hba0123456789cdef; + assign zero = '0; + assign ones = '1; endmodule