24 #include "llvm/ADT/Hashing.h"
25 #include "llvm/ADT/SmallVector.h"
26 #include "llvm/ADT/StringRef.h"
27 #include "llvm/ADT/Twine.h"
34 using llvm::StringRef;
38 R
"(Dumps a debug representation of the object to stderr.)";
44 template <
typename PyType,
typename CType>
48 result.reserve(nb::len(list));
49 for (nb::handle item : list) {
51 result.push_back(nb::cast<PyType>(item));
52 }
catch (nb::cast_error &err) {
53 std::string msg = (llvm::Twine(
"Invalid expression when ") + action +
54 " (" + err.what() +
")")
56 throw std::runtime_error(msg.c_str());
57 }
catch (std::runtime_error &err) {
58 std::string msg = (llvm::Twine(
"Invalid expression (None?) when ") +
59 action +
" (" + err.what() +
")")
61 throw std::runtime_error(msg.c_str());
66 template <
typename PermutationTy>
69 for (
auto val : permutation) {
70 if (val < permutation.size()) {
86 template <
typename DerivedTy,
typename BaseTy = PyAffineExpr>
87 class PyConcreteAffineExpr :
public BaseTy {
93 using ClassTy = nb::class_<DerivedTy, BaseTy>;
94 using IsAFunctionTy = bool (*)(MlirAffineExpr);
96 PyConcreteAffineExpr() =
default;
98 : BaseTy(std::move(contextRef), affineExpr) {}
100 : PyConcreteAffineExpr(orig.
getContext(), castFrom(orig)) {}
103 if (!DerivedTy::isaFunction(orig)) {
104 auto origRepr = nb::cast<std::string>(nb::repr(nb::cast(orig)));
105 throw nb::value_error((Twine(
"Cannot cast affine expression to ") +
106 DerivedTy::pyClassName +
" (from " + origRepr +
114 static void bind(nb::module_ &m) {
115 auto cls = ClassTy(m, DerivedTy::pyClassName);
116 cls.def(nb::init<PyAffineExpr &>(), nb::arg(
"expr"));
120 return DerivedTy::isaFunction(otherAffineExpr);
123 DerivedTy::bindDerived(cls);
127 static void bindDerived(ClassTy &m) {}
130 class PyAffineConstantExpr :
public PyConcreteAffineExpr<PyAffineConstantExpr> {
133 static constexpr
const char *pyClassName =
"AffineConstantExpr";
134 using PyConcreteAffineExpr::PyConcreteAffineExpr;
136 static PyAffineConstantExpr
get(intptr_t value,
138 MlirAffineExpr affineExpr =
140 return PyAffineConstantExpr(context->getRef(), affineExpr);
143 static void bindDerived(ClassTy &c) {
145 nb::arg(
"context").none() = nb::none());
146 c.def_prop_ro(
"value", [](PyAffineConstantExpr &
self) {
152 class PyAffineDimExpr :
public PyConcreteAffineExpr<PyAffineDimExpr> {
155 static constexpr
const char *pyClassName =
"AffineDimExpr";
156 using PyConcreteAffineExpr::PyConcreteAffineExpr;
160 return PyAffineDimExpr(context->getRef(), affineExpr);
163 static void bindDerived(ClassTy &c) {
165 nb::arg(
"context").none() = nb::none());
166 c.def_prop_ro(
"position", [](PyAffineDimExpr &
self) {
172 class PyAffineSymbolExpr :
public PyConcreteAffineExpr<PyAffineSymbolExpr> {
175 static constexpr
const char *pyClassName =
"AffineSymbolExpr";
176 using PyConcreteAffineExpr::PyConcreteAffineExpr;
180 return PyAffineSymbolExpr(context->getRef(), affineExpr);
183 static void bindDerived(ClassTy &c) {
185 nb::arg(
"context").none() = nb::none());
186 c.def_prop_ro(
"position", [](PyAffineSymbolExpr &
self) {
192 class PyAffineBinaryExpr :
public PyConcreteAffineExpr<PyAffineBinaryExpr> {
195 static constexpr
const char *pyClassName =
"AffineBinaryExpr";
196 using PyConcreteAffineExpr::PyConcreteAffineExpr;
208 static void bindDerived(ClassTy &c) {
209 c.def_prop_ro(
"lhs", &PyAffineBinaryExpr::lhs);
210 c.def_prop_ro(
"rhs", &PyAffineBinaryExpr::rhs);
214 class PyAffineAddExpr
215 :
public PyConcreteAffineExpr<PyAffineAddExpr, PyAffineBinaryExpr> {
218 static constexpr
const char *pyClassName =
"AffineAddExpr";
219 using PyConcreteAffineExpr::PyConcreteAffineExpr;
223 return PyAffineAddExpr(lhs.
getContext(), expr);
226 static PyAffineAddExpr getRHSConstant(
PyAffineExpr lhs, intptr_t rhs) {
229 return PyAffineAddExpr(lhs.
getContext(), expr);
232 static PyAffineAddExpr getLHSConstant(intptr_t lhs,
PyAffineExpr rhs) {
235 return PyAffineAddExpr(rhs.
getContext(), expr);
238 static void bindDerived(ClassTy &c) {
243 class PyAffineMulExpr
244 :
public PyConcreteAffineExpr<PyAffineMulExpr, PyAffineBinaryExpr> {
247 static constexpr
const char *pyClassName =
"AffineMulExpr";
248 using PyConcreteAffineExpr::PyConcreteAffineExpr;
252 return PyAffineMulExpr(lhs.
getContext(), expr);
255 static PyAffineMulExpr getRHSConstant(
PyAffineExpr lhs, intptr_t rhs) {
258 return PyAffineMulExpr(lhs.
getContext(), expr);
261 static PyAffineMulExpr getLHSConstant(intptr_t lhs,
PyAffineExpr rhs) {
264 return PyAffineMulExpr(rhs.
getContext(), expr);
267 static void bindDerived(ClassTy &c) {
272 class PyAffineModExpr
273 :
public PyConcreteAffineExpr<PyAffineModExpr, PyAffineBinaryExpr> {
276 static constexpr
const char *pyClassName =
"AffineModExpr";
277 using PyConcreteAffineExpr::PyConcreteAffineExpr;
281 return PyAffineModExpr(lhs.
getContext(), expr);
284 static PyAffineModExpr getRHSConstant(
PyAffineExpr lhs, intptr_t rhs) {
287 return PyAffineModExpr(lhs.
getContext(), expr);
290 static PyAffineModExpr getLHSConstant(intptr_t lhs,
PyAffineExpr rhs) {
293 return PyAffineModExpr(rhs.
getContext(), expr);
296 static void bindDerived(ClassTy &c) {
301 class PyAffineFloorDivExpr
302 :
public PyConcreteAffineExpr<PyAffineFloorDivExpr, PyAffineBinaryExpr> {
305 static constexpr
const char *pyClassName =
"AffineFloorDivExpr";
306 using PyConcreteAffineExpr::PyConcreteAffineExpr;
310 return PyAffineFloorDivExpr(lhs.
getContext(), expr);
313 static PyAffineFloorDivExpr getRHSConstant(
PyAffineExpr lhs, intptr_t rhs) {
316 return PyAffineFloorDivExpr(lhs.
getContext(), expr);
319 static PyAffineFloorDivExpr getLHSConstant(intptr_t lhs,
PyAffineExpr rhs) {
322 return PyAffineFloorDivExpr(rhs.
getContext(), expr);
325 static void bindDerived(ClassTy &c) {
330 class PyAffineCeilDivExpr
331 :
public PyConcreteAffineExpr<PyAffineCeilDivExpr, PyAffineBinaryExpr> {
334 static constexpr
const char *pyClassName =
"AffineCeilDivExpr";
335 using PyConcreteAffineExpr::PyConcreteAffineExpr;
339 return PyAffineCeilDivExpr(lhs.
getContext(), expr);
342 static PyAffineCeilDivExpr getRHSConstant(
PyAffineExpr lhs, intptr_t rhs) {
345 return PyAffineCeilDivExpr(lhs.
getContext(), expr);
348 static PyAffineCeilDivExpr getLHSConstant(intptr_t lhs,
PyAffineExpr rhs) {
351 return PyAffineCeilDivExpr(rhs.
getContext(), expr);
354 static void bindDerived(ClassTy &c) {
372 throw nb::python_error();
387 class PyAffineMapExprList
388 :
public Sliceable<PyAffineMapExprList, PyAffineExpr> {
390 static constexpr
const char *pyClassName =
"AffineExprList";
392 PyAffineMapExprList(
const PyAffineMap &map, intptr_t startIndex = 0,
393 intptr_t length = -1, intptr_t step = 1)
410 PyAffineMapExprList slice(intptr_t startIndex, intptr_t length,
412 return PyAffineMapExprList(affineMap, startIndex, length, step);
430 throw nb::python_error();
441 class PyIntegerSetConstraint {
444 : set(std::move(set)), pos(pos) {}
453 static void bind(nb::module_ &m) {
454 nb::class_<PyIntegerSetConstraint>(m,
"IntegerSetConstraint")
455 .def_prop_ro(
"expr", &PyIntegerSetConstraint::getExpr)
456 .def_prop_ro(
"is_eq", &PyIntegerSetConstraint::isEq);
464 class PyIntegerSetConstraintList
465 :
public Sliceable<PyIntegerSetConstraintList, PyIntegerSetConstraint> {
467 static constexpr
const char *pyClassName =
"IntegerSetConstraintList";
469 PyIntegerSetConstraintList(
const PyIntegerSet &set, intptr_t startIndex = 0,
470 intptr_t length = -1, intptr_t step = 1)
478 friend class Sliceable<PyIntegerSetConstraintList, PyIntegerSetConstraint>;
482 PyIntegerSetConstraint getRawElement(intptr_t pos) {
483 return PyIntegerSetConstraint(set, pos);
486 PyIntegerSetConstraintList slice(intptr_t startIndex, intptr_t length,
488 return PyIntegerSetConstraintList(set, startIndex, length, step);
506 throw nb::python_error();
516 nb::class_<PyAffineExpr>(m,
"AffineExpr")
520 .def(
"__add__", &PyAffineAddExpr::getRHSConstant)
521 .def(
"__radd__", &PyAffineAddExpr::getRHSConstant)
523 .def(
"__mul__", &PyAffineMulExpr::getRHSConstant)
524 .def(
"__rmul__", &PyAffineMulExpr::getRHSConstant)
526 .def(
"__mod__", &PyAffineModExpr::getRHSConstant)
548 return PyAffineAddExpr::getLHSConstant(
549 other, PyAffineMulExpr::getLHSConstant(-1,
self));
554 [](
PyAffineExpr &
self, nb::object &other) {
return false; })
560 return printAccum.
join();
565 printAccum.
parts.append(
"AffineExpr(");
568 printAccum.
parts.append(
")");
569 return printAccum.
join();
577 [](
PyAffineExpr &
self) {
return self.getContext().getObject(); })
585 "Gets an affine expression containing a sum of two expressions.")
586 .def_static(
"get_add", &PyAffineAddExpr::getLHSConstant,
587 "Gets an affine expression containing a sum of a constant "
588 "and another expression.")
589 .def_static(
"get_add", &PyAffineAddExpr::getRHSConstant,
590 "Gets an affine expression containing a sum of an expression "
594 "Gets an affine expression containing a product of two expressions.")
595 .def_static(
"get_mul", &PyAffineMulExpr::getLHSConstant,
596 "Gets an affine expression containing a product of a "
597 "constant and another expression.")
598 .def_static(
"get_mul", &PyAffineMulExpr::getRHSConstant,
599 "Gets an affine expression containing a product of an "
600 "expression and a constant.")
602 "Gets an affine expression containing the modulo of dividing "
603 "one expression by another.")
604 .def_static(
"get_mod", &PyAffineModExpr::getLHSConstant,
605 "Gets a semi-affine expression containing the modulo of "
606 "dividing a constant by an expression.")
607 .def_static(
"get_mod", &PyAffineModExpr::getRHSConstant,
608 "Gets an affine expression containing the module of dividing"
609 "an expression by a constant.")
611 "Gets an affine expression containing the rounded-down "
612 "result of dividing one expression by another.")
613 .def_static(
"get_floor_div", &PyAffineFloorDivExpr::getLHSConstant,
614 "Gets a semi-affine expression containing the rounded-down "
615 "result of dividing a constant by an expression.")
616 .def_static(
"get_floor_div", &PyAffineFloorDivExpr::getRHSConstant,
617 "Gets an affine expression containing the rounded-down "
618 "result of dividing an expression by a constant.")
620 "Gets an affine expression containing the rounded-up result "
621 "of dividing one expression by another.")
622 .def_static(
"get_ceil_div", &PyAffineCeilDivExpr::getLHSConstant,
623 "Gets a semi-affine expression containing the rounded-up "
624 "result of dividing a constant by an expression.")
625 .def_static(
"get_ceil_div", &PyAffineCeilDivExpr::getRHSConstant,
626 "Gets an affine expression containing the rounded-up result "
627 "of dividing an expression by a constant.")
629 nb::arg(
"context").none() = nb::none(),
630 "Gets a constant affine expression with the given value.")
633 nb::arg(
"context").none() = nb::none(),
634 "Gets an affine expression of a dimension at the given position.")
637 nb::arg(
"context").none() = nb::none(),
638 "Gets an affine expression of a symbol at the given position.")
642 PyAffineConstantExpr::bind(m);
643 PyAffineDimExpr::bind(m);
644 PyAffineSymbolExpr::bind(m);
645 PyAffineBinaryExpr::bind(m);
646 PyAffineAddExpr::bind(m);
647 PyAffineMulExpr::bind(m);
648 PyAffineModExpr::bind(m);
649 PyAffineFloorDivExpr::bind(m);
650 PyAffineCeilDivExpr::bind(m);
655 nb::class_<PyAffineMap>(m,
"AffineMap")
660 .def(
"__eq__", [](
PyAffineMap &
self, nb::object &other) {
return false; })
666 return printAccum.
join();
671 printAccum.
parts.append(
"AffineMap(");
674 printAccum.
parts.append(
")");
675 return printAccum.
join();
681 .def_static(
"compress_unused_symbols",
684 pyListToVector<PyAffineMap, MlirAffineMap>(
685 affineMaps, maps,
"attempting to create an AffineMap");
686 std::vector<MlirAffineMap> compressed(affineMaps.size());
687 auto populate = [](
void *result, intptr_t idx,
689 static_cast<MlirAffineMap *
>(result)[idx] = (m);
692 maps.data(), maps.size(), compressed.data(), populate);
693 std::vector<PyAffineMap> res;
694 res.reserve(compressed.size());
695 for (
auto m : compressed)
696 res.emplace_back(context->getRef(), m);
701 [](
PyAffineMap &
self) {
return self.getContext().getObject(); },
702 "Context that owns the Affine Map")
708 [](intptr_t dimCount, intptr_t symbolCount, nb::list exprs,
711 pyListToVector<PyAffineExpr, MlirAffineExpr>(
712 exprs, affineExprs,
"attempting to create an AffineMap");
715 affineExprs.size(), affineExprs.data());
718 nb::arg(
"dim_count"), nb::arg(
"symbol_count"), nb::arg(
"exprs"),
719 nb::arg(
"context").none() = nb::none(),
720 "Gets a map with the given expressions as results.")
724 MlirAffineMap affineMap =
728 nb::arg(
"value"), nb::arg(
"context").none() = nb::none(),
729 "Gets an affine map with a single constant result")
736 nb::arg(
"context").none() = nb::none(),
"Gets an empty affine map.")
740 MlirAffineMap affineMap =
744 nb::arg(
"n_dims"), nb::arg(
"context").none() = nb::none(),
745 "Gets an identity map with the given number of dimensions.")
747 "get_minor_identity",
748 [](intptr_t nDims, intptr_t nResults,
750 MlirAffineMap affineMap =
754 nb::arg(
"n_dims"), nb::arg(
"n_results"),
755 nb::arg(
"context").none() = nb::none(),
756 "Gets a minor identity map with the given number of dimensions and "
760 [](std::vector<unsigned> permutation,
763 throw std::runtime_error(
"Invalid permutation when attempting to "
764 "create an AffineMap");
766 context->
get(), permutation.size(), permutation.data());
769 nb::arg(
"permutation"), nb::arg(
"context").none() = nb::none(),
770 "Gets an affine map that permutes its inputs.")
773 [](
PyAffineMap &
self, std::vector<intptr_t> &resultPos) {
775 for (intptr_t pos : resultPos) {
776 if (pos < 0 || pos >= numResults)
777 throw nb::value_error(
"result position out of bounds");
780 self, resultPos.size(), resultPos.data());
783 nb::arg(
"result_positions"))
788 throw nb::value_error(
"number of results out of bounds");
789 MlirAffineMap affineMap =
793 nb::arg(
"n_results"))
798 throw nb::value_error(
"number of results out of bounds");
799 MlirAffineMap affineMap =
803 nb::arg(
"n_results"))
808 intptr_t numResultSyms) {
810 self, expression, replacement, numResultDims, numResultSyms);
813 nb::arg(
"expr"), nb::arg(
"replacement"), nb::arg(
"n_result_dims"),
814 nb::arg(
"n_result_syms"))
818 .def_prop_ro(
"is_projected_permutation",
831 .def_prop_ro(
"results",
832 [](
PyAffineMap &
self) {
return PyAffineMapExprList(
self); });
833 PyAffineMapExprList::bind(m);
838 nb::class_<PyIntegerSet>(m,
"IntegerSet")
843 .def(
"__eq__", [](
PyIntegerSet &
self, nb::object other) {
return false; })
849 return printAccum.
join();
854 printAccum.
parts.append(
"IntegerSet(");
857 printAccum.
parts.append(
")");
858 return printAccum.
join();
866 [](
PyIntegerSet &
self) {
return self.getContext().getObject(); })
872 [](intptr_t numDims, intptr_t numSymbols, nb::list exprs,
874 if (exprs.size() != eqFlags.size())
875 throw nb::value_error(
876 "Expected the number of constraints to match "
877 "that of equality flags");
878 if (exprs.size() == 0)
879 throw nb::value_error(
"Expected non-empty list of constraints");
887 pyListToVector<PyAffineExpr>(exprs, affineExprs,
888 "attempting to create an IntegerSet");
890 context->
get(), numDims, numSymbols, exprs.size(),
891 affineExprs.data(), flags.data());
894 nb::arg(
"num_dims"), nb::arg(
"num_symbols"), nb::arg(
"exprs"),
895 nb::arg(
"eq_flags"), nb::arg(
"context").none() = nb::none())
898 [](intptr_t numDims, intptr_t numSymbols,
904 nb::arg(
"num_dims"), nb::arg(
"num_symbols"),
905 nb::arg(
"context").none() = nb::none())
908 [](
PyIntegerSet &
self, nb::list dimExprs, nb::list symbolExprs,
909 intptr_t numResultDims, intptr_t numResultSymbols) {
910 if (
static_cast<intptr_t
>(dimExprs.size()) !=
912 throw nb::value_error(
913 "Expected the number of dimension replacement expressions "
914 "to match that of dimensions");
915 if (
static_cast<intptr_t
>(symbolExprs.size()) !=
917 throw nb::value_error(
918 "Expected the number of symbol replacement expressions "
919 "to match that of symbols");
922 pyListToVector<PyAffineExpr>(
923 dimExprs, dimAffineExprs,
924 "attempting to create an IntegerSet by replacing dimensions");
925 pyListToVector<PyAffineExpr>(
926 symbolExprs, symbolAffineExprs,
927 "attempting to create an IntegerSet by replacing symbols");
929 self, dimAffineExprs.data(), symbolAffineExprs.data(),
930 numResultDims, numResultSymbols);
933 nb::arg(
"dim_exprs"), nb::arg(
"symbol_exprs"),
934 nb::arg(
"num_result_dims"), nb::arg(
"num_result_symbols"))
935 .def_prop_ro(
"is_canonical_empty",
948 .def_prop_ro(
"n_equalities",
952 .def_prop_ro(
"n_inequalities",
957 return PyIntegerSetConstraintList(
self);
959 PyIntegerSetConstraint::bind(m);
960 PyIntegerSetConstraintList::bind(m);
static void pyListToVector(const nb::list &list, llvm::SmallVectorImpl< CType > &result, StringRef action)
Attempts to populate result with the content of list casted to the appropriate type (Python and C typ...
static const char kDumpDocstring[]
static bool isPermutation(std::vector< PermutationTy > permutation)
static MLIRContext * getContext(OpFoldResult val)
static MlirIntegerSet mlirPythonCapsuleToIntegerSet(PyObject *capsule)
Extracts an MlirIntegerSet from a capsule as produced from mlirPythonIntegerSetToCapsule.
#define MLIR_PYTHON_CAPI_PTR_ATTR
Attribute on MLIR Python objects that expose their C-API pointer.
static PyObject * mlirPythonIntegerSetToCapsule(MlirIntegerSet integerSet)
Creates a capsule object encapsulating the raw C-API MlirIntegerSet.
static MlirAffineMap mlirPythonCapsuleToAffineMap(PyObject *capsule)
Extracts an MlirAffineMap from a capsule as produced from mlirPythonAffineMapToCapsule.
#define MLIR_PYTHON_CAPI_FACTORY_ATTR
Attribute on MLIR Python objects that exposes a factory function for constructing the corresponding P...
static PyObject * mlirPythonAffineExprToCapsule(MlirAffineExpr expr)
Creates a capsule object encapsulating the raw C-API MlirAffineExpr.
static PyObject * mlirPythonAffineMapToCapsule(MlirAffineMap affineMap)
Creates a capsule object encapsulating the raw C-API MlirAffineMap.
static MlirAffineExpr mlirPythonCapsuleToAffineExpr(PyObject *capsule)
Extracts an MlirAffineExpr from a capsule as produced from mlirPythonAffineExprToCapsule.
A CRTP base class for pseudo-containers willing to support Python-type slicing access on top of index...
PyMlirContextRef & getContext()
Accesses the context reference.
Used in function arguments when None should resolve to the current context manager set instance.
ReferrentTy * get() const
Wrapper around MlirAffineExpr. Affine expressions are owned by the context.
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirAffineExpr.
PyAffineExpr(PyMlirContextRef contextRef, MlirAffineExpr affineExpr)
static PyAffineExpr createFromCapsule(nanobind::object capsule)
Creates a PyAffineExpr from the MlirAffineExpr wrapped by a capsule.
bool operator==(const PyAffineExpr &other) const
PyAffineMap(PyMlirContextRef contextRef, MlirAffineMap affineMap)
bool operator==(const PyAffineMap &other) const
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirAffineMap.
static PyAffineMap createFromCapsule(nanobind::object capsule)
Creates a PyAffineMap from the MlirAffineMap wrapped by a capsule.
bool operator==(const PyIntegerSet &other) const
static PyIntegerSet createFromCapsule(nanobind::object capsule)
Creates a PyIntegerSet from the MlirAffineMap wrapped by a capsule.
PyIntegerSet(PyMlirContextRef contextRef, MlirIntegerSet integerSet)
nanobind::object getCapsule()
Gets a capsule wrapping the void* within the MlirIntegerSet.
static PyMlirContextRef forContext(MlirContext context)
Returns a context reference for the singleton PyMlirContext wrapper for the given context.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a constant expression.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr)
Returns the left hand side affine expression of the given affine binary operation expression.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine mul expression with 'lhs' and 'rhs'.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant)
Creates an affine constant expression with 'constant' in the context.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr)
Returns the right hand side affine expression of the given affine binary operation expression.
MLIR_CAPI_EXPORTED void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback, void *userData)
Prints an affine expression by sending chunks of the string representation and forwarding userData to...
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine add expression with 'lhs' and 'rhs'.
MLIR_CAPI_EXPORTED intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine dimension expression.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an add expression.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr)
Checks whether the given affine expression is binary.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mul expression.
MLIR_CAPI_EXPORTED int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr)
Returns the value of the given affine constant expression.
MLIR_CAPI_EXPORTED MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr)
Gets the context that owns the affine expression.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a symbol expression.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an ceildiv expression.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine floordiv expression with 'lhs' and 'rhs'.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an floordiv expression.
MLIR_CAPI_EXPORTED bool mlirAffineExprEqual(MlirAffineExpr lhs, MlirAffineExpr rhs)
Returns true if the two affine expressions are equal.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position)
Creates an affine dimension expression with 'position' in the context.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr)
Checks whether the given affine expression is an mod expression.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine mod expression with 'lhs' and 'rhs'.
MLIR_CAPI_EXPORTED void mlirAffineExprDump(MlirAffineExpr affineExpr)
Prints the affine expression to the standard error stream.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineExprCompose(MlirAffineExpr affineExpr, struct MlirAffineMap affineMap)
Composes the given map with the given expression.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position)
Creates an affine symbol expression with 'position' in the context.
static bool mlirAffineExprIsNull(MlirAffineExpr affineExpr)
Returns true if the given affine expression is a null expression.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs)
Creates an affine ceildiv expression with 'lhs' and 'rhs'.
MLIR_CAPI_EXPORTED intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr)
Returns the position of the given affine symbol expression.
MLIR_CAPI_EXPORTED bool mlirAffineExprIsADim(MlirAffineExpr affineExpr)
Checks whether the given affine expression is a dimension expression.
MLIR_CAPI_EXPORTED bool mlirAffineMapEqual(MlirAffineMap a1, MlirAffineMap a2)
Checks if two affine maps are equal.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx)
Creates a zero result affine map with no dimensions or symbols in the context.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount, intptr_t symbolCount, intptr_t nAffineExprs, MlirAffineExpr *affineExprs)
Creates an affine map with results defined by the given list of affine expressions.
MLIR_CAPI_EXPORTED intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap)
Returns the number of dimensions of the given affine map.
MLIR_CAPI_EXPORTED MlirContext mlirAffineMapGetContext(MlirAffineMap affineMap)
Gets the context that the given affine map was created with.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos)
Returns the result at the given position.
MLIR_CAPI_EXPORTED void mlirAffineMapDump(MlirAffineMap affineMap)
Prints the affine map to the standard error stream.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val)
Creates a single constant result affine map in the context.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx, intptr_t numDims)
Creates an affine map with 'numDims' identity in the context.
MLIR_CAPI_EXPORTED void mlirAffineMapPrint(MlirAffineMap affineMap, MlirStringCallback callback, void *userData)
Prints an affine map by sending chunks of the string representation and forwarding userData tocallbac...
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap, intptr_t numResults)
Returns the affine map consisting of the most minor numResults results.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap, intptr_t numResults)
Returns the affine map consisting of the most major numResults results.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapGetSubMap(MlirAffineMap affineMap, intptr_t size, intptr_t *resultPos)
Returns the affine map consisting of the resultPos subset.
MLIR_CAPI_EXPORTED intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap)
Returns the number of results of the given affine map.
MLIR_CAPI_EXPORTED intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap)
Returns the number of symbols of the given affine map.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size, unsigned *permutation)
Creates an affine map with a permutation expression and its size in the context.
MLIR_CAPI_EXPORTED void mlirAffineMapCompressUnusedSymbols(MlirAffineMap *affineMaps, intptr_t size, void *result, void(*populateResult)(void *res, intptr_t idx, MlirAffineMap m))
Returns the simplified affine map resulting from dropping the symbols that do not appear in any of th...
MLIR_CAPI_EXPORTED bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap)
Checks whether the given affine map represents a subset of a symbol-less permutation map.
MLIR_CAPI_EXPORTED intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap)
Returns the number of inputs (dimensions + symbols) of the given affine map.
MLIR_CAPI_EXPORTED bool mlirAffineMapIsPermutation(MlirAffineMap affineMap)
Checks whether the given affine map represents a symbol-less permutation map.
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapReplace(MlirAffineMap affineMap, MlirAffineExpr expression, MlirAffineExpr replacement, intptr_t numResultDims, intptr_t numResultSyms)
Apply AffineExpr::replace(map) to each of the results and return a new new AffineMap with the new res...
MLIR_CAPI_EXPORTED MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims, intptr_t results)
Creates an identity affine map on the most minor dimensions in the context.
static bool mlirAffineMapIsNull(MlirAffineMap affineMap)
Checks whether an affine map is null.
MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumConstraints(MlirIntegerSet set)
Returns the number of constraints (equalities + inequalities) in the given set.
MLIR_CAPI_EXPORTED MlirAffineExpr mlirIntegerSetGetConstraint(MlirIntegerSet set, intptr_t pos)
Returns pos-th constraint of the set.
MLIR_CAPI_EXPORTED bool mlirIntegerSetIsCanonicalEmpty(MlirIntegerSet set)
Checks whether the given set is a canonical empty set, e.g., the set returned by mlirIntegerSetEmptyG...
MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumInputs(MlirIntegerSet set)
Returns the number of inputs (dimensions + symbols) in the given set.
MLIR_CAPI_EXPORTED MlirIntegerSet mlirIntegerSetEmptyGet(MlirContext context, intptr_t numDims, intptr_t numSymbols)
Gets or creates a new canonically empty integer set with the give number of dimensions and symbols in...
MLIR_CAPI_EXPORTED MlirIntegerSet mlirIntegerSetGet(MlirContext context, intptr_t numDims, intptr_t numSymbols, intptr_t numConstraints, const MlirAffineExpr *constraints, const bool *eqFlags)
Gets or creates a new integer set in the given context.
MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumEqualities(MlirIntegerSet set)
Returns the number of equalities in the given set.
MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumDims(MlirIntegerSet set)
Returns the number of dimensions in the given set.
MLIR_CAPI_EXPORTED MlirIntegerSet mlirIntegerSetReplaceGet(MlirIntegerSet set, const MlirAffineExpr *dimReplacements, const MlirAffineExpr *symbolReplacements, intptr_t numResultDims, intptr_t numResultSymbols)
Gets or creates a new integer set in which the values and dimensions of the given set are replaced wi...
MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumSymbols(MlirIntegerSet set)
Returns the number of symbols in the given set.
static bool mlirIntegerSetIsNull(MlirIntegerSet set)
Checks whether an integer set is a null object.
MLIR_CAPI_EXPORTED MlirContext mlirIntegerSetGetContext(MlirIntegerSet set)
Gets the context in which the given integer set lives.
MLIR_CAPI_EXPORTED void mlirIntegerSetPrint(MlirIntegerSet set, MlirStringCallback callback, void *userData)
Prints an integer set by sending chunks of the string representation and forwarding userData tocallba...
MLIR_CAPI_EXPORTED bool mlirIntegerSetEqual(MlirIntegerSet s1, MlirIntegerSet s2)
Checks if two integer set objects are equal.
MLIR_CAPI_EXPORTED bool mlirIntegerSetIsConstraintEq(MlirIntegerSet set, intptr_t pos)
Returns true of the pos-th constraint of the set is an equality constraint, false otherwise.
MLIR_CAPI_EXPORTED void mlirIntegerSetDump(MlirIntegerSet set)
Prints an integer set to the standard error stream.
MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumInequalities(MlirIntegerSet set)
Returns the number of inequalities in the given set.
inline ::llvm::hash_code hash_value(const PolynomialBase< D, T > &arg)
void populateIRAffine(nanobind::module_ &m)
Include the generated interface declarations.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
Accumulates into a python string from a method that accepts an MlirStringCallback.
MlirStringCallback getCallback()