11f8618f8SAlex Zinenko// RUN: mlir-tblgen -gen-python-enum-bindings %s -I %S/../../include | FileCheck %s 21f8618f8SAlex Zinenko 31f8618f8SAlex Zinenkoinclude "mlir/IR/EnumAttr.td" 41f8618f8SAlex Zinenko 5*92233062Smaxdef Test_Dialect : Dialect { 6*92233062Smax let name = "TestDialect"; 7*92233062Smax let cppNamespace = "::test"; 8*92233062Smax} 9*92233062Smax 101f8618f8SAlex Zinenko// CHECK: Autogenerated by mlir-tblgen; don't manually edit. 111f8618f8SAlex Zinenko 12*92233062Smax// CHECK: from enum import IntEnum, auto, IntFlag 131f8618f8SAlex Zinenko// CHECK: from ._ods_common import _cext as _ods_cext 14*92233062Smax// CHECK: from ..ir import register_attribute_builder 151f8618f8SAlex Zinenko// CHECK: _ods_ir = _ods_cext.ir 161f8618f8SAlex Zinenko 171f8618f8SAlex Zinenkodef One : I32EnumAttrCase<"CaseOne", 1, "one">; 181f8618f8SAlex Zinenkodef Two : I32EnumAttrCase<"CaseTwo", 2, "two">; 19*92233062Smaxdef NegOne : I32EnumAttrCase<"CaseNegOne", -1, "negone">; 201f8618f8SAlex Zinenko 21*92233062Smaxdef MyEnum : I32EnumAttr<"MyEnum", "An example 32-bit enum", [One, Two, NegOne]>; 22*92233062Smax// CHECK-LABEL: class MyEnum(IntEnum): 231f8618f8SAlex Zinenko// CHECK: """An example 32-bit enum""" 241f8618f8SAlex Zinenko 25*92233062Smax// CHECK: CaseOne = 1 26*92233062Smax// CHECK: CaseTwo = 2 27*92233062Smax// CHECK: CaseNegOne = auto() 281f8618f8SAlex Zinenko 29*92233062Smax// CHECK: def __str__(self): 30*92233062Smax// CHECK: if self is MyEnum.CaseOne: 31*92233062Smax// CHECK: return "one" 32*92233062Smax// CHECK: if self is MyEnum.CaseTwo: 33*92233062Smax// CHECK: return "two" 34*92233062Smax// CHECK: if self is MyEnum.CaseNegOne: 35*92233062Smax// CHECK: return "negone" 36*92233062Smax// CHECK: raise ValueError("Unknown MyEnum enum entry.") 37*92233062Smax 38*92233062Smax// CHECK: @register_attribute_builder("MyEnum") 39*92233062Smax// CHECK: def _myenum(x, context): 40*92233062Smax// CHECK: return _ods_ir.IntegerAttr.get(_ods_ir.IntegerType.get_signless(32, context=context), int(x)) 41*92233062Smax 42*92233062Smaxdef TestMyEnum_Attr : EnumAttr<Test_Dialect, MyEnum, "enum">; 431f8618f8SAlex Zinenko 441f8618f8SAlex Zinenkodef One64 : I64EnumAttrCase<"CaseOne64", 1, "one">; 451f8618f8SAlex Zinenkodef Two64 : I64EnumAttrCase<"CaseTwo64", 2, "two">; 461f8618f8SAlex Zinenko 471f8618f8SAlex Zinenkodef MyEnum64 : I64EnumAttr<"MyEnum64", "An example 64-bit enum", [One64, Two64]>; 48*92233062Smax// CHECK-LABEL: class MyEnum64(IntEnum): 491f8618f8SAlex Zinenko// CHECK: """An example 64-bit enum""" 501f8618f8SAlex Zinenko 51*92233062Smax// CHECK: CaseOne64 = 1 52*92233062Smax// CHECK: CaseTwo64 = 2 531f8618f8SAlex Zinenko 54*92233062Smax// CHECK: def __str__(self): 55*92233062Smax// CHECK: if self is MyEnum64.CaseOne64: 56*92233062Smax// CHECK: return "one" 57*92233062Smax// CHECK: if self is MyEnum64.CaseTwo64: 58*92233062Smax// CHECK: return "two" 59*92233062Smax// CHECK: raise ValueError("Unknown MyEnum64 enum entry.") 601f8618f8SAlex Zinenko 61*92233062Smax// CHECK: @register_attribute_builder("MyEnum64") 62*92233062Smax// CHECK: def _myenum64(x, context): 63*92233062Smax// CHECK: return _ods_ir.IntegerAttr.get(_ods_ir.IntegerType.get_signless(64, context=context), int(x)) 64*92233062Smax 65*92233062Smaxdef TestBitEnum 66*92233062Smax : I32BitEnumAttr<"TestBitEnum", "", [ 67*92233062Smax I32BitEnumAttrCaseBit<"User", 0, "user">, 68*92233062Smax I32BitEnumAttrCaseBit<"Group", 1, "group">, 69*92233062Smax I32BitEnumAttrCaseBit<"Other", 2, "other">, 70*92233062Smax ]> { 71*92233062Smax let genSpecializedAttr = 0; 72*92233062Smax let separator = " | "; 73*92233062Smax} 74*92233062Smax 75*92233062Smaxdef TestBitEnum_Attr : EnumAttr<Test_Dialect, TestBitEnum, "testbitenum">; 76*92233062Smax 77*92233062Smax// CHECK-LABEL: class TestBitEnum(IntFlag): 78*92233062Smax 79*92233062Smax// CHECK: User = 1 80*92233062Smax// CHECK: Group = 2 81*92233062Smax// CHECK: Other = 4 82*92233062Smax 83*92233062Smax// CHECK: def __iter__(self): 84*92233062Smax// CHECK: return iter([case for case in type(self) if (self & case) is case]) 85*92233062Smax// CHECK: def __len__(self): 86*92233062Smax// CHECK: return bin(self).count("1") 87*92233062Smax 88*92233062Smax// CHECK: def __str__(self): 89*92233062Smax// CHECK: if len(self) > 1: 90*92233062Smax// CHECK: return " | ".join(map(str, self)) 91*92233062Smax// CHECK: if self is TestBitEnum.User: 92*92233062Smax// CHECK: return "user" 93*92233062Smax// CHECK: if self is TestBitEnum.Group: 94*92233062Smax// CHECK: return "group" 95*92233062Smax// CHECK: if self is TestBitEnum.Other: 96*92233062Smax// CHECK: return "other" 97*92233062Smax// CHECK: raise ValueError("Unknown TestBitEnum enum entry.") 98*92233062Smax 99*92233062Smax// CHECK: @register_attribute_builder("TestBitEnum") 100*92233062Smax// CHECK: def _testbitenum(x, context): 101*92233062Smax// CHECK: return _ods_ir.IntegerAttr.get(_ods_ir.IntegerType.get_signless(32, context=context), int(x)) 102*92233062Smax 103*92233062Smax// CHECK: @register_attribute_builder("TestBitEnum_Attr") 104*92233062Smax// CHECK: def _testbitenum_attr(x, context): 105*92233062Smax// CHECK: return _ods_ir.Attribute.parse(f'#TestDialect<testbitenum {str(x)}>', context=context) 106*92233062Smax 107*92233062Smax// CHECK: @register_attribute_builder("TestMyEnum_Attr") 108*92233062Smax// CHECK: def _testmyenum_attr(x, context): 109*92233062Smax// CHECK: return _ods_ir.Attribute.parse(f'#TestDialect<enum {str(x)}>', context=context) 110