[Mlir-commits] [mlir] [mlir] Quality of life improvements to python API types. (PR #66723)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Mon Sep 18 17:22:46 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

<details>
<summary>Changes</summary>

* Moves several orphaned methods from Operation/OpView -> _OperationBase so that both hierarchies share them (whether unknown or known to ODS).
* Adds typing information for missing `MLIRError` exception.
* Adds `DiagnosticInfo` typing.
* Adds `DenseResourceElementsAttr` typing that was missing.

---
Full diff: https://github.com/llvm/llvm-project/pull/66723.diff


3 Files Affected:

- (modified) mlir/lib/Bindings/Python/IRCore.cpp (+36-31) 
- (modified) mlir/python/mlir/_mlir_libs/_mlir/ir.pyi (+30-7) 
- (modified) mlir/python/mlir/_mlir_libs/_mlir/passmanager.pyi (+1-1) 


``````````diff
diff --git a/mlir/lib/Bindings/Python/IRCore.cpp b/mlir/lib/Bindings/Python/IRCore.cpp
index b06937bc285e206..48a65278cc3e6f2 100644
--- a/mlir/lib/Bindings/Python/IRCore.cpp
+++ b/mlir/lib/Bindings/Python/IRCore.cpp
@@ -2768,6 +2768,24 @@ void mlir::python::populateIRCore(py::module &m) {
                                return PyOpAttributeMap(
                                    self.getOperation().getRef());
                              })
