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 }
29 
30 void mlirAffineExprDump(MlirAffineExpr affineExpr) {
31   unwrap(affineExpr).dump();
32 }
33 
34 int mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr) {
35   return unwrap(affineExpr).isSymbolicOrConstant();
36 }
37 
38 int mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr) {
39   return unwrap(affineExpr).isPureAffine();
40 }
41 
42 int64_t mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr) {
43   return unwrap(affineExpr).getLargestKnownDivisor();
44 }
45 
46 int mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor) {
47   return unwrap(affineExpr).isMultipleOf(factor);
48 }
49 
50 int mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr,
51                                   intptr_t position) {
52   return unwrap(affineExpr).isFunctionOfDim(position);
53 }
54 
55 //===----------------------------------------------------------------------===//
56 // Affine Dimension Expression.
57 //===----------------------------------------------------------------------===//
58 
59 MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) {
60   return wrap(getAffineDimExpr(position, unwrap(ctx)));
61 }
62 
63 intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) {
64   return unwrap(affineExpr).cast<AffineDimExpr>().getPosition();
65 }
66 
67 //===----------------------------------------------------------------------===//
68 // Affine Symbol Expression.
69 //===----------------------------------------------------------------------===//
70 
71 MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) {
72   return wrap(getAffineSymbolExpr(position, unwrap(ctx)));
73 }
74 
75 intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) {
76   return unwrap(affineExpr).cast<AffineSymbolExpr>().getPosition();
77 }
78 
79 //===----------------------------------------------------------------------===//
80 // Affine Constant Expression.
81 //===----------------------------------------------------------------------===//
82 
83 MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) {
84   return wrap(getAffineConstantExpr(constant, unwrap(ctx)));
85 }
86 
87 int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) {
88   return unwrap(affineExpr).cast<AffineConstantExpr>().getValue();
89 }
90 
91 //===----------------------------------------------------------------------===//
92 // Affine Add Expression.
93 //===----------------------------------------------------------------------===//
94 
95 int mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) {
96   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add;
97 }
98 
99 MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
100   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Add, unwrap(lhs),
101                                     unwrap(rhs)));
102 }
103 
104 //===----------------------------------------------------------------------===//
105 // Affine Mul Expression.
106 //===----------------------------------------------------------------------===//
107 
108 int mlirAffineExprIsAMul(MlirAffineExpr affineExpr) {
109   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul;
110 }
111 
112 MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
113   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mul, unwrap(lhs),
114                                     unwrap(rhs)));
115 }
116 
117 //===----------------------------------------------------------------------===//
118 // Affine Mod Expression.
119 //===----------------------------------------------------------------------===//
120 
121 int mlirAffineExprIsAMod(MlirAffineExpr affineExpr) {
122   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod;
123 }
124 
125 MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
126   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mod, unwrap(lhs),
127                                     unwrap(rhs)));
128 }
129 
130 //===----------------------------------------------------------------------===//
131 // Affine FloorDiv Expression.
132 //===----------------------------------------------------------------------===//
133 
134 int mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) {
135   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv;
136 }
137 
138 MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs,
139                                          MlirAffineExpr rhs) {
140   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::FloorDiv, unwrap(lhs),
141                                     unwrap(rhs)));
142 }
143 
144 //===----------------------------------------------------------------------===//
145 // Affine CeilDiv Expression.
146 //===----------------------------------------------------------------------===//
147 
148 int mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) {
149   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv;
150 }
151 
152 MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs,
153                                         MlirAffineExpr rhs) {
154   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::CeilDiv, unwrap(lhs),
155                                     unwrap(rhs)));
156 }
157 
158 //===----------------------------------------------------------------------===//
159 // Affine Binary Operation Expression.
160 //===----------------------------------------------------------------------===//
161 
162 MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) {
163   return wrap(unwrap(affineExpr).cast<AffineBinaryOpExpr>().getLHS());
164 }
165 
166 MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) {
167   return wrap(unwrap(affineExpr).cast<AffineBinaryOpExpr>().getRHS());
168 }
169