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

Rolf Morel llvmlistbot at llvm.org
Fri Dec 12 08:46:05 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"):
----------------
rolfmorel wrote:

Just thinking out loud:

In a `my_dialects/my_int.py` file:
```python
from mlir import ir
from mlir.dialects.irdl import dsl as irdsl

class MyIntDialect(irdsl.Dialect, name="my_int"):
    def register(ctx):  # or load(...) or ...
        with ir.Location.file("my_dialects/my_int.py"):
            super().register(ctx)  # this method on `irdsl.Dialect` could also automagically set the relevant location based on the subclass's __file__

class ConstantOp(MyIntDialect.Operation, name="constant"):
    value = irdsl.Attribute(iattr)
    cst = irdsl.Result(i32)

my_int = MyIntDialect()
```
in `some_ir_builder.py`:
```python
from mlir import ir
from my_dialects.my_int import my_int, ConstantOp

def builder():
    ...
    with ir.InsertionPoint(...):
        one = ir.IntegerAttr.get(ir.i32Type.get(), 1)
        my_one = my_int.constant(value=one)
        assert(isinstance(my_one, ir.Value))
        assert(isinstance(my_one.owner, ConstantOp))

        my_one_too = ConstantOp(one)  # NB: question is if this will work as ConstantOp won't (directly) know about the my_int instance of MyIntDialect
        assert(isinstance(my_one_too.cst, ir.Value))
        assert(isinstance(my_one_too, ConstantOp))
```
in `main.py`:
```python
from mlir import ir
from my_dialects.my_int import my_int
from some_ir_builder import builder

if __name__ == "__main__":
    with ir.Context() as ctx, ir.Location.unknown():
        my_int.register(ctx)  # or my_int.register() or my_int.load(ctx) or ctx.register(my_int) or ...
        builder()
```

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


More information about the Mlir-commits mailing list