Remove quantinfo types

Any needed information has been moved into the attributes for each operator.

This aligns with the structure of the attributes in the TOSA
specification, and generally simplifies the code.

Change-Id: I8243e91b09de1a9115f8af09c5e7def7e8f2866b
Signed-off-by: Eric Kunze <eric.kunze@arm.com>
diff --git a/include/attribute.def b/include/attribute.def
index 8ac5d8d..ea91869 100644
--- a/include/attribute.def
+++ b/include/attribute.def
@@ -26,20 +26,26 @@
     ...: variadic variables for more arguments, depending on NUM_ARGS_IN_ATTRIBUTES
 */
 
-DEF_ATTRIBUTE(Pool, 3,
+DEF_ATTRIBUTE(Pool, 5,
               int32_t, V, pad,
               int32_t, V, kernel,
-              int32_t, V, stride)
+              int32_t, V, stride,
+              int32_t, S, input_zp,
+              int32_t, S, output_zp)
 
-DEF_ATTRIBUTE(Conv, 3,
+DEF_ATTRIBUTE(Conv, 5,
               int32_t, V, pad,
               int32_t, V, stride,
-              int32_t, V, dilation)
+              int32_t, V, dilation,
+              int32_t, S, input_zp,
+              int32_t, S, weight_zp)
 
