diff --git a/include/attribute.def b/include/attribute.def
index 86361a4..9e4c461 100644
--- a/include/attribute.def
+++ b/include/attribute.def
@@ -34,21 +34,19 @@
               int32_t, S, output_zp,
               DType,   S, accum_dtype)
 
-DEF_ATTRIBUTE(Conv, 6,
+DEF_ATTRIBUTE(Conv, 5,
               int32_t, V, pad,
               int32_t, V, stride,
               int32_t, V, dilation,
               int32_t, S, input_zp,
-              int32_t, S, weight_zp,
-              DType,   S, accum_dtype)
+              int32_t, S, weight_zp)
 
-DEF_ATTRIBUTE(TransposeConv, 6,
+DEF_ATTRIBUTE(TransposeConv, 5,
               int32_t, V, out_pad,
               int32_t, V, stride,
               int32_t, V, output_shape,
               int32_t, S, input_zp,
-              int32_t, S, weight_zp,
-              DType,   S, accum_dtype)
+              int32_t, S, weight_zp)
 
 DEF_ATTRIBUTE(Pad, 3,
               int32_t, V, padding,
@@ -109,15 +107,13 @@
 DEF_ATTRIBUTE(Table, 1,
               int16_t, V, table)
 
-DEF_ATTRIBUTE(MatMul, 3,
+DEF_ATTRIBUTE(MatMul, 2,
               int32_t, S, a_zp,
-              int32_t, S, b_zp,
-              DType,   S, accum_dtype)
+              int32_t, S, b_zp)
 
-DEF_ATTRIBUTE(FullyConnected, 3,
+DEF_ATTRIBUTE(FullyConnected, 2,
               int32_t, S, input_zp,
-              int32_t, S, weight_zp,
-              DType,   S, accum_dtype)
+              int32_t, S, weight_zp)
 
 DEF_ATTRIBUTE(Negate, 2,
               int32_t, S, input1_zp,
diff --git a/include/tosa_generated.h b/include/tosa_generated.h
index b34875f..50b3835 100644
--- a/include/tosa_generated.h
+++ b/include/tosa_generated.h
@@ -732,8 +732,7 @@
     VT_STRIDE = 6,
     VT_DILATION = 8,
     VT_INPUT_ZP = 10,
-    VT_WEIGHT_ZP = 12,
-    VT_ACCUM_DTYPE = 14
+    VT_WEIGHT_ZP = 12
   };
   const flatbuffers::Vector<int32_t> *pad() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_PAD);
@@ -750,9 +749,6 @@
   int32_t weight_zp() const {
     return GetField<int32_t>(VT_WEIGHT_ZP, 0);
   }
-  tosa::DType accum_dtype() const {
-    return static_cast<tosa::DType>(GetField<uint32_t>(VT_ACCUM_DTYPE, 0));
-  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyOffset(verifier, VT_PAD) &&
@@ -763,7 +759,6 @@
            verifier.VerifyVector(dilation()) &&
            VerifyField<int32_t>(verifier, VT_INPUT_ZP, 4) &&
            VerifyField<int32_t>(verifier, VT_WEIGHT_ZP, 4) &&
-           VerifyField<uint32_t>(verifier, VT_ACCUM_DTYPE, 4) &&
            verifier.EndTable();
   }
 };
@@ -787,9 +782,6 @@
   void add_weight_zp(int32_t weight_zp) {
     fbb_.AddElement<int32_t>(ConvAttribute::VT_WEIGHT_ZP, weight_zp, 0);
   }
-  void add_accum_dtype(tosa::DType accum_dtype) {
-    fbb_.AddElement<uint32_t>(ConvAttribute::VT_ACCUM_DTYPE, static_cast<uint32_t>(accum_dtype), 0);
-  }
   explicit ConvAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -807,10 +799,8 @@
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> stride = 0,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> dilation = 0,
     int32_t input_zp = 0,
