1 //===- AffineExpr.cpp - C API for MLIR Affine Expressions -----------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "mlir-c/AffineExpr.h"
10 #include "mlir-c/AffineMap.h"
11 #include "mlir-c/IR.h"
12 #include "mlir/CAPI/AffineExpr.h"
13 #include "mlir/CAPI/AffineMap.h"
14 #include "mlir/CAPI/IR.h"
15 #include "mlir/CAPI/Utils.h"
16 #include "mlir/IR/AffineExpr.h"
17 
18 using namespace mlir;
19 
20 MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr) {
21   return wrap(unwrap(affineExpr).getContext());
22 }
23 
24 void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback,
25                          void *userData) {
26   mlir::detail::CallbackOstream stream(callback, userData);
27   unwrap(affineExpr).print(stream);
28   stream.flush();
29 }
30 
31 void mlirAffineExprDump(MlirAffineExpr affineExpr) {
32   unwrap(affineExpr).dump();
33 }
34 
35 int mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr) {
36   return unwrap(affineExpr).isSymbolicOrConstant();
37 }
38 
39 int mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr) {
40   return unwrap(affineExpr).isPureAffine();
41 }
42 
43 int64_t mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr) {
44   return unwrap(affineExpr).getLargestKnownDivisor();
45 }
46 
47 int mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor) {
48   return unwrap(affineExpr).isMultipleOf(factor);
49 }
50 
51 int mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr,
52                                   intptr_t position) {
53   return unwrap(affineExpr).isFunctionOfDim(position);
54 }
55 
56 /*============================================================================*/
57 /* Affine Dimension Expression.                                               */
58 /*============================================================================*/
59 
60 MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) {
61   return wrap(getAffineDimExpr(position, unwrap(ctx)));
62 }
63 
64 intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) {
65   return unwrap(affineExpr).cast<AffineDimExpr>().getPosition();
66 }
67 
68 /*============================================================================*/
69 /* Affine Symbol Expression.                                                  */
70 /*============================================================================*/
71 
72 MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) {
73   return wrap(getAffineSymbolExpr(position, unwrap(ctx)));
74 }
75 
76 intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) {
77   return unwrap(affineExpr).cast<AffineSymbolExpr>().getPosition();
78 }
79 
80 /*============================================================================*/
81 /* Affine Constant Expression.                                                */
82 /*============================================================================*/
83 
84 MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) {
85   return wrap(getAffineConstantExpr(constant, unwrap(ctx)));
86 }
87 
88 int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) {
89   return unwrap(affineExpr).cast<AffineConstantExpr>().getValue();
90 }
91 
92 /*============================================================================*/
93 /* Affine Add Expression.                                                     */
94 /*============================================================================*/
95 
96 int mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) {
97   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add;
98 }
99 
100 MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
101   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Add, unwrap(lhs),
102                                     unwrap(rhs)));
103 }
104 
105 /*============================================================================*/
106 /* Affine Mul Expression.                                                     */
107 /*============================================================================*/
108 
109 int mlirAffineExprIsAMul(MlirAffineExpr affineExpr) {
110   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul;
111 }
112 
113 MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
114   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mul, unwrap(lhs),
115                                     unwrap(rhs)));
116 }
117 
118 /*============================================================================*/
119 /* Affine Mod Expression.                                                     */
120 /*============================================================================*/
121 
122 int mlirAffineExprIsAMod(MlirAffineExpr affineExpr) {
123   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod;
124 }
125 
126 MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
127   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mod, unwrap(lhs),
128                                     unwrap(rhs)));
129 }
130 
131 /*============================================================================*/
132 /* Affine FloorDiv Expression.                                                */
133 /*============================================================================*/
134 
135 int mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) {
136   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv;
137 }
138 
139 MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs,
140                                          MlirAffineExpr rhs) {
141   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::FloorDiv, unwrap(lhs),
142                                     unwrap(rhs)));
143 }
144 
145 /*============================================================================*/
146 /* Affine CeilDiv Expression.                                                */
147 /*============================================================================*/
148 
149 int mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) {
150   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv;
151 }
152 
153 MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs,
154                                         MlirAffineExpr rhs) {
155   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::CeilDiv, unwrap(lhs),
156                                     unwrap(rhs)));
157 }
158 
159 /*============================================================================*/
160 /* Affine Binary Operation Expression.                                        */
161 /*============================================================================*/
162 
163 MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) {
164   return wrap(unwrap(affineExpr).cast<AffineBinaryOpExpr>().getLHS());
165 }
166 
167 MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) {
168   return wrap(unwrap(affineExpr).cast<AffineBinaryOpExpr>().getRHS());
169 }
170