-DEF_ATTRIBUTE(TransposeConv, 3,
+DEF_ATTRIBUTE(TransposeConv, 5,
               int32_t, V, out_pad,
               int32_t, V, stride,
-              int32_t, V, output_shape)
+              int32_t, V, output_shape,
+              int32_t, S, input_zp,
+              int32_t, S, weight_zp)
 
 DEF_ATTRIBUTE(Pad, 3,
               int32_t, V, padding,
@@ -103,3 +109,14 @@
 DEF_ATTRIBUTE(Table, 1,
               int16_t, V, table)
 
+DEF_ATTRIBUTE(MatMul, 2,
+              int32_t, S, a_zp,
+              int32_t, S, b_zp)
+
+DEF_ATTRIBUTE(FullyConnected, 2,
+              int32_t, S, input_zp,
+              int32_t, S, weight_zp)
+
+DEF_ATTRIBUTE(Negate, 2,
+              int32_t, S, input1_zp,
+              int32_t, S, output_zp)
diff --git a/include/quant_info.def b/include/quant_info.def
deleted file mode 100644
index 888c183..0000000
--- a/include/quant_info.def
+++ /dev/null
@@ -1,43 +0,0 @@
-
-// Copyright (c) 2020-2021, ARM Limited.
-//
-//    Licensed under the Apache License, Version 2.0 (the "License");
-//    you may not use this file except in compliance with the License.
-//    You may obtain a copy of the License at
-//
-//         http://www.apache.org/licenses/LICENSE-2.0
-//
-//    Unless required by applicable law or agreed to in writing, software
-//    distributed under the License is distributed on an "AS IS" BASIS,
-//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//    See the License for the specific language governing permissions and
-//    limitations under the License.
-
-/*
-  Syntax:
-    DEF_QUANTIZATION_INFO(NAME, NUM_ARGS_IN_OPTIONS, ARG0_TYPE, ARG0_SCALAR_OR_VECTOR, ARGS0_NAME, ...)
-
-  Description:
-    NAME: corresponding quantization info name, must match corresponding "table XXXQuantInfo" in tosa.fbs
-    NUM_ARGS_IN_QINFO: number of arguments in this quantization info
-    ARG0_TYPE: data type of arg0
-    ARG0_SCALAR_OR_VECTOR: is arg0 a scalar (S) or a vector (V)
-    ARG0_NAME: name of arg0
-    ...: variadic variables for more arguments, depending on NUM_ARGS_IN_QINFO
-*/
-
-
-DEF_QUANTIZATION_INFO(Unary, 2,
-                      int32_t, S, input_zp,
-                      int32_t, S, output_zp)
-
-DEF_QUANTIZATION_INFO(Conv, 2,
-                      int32_t, S, input_zp,
-                      int32_t, S, weight_zp)
-
-DEF_QUANTIZATION_INFO(MatMul, 2,
-                      int32_t, S, a_zp,
-                      int32_t, S, b_zp)
-
-DEF_QUANTIZATION_INFO(Pad, 1,
-                      int32_t, S, input_zp)
diff --git a/include/quant_info.h b/include/quant_info.h
deleted file mode 100644
index c7daeb2..0000000
--- a/include/quant_info.h
+++ /dev/null
@@ -1,163 +0,0 @@
-
-// Copyright (c) 2020-2021, ARM Limited.
-//
-//    Licensed under the Apache License, Version 2.0 (the "License");
-//    you may not use this file except in compliance with the License.
-//    You may obtain a copy of the License at
-//
-//         http://www.apache.org/licenses/LICENSE-2.0
-//
-//    Unless required by applicable law or agreed to in writing, software
-//    distributed under the License is distributed on an "AS IS" BASIS,
-//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//    See the License for the specific language governing permissions and
-//    limitations under the License.
-
-#ifndef _TOSA_SERIALIZATION_QUANT_INFO_H
-#define _TOSA_SERIALIZATION_QUANT_INFO_H
-#include "flatbuffers/idl.h"
-#include "flatbuffers/util.h"
-#include "tosa_generated.h"
-
-namespace tosa
-{
-
-class TosaQuantInfoBase
-{
-public:
-    virtual ~TosaQuantInfoBase()
-    {}
-};
-
-class TosaNoneQuantInfo : public TosaQuantInfoBase
-{
-public:
-    TosaNoneQuantInfo()
-    {}
-    TosaNoneQuantInfo(TosaNoneQuantInfo* p)
-    {}
-};
-
-#define DEF_ARGS_VER0_S(T, V) _##V = p->V();
-#define DEF_ARGS_VER0_V(T, V) _##V = std::vector<T>(p->V()->begin(), p->V()->end());
-#define DEF_ARGS_VER1_S(T, V) const T& V
-#define DEF_ARGS_VER1_V(T, V) const std::vector<T>& V
-#define DEF_ARGS_VER2_S(T, V) _##V = V;
-#define DEF_ARGS_VER2_V(T, V) _##V = V;
-#define DEF_ARGS_VER3_S(T, V)                                                                                          \
-    T V() const                                                                                                        \
-    {                                                                                                                  \
-        return _##V;                                                                                                   \
-    }
-#define DEF_ARGS_VER3_V(T, V)                                                                                          \
-    std::vector<T> V() const                                                                                           \
-    {                                                                                                                  \
-        return _##V;                                                                                                   \
-    }
-#define DEF_ARGS_VER4_S(T, V) T _##V;
-#define DEF_ARGS_VER4_V(T, V) std::vector<T> _##V;
-
-// another level of preprocessor indirection to handle ", " as function's input argument
-#define DEF_ARGS_VER1_TRUE(T, F, V) DEF_ARGS_VER1_##F(T, V)
-#define DEF_ARGS_VER1_FALSE(T, F, V) , DEF_ARGS_VER1_##F(T, V)
-
-#define DEF_ARGS_VER0(FIRST, T, F, V) DEF_ARGS_VER0_##F(T, V)
-#define DEF_ARGS_VER1(FIRST, T, F, V) DEF_ARGS_VER1_##FIRST(T, F, V)
-#define DEF_ARGS_VER2(FIRST, T, F, V) DEF_ARGS_VER2_##F(T, V)
-#define DEF_ARGS_VER3(FIRST, T, F, V) DEF_ARGS_VER3_##F(T, V)
-#define DEF_ARGS_VER4(FIRST, T, F, V) DEF_ARGS_VER4_##F(T, V)
-
-#define DEF_ARGS_1(VER, T0, F0, V0) DEF_ARGS_##VER(TRUE, T0, F0, V0)
-#define DEF_ARGS_2(VER, T0, F0, V0, T1, F1, V1) DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1)
-#define DEF_ARGS_3(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2)                                                            \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)
-#define DEF_ARGS_4(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3)                                                \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)               \
-        DEF_ARGS_##VER(FALSE, T3, F3, V3)
-#define DEF_ARGS_5(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4)                                    \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)               \
-        DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4)
-#define DEF_ARGS_6(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5)                        \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)               \
-        DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5)
-#define DEF_ARGS_7(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6)            \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)               \
-        DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5)          \
-            DEF_ARGS_##VER(FALSE, T6, F6, V6)
-#define DEF_ARGS_8(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6, T7, F7,    \
-                   V7)                                                                                                 \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)               \
-        DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5)          \
-            DEF_ARGS_##VER(FALSE, T6, F6, V6) DEF_ARGS_##VER(FALSE, T7, F7, V7)
-#define DEF_ARGS_9(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6, T7, F7,    \
-                   V7, T8, F8, V8)                                                                                     \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)               \
-        DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5)          \
-            DEF_ARGS_##VER(FALSE, T6, F6, V6) DEF_ARGS_##VER(FALSE, T7, F7, V7) DEF_ARGS_##VER(FALSE, T8, F8, V8)
-#define DEF_ARGS_10(VER, T0, F0, V0, T1, F1, V1, T2, F2, V2, T3, F3, V3, T4, F4, V4, T5, F5, V5, T6, F6, V6, T7, F7,   \
-                    V7, T8, F8, V8, T9, F9, V9)                                                                        \
-    DEF_ARGS_##VER(TRUE, T0, F0, V0) DEF_ARGS_##VER(FALSE, T1, F1, V1) DEF_ARGS_##VER(FALSE, T2, F2, V2)               \
-        DEF_ARGS_##VER(FALSE, T3, F3, V3) DEF_ARGS_##VER(FALSE, T4, F4, V4) DEF_ARGS_##VER(FALSE, T5, F5, V5)          \
-            DEF_ARGS_##VER(FALSE, T6, F6, V6) DEF_ARGS_##VER(FALSE, T7, F7, V7) DEF_ARGS_##VER(FALSE, T8, F8, V8)      \
-                DEF_ARGS_##VER(FALSE, T9, F9, V9)
-
-#define DEF_QUANTIZATION_INFO(NAME, NUM_ARGS, ...)                                                                     \
-    class Tosa##NAME##QuantInfo : public TosaQuantInfoBase                                                             \
-    {                                                                                                                  \
-    public:                                                                                                            \
-        Tosa##NAME##QuantInfo(const TosaQuantInfoBase* qinfo)                                                          \
-        {                                                                                                              \
-            const Tosa##NAME##QuantInfo* p = static_cast<const Tosa##NAME##QuantInfo*>(qinfo);                         \
-            *this                          = *p;                                                                       \
-        }                                                                                                              \
-        Tosa##NAME##QuantInfo(const Tosa##NAME##QuantInfo* p)                                                          \
-        {                                                                                                              \
-            *this = *p;                                                                                                \
-        }                                                                                                              \
-        Tosa##NAME##QuantInfo(const void* qinfo)                                                                       \
-        {                                                                                                              \
-            const NAME##QuantInfo* p = static_cast<const NAME##QuantInfo*>(qinfo);                                     \
-            DEF_ARGS_##NUM_ARGS(VER0, __VA_ARGS__)                                                                     \
-        }                                                                                                              \
-        Tosa##NAME##QuantInfo(DEF_ARGS_##NUM_ARGS(VER1, __VA_ARGS__))                                                  \
-        {                                                                                                              \
-            DEF_ARGS_##NUM_ARGS(VER2, __VA_ARGS__)                                                                     \
-        }                                                                                                              \
-        virtual ~Tosa##NAME##QuantInfo()                                                                               \
-        {}                                                                                                             \
-        DEF_ARGS_##NUM_ARGS(VER3, __VA_ARGS__) private : DEF_ARGS_##NUM_ARGS(VER4, __VA_ARGS__)                        \
-    };
-
-#include "quant_info.def"
-#undef DEF_QUANTIZATION_INFO
-#undef DEF_ARGS_1
-#undef DEF_ARGS_2
-#undef DEF_ARGS_3
-#undef DEF_ARGS_4
-#undef DEF_ARGS_5
-#undef DEF_ARGS_6
-#undef DEF_ARGS_7
-#undef DEF_ARGS_8
-#undef DEF_ARGS_9
-#undef DEF_ARGS_10
-#undef DEF_ARGS_VER0
-#undef DEF_ARGS_VER1
-#undef DEF_ARGS_VER2
-#undef DEF_ARGS_VER3
-#undef DEF_ARGS_VER4
-#undef DEF_ARGS_VER1_TRUE
-#undef DEF_ARGS_VER1_FALSE
-#undef DEF_ARGS_VER0_S
-#undef DEF_ARGS_VER0_V
-#undef DEF_ARGS_VER1_S
-#undef DEF_ARGS_VER1_V
-#undef DEF_ARGS_VER2_S
-#undef DEF_ARGS_VER2_V
-#undef DEF_ARGS_VER3_S
-#undef DEF_ARGS_VER3_V
-#undef DEF_ARGS_VER4_S
-#undef DEF_ARGS_VER4_V
-
-}    // namespace tosa
-
-#endif
diff --git a/include/tosa_generated.h b/include/tosa_generated.h
index 58fe4a7..bd56e4e 100644
--- a/include/tosa_generated.h
+++ b/include/tosa_generated.h
@@ -59,17 +59,14 @@
 struct TableAttribute;
 struct TableAttributeBuilder;
 
-struct UnaryQuantInfo;
-struct UnaryQuantInfoBuilder;
+struct MatMulAttribute;
+struct MatMulAttributeBuilder;
 
-struct ConvQuantInfo;
-struct ConvQuantInfoBuilder;
+struct FullyConnectedAttribute;
+struct FullyConnectedAttributeBuilder;
 