-    int32_t weight_zp = 0,
-    tosa::DType accum_dtype = tosa::DType_UNKNOWN) {
+    int32_t weight_zp = 0) {
   ConvAttributeBuilder builder_(_fbb);
-  builder_.add_accum_dtype(accum_dtype);
   builder_.add_weight_zp(weight_zp);
   builder_.add_input_zp(input_zp);
   builder_.add_dilation(dilation);
@@ -825,8 +815,7 @@
     const std::vector<int32_t> *stride = nullptr,
     const std::vector<int32_t> *dilation = nullptr,
     int32_t input_zp = 0,
-    int32_t weight_zp = 0,
-    tosa::DType accum_dtype = tosa::DType_UNKNOWN) {
+    int32_t weight_zp = 0) {
   auto pad__ = pad ? _fbb.CreateVector<int32_t>(*pad) : 0;
   auto stride__ = stride ? _fbb.CreateVector<int32_t>(*stride) : 0;
   auto dilation__ = dilation ? _fbb.CreateVector<int32_t>(*dilation) : 0;
@@ -836,8 +825,7 @@
       stride__,
       dilation__,
       input_zp,
-      weight_zp,
-      accum_dtype);
+      weight_zp);
 }
 
 struct TransposeConvAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
@@ -847,8 +835,7 @@
     VT_STRIDE = 6,
     VT_OUTPUT_SHAPE = 8,
     VT_INPUT_ZP = 10,
-    VT_WEIGHT_ZP = 12,
-    VT_ACCUM_DTYPE = 14
+    VT_WEIGHT_ZP = 12
   };
   const flatbuffers::Vector<int32_t> *out_pad() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_OUT_PAD);
@@ -865,9 +852,6 @@
   int32_t weight_zp() const {
     return GetField<int32_t>(VT_WEIGHT_ZP, 0);
   }
-  tosa::DType accum_dtype() const {
-    return static_cast<tosa::DType>(GetField<uint32_t>(VT_ACCUM_DTYPE, 0));
-  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyOffset(verifier, VT_OUT_PAD) &&
@@ -878,7 +862,6 @@
            verifier.VerifyVector(output_shape()) &&
            VerifyField<int32_t>(verifier, VT_INPUT_ZP, 4) &&
            VerifyField<int32_t>(verifier, VT_WEIGHT_ZP, 4) &&
-           VerifyField<uint32_t>(verifier, VT_ACCUM_DTYPE, 4) &&
            verifier.EndTable();
   }
 };
@@ -902,9 +885,6 @@
   void add_weight_zp(int32_t weight_zp) {
     fbb_.AddElement<int32_t>(TransposeConvAttribute::VT_WEIGHT_ZP, weight_zp, 0);
   }
-  void add_accum_dtype(tosa::DType accum_dtype) {
-    fbb_.AddElement<uint32_t>(TransposeConvAttribute::VT_ACCUM_DTYPE, static_cast<uint32_t>(accum_dtype), 0);
-  }
   explicit TransposeConvAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -922,10 +902,8 @@
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> stride = 0,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> output_shape = 0,
     int32_t input_zp = 0,
-    int32_t weight_zp = 0,
-    tosa::DType accum_dtype = tosa::DType_UNKNOWN) {
+    int32_t weight_zp = 0) {
   TransposeConvAttributeBuilder builder_(_fbb);
-  builder_.add_accum_dtype(accum_dtype);
   builder_.add_weight_zp(weight_zp);
   builder_.add_input_zp(input_zp);
   builder_.add_output_shape(output_shape);
@@ -940,8 +918,7 @@
     const std::vector<int32_t> *stride = nullptr,
     const std::vector<int32_t> *output_shape = nullptr,
     int32_t input_zp = 0,
-    int32_t weight_zp = 0,
-    tosa::DType accum_dtype = tosa::DType_UNKNOWN) {
+    int32_t weight_zp = 0) {
   auto out_pad__ = out_pad ? _fbb.CreateVector<int32_t>(*out_pad) : 0;
   auto stride__ = stride ? _fbb.CreateVector<int32_t>(*stride) : 0;
   auto output_shape__ = output_shape ? _fbb.CreateVector<int32_t>(*output_shape) : 0;
@@ -951,8 +928,7 @@
       stride__,
       output_shape__,
       input_zp,
-      weight_zp,
-      accum_dtype);
+      weight_zp);
 }
 
 struct PadAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