+      .def_property_readonly(
+          "context",
+          [](PyOperationBase &self) {
+            PyOperation &concreteOperation = self.getOperation();
+            concreteOperation.checkValid();
+            return concreteOperation.getContext().getObject();
+          },
+          "Context that owns the Operation")
+      .def_property_readonly("name",
+                             [](PyOperationBase &self) {
+                               auto &concreteOperation = self.getOperation();
+                               concreteOperation.checkValid();
+                               MlirOperation operation =
+                                   concreteOperation.get();
+                               MlirStringRef name = mlirIdentifierStr(
+                                   mlirOperationGetName(operation));
+                               return py::str(name.data, name.length);
+                             })
       .def_property_readonly("operands",
                              [](PyOperationBase &self) {
                                return PyOpOperandList(
@@ -2813,6 +2831,14 @@ void mlir::python::populateIRCore(py::module &m) {
           },
           "Returns the source location the operation was defined or derived "
           "from.")
+      .def_property_readonly("parent",
+                             [](PyOperationBase &self) -> py::object {
+                               auto parent =
+                                   self.getOperation().getParentOperation();
+                               if (parent)
+                                 return parent->getObject();
+                               return py::none();
+                             })
       .def(
           "__str__",
           [](PyOperationBase &self) {
@@ -2855,6 +2881,12 @@ void mlir::python::populateIRCore(py::module &m) {
       .def("move_before", &PyOperationBase::moveBefore, py::arg("other"),
            "Puts self immediately before the other operation in its parent "
            "block.")
+      .def(
+          "clone",
+          [](PyOperationBase &self, py::object ip) {
+            return self.getOperation().clone(ip);
+          },
+          py::arg("ip") = py::none())
       .def(
           "detach_from_parent",
           [](PyOperationBase &self) {
@@ -2866,7 +2898,8 @@ void mlir::python::populateIRCore(py::module &m) {
             operation.detachFromParent();
             return operation.createOpView();
           },
-          "Detaches the operation from its parent block.");
+          "Detaches the operation from its parent block.")
+      .def("erase", [](PyOperationBase &self) { self.getOperation().erase(); });
 
   py::class_<PyOperation, PyOperationBase>(m, "Operation", py::module_local())
       .def_static("create", &PyOperation::create, py::arg("name"),
@@ -2887,45 +2920,17 @@ void mlir::python::populateIRCore(py::module &m) {
           py::arg("context") = py::none(),
           "Parses an operation. Supports both text assembly format and binary "
           "bytecode format.")
-      .def_property_readonly("parent",
-                             [](PyOperation &self) -> py::object {
-                               auto parent = self.getParentOperation();
-                               if (parent)
-                                 return parent->getObject();
-                               return py::none();
-                             })
-      .def("erase", &PyOperation::erase)
-      .def("clone", &PyOperation::clone, py::arg("ip") = py::none())
       .def_property_readonly(MLIR_PYTHON_CAPI_PTR_ATTR,
                              &PyOperation::getCapsule)
       .def(MLIR_PYTHON_CAPI_FACTORY_ATTR, &PyOperation::createFromCapsule)
-      .def_property_readonly("name",
-                             [](PyOperation &self) {
-                               self.checkValid();
-                               MlirOperation operation = self.get();
-                               MlirStringRef name = mlirIdentifierStr(
-                                   mlirOperationGetName(operation));
-                               return py::str(name.data, name.length);
-                             })
-      .def_property_readonly(
-          "context",
-          [](PyOperation &self) {
-            self.checkValid();
-            return self.getContext().getObject();
-          },
-          "Context that owns the Operation")
+      .def_property_readonly("operation", [](py::object self) { return self; })
       .def_property_readonly("opview", &PyOperation::createOpView);
 
   auto opViewClass =
       py::class_<PyOpView, PyOperationBase>(m, "OpView", py::module_local())
           .def(py::init<py::object>(), py::arg("operation"))
           .def_property_readonly("operation", &PyOpView::getOperationObject)
-          .def_property_readonly(
-              "context",
-              [](PyOpView &self) {
-                return self.getOperation().getContext().getObject();
-              },
-              "Context that owns the Operation")
+          .def_property_readonly("opview", [](py::object self) { return self; })
           .def("__str__", [](PyOpView &self) {
             return py::str(self.getOperationObject());
           });
diff --git a/mlir/python/mlir/_mlir_libs/_mlir/ir.pyi b/mlir/python/mlir/_mlir_libs/_mlir/ir.pyi
index 23f4687d0394d9e..e8f4440d216eeb4 100644
--- a/mlir/python/mlir/_mlir_libs/_mlir/ir.pyi
+++ b/mlir/python/mlir/_mlir_libs/_mlir/ir.pyi
@@ -43,11 +43,13 @@ __all__ = [
     "DenseElementsAttr",
     "DenseFPElementsAttr",
     "DenseIntElementsAttr",
+    "DenseResourceElementsAttr",
     "Dialect",
     "DialectDescriptor",
     "Dialects",
     "Diagnostic",
     "DiagnosticHandler",
+    "DiagnosticInfo",
     "DiagnosticSeverity",
     "DictAttr",
     "Float8E4M3FNType",
@@ -74,6 +76,7 @@ __all__ = [
     "Location",
     "MemRefType",
     "Module",
+    "MLIRError",
     "NamedAttribute",
     "NoneType",
     "OpaqueType",
@@ -123,10 +126,16 @@ class _OperationBase:
     @property
     def attributes(self) -> OpAttributeMap: ...
     @property
+    def context(self) -> Context: ...
+    @property
     def location(self) -> Location: ...
     @property
+    def name(self) -> str: ...
+    @property
     def operands(self) -> OpOperandList: ...
     @property
+    @property
+    def parent(self) -> Optional[_OperationBase]: ...
     def regions(self) -> RegionSequence: ...
     @property
     def result(self) -> OpResult: ...
@@ -530,6 +539,10 @@ class DenseIntElementsAttr(DenseElementsAttr):
     @property
     def type(self) -> Type: ...
 
+class DenseResourceElementsAttr(Attribute):
+    @staticmethod
+    def get_from_buffer(array: Any, name: str, type: Type, alignment: Optional[int] = None, is_mutable: bool = False, context: Optional[Context] = None) -> None: ...
+
 class Dialect:
     def __init__(self, descriptor: DialectDescriptor) -> None: ...
     @property
@@ -563,6 +576,17 @@ class DiagnosticHandler:
     def __enter__(self) -> DiagnosticHandler: ...
     def __exit__(self, arg0: object, arg1: object, arg2: object) -> None: ...
 
+class DiagnosticInfo:
+    def __init__(self, diag: Diagnostic) -> None: ...
+    @property
+    def severity(self) -> "DiagnosticSeverity": ...
+    @property
+    def location(self) -> "Location": ...
+    @property
+    def message(self) -> str: ...
+    @property
+    def notes(self) -> Sequence["DiagnosticInfo"]: ...
+
 class DiagnosticSeverity:
     ERROR: DiagnosticSeverity
     WARNING: DiagnosticSeverity
@@ -871,6 +895,9 @@ class Module:
     @property
     def operation(self) -> Operation: ...
 
+class MLIRError(Exception):
+    def __init__(self, message: str, error_diagnostics: List[DiagnosticInfo]) -> None: ...
+
 class NamedAttribute:
     @property
     def attr(self) -> Attribute: ...
@@ -950,9 +977,9 @@ class OpView(_OperationBase):
         loc: Optional[Location] = None,
         ip: Optional[InsertionPoint] = None) -> _TOperation: ...
     @property
-    def context(self) -> Context: ...
-    @property
     def operation(self) -> Operation: ...
+    @property
+    def opview(self) -> "OpView": ...
 
 class Operation(_OperationBase):
     def _CAPICreate(self) -> object: ...
@@ -968,13 +995,9 @@ class Operation(_OperationBase):
     @property
     def _CAPIPtr(self) -> object: ...
     @property
-    def context(self) -> Context: ...
-    @property
-    def name(self) -> str: ...
+    def operation(self) -> "Operation": ...
     @property
     def opview(self) -> OpView: ...
-    @property
-    def parent(self) -> Optional[_OperationBase]: ...
 
 class OperationIterator:
     def __iter__(self) -> OperationIterator: ...
diff --git a/mlir/python/mlir/_mlir_libs/_mlir/passmanager.pyi b/mlir/python/mlir/_mlir_libs/_mlir/passmanager.pyi
index 44d22255e3110dc..c072d5e0fb86f32 100644
--- a/mlir/python/mlir/_mlir_libs/_mlir/passmanager.pyi
+++ b/mlir/python/mlir/_mlir_libs/_mlir/passmanager.pyi
@@ -20,6 +20,6 @@ class PassManager:
     def enable_verifier(self, enable: bool) -> None: ...
     @staticmethod
     def parse(pipeline: str, context: Optional[_ir.Context] = None) -> PassManager: ...
-    def run(self, module: _ir.Module) -> None: ...
+    def run(self, module: _ir._OperationBase) -> None: ...
     @property
     def _CAPIPtr(self) -> object: ...

``````````

</details>


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


More information about the Mlir-commits mailing list