-struct MatMulQuantInfo;
-struct MatMulQuantInfoBuilder;
-
-struct PadQuantInfo;
-struct PadQuantInfoBuilder;
+struct NegateAttribute;
+struct NegateAttributeBuilder;
 
 struct Version;
 struct VersionBuilder;
@@ -423,11 +420,14 @@
   Attribute_WhileLoopAttribute = 15,
   Attribute_TransposeAttribute = 16,
   Attribute_TableAttribute = 17,
+  Attribute_MatMulAttribute = 18,
+  Attribute_FullyConnectedAttribute = 19,
+  Attribute_NegateAttribute = 20,
   Attribute_MIN = Attribute_NONE,
-  Attribute_MAX = Attribute_TableAttribute
+  Attribute_MAX = Attribute_NegateAttribute
 };
 
-inline const Attribute (&EnumValuesAttribute())[18] {
+inline const Attribute (&EnumValuesAttribute())[21] {
   static const Attribute values[] = {
     Attribute_NONE,
     Attribute_PoolAttribute,
@@ -446,13 +446,16 @@
     Attribute_CondIfAttribute,
     Attribute_WhileLoopAttribute,
     Attribute_TransposeAttribute,
-    Attribute_TableAttribute
+    Attribute_TableAttribute,
+    Attribute_MatMulAttribute,
+    Attribute_FullyConnectedAttribute,
+    Attribute_NegateAttribute
   };
   return values;
 }
 
 inline const char * const *EnumNamesAttribute() {
-  static const char * const names[19] = {
+  static const char * const names[22] = {
     "NONE",
     "PoolAttribute",
     "ConvAttribute",
@@ -471,13 +474,16 @@
     "WhileLoopAttribute",
     "TransposeAttribute",
     "TableAttribute",
+    "MatMulAttribute",
+    "FullyConnectedAttribute",
+    "NegateAttribute",
     nullptr
   };
   return names;
 }
 
 inline const char *EnumNameAttribute(Attribute e) {
-  if (flatbuffers::IsOutRange(e, Attribute_NONE, Attribute_TableAttribute)) return "";
+  if (flatbuffers::IsOutRange(e, Attribute_NONE, Attribute_NegateAttribute)) return "";
   const size_t index = static_cast<size_t>(e);
   return EnumNamesAttribute()[index];
 }
@@ -554,77 +560,29 @@
   static const Attribute enum_value = Attribute_TableAttribute;
 };
 
+template<> struct AttributeTraits<tosa::MatMulAttribute> {
+  static const Attribute enum_value = Attribute_MatMulAttribute;
+};
+
+template<> struct AttributeTraits<tosa::FullyConnectedAttribute> {
+  static const Attribute enum_value = Attribute_FullyConnectedAttribute;
+};
+
+template<> struct AttributeTraits<tosa::NegateAttribute> {
+  static const Attribute enum_value = Attribute_NegateAttribute;
+};
+
 bool VerifyAttribute(flatbuffers::Verifier &verifier, const void *obj, Attribute type);
 bool VerifyAttributeVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
 
-enum QuantInfo {
-  QuantInfo_NONE = 0,
-  QuantInfo_UnaryQuantInfo = 1,
-  QuantInfo_ConvQuantInfo = 2,
-  QuantInfo_MatMulQuantInfo = 3,
-  QuantInfo_PadQuantInfo = 4,
-  QuantInfo_MIN = QuantInfo_NONE,
-  QuantInfo_MAX = QuantInfo_PadQuantInfo
-};
-
-inline const QuantInfo (&EnumValuesQuantInfo())[5] {
-  static const QuantInfo values[] = {
-    QuantInfo_NONE,
-    QuantInfo_UnaryQuantInfo,
-    QuantInfo_ConvQuantInfo,
-    QuantInfo_MatMulQuantInfo,
-    QuantInfo_PadQuantInfo
-  };
-  return values;
-}
-
-inline const char * const *EnumNamesQuantInfo() {
-  static const char * const names[6] = {
-    "NONE",
-    "UnaryQuantInfo",
-    "ConvQuantInfo",
-    "MatMulQuantInfo",
-    "PadQuantInfo",
-    nullptr
-  };
-  return names;
-}
-
-inline const char *EnumNameQuantInfo(QuantInfo e) {
-  if (flatbuffers::IsOutRange(e, QuantInfo_NONE, QuantInfo_PadQuantInfo)) return "";
-  const size_t index = static_cast<size_t>(e);
-  return EnumNamesQuantInfo()[index];
-}
-
-template<typename T> struct QuantInfoTraits {
-  static const QuantInfo enum_value = QuantInfo_NONE;
-};
-
-template<> struct QuantInfoTraits<tosa::UnaryQuantInfo> {
-  static const QuantInfo enum_value = QuantInfo_UnaryQuantInfo;
-};
-
-template<> struct QuantInfoTraits<tosa::ConvQuantInfo> {
-  static const QuantInfo enum_value = QuantInfo_ConvQuantInfo;
-};
-
-template<> struct QuantInfoTraits<tosa::MatMulQuantInfo> {
-  static const QuantInfo enum_value = QuantInfo_MatMulQuantInfo;
-};
-
-template<> struct QuantInfoTraits<tosa::PadQuantInfo> {
-  static const QuantInfo enum_value = QuantInfo_PadQuantInfo;
-};
-
-bool VerifyQuantInfo(flatbuffers::Verifier &verifier, const void *obj, QuantInfo type);
-bool VerifyQuantInfoVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types);
-
 struct PoolAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
   typedef PoolAttributeBuilder Builder;
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_PAD = 4,
     VT_KERNEL = 6,
-    VT_STRIDE = 8
+    VT_STRIDE = 8,
+    VT_INPUT_ZP = 10,
+    VT_OUTPUT_ZP = 12
   };
   const flatbuffers::Vector<int32_t> *pad() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_PAD);
@@ -635,6 +593,12 @@
   const flatbuffers::Vector<int32_t> *stride() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_STRIDE);
   }
+  int32_t input_zp() const {
+    return GetField<int32_t>(VT_INPUT_ZP, 0);
+  }
+  int32_t output_zp() const {
+    return GetField<int32_t>(VT_OUTPUT_ZP, 0);
+  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyOffset(verifier, VT_PAD) &&
@@ -643,6 +607,8 @@
            verifier.VerifyVector(kernel()) &&
            VerifyOffset(verifier, VT_STRIDE) &&
            verifier.VerifyVector(stride()) &&
+           VerifyField<int32_t>(verifier, VT_INPUT_ZP) &&
+           VerifyField<int32_t>(verifier, VT_OUTPUT_ZP) &&
            verifier.EndTable();
   }
 };
@@ -660,6 +626,12 @@
   void add_stride(flatbuffers::Offset<flatbuffers::Vector<int32_t>> stride) {
     fbb_.AddOffset(PoolAttribute::VT_STRIDE, stride);
   }
