Skip to content

Commit 1a82557

Browse files
committed
bind intmonomial (in order to later bind *polynomial)
1 parent 0bdb03f commit 1a82557

File tree

4 files changed

+123
-3
lines changed

4 files changed

+123
-3
lines changed

mlir/include/mlir-c/Dialect/Polynomial.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,36 @@
1010
#ifndef MLIR_C_DIALECT_POLYNOMIAL_H
1111
#define MLIR_C_DIALECT_POLYNOMIAL_H
1212

13-
#include "mlir-c/IR.h"
13+
#include "mlir/CAPI/Wrap.h"
14+
#include "mlir/Dialect/Polynomial/IR/Polynomial.h"
1415

1516
#ifdef __cplusplus
1617
extern "C" {
1718
#endif
1819

1920
MLIR_DECLARE_CAPI_DIALECT_REGISTRATION(Polynomial, polynomial);
2021

22+
#define DEFINE_C_API_STRUCT(name, storage) \
23+
struct name { \
24+
storage *ptr; \
25+
}; \
26+
typedef struct name name
27+
28+
DEFINE_C_API_STRUCT(MlirIntMonomial, void);
29+
30+
#undef DEFINE_C_API_STRUCT
31+
32+
DEFINE_C_API_PTR_METHODS(MlirIntMonomial, mlir::polynomial::IntMonomial);
33+
34+
MLIR_CAPI_EXPORTED MlirIntMonomial mlirPolynomialGetIntMonomial(int64_t coeff,
35+
uint64_t expo);
36+
37+
MLIR_CAPI_EXPORTED int64_t
38+
mlirPolynomialIntMonomialGetCoefficient(MlirIntMonomial intMonomial);
39+
40+
MLIR_CAPI_EXPORTED uint64_t
41+
mlirPolynomialIntMonomialGetExponent(MlirIntMonomial intMonomial);
42+
2143
#ifdef __cplusplus
2244
}
2345
#endif

mlir/lib/Bindings/Python/DialectPolynomial.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,85 @@ using namespace llvm;
1818
using namespace mlir;
1919
using namespace mlir::python::adaptors;
2020

