@@ -18,6 +18,85 @@ using namespace llvm;
18
18
using namespace mlir ;
19
19
using namespace mlir ::python::adaptors;
20
20
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
+
21
86
PYBIND11_MODULE (_mlirDialectsPolynomial, m) {
22
87
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
+ });
23
102
}
0 commit comments