+  void add_input_zp(int32_t input_zp) {
+    fbb_.AddElement<int32_t>(PoolAttribute::VT_INPUT_ZP, input_zp, 0);
+  }
+  void add_output_zp(int32_t output_zp) {
+    fbb_.AddElement<int32_t>(PoolAttribute::VT_OUTPUT_ZP, output_zp, 0);
+  }
   explicit PoolAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -676,8 +648,12 @@
     flatbuffers::FlatBufferBuilder &_fbb,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> pad = 0,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> kernel = 0,
-    flatbuffers::Offset<flatbuffers::Vector<int32_t>> stride = 0) {
+    flatbuffers::Offset<flatbuffers::Vector<int32_t>> stride = 0,
+    int32_t input_zp = 0,
+    int32_t output_zp = 0) {
   PoolAttributeBuilder builder_(_fbb);
+  builder_.add_output_zp(output_zp);
+  builder_.add_input_zp(input_zp);
   builder_.add_stride(stride);
   builder_.add_kernel(kernel);
   builder_.add_pad(pad);
@@ -688,7 +664,9 @@
     flatbuffers::FlatBufferBuilder &_fbb,
     const std::vector<int32_t> *pad = nullptr,
     const std::vector<int32_t> *kernel = nullptr,
-    const std::vector<int32_t> *stride = nullptr) {
+    const std::vector<int32_t> *stride = nullptr,
+    int32_t input_zp = 0,
+    int32_t output_zp = 0) {
   auto pad__ = pad ? _fbb.CreateVector<int32_t>(*pad) : 0;
   auto kernel__ = kernel ? _fbb.CreateVector<int32_t>(*kernel) : 0;
   auto stride__ = stride ? _fbb.CreateVector<int32_t>(*stride) : 0;
@@ -696,7 +674,9 @@
       _fbb,
       pad__,
       kernel__,
-      stride__);
+      stride__,
+      input_zp,
+      output_zp);
 }
 
 struct ConvAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
@@ -704,7 +684,9 @@
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_PAD = 4,
     VT_STRIDE = 6,
-    VT_DILATION = 8
+    VT_DILATION = 8,
+    VT_INPUT_ZP = 10,
+    VT_WEIGHT_ZP = 12
   };
   const flatbuffers::Vector<int32_t> *pad() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_PAD);
@@ -715,6 +697,12 @@
   const flatbuffers::Vector<int32_t> *dilation() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_DILATION);
   }
+  int32_t input_zp() const {
+    return GetField<int32_t>(VT_INPUT_ZP, 0);
+  }
+  int32_t weight_zp() const {
+    return GetField<int32_t>(VT_WEIGHT_ZP, 0);
+  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyOffset(verifier, VT_PAD) &&
@@ -723,6 +711,8 @@
            verifier.VerifyVector(stride()) &&
            VerifyOffset(verifier, VT_DILATION) &&
            verifier.VerifyVector(dilation()) &&
+           VerifyField<int32_t>(verifier, VT_INPUT_ZP) &&
+           VerifyField<int32_t>(verifier, VT_WEIGHT_ZP) &&
            verifier.EndTable();
   }
 };
@@ -740,6 +730,12 @@
   void add_dilation(flatbuffers::Offset<flatbuffers::Vector<int32_t>> dilation) {
     fbb_.AddOffset(ConvAttribute::VT_DILATION, dilation);
   }
+  void add_input_zp(int32_t input_zp) {
+    fbb_.AddElement<int32_t>(ConvAttribute::VT_INPUT_ZP, input_zp, 0);
+  }
+  void add_weight_zp(int32_t weight_zp) {
+    fbb_.AddElement<int32_t>(ConvAttribute::VT_WEIGHT_ZP, weight_zp, 0);
+  }
   explicit ConvAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -756,8 +752,12 @@
     flatbuffers::FlatBufferBuilder &_fbb,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> pad = 0,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> stride = 0,
-    flatbuffers::Offset<flatbuffers::Vector<int32_t>> dilation = 0) {
+    flatbuffers::Offset<flatbuffers::Vector<int32_t>> dilation = 0,
+    int32_t input_zp = 0,
+    int32_t weight_zp = 0) {
   ConvAttributeBuilder builder_(_fbb);
+  builder_.add_weight_zp(weight_zp);
+  builder_.add_input_zp(input_zp);
   builder_.add_dilation(dilation);
   builder_.add_stride(stride);
   builder_.add_pad(pad);
@@ -768,7 +768,9 @@
     flatbuffers::FlatBufferBuilder &_fbb,
     const std::vector<int32_t> *pad = nullptr,
     const std::vector<int32_t> *stride = nullptr,
-    const std::vector<int32_t> *dilation = nullptr) {
+    const std::vector<int32_t> *dilation = nullptr,
+    int32_t input_zp = 0,
+    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;
@@ -776,7 +778,9 @@
       _fbb,
       pad__,
       stride__,
-      dilation__);
+      dilation__,
+      input_zp,
+      weight_zp);
 }
 
 struct TransposeConvAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
@@ -784,7 +788,9 @@
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_OUT_PAD = 4,
     VT_STRIDE = 6,
-    VT_OUTPUT_SHAPE = 8
+    VT_OUTPUT_SHAPE = 8,
+    VT_INPUT_ZP = 10,
+    VT_WEIGHT_ZP = 12
   };
   const flatbuffers::Vector<int32_t> *out_pad() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_OUT_PAD);
@@ -795,6 +801,12 @@
   const flatbuffers::Vector<int32_t> *output_shape() const {
     return GetPointer<const flatbuffers::Vector<int32_t> *>(VT_OUTPUT_SHAPE);
   }
+  int32_t input_zp() const {
+    return GetField<int32_t>(VT_INPUT_ZP, 0);
+  }
+  int32_t weight_zp() const {
+    return GetField<int32_t>(VT_WEIGHT_ZP, 0);
+  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyOffset(verifier, VT_OUT_PAD) &&
@@ -803,6 +815,8 @@
            verifier.VerifyVector(stride()) &&
            VerifyOffset(verifier, VT_OUTPUT_SHAPE) &&
            verifier.VerifyVector(output_shape()) &&
+           VerifyField<int32_t>(verifier, VT_INPUT_ZP) &&
+           VerifyField<int32_t>(verifier, VT_WEIGHT_ZP) &&
            verifier.EndTable();
   }
 };
@@ -820,6 +834,12 @@
   void add_output_shape(flatbuffers::Offset<flatbuffers::Vector<int32_t>> output_shape) {
     fbb_.AddOffset(TransposeConvAttribute::VT_OUTPUT_SHAPE, output_shape);
   }
+  void add_input_zp(int32_t input_zp) {
+    fbb_.AddElement<int32_t>(TransposeConvAttribute::VT_INPUT_ZP, input_zp, 0);
+  }
+  void add_weight_zp(int32_t weight_zp) {
+    fbb_.AddElement<int32_t>(TransposeConvAttribute::VT_WEIGHT_ZP, weight_zp, 0);
+  }
   explicit TransposeConvAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -836,8 +856,12 @@
     flatbuffers::FlatBufferBuilder &_fbb,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> out_pad = 0,
     flatbuffers::Offset<flatbuffers::Vector<int32_t>> stride = 0,
