9#ifndef MLIR_BINDINGS_PYTHON_IRCORE_H
10#define MLIR_BINDINGS_PYTHON_IRCORE_H
55 static void set(nanobind::object &o,
bool enable);
56 static bool get(
const nanobind::object &);
57 static void bind(nanobind::module_ &m);
60 static nanobind::ft_mutex mutex;
69 : referrent(referrent), object(std::move(object)) {
70 assert(this->referrent &&
71 "cannot construct PyObjectRef with null referrent");
72 assert(this->
object &&
"cannot construct PyObjectRef with null object");
75 : referrent(other.referrent), object(std::move(other.object)) {
76 other.referrent =
nullptr;
77 assert(!other.object);
80 : referrent(other.referrent), object(other.object ) {}
82 referrent = other.referrent;
83 object = other.object;
87 referrent = other.referrent;
88 object = std::move(other.object);
89 other.referrent =
nullptr;
90 assert(!other.object);
98 return Py_REFCNT(
object.
ptr());
105 assert(referrent &&
object);
107 auto stolen = std::move(
object);
111 T *
get() {
return referrent; }
113 assert(referrent &&
object);
117 assert(referrent &&
object);
120 operator bool()
const {
return referrent && object; }
122 using NBTypedT = nanobind::typed<nanobind::object, T>;
126 nanobind::object object;
146 nanobind::object insertionPoint,
147 nanobind::object location)
148 : context(std::move(context)), insertionPoint(std::move(insertionPoint)),
149 location(std::move(location)), frameKind(frameKind) {}
167 static nanobind::object pushContext(nanobind::object context);
169 static nanobind::object pushInsertionPoint(nanobind::object insertionPoint);
171 static nanobind::object pushLocation(nanobind::object location);
172 static void popLocation(
PyLocation &location);
175 static std::vector<PyThreadContextEntry> &getStack();
178 static void push(FrameKind frameKind, nanobind::object context,
179 nanobind::object insertionPoint, nanobind::object location);
182 nanobind::object context;
184 nanobind::object insertionPoint;
186 nanobind::object location;
201 MlirLlvmThreadPool
get() {
return threadPool; }
203 std::string _mlir_thread_pool_ptr()
const;
206 MlirLlvmThreadPool threadPool;
224 MlirContext
get() {
return context; }
231 nanobind::object getCapsule();
237 static nanobind::object createFromCapsule(nanobind::object capsule);
240 static size_t getLiveCount();
244 size_t getLiveModuleCount();
247 static nanobind::object contextEnter(nanobind::object context);
248 void contextExit(
const nanobind::object &excType,
249 const nanobind::object &excVal,
250 const nanobind::object &excTb);
254 nanobind::object attachDiagnosticHandler(nanobind::object callback);
269 using LiveContextMap = std::unordered_map<void *, PyMlirContext *>;
270 static nanobind::ft_mutex live_contexts_mutex;
271 static LiveContextMap &getLiveContexts();
277 using LiveModuleMap =
278 std::unordered_map<const void *, std::pair<nanobind::handle, PyModule *>>;
279 LiveModuleMap liveModules;
281 bool emitErrorDiagnostics =
false;
291 :
public Defaulting<DefaultingPyMlirContext, PyMlirContext> {
305 assert(this->contextRef &&
306 "context object constructed with null context ref");
322 operator MlirLocation()
const {
return loc; }
323 MlirLocation
get()
const {
return loc; }
326 static nanobind::object contextEnter(nanobind::object location);
327 void contextExit(
const nanobind::object &excType,
328 const nanobind::object &excVal,
329 const nanobind::object &excTb);
332 nanobind::object getCapsule();
338 static PyLocation createFromCapsule(nanobind::object capsule);
342 nanobind::typed<nanobind::object, PyLocation> maybeDownCast();
370 MlirOperationEquivalenceFlags> {
371 None = MLIR_OPERATION_EQUIVALENCE_NONE,
388 nanobind::typed<nanobind::object, PyLocation> getLocation();
389 nanobind::str getMessage();
390 nanobind::typed<nanobind::tuple, PyDiagnostic> getNotes();
409 std::optional<nanobind::tuple> materializedNotes;
445 const nanobind::object &excVal,
446 const nanobind::object &excTb) {
452 nanobind::object callback;
453 std::optional<MlirDiagnosticHandlerID> registeredID;
454 bool hadError =
false;
463 ctx->
get(), handler, this,
467 assert(errors.empty() &&
"unhandled captured errors");
470 std::vector<PyDiagnostic::DiagnosticInfo>
take() {
471 return std::move(errors);
477 std::vector<PyDiagnostic::DiagnosticInfo> errors;
492 MlirDialect
get() {
return dialect; }
505 MlirDialect getDialectForKey(
const std::string &key,
bool attrError);
513 PyDialect(nanobind::object descriptor) : descriptor(std::move(descriptor)) {}
518 nanobind::object descriptor;
534 : registry(other.registry) {
535 other.registry = {
nullptr};
538 operator MlirDialectRegistry()
const {
return registry; }
539 MlirDialectRegistry
get()
const {
return registry; }
541 nanobind::object getCapsule();
545 MlirDialectRegistry registry;
551 :
public Defaulting<DefaultingPyLocation, PyLocation> {
557 operator MlirLocation()
const {
return *
get(); }
574 MlirModule
get() {
return module; }
578 return PyModuleRef(
this, nanobind::borrow<nanobind::object>(handle));
585 nanobind::object getCapsule();
590 static nanobind::object createFromCapsule(nanobind::object capsule);
597 nanobind::handle handle;
608 void print(std::optional<int64_t> largeElementsLimit,
609 std::optional<int64_t> largeResourceLimit,
bool enableDebugInfo,
610 bool prettyDebugInfo,
bool printGenericOpForm,
bool useLocalScope,
611 bool useNameLocAsPrefix,
bool assumeVerified,
612 nanobind::object fileObject,
bool binary,
bool skipRegions);
613 void print(
PyAsmState &state, nanobind::object fileObject,
bool binary);
616 getAsm(
bool binary, std::optional<int64_t> largeElementsLimit,
617 std::optional<int64_t> largeResourceLimit,
bool enableDebugInfo,
618 bool prettyDebugInfo,
bool printGenericOpForm,
bool useLocalScope,
619 bool useNameLocAsPrefix,
bool assumeVerified,
bool skipRegions);
623 std::optional<int64_t> bytecodeVersion);
667 nanobind::object parentKeepAlive = nanobind::object());
673 nanobind::object parentKeepAlive = nanobind::object());
678 const std::string &sourceStr,
679 const std::string &sourceName);
683 void detachFromParent();
686 operator MlirOperation()
const {
return get(); }
687 MlirOperation
get()
const;
692 void setAttached(
const nanobind::object &parent = nanobind::object());
694 void checkValid()
const;
702 std::optional<PyOperationRef> getParentOperation();
705 nanobind::object getCapsule();
710 static nanobind::object createFromCapsule(
const nanobind::object &capsule);
713 static nanobind::object
714 create(std::string_view name, std::optional<std::vector<PyType *>> results,
715 const MlirValue *operands,
size_t numOperands,
716 std::optional<nanobind::dict> attributes,
717 std::optional<std::vector<PyBlock *>> successors,
int regions,
718 PyLocation &location,
const nanobind::object &ip,
bool inferType);
721 nanobind::object createOpView();
731 nanobind::object
clone(
const nanobind::object &ip);
737 MlirOperation operation,
738 nanobind::object parentKeepAlive);
740 MlirOperation operation;
741 nanobind::handle handle;
748 nanobind::object parentKeepAlive;
749 bool attached =
true;
763 PyOpView(
const nanobind::object &operationObject);
768 static nanobind::typed<nanobind::object, PyOperation>
769 buildGeneric(std::string_view name, std::tuple<int, bool> opRegionSpec,
770 nanobind::object operandSegmentSpecObj,
771 nanobind::object resultSegmentSpecObj,
772 std::optional<nanobind::sequence> resultTypeList,
773 nanobind::sequence operandList,
774 std::optional<nanobind::dict> attributes,
775 std::optional<std::vector<PyBlock *>> successors,
776 std::optional<int> regions,
PyLocation &location,
777 const nanobind::object &maybeIp);
786 static nanobind::object constructDerived(
const nanobind::object &cls,
787 const nanobind::object &operation);
791 nanobind::object operationObject;
800 : parentOperation(std::move(parentOperation)), region(region) {
803 operator MlirRegion()
const {
return region; }
805 MlirRegion
get() {
return region; }
818 PyAsmState(MlirValue value,
bool useLocalScope);
825 MlirAsmState
get() {
return state; }
829 MlirOpPrintingFlags flags;
838 : parentOperation(std::move(parentOperation)), block(block) {
842 MlirBlock
get() {
return block; }
848 nanobind::object getCapsule();
881 static nanobind::object
contextEnter(nanobind::object insertionPoint);
883 const nanobind::object &excVal,
884 const nanobind::object &excTb);
893 : refOperation(std::move(refOperation)), block(std::move(block)) {}
895 std::optional<PyOperationRef> refOperation;
906 operator MlirType()
const {
return type; }
907 MlirType
get()
const {
return type; }
910 nanobind::object getCapsule();
916 static PyType createFromCapsule(nanobind::object capsule);
918 nanobind::typed<nanobind::object, PyType> maybeDownCast();
934 operator MlirTypeID()
const {
return typeID; }
935 MlirTypeID
get() {
return typeID; }
938 nanobind::object getCapsule();
941 static PyTypeID createFromCapsule(nanobind::object capsule);
952template <
typename DerivedTy,
typename BaseTy = PyType>
958 using ClassTy = nanobind::class_<DerivedTy, BaseTy>;
967 : BaseTy(std::move(contextRef), t) {}
972 if (!DerivedTy::isaFunction(orig)) {
974 nanobind::cast<std::string>(nanobind::repr(nanobind::cast(orig)));
975 throw nanobind::value_error((std::string(
"Cannot cast type to ") +
976 DerivedTy::pyClassName +
" (from " +
983 static void bind(nanobind::module_ &m) {
984 auto cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::is_generic());
985 cls.def(nanobind::init<PyType &>(), nanobind::keep_alive<0, 1>(),
986 nanobind::arg(
"cast_from_type"));
987 cls.def_prop_ro_static(
"static_typeid", [](nanobind::object & ) {
988 if (DerivedTy::getTypeIdFunction)
989 return PyTypeID(DerivedTy::getTypeIdFunction());
990 throw nanobind::attribute_error(
991 (DerivedTy::pyClassName + std::string(
" has no typeid.")).c_str());
993 cls.def_prop_ro(
"typeid", [](
PyType &self) {
994 return nanobind::cast<PyTypeID>(nanobind::cast(self).attr(
"typeid"));
996 cls.def(
"__repr__", [](
DerivedTy &self) {
998 printAccum.
parts.append(DerivedTy::pyClassName);
999 printAccum.
parts.append(
"(");
1001 printAccum.
parts.append(
")");
1002 return printAccum.
join();
1005 if (DerivedTy::getTypeIdFunction) {
1007 DerivedTy::getTypeIdFunction(),
1008 nanobind::cast<nanobind::callable>(nanobind::cpp_function(
1013 if (DerivedTy::name.length != 0) {
1014 cls.def_prop_ro_static(
"type_name", [](nanobind::object & ) {
1015 return nanobind::str(DerivedTy::name.data, DerivedTy::name.length);
1019 DerivedTy::bindDerived(cls);
1033 operator MlirAttribute()
const {
return attr; }
1034 MlirAttribute
get()
const {
return attr; }
1037 nanobind::object getCapsule();
1043 static PyAttribute createFromCapsule(
const nanobind::object &capsule);
1045 nanobind::typed<nanobind::object, PyAttribute> maybeDownCast();
1071 std::unique_ptr<std::string> ownedName;
1079template <
typename DerivedTy,
typename BaseTy = PyAttribute>
1085 using ClassTy = nanobind::class_<DerivedTy, BaseTy>;
1094 : BaseTy(std::move(contextRef), attr) {}
1099 if (!DerivedTy::isaFunction(orig)) {
1101 nanobind::cast<std::string>(nanobind::repr(nanobind::cast(orig)));
1102 throw nanobind::value_error((std::string(
"Cannot cast attribute to ") +
1103 DerivedTy::pyClassName +
" (from " +
1110 static void bind(nanobind::module_ &m, PyType_Slot *slots =
nullptr) {
1113 cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::type_slots(slots),
1114 nanobind::is_generic());
1116 cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::is_generic());
1118 cls.def(nanobind::init<PyAttribute &>(), nanobind::keep_alive<0, 1>(),
1119 nanobind::arg(
"cast_from_attr"));
1122 [](
PyAttribute &attr) -> nanobind::typed<nanobind::object, PyType> {
1126 cls.def_prop_ro_static(
"static_typeid", [](nanobind::object & ) {
1127 if (DerivedTy::getTypeIdFunction)
1128 return PyTypeID(DerivedTy::getTypeIdFunction());
1129 throw nanobind::attribute_error(
1130 (DerivedTy::pyClassName + std::string(
" has no typeid.")).c_str());
1133 return nanobind::cast<PyTypeID>(nanobind::cast(self).attr(
"typeid"));
1135 cls.def(
"__repr__", [](
DerivedTy &self) {
1137 printAccum.
parts.append(DerivedTy::pyClassName);
1138 printAccum.
parts.append(
"(");
1141 printAccum.
parts.append(
")");
1142 return printAccum.
join();
1145 if (DerivedTy::getTypeIdFunction) {
1147 DerivedTy::getTypeIdFunction(),
1148 nanobind::cast<nanobind::callable>(
1155 if (DerivedTy::name.length != 0) {
1156 cls.def_prop_ro_static(
"attr_name", [](nanobind::object & ) {
1157 return nanobind::str(DerivedTy::name.data, DerivedTy::name.length);
1161 DerivedTy::bindDerived(cls);
1183template <
typename DerivedTy,
typename BaseTy = PyLocation>
1189 using ClassTy = nanobind::class_<DerivedTy, BaseTy>;
1197 : BaseTy(std::move(contextRef), loc) {}
1202 if (!DerivedTy::isaFunction(orig.
get())) {
1204 nanobind::cast<std::string>(nanobind::repr(nanobind::cast(orig)));
1205 throw nanobind::value_error((std::string(
"Cannot cast location to ") +
1206 DerivedTy::pyClassName +
" (from " +
1213 static void bind(nanobind::module_ &m) {
1214 ClassTy cls(m, DerivedTy::pyClassName, nanobind::is_generic());
1215 cls.def(nanobind::init<PyLocation &>(), nanobind::keep_alive<0, 1>(),
1216 nanobind::arg(
"cast_from_loc"));
1217 cls.def_prop_ro_static(
"static_typeid", [](nanobind::object & ) {
1218 if (DerivedTy::getTypeIdFunction)
1219 return PyTypeID(DerivedTy::getTypeIdFunction());
1220 throw nanobind::attribute_error(
1221 (DerivedTy::pyClassName + std::string(
" has no typeid.")).c_str());
1223 cls.def(
"__repr__", [](
DerivedTy &self) {
1225 printAccum.
parts.append(DerivedTy::pyClassName);
1226 printAccum.
parts.append(
"(");
1229 printAccum.
parts.append(
")");
1230 return printAccum.
join();
1232 if (DerivedTy::getTypeIdFunction) {
1234 DerivedTy::getTypeIdFunction(),
1235 nanobind::cast<nanobind::callable>(nanobind::cpp_function(
1239 DerivedTy::bindDerived(cls);
1321 : parentOperation(std::move(parentOperation)), value(value) {}
1322 operator MlirValue()
const {
return value; }
1324 MlirValue
get() {
return value; }
1330 nanobind::object getCapsule();
1332 nanobind::typed<nanobind::object,
1333 std::variant<PyBlockArgument, PyOpResult, PyValue>>
1338 static PyValue createFromCapsule(nanobind::object capsule);
1351 operator MlirAffineExpr()
const {
return affineExpr; }
1352 MlirAffineExpr
get()
const {
return affineExpr; }
1355 nanobind::object getCapsule();
1361 static PyAffineExpr createFromCapsule(
const nanobind::object &capsule);
1369 nanobind::typed<nanobind::object, PyAffineExpr>
maybeDownCast();
1372 MlirAffineExpr affineExpr;
1380 operator MlirAffineMap()
const {
return affineMap; }
1381 MlirAffineMap
get()
const {
return affineMap; }
1384 nanobind::object getCapsule();
1390 static PyAffineMap createFromCapsule(
const nanobind::object &capsule);
1393 MlirAffineMap affineMap;
1401 operator MlirIntegerSet()
const {
return integerSet; }
1402 MlirIntegerSet
get()
const {
return integerSet; }
1405 nanobind::object getCapsule();
1410 static PyIntegerSet createFromCapsule(
const nanobind::object &capsule);
1413 MlirIntegerSet integerSet;
1427 nanobind::object dunderGetItem(
const std::string &name);
1434 void dunderDel(
const std::string &name);
1442 static void setSymbolName(
PyOperationBase &symbol,
const std::string &name);
1447 const std::string &visibility);
1451 static void replaceAllSymbolUses(
const std::string &oldSymbol,
1452 const std::string &newSymbol,
1456 static void walkSymbolTables(
PyOperationBase &from,
bool allSymUsesVisible,
1457 nanobind::object callback);
1460 operator MlirSymbolTable() {
return symbolTable; }
1464 MlirSymbolTable symbolTable;
1472 : message(std::move(message)),
1473 errorDiagnostics(std::move(errorDiagnostics)) {}
1474 const char *
what() const noexcept
override {
return message.c_str(); }
1477 static void bind(nanobind::module_ &m);
1502createBlock(
const nanobind::typed<nanobind::sequence, PyType> &pyArgTypes,
1503 const std::optional<nanobind::typed<nanobind::sequence, PyLocation>>
1508 static nanobind::callable
1511 nanobind::callable
func,
bool replace,
1512 bool allow_existing);
1514 static void bind(nanobind::module_ &m);
1524 :
public Sliceable<PyRegionList, PyRegion> {
1547 : operation(std::move(operation)), next(next) {}
1551 nanobind::typed<nanobind::object, PyBlock> dunderNext();
1553 static void bind(nanobind::module_ &m);
1566 : operation(std::move(operation)), region(region) {}
1574 PyBlock appendBlock(
const nanobind::args &pyArgTypes,
1575 const std::optional<nanobind::sequence> &pyArgLocs);
1577 static void bind(nanobind::module_ &m);
1587 : parentOperation(std::move(parentOperation)), next(next) {}
1591 nanobind::typed<nanobind::object, PyOpView> dunderNext();
1593 static void bind(nanobind::module_ &m);
1607 : parentOperation(std::move(parentOperation)), block(block) {}
1613 nanobind::typed<nanobind::object, PyOpView> dunderGetItem(
intptr_t index);
1615 static void bind(nanobind::module_ &m);
1625 operator MlirOpOperand()
const {
return opOperand; }
1627 nanobind::typed<nanobind::object, PyOpView> getOwner()
const;
1629 size_t getOperandNumber()
const;
1631 static void bind(nanobind::module_ &m);
1634 MlirOpOperand opOperand;
1643 nanobind::typed<nanobind::object, PyOpOperand> dunderNext();
1645 static void bind(nanobind::module_ &m);
1648 MlirOpOperand opOperand;
1654template <
typename DerivedTy>
1661 using ClassTy = nanobind::class_<DerivedTy, PyValue>;
1669 :
PyValue(operationRef, value) {}
1676 if (!DerivedTy::isaFunction(orig.
get())) {
1678 nanobind::cast<std::string>(nanobind::repr(nanobind::cast(orig)));
1679 throw nanobind::value_error((std::string(
"Cannot cast value to ") +
1680 DerivedTy::pyClassName +
" (from " +
1688 static void bind(nanobind::module_ &m) {
1689 auto cls =
ClassTy(m, DerivedTy::pyClassName, nanobind::is_generic(),
1690 nanobind::sig((std::string(
"class ") +
1691 DerivedTy::pyClassName +
"(Value[_T])")
1693 cls.def(nanobind::init<PyValue &>(), nanobind::keep_alive<0, 1>(),
1694 nanobind::arg(
"value"));
1697 [](
DerivedTy &self) -> nanobind::typed<nanobind::object, DerivedTy> {
1698 return self.maybeDownCast();
1700 cls.def(
"__str__", [](
PyValue &self) {
1702 printAccum.
parts.append(std::string(DerivedTy::pyClassName) +
"(");
1705 printAccum.
parts.append(
")");
1706 return printAccum.
join();
1709 if (DerivedTy::getTypeIdFunction) {
1711 DerivedTy::getTypeIdFunction(),
1712 nanobind::cast<nanobind::callable>(nanobind::cpp_function(
1717 DerivedTy::bindDerived(cls);
1739 :
public Sliceable<PyOpResultList, PyOpResult> {
1742 static constexpr std::array<const char *, 1>
typeParams = {
"_T"};
1782 :
public Sliceable<PyBlockArgumentList, PyBlockArgument> {
1816 :
public Sliceable<PyOpOperandList, PyValue> {
1819 static constexpr std::array<const char *, 1>
typeParams = {
"_T"};
1848 :
public Sliceable<PyOpSuccessors, PyBlock> {
1878 :
public Sliceable<PyBlockSuccessors, PyBlock> {
1909 :
public Sliceable<PyBlockPredecessors, PyBlock> {
1937 : operation(std::move(operation)) {}
1939 nanobind::typed<nanobind::object, PyAttribute>
1940 dunderGetItemNamed(
const std::string &name);
1944 nanobind::typed<nanobind::object, std::optional<PyAttribute>>
1945 get(
const std::string &key, nanobind::object defaultValue);
1947 void dunderSetItem(
const std::string &name,
const PyAttribute &attr);
1949 void dunderDelItem(
const std::string &name);
1953 bool dunderContains(
const std::string &name);
1955 static void forEachAttr(MlirOperation op,
1958 static void bind(nanobind::module_ &m);
1968 : operands(std::move(operands)), attributes(std::move(attributes)) {}
1970 : operands(std::move(operands)),
1971 attributes(opView.getOperation().getRef()) {}
1973 static void bind(nanobind::module_ &m);
1976 nanobind::list operands;
1982 static bool attach(
const nanobind::object &opName,
1985 static void bind(nanobind::module_ &m);
1995 static void bind(nanobind::module_ &m);
2001 static void bind(nanobind::module_ &m);
2007 static void bind(nanobind::module_ &m);
2014 static void bind(nanobind::module_ &m);
2024template <
class Func,
typename... Args>
2026 nanobind::object
cf = nanobind::cpp_function(f, args...);
2028 return std::make_unique<nanobind::object>(
2029 nanobind::module_::import_(
"builtins").attr(
"classmethod"));
2031 return classmethodFn.
get()(
cf);
2042 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyMlirContext>
2044 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyMlirContext> {
2048 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyLocation>
2050 mlir::python::MLIR_BINDINGS_PYTHON_DOMAIN::DefaultingPyLocation> {};
MLIR_FLOAT16_EXPORT bool operator==(const f16 &f1, const f16 &f2)
bool mlirValueIsABlockArgument(MlirValue value)
void mlirLocationPrint(MlirLocation location, MlirStringCallback callback, void *userData)
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 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_< PyOpResultList > 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 IsAFunctionTy isaFunction
static constexpr const char * pyClassName
PyConcreteLocation()=default
static constexpr GetTypeIDFunctionTy getTypeIdFunction
static void bindDerived(ClassTy &c)
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
static constexpr GetTypeIDFunctionTy getTypeIdFunction
static void bind(nanobind::module_ &m)
static void bindDerived(ClassTy &m)
Implemented by derived classes to add methods to the Python subclass.
PyConcreteLocation()=default
static MlirLocation castFrom(PyLocation &orig)
MlirTypeID(*)() GetTypeIDFunctionTy
PyConcreteLocation(PyLocation &orig)
PyConcreteLocation(PyMlirContextRef contextRef, MlirLocation loc)
nanobind::class_< DerivedTy, BaseTy > ClassTy
bool(*)(MlirLocation) IsAFunctionTy
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 const char * typeIDAttr
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 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 bool attach(const nanobind::object &opName, PyMlirContext &context)
static void bind(nanobind::module_ &m)
static constexpr IsAFunctionTy isaFunction
static void bindDerived(ClassTy &c)
static constexpr GetTypeIDFunctionTy getTypeIdFunction
PyConcreteLocation()=default
static constexpr const char * pyClassName
static void bindDerived(ClassTy &c)
static constexpr GetTypeIDFunctionTy getTypeIdFunction
static constexpr IsAFunctionTy isaFunction
PyConcreteLocation()=default
static constexpr const char * pyClassName
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
static constexpr GetTypeIDFunctionTy getTypeIdFunction
static constexpr IsAFunctionTy isaFunction
static constexpr const char * pyClassName
PyConcreteLocation()=default
static void bindDerived(ClassTy &c)
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 & operator=(const PyObjectRef &other)
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 & operator=(PyObjectRef &&other) noexcept
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 constexpr std::array< const char *, 1 > typeParams
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
static constexpr std::array< const char *, 1 > typeParams
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)
static constexpr const char * pyClassName
PyRegionList(PyOperationRef operation, intptr_t startIndex=0, intptr_t length=-1, intptr_t step=1)
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()
static constexpr GetTypeIDFunctionTy getTypeIdFunction
static constexpr const char * pyClassName
PyConcreteLocation()=default
static constexpr IsAFunctionTy isaFunction
static void bindDerived(ClassTy &c)
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 bool mlirLocationIsAUnknown(MlirLocation location)
Checks whether the given location is an Unknown.
MLIR_CAPI_EXPORTED MlirTypeID mlirLocationUnknownGetTypeID(void)
TypeID Getter for Unknown.
MLIR_CAPI_EXPORTED void mlirDialectRegistryDestroy(MlirDialectRegistry registry)
Takes a dialect registry owned by the caller and destroys it.
MLIR_CAPI_EXPORTED bool mlirLocationIsAFileLineColRange(MlirLocation location)
Checks whether the given location is an FileLineColRange.
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
MLIR_CAPI_EXPORTED bool mlirLocationIsACallSite(MlirLocation location)
Checks whether the given location is an CallSite.
static bool mlirBlockIsNull(MlirBlock block)
Checks whether a block is null.
MLIR_CAPI_EXPORTED bool mlirLocationIsAFused(MlirLocation location)
Checks whether the given location is an Fused.
MLIR_CAPI_EXPORTED void mlirSymbolTableDestroy(MlirSymbolTable symbolTable)
Destroys the symbol table created with mlirSymbolTableCreate.
MLIR_CAPI_EXPORTED bool mlirLocationIsAName(MlirLocation location)
Checks whether the given location is an Name.
static bool mlirDialectRegistryIsNull(MlirDialectRegistry registry)
Checks if the dialect registry is null.
MLIR_CAPI_EXPORTED MlirTypeID mlirLocationFileLineColRangeGetTypeID(void)
TypeID Getter for FileLineColRange.
static bool mlirRegionIsNull(MlirRegion region)
Checks whether a region is null.
MLIR_CAPI_EXPORTED MlirTypeID mlirLocationCallSiteGetTypeID(void)
TypeID Getter for CallSite.
MLIR_CAPI_EXPORTED MlirDialectRegistry mlirDialectRegistryCreate(void)
Creates a dialect registry and transfers its ownership to the caller.
MLIR_CAPI_EXPORTED MlirTypeID mlirLocationNameGetTypeID(void)
TypeID Getter for Name.
MLIR_CAPI_EXPORTED MlirTypeID mlirLocationFusedGetTypeID(void)
TypeID Getter for Fused.
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)
PyOperationEquivalenceFlags
Flags controlling structural operation equivalence and hashing.
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::typed< nanobind::sequence, PyType > &pyArgTypes, const std::optional< nanobind::typed< nanobind::sequence, PyLocation > > &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
const char * what() const noexcept override
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, bool allow_existing)
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)