xref: /llvm-project/mlir/test/mlir-tblgen/enums-python-bindings.td (revision 92233062c17590d3157bdc6db430fcdfc54312fe)
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