Optimize $onehot in Dfg
This commit is contained in:
parent
e53d6d9006
commit
ca376d681a
|
|
@ -5784,6 +5784,7 @@ public:
|
|||
};
|
||||
class AstOneHot final : public AstNodeUniop {
|
||||
// True if only single bit set in vector
|
||||
// @astgen makeDfgVertex
|
||||
public:
|
||||
AstOneHot(FileLine* fl, AstNodeExpr* lhsp)
|
||||
: ASTGEN_SUPER_OneHot(fl, lhsp) {
|
||||
|
|
@ -5801,6 +5802,7 @@ public:
|
|||
};
|
||||
class AstOneHot0 final : public AstNodeUniop {
|
||||
// True if only single bit, or no bits set in vector
|
||||
// @astgen makeDfgVertex
|
||||
public:
|
||||
AstOneHot0(FileLine* fl, AstNodeExpr* lhsp)
|
||||
: ASTGEN_SUPER_OneHot0(fl, lhsp) {
|
||||
|
|
|
|||
|
|
@ -774,7 +774,9 @@ void DfgVertex::typeCheck(const DfgGraph& dfg) const {
|
|||
case VDfgType::LogNot:
|
||||
case VDfgType::RedAnd:
|
||||
case VDfgType::RedOr:
|
||||
case VDfgType::RedXor: {
|
||||
case VDfgType::RedXor:
|
||||
case VDfgType::OneHot:
|
||||
case VDfgType::OneHot0: {
|
||||
CHECK(dtype() == DfgDataType::packed(1), "Should be 1-bit");
|
||||
CHECK(inputp(0)->isPacked(), "Operand should be Packed type");
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -110,6 +110,8 @@ class V3DfgCse final {
|
|||
case VDfgType::NeqCase:
|
||||
case VDfgType::NeqWild:
|
||||
case VDfgType::Not:
|
||||
case VDfgType::OneHot:
|
||||
case VDfgType::OneHot0:
|
||||
case VDfgType::Or:
|
||||
case VDfgType::Pow:
|
||||
case VDfgType::PowSS:
|
||||
|
|
@ -232,6 +234,8 @@ class V3DfgCse final {
|
|||
case VDfgType::NeqCase:
|
||||
case VDfgType::NeqWild:
|
||||
case VDfgType::Not:
|
||||
case VDfgType::OneHot:
|
||||
case VDfgType::OneHot0:
|
||||
case VDfgType::Or:
|
||||
case VDfgType::Pow:
|
||||
case VDfgType::PowSS:
|
||||
|
|
|
|||
|
|
@ -143,6 +143,8 @@ template <> void foldOp<DfgExtendS> (V3Number& out, const V3Number& src) { ou
|
|||
template <> void foldOp<DfgLogNot> (V3Number& out, const V3Number& src) { out.opLogNot(src); }
|
||||
template <> void foldOp<DfgNegate> (V3Number& out, const V3Number& src) { out.opNegate(src); }
|
||||
template <> void foldOp<DfgNot> (V3Number& out, const V3Number& src) { out.opNot(src); }
|
||||
template <> void foldOp<DfgOneHot> (V3Number& out, const V3Number& src) { out.opOneHot(src); }
|
||||
template <> void foldOp<DfgOneHot0> (V3Number& out, const V3Number& src) { out.opOneHot0(src); }
|
||||
template <> void foldOp<DfgRedAnd> (V3Number& out, const V3Number& src) { out.opRedAnd(src); }
|
||||
template <> void foldOp<DfgRedOr> (V3Number& out, const V3Number& src) { out.opRedOr(src); }
|
||||
template <> void foldOp<DfgRedXor> (V3Number& out, const V3Number& src) { out.opRedXor(src); }
|
||||
|
|
@ -1325,6 +1327,14 @@ class V3DfgPeephole final : public DfgVisitor {
|
|||
}
|
||||
}
|
||||
|
||||
void visit(DfgOneHot* const vtxp) override {
|
||||
if (foldUnary(vtxp)) return;
|
||||
}
|
||||
|
||||
void visit(DfgOneHot0* const vtxp) override {
|
||||
if (foldUnary(vtxp)) return;
|
||||
}
|
||||
|
||||
void visit(DfgRedOr* const vtxp) override {
|
||||
if (optimizeReduction(vtxp)) return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -62,6 +62,12 @@ module t (
|
|||
//verilator lint_on WIDTH
|
||||
`signal(FOLD_UNARY_Extend, tmp_FOLD_UNARY_Extend);
|
||||
`signal(FOLD_UNARY_ExtendS, tmp_FOLD_UNARY_ExtendS);
|
||||
`signal(FOLD_UNARY_OneHot, $onehot(const_a));
|
||||
`signal(FOLD_UNARY_OneHot0, $onehot0(const_a));
|
||||
`signal(FOLD_UNARY_OneHot_A, $onehot(const_a[0]));
|
||||
`signal(FOLD_UNARY_OneHot_B, $onehot(~const_a[0]));
|
||||
`signal(FOLD_UNARY_OneHot0_A, $onehot0(const_a[0]));
|
||||
`signal(FOLD_UNARY_OneHot0_B, $onehot0(~const_a[0]));
|
||||
|
||||
`signal(FOLD_BINARY_Add, const_a + const_b);
|
||||
`signal(FOLD_BINARY_And, const_a & const_b);
|
||||
|
|
|
|||
Loading…
Reference in New Issue