# automatically generated by the FlatBuffers compiler, do not modify

# namespace: tosa

import flatbuffers

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

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

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

    # ArithmeticRightShiftAttribute
    def Round(self):
        o = flatbuffers.number_types.UOffsetTFlags.py_type(self._tab.Offset(4))
        if o != 0:
            return bool(self._tab.Get(flatbuffers.number_types.BoolFlags, o + self._tab.Pos))
        return False

def ArithmeticRightShiftAttributeStart(builder): builder.StartObject(1)
def ArithmeticRightShiftAttributeAddRound(builder, round): builder.PrependBoolSlot(0, round, 0)
def ArithmeticRightShiftAttributeEnd(builder): return builder.EndObject()