-    flatbuffers::Offset<flatbuffers::Vector<int32_t>> output_shape = 0) {
+    flatbuffers::Offset<flatbuffers::Vector<int32_t>> output_shape = 0,
+    int32_t input_zp = 0,
+    int32_t weight_zp = 0) {
   TransposeConvAttributeBuilder builder_(_fbb);
+  builder_.add_weight_zp(weight_zp);
+  builder_.add_input_zp(input_zp);
   builder_.add_output_shape(output_shape);
   builder_.add_stride(stride);
   builder_.add_out_pad(out_pad);
@@ -848,7 +872,9 @@
     flatbuffers::FlatBufferBuilder &_fbb,
     const std::vector<int32_t> *out_pad = nullptr,
     const std::vector<int32_t> *stride = nullptr,
-    const std::vector<int32_t> *output_shape = nullptr) {
+    const std::vector<int32_t> *output_shape = nullptr,
+    int32_t input_zp = 0,
+    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;
@@ -856,7 +882,9 @@
       _fbb,
       out_pad__,
       stride__,
-      output_shape__);
+      output_shape__,
+      input_zp,
+      weight_zp);
 }
 
 struct PadAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
@@ -1797,112 +1825,8 @@
       table__);
 }
 
-struct UnaryQuantInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  typedef UnaryQuantInfoBuilder Builder;
-  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
-    VT_INPUT_ZP = 4,
-    VT_OUTPUT_ZP = 6
-  };
-  int32_t input_zp() const {
-    return GetField<int32_t>(VT_INPUT_ZP, 0);
-  }
-  int32_t output_zp() const {
-    return GetField<int32_t>(VT_OUTPUT_ZP, 0);
-  }
-  bool Verify(flatbuffers::Verifier &verifier) const {
-    return VerifyTableStart(verifier) &&
-           VerifyField<int32_t>(verifier, VT_INPUT_ZP) &&
-           VerifyField<int32_t>(verifier, VT_OUTPUT_ZP) &&
-           verifier.EndTable();
-  }
-};
-
-struct UnaryQuantInfoBuilder {
-  typedef UnaryQuantInfo Table;
-  flatbuffers::FlatBufferBuilder &fbb_;
-  flatbuffers::uoffset_t start_;
-  void add_input_zp(int32_t input_zp) {
-    fbb_.AddElement<int32_t>(UnaryQuantInfo::VT_INPUT_ZP, input_zp, 0);
-  }
-  void add_output_zp(int32_t output_zp) {
-    fbb_.AddElement<int32_t>(UnaryQuantInfo::VT_OUTPUT_ZP, output_zp, 0);
-  }
-  explicit UnaryQuantInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
-        : fbb_(_fbb) {
-    start_ = fbb_.StartTable();
-  }
-  UnaryQuantInfoBuilder &operator=(const UnaryQuantInfoBuilder &);
-  flatbuffers::Offset<UnaryQuantInfo> Finish() {
-    const auto end = fbb_.EndTable(start_);
-    auto o = flatbuffers::Offset<UnaryQuantInfo>(end);
-    return o;
-  }
-};
-
-inline flatbuffers::Offset<UnaryQuantInfo> CreateUnaryQuantInfo(
-    flatbuffers::FlatBufferBuilder &_fbb,
-    int32_t input_zp = 0,
-    int32_t output_zp = 0) {
-  UnaryQuantInfoBuilder builder_(_fbb);
-  builder_.add_output_zp(output_zp);
-  builder_.add_input_zp(input_zp);
-  return builder_.Finish();
-}
-
-struct ConvQuantInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  typedef ConvQuantInfoBuilder Builder;
-  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
-    VT_INPUT_ZP = 4,
-    VT_WEIGHT_ZP = 6
-  };
-  int32_t input_zp() const {
-    return GetField<int32_t>(VT_INPUT_ZP, 0);
-  }
-  int32_t weight_zp() const {
-    return GetField<int32_t>(VT_WEIGHT_ZP, 0);
-  }
-  bool Verify(flatbuffers::Verifier &verifier) const {
-    return VerifyTableStart(verifier) &&
-           VerifyField<int32_t>(verifier, VT_INPUT_ZP) &&
-           VerifyField<int32_t>(verifier, VT_WEIGHT_ZP) &&
-           verifier.EndTable();
-  }
-};
-
-struct ConvQuantInfoBuilder {
-  typedef ConvQuantInfo Table;
-  flatbuffers::FlatBufferBuilder &fbb_;
-  flatbuffers::uoffset_t start_;
-  void add_input_zp(int32_t input_zp) {
-    fbb_.AddElement<int32_t>(ConvQuantInfo::VT_INPUT_ZP, input_zp, 0);
-  }
-  void add_weight_zp(int32_t weight_zp) {
-    fbb_.AddElement<int32_t>(ConvQuantInfo::VT_WEIGHT_ZP, weight_zp, 0);
-  }
-  explicit ConvQuantInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
-        : fbb_(_fbb) {
-    start_ = fbb_.StartTable();
-  }
-  ConvQuantInfoBuilder &operator=(const ConvQuantInfoBuilder &);
-  flatbuffers::Offset<ConvQuantInfo> Finish() {
-    const auto end = fbb_.EndTable(start_);
-    auto o = flatbuffers::Offset<ConvQuantInfo>(end);
-    return o;
-  }
-};
-
-inline flatbuffers::Offset<ConvQuantInfo> CreateConvQuantInfo(
-    flatbuffers::FlatBufferBuilder &_fbb,
-    int32_t input_zp = 0,
-    int32_t weight_zp = 0) {
-  ConvQuantInfoBuilder builder_(_fbb);
-  builder_.add_weight_zp(weight_zp);
-  builder_.add_input_zp(input_zp);
-  return builder_.Finish();
-}
-
-struct MatMulQuantInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  typedef MatMulQuantInfoBuilder Builder;
+struct MatMulAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef MatMulAttributeBuilder Builder;
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
     VT_A_ZP = 4,
     VT_B_ZP = 6
@@ -1921,80 +1845,142 @@
   }
 };
 