@@ -1866,8 +1842,7 @@
   typedef MatMulAttributeBuilder Builder;
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_A_ZP = 4,
-    VT_B_ZP = 6,
-    VT_ACCUM_DTYPE = 8
+    VT_B_ZP = 6
   };
   int32_t a_zp() const {
     return GetField<int32_t>(VT_A_ZP, 0);
@@ -1875,14 +1850,10 @@
   int32_t b_zp() const {
     return GetField<int32_t>(VT_B_ZP, 0);
   }
-  tosa::DType accum_dtype() const {
-    return static_cast<tosa::DType>(GetField<uint32_t>(VT_ACCUM_DTYPE, 0));
-  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyField<int32_t>(verifier, VT_A_ZP, 4) &&
            VerifyField<int32_t>(verifier, VT_B_ZP, 4) &&
-           VerifyField<uint32_t>(verifier, VT_ACCUM_DTYPE, 4) &&
            verifier.EndTable();
   }
 };
@@ -1897,9 +1868,6 @@
   void add_b_zp(int32_t b_zp) {
     fbb_.AddElement<int32_t>(MatMulAttribute::VT_B_ZP, b_zp, 0);
   }
-  void add_accum_dtype(tosa::DType accum_dtype) {
-    fbb_.AddElement<uint32_t>(MatMulAttribute::VT_ACCUM_DTYPE, static_cast<uint32_t>(accum_dtype), 0);
-  }
   explicit MatMulAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -1914,10 +1882,8 @@
 inline flatbuffers::Offset<MatMulAttribute> CreateMatMulAttribute(
     flatbuffers::FlatBufferBuilder &_fbb,
     int32_t a_zp = 0,
-    int32_t b_zp = 0,
-    tosa::DType accum_dtype = tosa::DType_UNKNOWN) {
+    int32_t b_zp = 0) {
   MatMulAttributeBuilder builder_(_fbb);
-  builder_.add_accum_dtype(accum_dtype);
   builder_.add_b_zp(b_zp);
   builder_.add_a_zp(a_zp);
   return builder_.Finish();
@@ -1927,8 +1893,7 @@
   typedef FullyConnectedAttributeBuilder Builder;
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_INPUT_ZP = 4,
-    VT_WEIGHT_ZP = 6,
-    VT_ACCUM_DTYPE = 8
+    VT_WEIGHT_ZP = 6
   };
   int32_t input_zp() const {
     return GetField<int32_t>(VT_INPUT_ZP, 0);
@@ -1936,14 +1901,10 @@
   int32_t weight_zp() const {
     return GetField<int32_t>(VT_WEIGHT_ZP, 0);
   }
-  tosa::DType accum_dtype() const {
-    return static_cast<tosa::DType>(GetField<uint32_t>(VT_ACCUM_DTYPE, 0));
-  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyField<int32_t>(verifier, VT_INPUT_ZP, 4) &&
            VerifyField<int32_t>(verifier, VT_WEIGHT_ZP, 4) &&
-           VerifyField<uint32_t>(verifier, VT_ACCUM_DTYPE, 4) &&
            verifier.EndTable();
   }
 };
@@ -1958,9 +1919,6 @@
   void add_weight_zp(int32_t weight_zp) {
     fbb_.AddElement<int32_t>(FullyConnectedAttribute::VT_WEIGHT_ZP, weight_zp, 0);
   }
-  void add_accum_dtype(tosa::DType accum_dtype) {
-    fbb_.AddElement<uint32_t>(FullyConnectedAttribute::VT_ACCUM_DTYPE, static_cast<uint32_t>(accum_dtype), 0);
-  }
   explicit FullyConnectedAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -1975,10 +1933,8 @@
 inline flatbuffers::Offset<FullyConnectedAttribute> CreateFullyConnectedAttribute(
     flatbuffers::FlatBufferBuilder &_fbb,
     int32_t input_zp = 0,
-    int32_t weight_zp = 0,
-    tosa::DType accum_dtype = tosa::DType_UNKNOWN) {
+    int32_t weight_zp = 0) {
   FullyConnectedAttributeBuilder builder_(_fbb);
-  builder_.add_accum_dtype(accum_dtype);
   builder_.add_weight_zp(weight_zp);
   builder_.add_input_zp(input_zp);
   return builder_.Finish();
