9#ifndef MLIR_BINDINGS_PYTHON_IRCORE_H
10#define MLIR_BINDINGS_PYTHON_IRCORE_H
54 static void set(nanobind::object &o,
bool enable);
55 static bool get(
const nanobind::object &);
56 static void bind(nanobind::module_ &m);
59 static nanobind::ft_mutex mutex;
68 : referrent(referrent), object(std::move(object)) {
69 assert(this->referrent &&
70 "cannot construct PyObjectRef with null referrent");
71 assert(this->
object &&
"cannot construct PyObjectRef with null object");
74 : referrent(other.referrent), object(std::move(other.object)) {
75 other.referrent =
nullptr;
76 assert(!other.object);
79 : referrent(other.referrent), object(other.object ) {}
85 return Py_REFCNT(
object.
ptr());
92 assert(referrent &&
object);
94 auto stolen = std::move(
object);
98 T *
get() {
return referrent; }
100 assert(referrent &&
object);
104 assert(referrent &&
object);
107 operator bool()
const {
return referrent && object; }
109 using NBTypedT = nanobind::typed<nanobind::object, T>;
113 nanobind::object object;
133 nanobind::object insertionPoint,
134 nanobind::object location)
135 : context(std::move(context)), insertionPoint(std::move(insertionPoint)),
136 location(std::move(location)), frameKind(frameKind) {}
154 static nanobind::object pushContext(nanobind::object context);
156 static nanobind::object pushInsertionPoint(nanobind::object insertionPoint);
158 static nanobind::object pushLocation(nanobind::object location);
159 static void popLocation(
PyLocation &location);
162 static std::vector<PyThreadContextEntry> &getStack();
165 static void push(FrameKind frameKind, nanobind::object context,
166 nanobind::object insertionPoint, nanobind::object location);
169 nanobind::object context;
171 nanobind::object insertionPoint;
173 nanobind::object location;
188 MlirLlvmThreadPool
get() {
return threadPool; }
190 std::string _mlir_thread_pool_ptr()
const;
193 MlirLlvmThreadPool threadPool;
211 MlirContext
get() {
return context; }
218 nanobind::object getCapsule();
224 static nanobind::object createFromCapsule(nanobind::object capsule);
227 static size_t getLiveCount();
231 size_t getLiveModuleCount();
234 static nanobind::object contextEnter(nanobind::object context);
235 void contextExit(
const nanobind::object &excType,
236 const nanobind::object &excVal,
237 const nanobind::object &excTb);
241 nanobind::object attachDiagnosticHandler(nanobind::object callback);
256 using LiveContextMap = std::unordered_map<void *, PyMlirContext *>;
257 static nanobind::ft_mutex live_contexts_mutex;
258 static LiveContextMap &getLiveContexts();
264 using LiveModuleMap =
265 std::unordered_map<const void *, std::pair<nanobind::handle, PyModule *>>;
266 LiveModuleMap liveModules;
268 bool emitErrorDiagnostics =
false;
278 :
public Defaulting<DefaultingPyMlirContext, PyMlirContext> {
292 assert(this->contextRef &&
293 "context object constructed with null context ref");
309 operator MlirLocation()
const {
return loc; }
310 MlirLocation
get()
const {
return loc; }
313 static nanobind::object contextEnter(nanobind::object location);
314 void contextExit(
const nanobind::object &excType,
315 const nanobind::object &excVal,
316 const nanobind::object &excTb);
319 nanobind::object getCapsule();
325 static PyLocation createFromCapsule(nanobind::object capsule);
362 nanobind::str getMessage();
363 nanobind::tuple getNotes();
382 std::optional<nanobind::tuple> materializedNotes;
418 const nanobind::object &excVal,
419 const nanobind::object &excTb) {
425 nanobind::object callback;
426 std::optional<MlirDiagnosticHandlerID> registeredID;
427 bool hadError =
false;
436 ctx->
get(), handler, this,
440 assert(errors.empty() &&
"unhandled captured errors");
443 std::vector<PyDiagnostic::DiagnosticInfo>
take() {
444 return std::move(errors);
450 std::vector<PyDiagnostic::DiagnosticInfo> errors;
465 MlirDialect
get() {
return dialect; }
478 MlirDialect getDialectForKey(
const std::string &key,
bool attrError);
486 PyDialect(nanobind::object descriptor) : descriptor(std::move(descriptor)) {}
491 nanobind::object descriptor;
507 : registry(other.registry) {
508 other.registry = {
nullptr};
511 operator MlirDialectRegistry()
const {
return registry; }
512 MlirDialectRegistry
get()
const {
return registry; }
514 nanobind::object getCapsule();
518 MlirDialectRegistry registry;
524 :
public Defaulting<DefaultingPyLocation, PyLocation> {
530 operator MlirLocation()
const {
return *
get(); }
547 MlirModule
get() {
return module; }
551 return PyModuleRef(
this, nanobind::borrow<nanobind::object>(handle));
558 nanobind::object getCapsule();
563 static nanobind::object createFromCapsule(nanobind::object capsule);
570 nanobind::handle handle;
581 void print(std::optional<int64_t> largeElementsLimit,
582 std::optional<int64_t> largeResourceLimit,
bool enableDebugInfo,
583 bool prettyDebugInfo,
bool printGenericOpForm,
bool useLocalScope,
584 bool useNameLocAsPrefix,
bool assumeVerified,
585 nanobind::object fileObject,
bool binary,
bool skipRegions);
586 void print(
PyAsmState &state, nanobind::object fileObject,
bool binary);
589 getAsm(
bool binary, std::optional<int64_t> largeElementsLimit,
590 std::optional<int64_t> largeResourceLimit,
bool enableDebugInfo,
591 bool prettyDebugInfo,
bool printGenericOpForm,
bool useLocalScope,
592 bool useNameLocAsPrefix,
bool assumeVerified,
bool skipRegions);
596 std::optional<int64_t> bytecodeVersion);
640 nanobind::object parentKeepAlive = nanobind::object());
646 nanobind::object parentKeepAlive = nanobind::object());
651 const std::string &sourceStr,
652 const std::string &sourceName);
656 void detachFromParent();
659 operator MlirOperation()
const {
return get(); }
660 MlirOperation
get()
const;
665 void setAttached(
const nanobind::object &parent = nanobind::object());
667 void checkValid()
const;
675 std::optional<PyOperationRef> getParentOperation();
678 nanobind::object getCapsule();
683 static nanobind::object createFromCapsule(
const nanobind::object &capsule);
686 static nanobind::object
687 create(std::string_view name, std::optional<std::vector<PyType *>> results,
688 const MlirValue *operands,
size_t numOperands,
689 std::optional<nanobind::dict> attributes,
690 std::optional<std::vector<PyBlock *>> successors,
int regions,
691 PyLocation &location,
const nanobind::object &ip,
bool inferType);
694 nanobind::object createOpView();
704 nanobind::object
clone(
const nanobind::object &ip);
710 MlirOperation operation,
711 nanobind::object parentKeepAlive);
713 MlirOperation operation;
714 nanobind::handle handle;
721 nanobind::object parentKeepAlive;
722 bool attached =
true;
736 PyOpView(
const nanobind::object &operationObject);
741 static nanobind::object
742 buildGeneric(std::string_view name, std::tuple<int, bool> opRegionSpec,
743 nanobind::object operandSegmentSpecObj,
744 nanobind::object resultSegmentSpecObj,
745 std::optional<nanobind::list> resultTypeList,
746 nanobind::list operandList,
747 std::optional<nanobind::dict> attributes,
748 std::optional<std::vector<PyBlock *>> successors,
749 std::optional<int> regions,
PyLocation &location,
750 const nanobind::object &maybeIp);
759 static nanobind::object constructDerived(
const nanobind::object &cls,
760 const nanobind::object &operation);
764 nanobind::object operationObject;
773 : parentOperation(std::move(parentOperation)), region(region) {
776 operator MlirRegion()
const {
return region; }
778 MlirRegion
get() {
return region; }
791 PyAsmState(MlirValue value,
bool useLocalScope);
798 MlirAsmState
get() {
return state; }
802 MlirOpPrintingFlags flags;
811 : parentOperation(std::move(parentOperation)), block(block) {
815 MlirBlock
get() {
return block; }
821 nanobind::object getCapsule();
854 static nanobind::object
contextEnter(nanobind::object insertionPoint);
856 const nanobind::object &excVal,
857 const nanobind::object &excTb);
866 : refOperation(std::move(refOperation)), block(std::move(block)) {}
868 std::optional<PyOperationRef> refOperation;
879 operator MlirType()
const {
return type; }
880 MlirType
get()
const {
return type; }
883 nanobind::object getCapsule();
889 static PyType createFromCapsule(nanobind::object capsule);
891 nanobind::typed<nanobind::object, PyType> maybeDownCast();
907 operator MlirTypeID()
const {
return typeID; }
908 MlirTypeID
get() {
return typeID; }
911 nanobind::object getCapsule();
914 static PyTypeID createFromCapsule(nanobind::object capsule);
925template <
typename DerivedTy,
typename BaseTy = PyType>
931 using ClassTy = nanobind::class_<DerivedTy, BaseTy>;
940 : BaseTy(std::move(contextRef), t) {}
945 if (!DerivedTy::isaFunction(orig)) {
947 nanobind::cast<std::string>(nanobind::repr(nanobind::cast(orig)));
948 throw nanobind::value_error((std::string(
"Cannot cast type to ") +
949 DerivedTy::pyClassName +
" (from " +
956 static void bind(nanobind::module_ &m) {
957 auto cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::is_generic());
958 cls.def(nanobind::init<PyType &>(), nanobind::keep_alive<0, 1>(),
959 nanobind::arg(
"cast_from_type"));
960 cls.def_prop_ro_static(
"static_typeid", [](nanobind::object & ) {
961 if (DerivedTy::getTypeIdFunction)
962 return PyTypeID(DerivedTy::getTypeIdFunction());
963 throw nanobind::attribute_error(
964 (DerivedTy::pyClassName + std::string(
" has no typeid.")).c_str());
966 cls.def_prop_ro(
"typeid", [](
PyType &self) {
967 return nanobind::cast<PyTypeID>(nanobind::cast(self).attr(
"typeid"));
969 cls.def(
"__repr__", [](
DerivedTy &self) {
971 printAccum.
parts.append(DerivedTy::pyClassName);
972 printAccum.
parts.append(
"(");
974 printAccum.
parts.append(
")");
975 return printAccum.
join();
978 if (DerivedTy::getTypeIdFunction) {
980 DerivedTy::getTypeIdFunction(),
981 nanobind::cast<nanobind::callable>(nanobind::cpp_function(
986 if (DerivedTy::name.length != 0) {
987 cls.def_prop_ro_static(
"type_name", [](nanobind::object & ) {
988 return nanobind::str(DerivedTy::name.data, DerivedTy::name.length);
992 DerivedTy::bindDerived(cls);
1006 operator MlirAttribute()
const {
return attr; }
1007 MlirAttribute
get()
const {
return attr; }
1010 nanobind::object getCapsule();
1016 static PyAttribute createFromCapsule(
const nanobind::object &capsule);
1018 nanobind::typed<nanobind::object, PyAttribute> maybeDownCast();
1044 std::unique_ptr<std::string> ownedName;
1052template <
typename DerivedTy,
typename BaseTy = PyAttribute>
1058 using ClassTy = nanobind::class_<DerivedTy, BaseTy>;
1067 : BaseTy(std::move(contextRef), attr) {}
1072 if (!DerivedTy::isaFunction(orig)) {
1074 nanobind::cast<std::string>(nanobind::repr(nanobind::cast(orig)));
1075 throw nanobind::value_error((std::string(
"Cannot cast attribute to ") +
1076 DerivedTy::pyClassName +
" (from " +
1083 static void bind(nanobind::module_ &m, PyType_Slot *slots =
nullptr) {
1086 cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::type_slots(slots),
1087 nanobind::is_generic());
1089 cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::is_generic());
1091 cls.def(nanobind::init<PyAttribute &>(), nanobind::keep_alive<0, 1>(),
1092 nanobind::arg(
"cast_from_attr"));
1095 [](
PyAttribute &attr) -> nanobind::typed<nanobind::object, PyType> {
1099 cls.def_prop_ro_static(
"static_typeid", [](nanobind::object & ) {
1100 if (DerivedTy::getTypeIdFunction)
1101 return PyTypeID(DerivedTy::getTypeIdFunction());
1102 throw nanobind::attribute_error(
1103 (DerivedTy::pyClassName + std::string(
" has no typeid.")).c_str());
1106 return nanobind::cast<PyTypeID>(nanobind::cast(self).attr(
"typeid"));
1108 cls.def(
"__repr__", [](
DerivedTy &self) {
1110 printAccum.
parts.append(DerivedTy::pyClassName);
1111 printAccum.
parts.append(
"(");
1114 printAccum.
parts.append(
")");
1115 return printAccum.
join();
1118 if (DerivedTy::getTypeIdFunction) {
1120 DerivedTy::getTypeIdFunction(),
1121 nanobind::cast<nanobind::callable>(
1128 if (DerivedTy::name.length != 0) {
1129 cls.def_prop_ro_static(
"attr_name", [](nanobind::object & ) {
1130 return nanobind::str(DerivedTy::name.data, DerivedTy::name.length);
1134 DerivedTy::bindDerived(cls);
1169 : parentOperation(std::move(parentOperation)), value(value) {}
1170 operator MlirValue()
const {
return value; }
1172 MlirValue
get() {
return value; }
1178 nanobind::object getCapsule();
1180 nanobind::typed<nanobind::object,
1181 std::variant<PyBlockArgument, PyOpResult, PyValue>>
1186 static PyValue createFromCapsule(nanobind::object capsule);
1199 operator MlirAffineExpr()
const {
return affineExpr; }
1200 MlirAffineExpr
get()
const {
return affineExpr; }
1203 nanobind::object getCapsule();
1209 static PyAffineExpr createFromCapsule(
const nanobind::object &capsule);
1217 nanobind::typed<nanobind::object, PyAffineExpr>
maybeDownCast();
1220 MlirAffineExpr affineExpr;
1228 operator MlirAffineMap()
const {
return affineMap; }
1229 MlirAffineMap
get()
const {
return affineMap; }
1232 nanobind::object getCapsule();
1238 static PyAffineMap createFromCapsule(
const nanobind::object &capsule);
1241 MlirAffineMap affineMap;
1249 operator MlirIntegerSet()
const {
return integerSet; }
1250 MlirIntegerSet
get()
const {
return integerSet; }
1253 nanobind::object getCapsule();
1258 static PyIntegerSet createFromCapsule(
const nanobind::object &capsule);
1261 MlirIntegerSet integerSet;
1275 nanobind::object dunderGetItem(
const std::string &name);
1282 void dunderDel(
const std::string &name);
1290 static void setSymbolName(
PyOperationBase &symbol,
const std::string &name);
1295 const std::string &visibility);
1299 static void replaceAllSymbolUses(
const std::string &oldSymbol,
1300 const std::string &newSymbol,
1304 static void walkSymbolTables(
PyOperationBase &from,
bool allSymUsesVisible,
1305 nanobind::object callback);
1308 operator MlirSymbolTable() {
return symbolTable; }
1312 MlirSymbolTable symbolTable;
1320 : message(std::move(message)),
1321 errorDiagnostics(std::move(errorDiagnostics)) {}
1346 const std::optional<nanobind::sequence> &pyArgLocs);
1350 static nanobind::callable
1353 nanobind::callable
func,
bool replace);
1355 static void bind(nanobind::module_ &m);
1365 : operation(std::move(operation)), nextIndex(nextIndex) {}
1369 nanobind::typed<nanobind::object, PyRegion> dunderNext();
1371 static void bind(nanobind::module_ &m);
1381 :
public Sliceable<PyRegionList, PyRegion> {
1408 : operation(std::move(operation)), next(next) {}
1412 nanobind::typed<nanobind::object, PyBlock> dunderNext();
1414 static void bind(nanobind::module_ &m);
1427 : operation(std::move(operation)), region(region) {}
1435 PyBlock appendBlock(
const nanobind::args &pyArgTypes,
1436 const std::optional<nanobind::sequence> &pyArgLocs);
1438 static void bind(nanobind::module_ &m);
1448 : parentOperation(std::move(parentOperation)), next(next) {}
1452 nanobind::typed<nanobind::object, PyOpView> dunderNext();
1454 static void bind(nanobind::module_ &m);
1468 : parentOperation(std::move(parentOperation)), block(block) {}
1474 nanobind::typed<nanobind::object, PyOpView> dunderGetItem(
intptr_t index);
1476 static void bind(nanobind::module_ &m);
1486 operator MlirOpOperand()
const {
return opOperand; }
1488 nanobind::typed<nanobind::object, PyOpView> getOwner()
const;
1490 size_t getOperandNumber()
const;
1492 static void bind(nanobind::module_ &m);
1495 MlirOpOperand opOperand;
1504 nanobind::typed<nanobind::object, PyOpOperand> dunderNext();
1506 static void bind(nanobind::module_ &m);
1509 MlirOpOperand opOperand;
1515template <
typename DerivedTy>
1522 using ClassTy = nanobind::class_<DerivedTy, PyValue>;
1530 :
PyValue(operationRef, value) {}
1537 if (!DerivedTy::isaFunction(orig.
get())) {
1539 nanobind::cast<std::string>(nanobind::repr(nanobind::cast(orig)));
1540 throw nanobind::value_error((std::string(
"Cannot cast value to ") +
1541 DerivedTy::pyClassName +
" (from " +
1549 static void bind(nanobind::module_ &m) {
1550 auto cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::is_generic(),
1551 nanobind::sig((std::string(
"class ") +
1552 DerivedTy::pyClassName +
"(Value[_T])")
1554 cls.def(nanobind::init<PyValue &>(), nanobind::keep_alive<0, 1>(),
1555 nanobind::arg(
"value"));
1558 [](
DerivedTy &self) -> nanobind::typed<nanobind::object, DerivedTy> {
1559 return self.maybeDownCast();
1561 cls.def(
"__str__", [](
PyValue &self) {
1563 printAccum.
parts.append(std::string(DerivedTy::pyClassName) +
"(");
1566 printAccum.
parts.append(
")");
1567 return printAccum.
join();
1570 if (DerivedTy::getTypeIdFunction) {
1572 DerivedTy::getTypeIdFunction(),
1573 nanobind::cast<nanobind::callable>(nanobind::cpp_function(
1578 DerivedTy::bindDerived(cls);
1600 :
public Sliceable<PyOpResultList, PyOpResult> {
1642 :
public Sliceable<PyBlockArgumentList, PyBlockArgument> {
1676 :
public Sliceable<PyOpOperandList, PyValue> {
1707 :
public Sliceable<PyOpSuccessors, PyBlock> {
1737 :
public Sliceable<PyBlockSuccessors, PyBlock> {
1768 :
public Sliceable<PyBlockPredecessors, PyBlock> {
1796 : operation(std::move(operation)) {}
1798 nanobind::typed<nanobind::object, PyAttribute>
1799 dunderGetItemNamed(
const std::string &name);
1803 nanobind::typed<nanobind::object, std::optional<PyAttribute>>
1804 get(
const std::string &key, nanobind::object defaultValue);
1806 void dunderSetItem(
const std::string &name,
const PyAttribute &attr);
1808 void dunderDelItem(
const std::string &name);
1812 bool dunderContains(
const std::string &name);
1814 static void forEachAttr(MlirOperation op,
1817 static void bind(nanobind::module_ &m);
1827 : operands(std::move(operands)), attributes(std::move(attributes)) {}
1829 : operands(std::move(operands)),
1830 attributes(opView.getOperation().getRef()) {}
1832 static void bind(nanobind::module_ &m);
1835 nanobind::list operands;
1841 static bool attach(
const nanobind::object &opName,
1844 static void bind(nanobind::module_ &m);
1852 static void bind(nanobind::module_ &m);
1858 static void bind(nanobind::module_ &m);
1868template <
class Func,
typename... Args>
1870 nanobind::object
cf = nanobind::cpp_function(f, args...);
1872 return std::make_unique<nanobind::object>(
1873 nanobind::module_::import_(
"builtins").attr(
"classmethod"));
1875 return classmethodFn.
get()(
cf);
1886 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyMlirContext>
1888 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyMlirContext> {
1892 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyLocation>
1894 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyLocation> {};
MLIR_FLOAT16_EXPORT bool operator==(const f16 &f1, const f16 &f2)
bool mlirValueIsABlockArgument(MlirValue value)
MlirType mlirAttributeGetType(MlirAttribute attribute)
bool mlirValueIsAOpResult(MlirValue value)
void mlirOpPrintingFlagsDestroy(MlirOpPrintingFlags flags)
void mlirTypePrint(MlirType type, MlirStringCallback callback, void *userData)
#define MLIR_PYTHON_MAYBE_DOWNCAST_ATTR
Attribute on MLIR Python objects that expose a function for downcasting the corresponding Python obje...
static LogicalResult nextIndex(ArrayRef< int64_t > shape, MutableArrayRef< int64_t > index)
Walks over the indices of the elements of a tensor of a given shape by updating index in place to the...
static std::string diag(const llvm::Value &value)
static void print(spirv::VerCapExtAttr triple, DialectAsmPrinter &printer)
static sycl::context getDefaultContext()
A CRTP base class for pseudo-containers willing to support Python-type slicing access on top of index...
nanobind::class_< PyRegionList > ClassTy
Sliceable(intptr_t startIndex, intptr_t length, intptr_t step)
ReferrentTy * get() const
Defaulting()=default
Type casters require the type to be default constructible, but using such an instance is illegal.
PyMlirContextRef & getContext()
Accesses the context reference.
BaseContextObject(PyMlirContextRef ref)
Used in function arguments when None should resolve to the current context manager set instance.
static constexpr const char kTypeDescription[]
static PyLocation & resolve()
Defaulting()=default
Type casters require the type to be default constructible, but using such an instance is illegal.
Used in function arguments when None should resolve to the current context manager set instance.
static constexpr const char kTypeDescription[]
static PyMlirContext & resolve()
Defaulting()=default
Type casters require the type to be default constructible, but using such an instance is illegal.
Wrapper around MlirAffineExpr. Affine expressions are owned by the context.
PyAffineExpr ceilDiv(const PyAffineExpr &other) const
PyAffineExpr floorDiv(const PyAffineExpr &other) const
PyAffineExpr add(const PyAffineExpr &other) const
MlirAffineExpr get() const
PyAffineExpr mod(const PyAffineExpr &other) const
PyAffineExpr(PyMlirContextRef contextRef, MlirAffineExpr affineExpr)
nanobind::typed< nanobind::object, PyAffineExpr > maybeDownCast()
PyAffineExpr mul(const PyAffineExpr &other) const
PyAffineMap(PyMlirContextRef contextRef, MlirAffineMap affineMap)
MlirAffineMap get() const
Wrapper around an MlirAsmState.
PyAsmState(MlirValue value, bool useLocalScope)
PyAsmState(const PyAsmState &other)=delete
PyAsmState(PyAsmState &other)=delete
Wrapper around the generic MlirAttribute.
PyAttribute(PyMlirContextRef contextRef, MlirAttribute attr)
MlirAttribute get() const
Sliceable< PyBlockArgumentList, PyBlockArgument > SliceableT
PyBlockArgumentList(PyOperationRef operation, MlirBlock block, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
static constexpr const char * pyClassName
static void bindDerived(ClassTy &c)
Python wrapper for MlirBlockArgument.
static void bindDerived(ClassTy &c)
PyConcreteValue()=default
static constexpr IsAFunctionTy isaFunction
static constexpr const char * pyClassName
PyBlockIterator & dunderIter()
PyBlockIterator(PyOperationRef operation, MlirBlock next)
PyBlockList(PyOperationRef operation, MlirRegion region)
PyBlockPredecessors(PyBlock block, PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
static constexpr const char * pyClassName
PyBlockSuccessors(PyBlock block, PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
static constexpr const char * pyClassName
Wrapper around an MlirBlock.
PyOperationRef & getParentOperation()
PyBlock(PyOperationRef parentOperation, MlirBlock block)
static constexpr GetTypeIDFunctionTy getTypeIdFunction
static void bindDerived(ClassTy &m)
Implemented by derived classes to add methods to the Python subclass.
PyConcreteAttribute(PyMlirContextRef contextRef, MlirAttribute attr)
static void bind(nanobind::module_ &m, PyType_Slot *slots=nullptr)
nanobind::class_< DerivedTy, BaseTy > ClassTy
PyConcreteAttribute(PyAttribute &orig)
PyConcreteAttribute()=default
static MlirAttribute castFrom(PyAttribute &orig)
bool(*)(MlirAttribute) IsAFunctionTy
MlirTypeID(*)() GetTypeIDFunctionTy
static const MlirStringRef name
nanobind::class_< DerivedTy, BaseTy > ClassTy
static constexpr GetTypeIDFunctionTy getTypeIdFunction
static void bind(nanobind::module_ &m)
MlirTypeID(*)() GetTypeIDFunctionTy
PyConcreteType(PyMlirContextRef contextRef, MlirType t)
PyConcreteType(PyType &orig)
static const MlirStringRef name
static MlirType castFrom(PyType &orig)
bool(*)(MlirType) IsAFunctionTy
static void bindDerived(ClassTy &m)
Implemented by derived classes to add methods to the Python subclass.
PyConcreteValue(PyOperationRef operationRef, MlirValue value)
static constexpr GetTypeIDFunctionTy getTypeIdFunction
MlirTypeID(*)() GetTypeIDFunctionTy
PyConcreteValue(PyValue &orig)
PyConcreteValue()=default
static void bind(nanobind::module_ &m)
Binds the Python module objects to functions of this class.
nanobind::class_< DerivedTy, PyValue > ClassTy
bool(*)(MlirValue) IsAFunctionTy
static MlirValue castFrom(PyValue &orig)
Attempts to cast the original value to the derived type and throws on type mismatches.
static void bindDerived(ClassTy &m)
Implemented by derived classes to add methods to the Python subclass.
Represents a diagnostic handler attached to the context.
void detach()
Detaches the handler. Does nothing if not attached.
nanobind::object contextEnter()
PyDiagnosticHandler(MlirContext context, nanobind::object callback)
void contextExit(const nanobind::object &excType, const nanobind::object &excVal, const nanobind::object &excTb)
friend class PyMlirContext
Python class mirroring the C MlirDiagnostic struct.
PyDiagnostic(MlirDiagnostic diagnostic)
PyDialectDescriptor(PyMlirContextRef contextRef, MlirDialect dialect)
Wrapper around an MlirDialectRegistry.
PyDialectRegistry(PyDialectRegistry &&other) noexcept
MlirDialectRegistry get() const
PyDialectRegistry(MlirDialectRegistry registry)
PyDialectRegistry(PyDialectRegistry &)=delete
nanobind::object getDescriptor()
PyDialect(nanobind::object descriptor)
PyDialects(PyMlirContextRef contextRef)
static void bind(nanobind::module_ &m)
static bool attach(const nanobind::object &opName, const nanobind::object &target, PyMlirContext &context)
static bool attach(const nanobind::object &opName, PyMlirContext &context)
static void bind(nanobind::module_ &m)
static void bind(nanobind::module_ &m)
static bool attach(const nanobind::object &opName, PyMlirContext &context)
static PyGlobals & get()
Most code should get the globals via this static accessor.
An insertion point maintains a pointer to a Block and a reference operation.
void insert(PyOperationBase &operationBase)
Inserts an operation.
void contextExit(const nanobind::object &excType, const nanobind::object &excVal, const nanobind::object &excTb)
static PyInsertionPoint atBlockTerminator(PyBlock &block)
Shortcut to create an insertion point before the block terminator.
static PyInsertionPoint after(PyOperationBase &op)
Shortcut to create an insertion point to the node after the specified operation.
std::optional< PyOperationRef > & getRefOperation()
static PyInsertionPoint atBlockBegin(PyBlock &block)
Shortcut to create an insertion point at the beginning of the block.
PyInsertionPoint(const PyBlock &block)
Creates an insertion point positioned after the last operation in the block, but still inside the blo...
static nanobind::object contextEnter(nanobind::object insertionPoint)
Enter and exit the context manager.
MlirIntegerSet get() const
PyIntegerSet(PyMlirContextRef contextRef, MlirIntegerSet integerSet)
Wrapper around an MlirLocation.
PyLocation(PyMlirContextRef contextRef, MlirLocation loc)
static PyMlirContextRef forContext(MlirContext context)
Returns a context reference for the singleton PyMlirContext wrapper for the given context.
PyMlirContext(PyMlirContext &&)=delete
MlirContext get()
Accesses the underlying MlirContext.
PyMlirContext(const PyMlirContext &)=delete
bool getEmitErrorDiagnostics()
void setEmitErrorDiagnostics(bool value)
Controls whether error diagnostics should be propagated to diagnostic handlers, instead of being capt...
PyModule(PyModule &)=delete
PyModuleRef getRef()
Gets a strong reference to this module.
MlirModule get()
Gets the backing MlirModule.
static PyModuleRef forModule(MlirModule module)
Returns a PyModule reference for the given MlirModule.
PyModule(PyMlirContext &&)=delete
Represents a Python MlirNamedAttr, carrying an optional owned name.
PyNamedAttribute(MlirAttribute attr, std::string ownedName)
Constructs a PyNamedAttr that retains an owned name.
MlirNamedAttribute namedAttr
Template for a reference to a concrete type which captures a python reference to its underlying pytho...
nanobind::typed< nanobind::object, T > NBTypedT
PyObjectRef(PyObjectRef &&other) noexcept
nanobind::object releaseObject()
Releases the object held by this instance, returning it.
PyObjectRef(T *referrent, nanobind::object object)
nanobind::object getObject()
PyObjectRef(const PyObjectRef &other)
PyOpAdaptor(nanobind::list operands, PyOpAttributeMap attributes)
PyOpAdaptor(nanobind::list operands, PyOpView &opView)
A list of operation attributes.
PyOpAttributeMap(PyOperationRef operation)
PyOpOperandIterator(MlirOpOperand opOperand)
PyOpOperandIterator & dunderIter()
static constexpr const char * pyClassName
Sliceable< PyOpOperandList, PyValue > SliceableT
static void bindDerived(ClassTy &c)
PyOpOperandList(PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
void dunderSetItem(intptr_t index, PyValue value)
PyOpOperand(MlirOpOperand opOperand)
A list of operation results.
static void bindDerived(ClassTy &c)
Sliceable< PyOpResultList, PyOpResult > SliceableT
PyOpResultList(PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
PyOperationRef & getOperation()
static constexpr const char * pyClassName
Python wrapper for MlirOpResult.
static constexpr const char * pyClassName
static void bindDerived(ClassTy &c)
PyConcreteValue()=default
static constexpr IsAFunctionTy isaFunction
static void bindDerived(ClassTy &c)
static constexpr const char * pyClassName
PyOpSuccessors(PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
void dunderSetItem(intptr_t index, PyBlock block)
A PyOpView is equivalent to the C++ "Op" wrappers: these are the basis for providing more instance-sp...
PyOpView(const nanobind::object &operationObject)
PyOperation & getOperation() override
Each must provide access to the raw Operation.
nanobind::object getOperationObject()
Base class for PyOperation and PyOpView which exposes the primary, user visible methods for manipulat...
bool isBeforeInBlock(PyOperationBase &other)
Given an operation 'other' that is within the same parent block, return whether the current operation...
nanobind::object getAsm(bool binary, std::optional< int64_t > largeElementsLimit, std::optional< int64_t > largeResourceLimit, bool enableDebugInfo, bool prettyDebugInfo, bool printGenericOpForm, bool useLocalScope, bool useNameLocAsPrefix, bool assumeVerified, bool skipRegions)
virtual ~PyOperationBase()=default
void writeBytecode(const nanobind::object &fileObject, std::optional< int64_t > bytecodeVersion)
bool verify()
Verify the operation.
virtual PyOperation & getOperation()=0
Each must provide access to the raw Operation.
void moveAfter(PyOperationBase &other)
Moves the operation before or after the other operation.
void moveBefore(PyOperationBase &other)
void walk(std::function< PyWalkResult(MlirOperation)> callback, PyWalkOrder walkOrder)
PyOperationIterator(PyOperationRef parentOperation, MlirOperation next)
PyOperationIterator & dunderIter()
PyOperationList(PyOperationRef parentOperation, MlirBlock block)
MlirOperation get() const
void setInvalid()
Invalidate the operation.
friend class PyOperationBase
PyOperation & getOperation() override
Each must provide access to the raw Operation.
friend class PySymbolTable
PyOperation(PyMlirContextRef contextRef, MlirOperation operation)
PyRegionIterator & dunderIter()
PyRegionIterator(PyOperationRef operation, int nextIndex)
PyRegionIterator dunderIter()
static constexpr const char * pyClassName
PyRegionList(PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
static void bindDerived(ClassTy &c)
Wrapper around an MlirRegion.
PyOperationRef & getParentOperation()
PyRegion(PyOperationRef parentOperation, MlirRegion region)
static constexpr const char * pyClassName
static void bindDerived(ClassTy &c)
static constexpr IsAFunctionTy isaFunction
static constexpr GetTypeIDFunctionTy getTypeIdFunction
PyConcreteAttribute()=default
static const MlirStringRef name
Bindings for MLIR symbol tables.
PySymbolTable(PyOperationBase &operation)
Constructs a symbol table for the given operation.
~PySymbolTable()
Destroys the symbol table.
Tracks an entry in the thread context stack.
PyThreadContextEntry(FrameKind frameKind, nanobind::object context, nanobind::object insertionPoint, nanobind::object location)
int getMaxConcurrency() const
PyThreadPool(PyThreadPool &&)=delete
PyThreadPool(const PyThreadPool &)=delete
A TypeID provides an efficient and unique identifier for a specific C++ type.
PyTypeID(MlirTypeID typeID)
Wrapper around the generic MlirType.
PyType(PyMlirContextRef contextRef, MlirType type)
nanobind::typed< nanobind::object, PyType > maybeDownCast()
virtual ~PyValue()=default
PyOperationRef & getParentOperation()
PyValue(PyOperationRef parentOperation, MlirValue value)
Safely calls Python initialization code on first use, avoiding deadlocks.
MlirDiagnosticSeverity
Severity of a diagnostic.
MLIR_CAPI_EXPORTED MlirDiagnosticHandlerID mlirContextAttachDiagnosticHandler(MlirContext context, MlirDiagnosticHandler handler, void *userData, void(*deleteUserData)(void *))
Attaches the diagnostic handler to the context.
MLIR_CAPI_EXPORTED void mlirContextDetachDiagnosticHandler(MlirContext context, MlirDiagnosticHandlerID id)
Detaches an attached diagnostic handler from the context given its identifier.
uint64_t MlirDiagnosticHandlerID
Opaque identifier of a diagnostic handler, useful to detach a handler.
MLIR_CAPI_EXPORTED MlirTypeID mlirStringAttrGetTypeID(void)
Returns the typeID of a String attribute.
MLIR_CAPI_EXPORTED bool mlirAttributeIsAString(MlirAttribute attr)
Checks whether the given attribute is a string attribute.
MLIR_CAPI_EXPORTED MlirStringRef mlirStringAttrGetName(void)
MLIR_CAPI_EXPORTED void mlirDialectRegistryDestroy(MlirDialectRegistry registry)
Takes a dialect registry owned by the caller and destroys it.
MLIR_CAPI_EXPORTED void mlirAttributePrint(MlirAttribute attr, MlirStringCallback callback, void *userData)
Prints a location by sending chunks of the string representation and forwarding userData to callback`...
@ MlirWalkResultInterrupt
static bool mlirBlockIsNull(MlirBlock block)
Checks whether a block is null.
MLIR_CAPI_EXPORTED void mlirSymbolTableDestroy(MlirSymbolTable symbolTable)
Destroys the symbol table created with mlirSymbolTableCreate.
static bool mlirDialectRegistryIsNull(MlirDialectRegistry registry)
Checks if the dialect registry is null.
static bool mlirRegionIsNull(MlirRegion region)
Checks whether a region is null.
MLIR_CAPI_EXPORTED MlirDialectRegistry mlirDialectRegistryCreate(void)
Creates a dialect registry and transfers its ownership to the caller.
MLIR_CAPI_EXPORTED void mlirValuePrint(MlirValue value, MlirStringCallback callback, void *userData)
Prints a block by sending chunks of the string representation and forwarding userData to callback`.
static MlirStringRef mlirStringRefCreate(const char *str, size_t length)
Constructs a string reference from the pointer and length.
#define MLIR_PYTHON_API_EXPORTED
MLIR_PYTHON_API_EXPORTED MlirValue getUniqueResult(MlirOperation operation)
MLIR_PYTHON_API_EXPORTED void populateRoot(nanobind::module_ &m)
PyObjectRef< PyMlirContext > PyMlirContextRef
Wrapper around MlirContext.
PyObjectRef< PyOperation > PyOperationRef
MlirStringRef toMlirStringRef(const std::string &s)
PyObjectRef< PyModule > PyModuleRef
MlirBlock MLIR_PYTHON_API_EXPORTED createBlock(const nanobind::sequence &pyArgTypes, const std::optional< nanobind::sequence > &pyArgLocs)
Create a block, using the current location context if no locations are specified.
PyWalkOrder
Traversal order for operation walk.
MLIR_PYTHON_API_EXPORTED void populateIRCore(nanobind::module_ &m)
nanobind::object classmethod(Func f, Args... args)
Helper for creating an @classmethod.
Include the generated interface declarations.
Operation * clone(OpBuilder &b, Operation *op, TypeRange newResultTypes, ValueRange newOperands)
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
An opaque reference to a diagnostic, always owned by the diagnostics engine (context).
A logical result value, essentially a boolean with named states.
A pointer to a sized fragment of a string, not necessarily null-terminated.
Accumulates into a python string from a method that accepts an MlirStringCallback.
MlirStringCallback getCallback()
MLIRError(std::string message, std::vector< PyDiagnostic::DiagnosticInfo > &&errorDiagnostics={})
std::vector< PyDiagnostic::DiagnosticInfo > errorDiagnostics
static bool dunderContains(const std::string &attributeKind)
static nanobind::callable dunderGetItemNamed(const std::string &attributeKind)
static void bind(nanobind::module_ &m)
static void dunderSetItemNamed(const std::string &attributeKind, nanobind::callable func, bool replace)
Materialized diagnostic information.
std::vector< DiagnosticInfo > notes
PyDiagnosticSeverity severity
Wrapper for the global LLVM debugging flag.
static void set(nanobind::object &o, bool enable)
static bool get(const nanobind::object &)
static void bind(nanobind::module_ &m)
std::vector< PyDiagnostic::DiagnosticInfo > take()
ErrorCapture(PyMlirContextRef ctx)