-struct MatMulQuantInfoBuilder {
-  typedef MatMulQuantInfo Table;
+struct MatMulAttributeBuilder {
+  typedef MatMulAttribute Table;
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
   void add_a_zp(int32_t a_zp) {
-    fbb_.AddElement<int32_t>(MatMulQuantInfo::VT_A_ZP, a_zp, 0);
+    fbb_.AddElement<int32_t>(MatMulAttribute::VT_A_ZP, a_zp, 0);
   }
   void add_b_zp(int32_t b_zp) {
-    fbb_.AddElement<int32_t>(MatMulQuantInfo::VT_B_ZP, b_zp, 0);
+    fbb_.AddElement<int32_t>(MatMulAttribute::VT_B_ZP, b_zp, 0);
   }
-  explicit MatMulQuantInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  explicit MatMulAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
-  MatMulQuantInfoBuilder &operator=(const MatMulQuantInfoBuilder &);
-  flatbuffers::Offset<MatMulQuantInfo> Finish() {
+  MatMulAttributeBuilder &operator=(const MatMulAttributeBuilder &);
+  flatbuffers::Offset<MatMulAttribute> Finish() {
     const auto end = fbb_.EndTable(start_);
-    auto o = flatbuffers::Offset<MatMulQuantInfo>(end);
+    auto o = flatbuffers::Offset<MatMulAttribute>(end);
     return o;
   }
 };
 
-inline flatbuffers::Offset<MatMulQuantInfo> CreateMatMulQuantInfo(
+inline flatbuffers::Offset<MatMulAttribute> CreateMatMulAttribute(
     flatbuffers::FlatBufferBuilder &_fbb,
     int32_t a_zp = 0,
     int32_t b_zp = 0) {
-  MatMulQuantInfoBuilder builder_(_fbb);
+  MatMulAttributeBuilder builder_(_fbb);
   builder_.add_b_zp(b_zp);
   builder_.add_a_zp(a_zp);
   return builder_.Finish();
 }
 
-struct PadQuantInfo FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
-  typedef PadQuantInfoBuilder Builder;
+struct FullyConnectedAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef FullyConnectedAttributeBuilder Builder;
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
-    VT_INPUT_ZP = 4
+    VT_INPUT_ZP = 4,
+    VT_WEIGHT_ZP = 6
   };
   int32_t input_zp() const {
     return GetField<int32_t>(VT_INPUT_ZP, 0);
   }
+  int32_t weight_zp() const {
+    return GetField<int32_t>(VT_WEIGHT_ZP, 0);
+  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyField<int32_t>(verifier, VT_INPUT_ZP) &&
+           VerifyField<int32_t>(verifier, VT_WEIGHT_ZP) &&
            verifier.EndTable();
   }
 };
 
-struct PadQuantInfoBuilder {
-  typedef PadQuantInfo Table;
+struct FullyConnectedAttributeBuilder {
+  typedef FullyConnectedAttribute Table;
   flatbuffers::FlatBufferBuilder &fbb_;
   flatbuffers::uoffset_t start_;
   void add_input_zp(int32_t input_zp) {
-    fbb_.AddElement<int32_t>(PadQuantInfo::VT_INPUT_ZP, input_zp, 0);
+    fbb_.AddElement<int32_t>(FullyConnectedAttribute::VT_INPUT_ZP, input_zp, 0);
   }
-  explicit PadQuantInfoBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+  void add_weight_zp(int32_t weight_zp) {
+    fbb_.AddElement<int32_t>(FullyConnectedAttribute::VT_WEIGHT_ZP, weight_zp, 0);
+  }
+  explicit FullyConnectedAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
   }
-  PadQuantInfoBuilder &operator=(const PadQuantInfoBuilder &);
-  flatbuffers::Offset<PadQuantInfo> Finish() {
+  FullyConnectedAttributeBuilder &operator=(const FullyConnectedAttributeBuilder &);
+  flatbuffers::Offset<FullyConnectedAttribute> Finish() {
     const auto end = fbb_.EndTable(start_);
-    auto o = flatbuffers::Offset<PadQuantInfo>(end);
+    auto o = flatbuffers::Offset<FullyConnectedAttribute>(end);
     return o;
   }
 };
 
-inline flatbuffers::Offset<PadQuantInfo> CreatePadQuantInfo(
+inline flatbuffers::Offset<FullyConnectedAttribute> CreateFullyConnectedAttribute(
     flatbuffers::FlatBufferBuilder &_fbb,
-    int32_t input_zp = 0) {
-  PadQuantInfoBuilder builder_(_fbb);
+    int32_t input_zp = 0,
+    int32_t weight_zp = 0) {
+  FullyConnectedAttributeBuilder builder_(_fbb);
+  builder_.add_weight_zp(weight_zp);
   builder_.add_input_zp(input_zp);
   return builder_.Finish();
 }
 
+struct NegateAttribute FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
+  typedef NegateAttributeBuilder Builder;
+  enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
+    VT_INPUT1_ZP = 4,
+    VT_OUTPUT_ZP = 6
+  };
+  int32_t input1_zp() const {
+    return GetField<int32_t>(VT_INPUT1_ZP, 0);
+  }
+  int32_t output_zp() const {
+    return GetField<int32_t>(VT_OUTPUT_ZP, 0);
+  }
+  bool Verify(flatbuffers::Verifier &verifier) const {
+    return VerifyTableStart(verifier) &&
+           VerifyField<int32_t>(verifier, VT_INPUT1_ZP) &&
+           VerifyField<int32_t>(verifier, VT_OUTPUT_ZP) &&
+           verifier.EndTable();
+  }
+};
+
+struct NegateAttributeBuilder {
+  typedef NegateAttribute Table;
+  flatbuffers::FlatBufferBuilder &fbb_;
+  flatbuffers::uoffset_t start_;
+  void add_input1_zp(int32_t input1_zp) {
+    fbb_.AddElement<int32_t>(NegateAttribute::VT_INPUT1_ZP, input1_zp, 0);
+  }
+  void add_output_zp(int32_t output_zp) {
+    fbb_.AddElement<int32_t>(NegateAttribute::VT_OUTPUT_ZP, output_zp, 0);
+  }
+  explicit NegateAttributeBuilder(flatbuffers::FlatBufferBuilder &_fbb)
+        : fbb_(_fbb) {
+    start_ = fbb_.StartTable();
+  }
+  NegateAttributeBuilder &operator=(const NegateAttributeBuilder &);
+  flatbuffers::Offset<NegateAttribute> Finish() {
+    const auto end = fbb_.EndTable(start_);
+    auto o = flatbuffers::Offset<NegateAttribute>(end);
+    return o;
+  }
+};
+
+inline flatbuffers::Offset<NegateAttribute> CreateNegateAttribute(
+    flatbuffers::FlatBufferBuilder &_fbb,
+    int32_t input1_zp = 0,
+    int32_t output_zp = 0) {
+  NegateAttributeBuilder builder_(_fbb);
+  builder_.add_output_zp(output_zp);
+  builder_.add_input1_zp(input1_zp);
+  return builder_.Finish();
+}
+
 struct Version FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
   typedef VersionBuilder Builder;
   enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE {
@@ -2007,7 +1993,7 @@
     return GetField<int32_t>(VT__MAJOR, 0);
   }
   int32_t _minor() const {
-    return GetField<int32_t>(VT__MINOR, 25);
+    return GetField<int32_t>(VT__MINOR, 30);
   }
   int32_t _patch() const {
     return GetField<int32_t>(VT__PATCH, 0);
@@ -2033,7 +2019,7 @@
     fbb_.AddElement<int32_t>(Version::VT__MAJOR, _major, 0);
   }
   void add__minor(int32_t _minor) {
-    fbb_.AddElement<int32_t>(Version::VT__MINOR, _minor, 25);
+    fbb_.AddElement<int32_t>(Version::VT__MINOR, _minor, 30);
   }
   void add__patch(int32_t _patch) {
     fbb_.AddElement<int32_t>(Version::VT__PATCH, _patch, 0);
@@ -2056,7 +2042,7 @@
 inline flatbuffers::Offset<Version> CreateVersion(
     flatbuffers::FlatBufferBuilder &_fbb,
     int32_t _major = 0,
-    int32_t _minor = 25,
+    int32_t _minor = 30,
     int32_t _patch = 0,
     bool _draft = true) {
   VersionBuilder builder_(_fbb);
@@ -2167,9 +2153,7 @@
     VT_ATTRIBUTE_TYPE = 6,
     VT_ATTRIBUTE = 8,
     VT_INPUTS = 10,
-    VT_OUTPUTS = 12,
-    VT_QUANT_INFO_TYPE = 14,
-    VT_QUANT_INFO = 16
+    VT_OUTPUTS = 12
   };
   tosa::Op op() const {
     return static_cast<tosa::Op>(GetField<uint32_t>(VT_OP, 0));
@@ -2232,31 +2216,21 @@
   const tosa::TableAttribute *attribute_as_TableAttribute() const {
     return attribute_type() == tosa::Attribute_TableAttribute ? static_cast<const tosa::TableAttribute *>(attribute()) : nullptr;
   }
+  const tosa::MatMulAttribute *attribute_as_MatMulAttribute() const {
+    return attribute_type() == tosa::Attribute_MatMulAttribute ? static_cast<const tosa::MatMulAttribute *>(attribute()) : nullptr;
+  }
+  const tosa::FullyConnectedAttribute *attribute_as_FullyConnectedAttribute() const {
+    return attribute_type() == tosa::Attribute_FullyConnectedAttribute ? static_cast<const tosa::FullyConnectedAttribute *>(attribute()) : nullptr;
+  }
+  const tosa::NegateAttribute *attribute_as_NegateAttribute() const {
+    return attribute_type() == tosa::Attribute_NegateAttribute ? static_cast<const tosa::NegateAttribute *>(attribute()) : nullptr;
+  }
   const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *inputs() const {
     return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_INPUTS);
   }
   const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *outputs() const {
     return GetPointer<const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *>(VT_OUTPUTS);
   }
-  tosa::QuantInfo quant_info_type() const {
-    return static_cast<tosa::QuantInfo>(GetField<uint8_t>(VT_QUANT_INFO_TYPE, 0));
-  }
-  const void *quant_info() const {
-    return GetPointer<const void *>(VT_QUANT_INFO);
-  }
-  template<typename T> const T *quant_info_as() const;
-  const tosa::UnaryQuantInfo *quant_info_as_UnaryQuantInfo() const {
-    return quant_info_type() == tosa::QuantInfo_UnaryQuantInfo ? static_cast<const tosa::UnaryQuantInfo *>(quant_info()) : nullptr;
-  }
-  const tosa::ConvQuantInfo *quant_info_as_ConvQuantInfo() const {
-    return quant_info_type() == tosa::QuantInfo_ConvQuantInfo ? static_cast<const tosa::ConvQuantInfo *>(quant_info()) : nullptr;
-  }
-  const tosa::MatMulQuantInfo *quant_info_as_MatMulQuantInfo() const {
-    return quant_info_type() == tosa::QuantInfo_MatMulQuantInfo ? static_cast<const tosa::MatMulQuantInfo *>(quant_info()) : nullptr;
-  }
-  const tosa::PadQuantInfo *quant_info_as_PadQuantInfo() const {
-    return quant_info_type() == tosa::QuantInfo_PadQuantInfo ? static_cast<const tosa::PadQuantInfo *>(quant_info()) : nullptr;
-  }
   bool Verify(flatbuffers::Verifier &verifier) const {
     return VerifyTableStart(verifier) &&
            VerifyField<uint32_t>(verifier, VT_OP) &&
@@ -2269,9 +2243,6 @@
            VerifyOffset(verifier, VT_OUTPUTS) &&
            verifier.VerifyVector(outputs()) &&
            verifier.VerifyVectorOfStrings(outputs()) &&
-           VerifyField<uint8_t>(verifier, VT_QUANT_INFO_TYPE) &&
-           VerifyOffset(verifier, VT_QUANT_INFO) &&
-           VerifyQuantInfo(verifier, quant_info(), quant_info_type()) &&
            verifier.EndTable();
   }
 };
@@ -2344,20 +2315,16 @@
   return attribute_as_TableAttribute();
 }
 