21+
class PyIntMonomial {
22+
public:
23+
PyIntMonomial(MlirIntMonomial intMonomial) : intMonomial(intMonomial) {}
24+
PyIntMonomial(int64_t coeff, uint64_t expo)
25+
: intMonomial(mlirPolynomialGetIntMonomial(coeff, expo)) {}
26+
operator MlirIntMonomial() const { return intMonomial; }
27+
MlirIntMonomial get() { return intMonomial; }
28+
29+
int64_t getCoefficient() {
30+
return mlirPolynomialIntMonomialGetCoefficient(this->get());
31+
}
32+
33+
uint64_t getExponent() {
34+
return mlirPolynomialIntMonomialGetExponent(this->get());
35+
}
36+
37+
private:
38+
MlirIntMonomial intMonomial;
39+
};
40+
41+
#define MLIR_PYTHON_CAPSULE_INT_POLYNOMIAL \
42+
MAKE_MLIR_PYTHON_QUALNAME("dialects.polynomial.IntMonomial._CAPIPtr")
43+
44+
static inline MlirIntMonomial
45+
mlirPythonCapsuleToIntMonomial(PyObject *capsule) {
46+
void *ptr = PyCapsule_GetPointer(capsule, MLIR_PYTHON_CAPSULE_INT_POLYNOMIAL);
47+
MlirIntMonomial intMonomial = {ptr};
48+
return intMonomial;
49+
}
50+
51+
static inline PyObject *
52+
mlirPythonIntMonomialToCapsule(MlirIntMonomial intMonomial) {
53+
return PyCapsule_New(MLIR_PYTHON_GET_WRAPPED_POINTER(intMonomial),
54+
MLIR_PYTHON_CAPSULE_INT_POLYNOMIAL, nullptr);
55+
}
56+
57+
static inline bool mlirIntMonomialIsNull(MlirIntMonomial intMonomial) {
58+
return !intMonomial.ptr;
59+
}
60+
61+
namespace pybind11 {
62+
namespace detail {
63+
64+
/// Casts object <-> MlirIntMonomial.
65+
template <>
66+
struct type_caster<MlirIntMonomial> {
67+
PYBIND11_TYPE_CASTER(MlirIntMonomial, _("MlirIntMonomial"));
68+
bool load(handle src, bool) {
69+
py::object capsule = mlirApiObjectToCapsule(src);
70+
value = mlirPythonCapsuleToIntMonomial(capsule.ptr());
71+
return !mlirIntMonomialIsNull(value);
72+
}
73+
74+
static handle cast(MlirIntMonomial v, return_value_policy, handle) {
75+
py::object capsule =
76+
py::reinterpret_steal<py::object>(mlirPythonIntMonomialToCapsule(v));
77+
return py::module::import(MAKE_MLIR_PYTHON_QUALNAME("dialects.polynomial"))
78+
.attr("IntMonomial")
79+
.attr(MLIR_PYTHON_CAPI_FACTORY_ATTR)(capsule)
80+
.release();
81+
}
82+
};
83+
} // namespace detail
84+
} // namespace pybind11
85+
2186
PYBIND11_MODULE(_mlirDialectsPolynomial, m) {
2287
m.doc() = "MLIR Polynomial dialect";
88+
89+
py::class_<PyIntMonomial>(m, "IntMonomial", py::module_local())
90+
.def(py::init<PyIntMonomial &>())
91+
.def(py::init<MlirIntMonomial>())
92+
.def(py::init<int64_t, uint64_t>())
93+
.def_property_readonly("coefficient", &PyIntMonomial::getCoefficient)
94+
.def_property_readonly("exponent", &PyIntMonomial::getExponent)
95+
.def("__str__", [](PyIntMonomial &self) {
96+
return std::string("<")
97+
.append(std::to_string(self.getCoefficient()))
98+
.append(", ")
99+
.append(std::to_string(self.getExponent()))
100+
.append(">");
101+
});
23102
}

mlir/lib/CAPI/Dialect/Polynomial.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,19 @@ using namespace mlir;
1414

1515
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(polynomial, polynomial,
1616
polynomial::PolynomialDialect)
17+
18+
MlirIntMonomial mlirPolynomialGetIntMonomial(int64_t coeff, uint64_t expo) {
19+
return wrap(new mlir::polynomial::IntMonomial(coeff, expo));
20+
}
21+
22+
int64_t mlirPolynomialIntMonomialGetCoefficient(MlirIntMonomial intMonomial) {
23+
return unwrap(intMonomial)
24+
->getCoefficient()
25+
.getLimitedValue(/*Limit = UINT64_MAX*/);
26+
}
27+
28+
uint64_t mlirPolynomialIntMonomialGetExponent(MlirIntMonomial intMonomial) {
29+
return unwrap(intMonomial)
30+
->getExponent(/*Limit = UINT64_MAX*/)
31+
.getLimitedValue();
32+
}

mlir/test/python/dialects/polynomial.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ def constructAndPrintInModule(f):
1818
@constructAndPrintInModule
1919
def test_smoke():
2020
value = Attribute.parse("#polynomial.float_polynomial<0.5 + 1.3e06 x**2>")
21-
output = Type.parse("!polynomial.polynomial<ring=<coefficientType=f32>>")
22-
res = polynomial.constant(output, value)
21+
res = polynomial.constant(value)
2322
# CHECK: polynomial.constant float<0.5 + 1.3E+6x**2> : <ring = <coefficientType = f32>>
2423
print(res)
24+
25+
int_poly = polynomial.IntMonomial(1, 10)
26+
# CHECK: <1, 10>
27+
print(int_poly)

0 commit comments

Comments
 (0)