# automatically generated by the FlatBuffers compiler, do not modify

# namespace: tosa

import flatbuffers

class ConvQuantInfo(object):
    __slots__ = ['_tab']

    @classmethod
    def GetRootAsConvQuantInfo(cls, buf, offset):
        n = flatbuffers.encode.Get(flatbuffers.packer.uoffset, buf, offset)
        x = ConvQuantInfo()
        x.Init(buf, n + offset)
        return x

    # ConvQuantInfo
    def Init(self, buf, pos):
        self._tab = flatbuffers.table.Table(buf, pos)

    # ConvQuantInfo
    def InputZp(self):
        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
        if o != 0:
            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)
        return 0

    # ConvQuantInfo
    def WeightZp(self):
        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(6))
        if o != 0:
            return self._tab.Get(flatbuffers.number_types.Int32Flags, o + self._tab.Pos)
        return 0

def ConvQuantInfoStart(builder): builder.StartObject(2)
def ConvQuantInfoAddInputZp(builder, inputZp): builder.PrependInt32Slot(0, inputZp, 0)
def ConvQuantInfoAddWeightZp(builder, weightZp): builder.PrependInt32Slot(1, weightZp, 0)
def ConvQuantInfoEnd(builder): return builder.EndObject()