-template<> inline const tosa::UnaryQuantInfo *TosaOperator::quant_info_as<tosa::UnaryQuantInfo>() const {
-  return quant_info_as_UnaryQuantInfo();
+template<> inline const tosa::MatMulAttribute *TosaOperator::attribute_as<tosa::MatMulAttribute>() const {
+  return attribute_as_MatMulAttribute();
 }
 
-template<> inline const tosa::ConvQuantInfo *TosaOperator::quant_info_as<tosa::ConvQuantInfo>() const {
-  return quant_info_as_ConvQuantInfo();
+template<> inline const tosa::FullyConnectedAttribute *TosaOperator::attribute_as<tosa::FullyConnectedAttribute>() const {
+  return attribute_as_FullyConnectedAttribute();
 }
 
-template<> inline const tosa::MatMulQuantInfo *TosaOperator::quant_info_as<tosa::MatMulQuantInfo>() const {
-  return quant_info_as_MatMulQuantInfo();
-}
-
-template<> inline const tosa::PadQuantInfo *TosaOperator::quant_info_as<tosa::PadQuantInfo>() const {
-  return quant_info_as_PadQuantInfo();
+template<> inline const tosa::NegateAttribute *TosaOperator::attribute_as<tosa::NegateAttribute>() const {
+  return attribute_as_NegateAttribute();
 }
 
 struct TosaOperatorBuilder {
@@ -2379,12 +2346,6 @@
   void add_outputs(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> outputs) {
     fbb_.AddOffset(TosaOperator::VT_OUTPUTS, outputs);
   }
-  void add_quant_info_type(tosa::QuantInfo quant_info_type) {
-    fbb_.AddElement<uint8_t>(TosaOperator::VT_QUANT_INFO_TYPE, static_cast<uint8_t>(quant_info_type), 0);
-  }
-  void add_quant_info(flatbuffers::Offset<void> quant_info) {
-    fbb_.AddOffset(TosaOperator::VT_QUANT_INFO, quant_info);
-  }
   explicit TosaOperatorBuilder(flatbuffers::FlatBufferBuilder &_fbb)
         : fbb_(_fbb) {
     start_ = fbb_.StartTable();
@@ -2403,16 +2364,12 @@
     tosa::Attribute attribute_type = tosa::Attribute_NONE,
     flatbuffers::Offset<void> attribute = 0,
     flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> inputs = 0,
-    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> outputs = 0,
-    tosa::QuantInfo quant_info_type = tosa::QuantInfo_NONE,
-    flatbuffers::Offset<void> quant_info = 0) {
+    flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>>> outputs = 0) {
   TosaOperatorBuilder builder_(_fbb);
-  builder_.add_quant_info(quant_info);
   builder_.add_outputs(outputs);
   builder_.add_inputs(inputs);
   builder_.add_attribute(attribute);
   builder_.add_op(op);
-  builder_.add_quant_info_type(quant_info_type);
   builder_.add_attribute_type(attribute_type);
   return builder_.Finish();
 }
@@ -2423,9 +2380,7 @@
     tosa::Attribute attribute_type = tosa::Attribute_NONE,
     flatbuffers::Offset<void> attribute = 0,
     const std::vector<flatbuffers::Offset<flatbuffers::String>> *inputs = nullptr,
-    const std::vector<flatbuffers::Offset<flatbuffers::String>> *outputs = nullptr,
-    tosa::QuantInfo quant_info_type = tosa::QuantInfo_NONE,
-    flatbuffers::Offset<void> quant_info = 0) {
+    const std::vector<flatbuffers::Offset<flatbuffers::String>> *outputs = nullptr) {
   auto inputs__ = inputs ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*inputs) : 0;
   auto outputs__ = outputs ? _fbb.CreateVector<flatbuffers::Offset<flatbuffers::String>>(*outputs) : 0;
   return tosa::CreateTosaOperator(
@@ -2434,9 +2389,7 @@
       attribute_type,
       attribute,
       inputs__,
-      outputs__,
-      quant_info_type,
-      quant_info);
+      outputs__);
 }
 
 struct TosaBasicBlock FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
@@ -2690,6 +2643,18 @@
       auto ptr = reinterpret_cast<const tosa::TableAttribute *>(obj);
       return verifier.VerifyTable(ptr);
     }
