[Mlir-commits] [mlir] [MLIR][Python] Add a DSL for defining IRDL dialects in Python bindings (PR #169045)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Dec 22 01:14:04 PST 2025


================
@@ -0,0 +1,300 @@
+# RUN: %PYTHON %s 2>&1 | FileCheck %s
+
+from mlir.ir import *
+from mlir.dialects.irdl import dsl as irdsl
+from mlir.dialects import arith
+import sys
+
+
+def run(f):
+    print("\nTEST:", f.__name__, file=sys.stderr)
+    with Context():
+        f()
+
+
+# CHECK: TEST: testMyInt
+ at run
+def testMyInt():
+    myint = irdsl.Dialect("myint")
+    iattr = irdsl.BaseName("#builtin.integer")
+    i32 = irdsl.Is(IntegerType.get_signless(32))
+
+    class ConstantOp(myint.Operation, name="constant"):
+        value = irdsl.Attribute(iattr)
+        cst = irdsl.Result(i32)
+
+    class AddOp(myint.Operation, name="add"):
+        lhs = irdsl.Operand(i32)
+        rhs = irdsl.Operand(i32)
+        res = irdsl.Result(i32)
+
+    # CHECK: irdl.dialect @myint {
+    # CHECK:   irdl.operation @constant {
+    # CHECK:     %0 = irdl.base "#builtin.integer"
+    # CHECK:     irdl.attributes {"value" = %0}
+    # CHECK:     %1 = irdl.is i32
+    # CHECK:     irdl.results(cst: %1)
+    # CHECK:   }
+    # CHECK:   irdl.operation @add {
+    # CHECK:     %0 = irdl.is i32
+    # CHECK:     irdl.operands(lhs: %0, rhs: %0)
+    # CHECK:     irdl.results(res: %0)
+    # CHECK:   }
+    # CHECK: }
+    with Location.unknown():
+        myint.load()
+    print(myint.mlir_module)
+
+    # CHECK: ['constant', 'add']
+    print([i._op_name for i in myint.operations])
+
+    i32 = IntegerType.get_signless(32)
+    with Location.unknown():
+        module = Module.create()
+        with InsertionPoint(module.body):
+            two = ConstantOp(i32, IntegerAttr.get(i32, 2))
+            three = ConstantOp(i32, IntegerAttr.get(i32, 3))
+            add1 = AddOp(i32, two, three)
+            add2 = AddOp(i32, add1, two)
+            add3 = AddOp(i32, add2, three)
+
+    # CHECK: %0 = "myint.constant"() {value = 2 : i32} : () -> i32
+    # CHECK: %1 = "myint.constant"() {value = 3 : i32} : () -> i32
+    # CHECK: %2 = "myint.add"(%0, %1) : (i32, i32) -> i32
+    # CHECK: %3 = "myint.add"(%2, %0) : (i32, i32) -> i32
+    # CHECK: %4 = "myint.add"(%3, %1) : (i32, i32) -> i32
+    print(module)
+    assert module.operation.verify()
+
+    # CHECK: AddOp
+    print(type(add1).__name__)
+    # CHECK: ConstantOp
+    print(type(two).__name__)
+    # CHECK: myint.add
+    print(add1.OPERATION_NAME)
+    # CHECK: None
+    print(add1._ODS_OPERAND_SEGMENTS)
+    # CHECK: None
+    print(add1._ODS_RESULT_SEGMENTS)
+    # CHECK: %0 = "myint.constant"() {value = 2 : i32} : () -> i32
+    print(add1.lhs.owner)
+    # CHECK: %1 = "myint.constant"() {value = 3 : i32} : () -> i32
+    print(add1.rhs.owner)
+    # CHECK: 2 : i32
+    print(two.value)
+    # CHECK: Value(%0
+    print(two.cst)
+    # CHECK: (self, /, res, lhs, rhs, *, loc=None, ip=None)
+    print(AddOp.__init__.__signature__)
+    # CHECK: (self, /, cst, value, *, loc=None, ip=None)
+    print(ConstantOp.__init__.__signature__)
+
+
+ at run
+def testIRDSL():
+    test = irdsl.Dialect("irdsl_test")
+    i32 = irdsl.Is(IntegerType.get_signless(32))
+    i64 = irdsl.Is(IntegerType.get_signless(64))
+    i32or64 = i32 | i64
+    any = irdsl.Any()
+    f32 = irdsl.Is(F32Type.get())
+    iattr = irdsl.BaseName("#builtin.integer")
+    fattr = irdsl.BaseName("#builtin.float")
+
+    class ConstraintOp(test.Operation, name="constraint"):
+        a = irdsl.Operand(i32or64)
+        b = irdsl.Operand(any)
+        c = irdsl.Operand(f32 | i32)
+        d = irdsl.Operand(any)
+        x = irdsl.Attribute(iattr)
+        y = irdsl.Attribute(fattr)
+
+    class OptionalOp(test.Operation, name="optional"):
+        a = irdsl.Operand(i32)
+        b = irdsl.Operand(i32, irdsl.Variadicity.optional)
+        out1 = irdsl.Result(i32)
+        out2 = irdsl.Result(i32, irdsl.Variadicity.optional)
+        out3 = irdsl.Result(i32)
+
+    class Optional2Op(test.Operation, name="optional2"):
+        a = irdsl.Operand(i32, irdsl.Variadicity.optional)
+        b = irdsl.Result(i32, irdsl.Variadicity.optional)
----------------
PragmaTwice wrote:

Done in https://github.com/llvm/llvm-project/pull/169045/commits/59d7ae71288af54ae76d53f2976fe4299e638308.

https://github.com/llvm/llvm-project/pull/169045


More information about the Mlir-commits mailing list