116 lines · plain
1// RUN: mlir-tblgen -gen-python-enum-bindings %s -I %S/../../include | FileCheck %s2 3include "mlir/IR/EnumAttr.td"4 5def Test_Dialect : Dialect {6 let name = "TestDialect";7 let cppNamespace = "::test";8}9 10// CHECK: Autogenerated by mlir-tblgen; don't manually edit.11 12// CHECK: from enum import IntEnum, auto, IntFlag13// CHECK: from ._ods_common import _cext as _ods_cext14// CHECK: from ..ir import register_attribute_builder15// CHECK: _ods_ir = _ods_cext.ir16 17def One : I32EnumAttrCase<"CaseOne", 1, "one">;18def Two : I32EnumAttrCase<"CaseTwo", 2, "two">;19def NegOne : I32EnumAttrCase<"CaseNegOne", -1, "negone">;20 21def MyEnum : I32EnumAttr<"MyEnum", "An example 32-bit enum", [One, Two, NegOne]>;22// CHECK-LABEL: class MyEnum(IntEnum):23// CHECK: """An example 32-bit enum"""24 25// CHECK: CaseOne = 126// CHECK: CaseTwo = 227// CHECK: CaseNegOne = auto()28 29// CHECK: def __str__(self):30// CHECK: if self is MyEnum.CaseOne:31// CHECK: return "one"32// CHECK: if self is MyEnum.CaseTwo:33// CHECK: return "two"34// CHECK: if self is MyEnum.CaseNegOne:35// CHECK: return "negone"36// CHECK: raise ValueError("Unknown MyEnum enum entry.")37 38// CHECK: @register_attribute_builder("MyEnum")39// CHECK: def _myenum(x, context):40// CHECK: return _ods_ir.IntegerAttr.get(_ods_ir.IntegerType.get_signless(32, context=context), int(x))41 42def TestMyEnum_Attr : EnumAttr<Test_Dialect, MyEnum, "enum">;43 44def One64 : I64EnumAttrCase<"CaseOne64", 1, "one">;45def Two64 : I64EnumAttrCase<"CaseTwo64", 2, "two">;46 47def MyEnum64 : I64EnumAttr<"MyEnum64", "An example 64-bit enum", [One64, Two64]>;48// CHECK-LABEL: class MyEnum64(IntEnum):49// CHECK: """An example 64-bit enum"""50 51// CHECK: CaseOne64 = 152// CHECK: CaseTwo64 = 253 54// CHECK: def __str__(self):55// CHECK: if self is MyEnum64.CaseOne64:56// CHECK: return "one"57// CHECK: if self is MyEnum64.CaseTwo64:58// CHECK: return "two"59// CHECK: raise ValueError("Unknown MyEnum64 enum entry.")60 61// CHECK: @register_attribute_builder("MyEnum64")62// CHECK: def _myenum64(x, context):63// CHECK: return _ods_ir.IntegerAttr.get(_ods_ir.IntegerType.get_signless(64, context=context), int(x))64 65def User : I32BitEnumAttrCaseBit<"User", 0, "user">;66def Group : I32BitEnumAttrCaseBit<"Group", 1, "group">;67def Other : I32BitEnumAttrCaseBit<"Other", 2, "other">;68 69def TestBitEnum70 : I32BitEnumAttr<71 "TestBitEnum", "",72 [User, Group, Other,73 I32BitEnumAttrCaseGroup<"Any", [User, Group, Other], "any">]> {74 let genSpecializedAttr = 0;75 let separator = " | ";76}77 78def TestBitEnum_Attr : EnumAttr<Test_Dialect, TestBitEnum, "testbitenum">;79 80// CHECK-LABEL: class TestBitEnum(IntFlag):81 82// CHECK: User = 183// CHECK: Group = 284// CHECK: Other = 485// CHECK: Any = 786 87// CHECK: def __iter__(self):88// CHECK: return iter([case for case in type(self) if (self & case) is case and self is not case])89// CHECK: def __len__(self):90// CHECK: return bin(self).count("1")91 92// CHECK: def __str__(self):93// CHECK: if len(self) > 1:94// CHECK: return " | ".join(map(str, self))95// CHECK: if self is TestBitEnum.User:96// CHECK: return "user"97// CHECK: if self is TestBitEnum.Group:98// CHECK: return "group"99// CHECK: if self is TestBitEnum.Other:100// CHECK: return "other"101// CHECK: if self is TestBitEnum.Any:102// CHECK: return "any"103// CHECK: raise ValueError("Unknown TestBitEnum enum entry.")104 105// CHECK: @register_attribute_builder("TestBitEnum")106// CHECK: def _testbitenum(x, context):107// CHECK: return _ods_ir.IntegerAttr.get(_ods_ir.IntegerType.get_signless(32, context=context), int(x))108 109// CHECK: @register_attribute_builder("TestBitEnum_Attr")110// CHECK: def _testbitenum_attr(x, context):111// CHECK: return _ods_ir.Attribute.parse(f'#TestDialect<testbitenum {str(x)}>', context=context)112 113// CHECK: @register_attribute_builder("TestMyEnum_Attr")114// CHECK: def _testmyenum_attr(x, context):115// CHECK: return _ods_ir.Attribute.parse(f'#TestDialect<enum {str(x)}>', context=context)116