+    case Attribute_MatMulAttribute: {
+      auto ptr = reinterpret_cast<const tosa::MatMulAttribute *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case Attribute_FullyConnectedAttribute: {
+      auto ptr = reinterpret_cast<const tosa::FullyConnectedAttribute *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
+    case Attribute_NegateAttribute: {
+      auto ptr = reinterpret_cast<const tosa::NegateAttribute *>(obj);
+      return verifier.VerifyTable(ptr);
+    }
     default: return true;
   }
 }
@@ -2706,43 +2671,6 @@
   return true;
 }
 
-inline bool VerifyQuantInfo(flatbuffers::Verifier &verifier, const void *obj, QuantInfo type) {
-  switch (type) {
-    case QuantInfo_NONE: {
-      return true;
-    }
-    case QuantInfo_UnaryQuantInfo: {
-      auto ptr = reinterpret_cast<const tosa::UnaryQuantInfo *>(obj);
-      return verifier.VerifyTable(ptr);
-    }
-    case QuantInfo_ConvQuantInfo: {
-      auto ptr = reinterpret_cast<const tosa::ConvQuantInfo *>(obj);
-      return verifier.VerifyTable(ptr);
-    }
-    case QuantInfo_MatMulQuantInfo: {
-      auto ptr = reinterpret_cast<const tosa::MatMulQuantInfo *>(obj);
-      return verifier.VerifyTable(ptr);
-    }
-    case QuantInfo_PadQuantInfo: {
-      auto ptr = reinterpret_cast<const tosa::PadQuantInfo *>(obj);
-      return verifier.VerifyTable(ptr);
-    }
-    default: return true;
-  }
-}
-
-inline bool VerifyQuantInfoVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector<flatbuffers::Offset<void>> *values, const flatbuffers::Vector<uint8_t> *types) {
-  if (!values || !types) return !values && !types;
-  if (values->size() != types->size()) return false;
-  for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) {
-    if (!VerifyQuantInfo(
-        verifier,  values->Get(i), types->GetEnum<QuantInfo>(i))) {
-      return false;
-    }
-  }
-  return true;
-}
-
 inline const tosa::TosaGraph *GetTosaGraph(const void *buf) {
   return flatbuffers::GetRoot<tosa::TosaGraph>(buf);
 }
diff --git a/include/tosa_serialization_handler.h b/include/tosa_serialization_handler.h
index 33c8047..695c530 100644
--- a/include/tosa_serialization_handler.h
+++ b/include/tosa_serialization_handler.h
@@ -19,7 +19,6 @@
 #include "flatbuffers/idl.h"
 #include "flatbuffers/util.h"
 #include "numpy_utils.h"
-#include "quant_info.h"
 #include "tosa_generated.h"
 #include <cstdint>
 #include <memory>
@@ -28,7 +27,7 @@
 
 // Keep version number in sync with the version default value with schema/tosa.fbs
 #define TOSA_VERSION_MAJOR 0
-#define TOSA_VERSION_MINOR 25
+#define TOSA_VERSION_MINOR 30
 #define TOSA_VERSION_PATCH 0
 #define TOSA_VERSION_DRAFT true
 #define TENSOR_BUFFER_FORCE_ALIGNMENT 8
@@ -172,15 +171,11 @@
     TosaSerializationOperator(Op op,
                               Attribute attribute_type,
                               const TosaAttributeBase* attribute,
-                              QuantInfo qinfo_type,
-                              const TosaQuantInfoBase* qinfo,
                               const std::vector<std::string>& input_tensor_names,
                               const std::vector<std::string>& output_tensor_names);
     TosaSerializationOperator(Op op,
                               Attribute attribute_type,
                               const TosaAttributeBase* attribute,
-                              QuantInfo qinfo_type,
-                              const TosaQuantInfoBase* qinfo,
                               std::vector<std::string>&& input_tensor_names,
                               std::vector<std::string>&& output_tensor_names);
     ~TosaSerializationOperator();
@@ -198,14 +193,6 @@
     {
         return _attribute;
     }
-    QuantInfo GetQInfoType() const
-    {
-        return _qinfo_type;
-    }
-    TosaQuantInfoBase* GetQInfo() const
-    {
-        return _qinfo;
-    }
     std::vector<std::string>& GetInputTensorNames()
     {
         return _input_tensor_names;
@@ -216,15 +203,10 @@
     }
 
 private:
-    void InitializeAttributeQinfo(Attribute attribute_type,
-                                  const TosaAttributeBase* attribute,
-                                  QuantInfo qinfo_type,
-                                  const TosaQuantInfoBase* qinfo);
+    void InitializeAttribute(Attribute attribute_type, const TosaAttributeBase* attribute);
     Op _op;                        /* operator enum, see tosa_isa_generated.h for enumeration table */
     Attribute _attribute_type;     /* operator attribute enum, used for dynamic casting TosaAttributeBase class */
     TosaAttributeBase* _attribute; /* real attribute class goes here */
-    QuantInfo _qinfo_type;         /* QuantInfo enum */
-    TosaQuantInfoBase* _qinfo;     /* base class pointer of QuantInfo */
     std::vector<std::string> _input_tensor_names;  /* array of input tensor names */
     std::vector<std::string> _output_tensor_names; /* array of output tensor names */
 };