xref: /llvm-project/mlir/lib/CAPI/IR/AffineExpr.cpp (revision 1609f1c2a5ecc0e0e28f433ec9205122478ddaa3)
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 
mlirAffineExprGetContext(MlirAffineExpr affineExpr)20 MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr) {
21   return wrap(unwrap(affineExpr).getContext());
22 }
23 
mlirAffineExprEqual(MlirAffineExpr lhs,MlirAffineExpr rhs)24 bool mlirAffineExprEqual(MlirAffineExpr lhs, MlirAffineExpr rhs) {
25   return unwrap(lhs) == unwrap(rhs);
26 }
27 
mlirAffineExprPrint(MlirAffineExpr affineExpr,MlirStringCallback callback,void * userData)28 void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback,
29                          void *userData) {
30   mlir::detail::CallbackOstream stream(callback, userData);
31   unwrap(affineExpr).print(stream);
32 }
33 
mlirAffineExprDump(MlirAffineExpr affineExpr)34 void mlirAffineExprDump(MlirAffineExpr affineExpr) {
35   unwrap(affineExpr).dump();
36 }
37 
mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr)38 bool mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr) {
39   return unwrap(affineExpr).isSymbolicOrConstant();
40 }
41 
mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr)42 bool mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr) {
43   return unwrap(affineExpr).isPureAffine();
44 }
45 
mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr)46 int64_t mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr) {
47   return unwrap(affineExpr).getLargestKnownDivisor();
48 }
49 
mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr,int64_t factor)50 bool mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor) {
51   return unwrap(affineExpr).isMultipleOf(factor);
52 }
53 
mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr,intptr_t position)54 bool mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr,
55                                    intptr_t position) {
56   return unwrap(affineExpr).isFunctionOfDim(position);
57 }
58 
mlirAffineExprCompose(MlirAffineExpr affineExpr,MlirAffineMap affineMap)59 MlirAffineExpr mlirAffineExprCompose(MlirAffineExpr affineExpr,
60                                      MlirAffineMap affineMap) {
61   return wrap(unwrap(affineExpr).compose(unwrap(affineMap)));
62 }
63 
64 //===----------------------------------------------------------------------===//
65 // Affine Dimension Expression.
66 //===----------------------------------------------------------------------===//
67 
mlirAffineExprIsADim(MlirAffineExpr affineExpr)68 bool mlirAffineExprIsADim(MlirAffineExpr affineExpr) {
69   return isa<AffineDimExpr>(unwrap(affineExpr));
70 }
71 
mlirAffineDimExprGet(MlirContext ctx,intptr_t position)72 MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) {
73   return wrap(getAffineDimExpr(position, unwrap(ctx)));
74 }
75 
mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr)76 intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) {
77   return cast<AffineDimExpr>(unwrap(affineExpr)).getPosition();
78 }
79 
80 //===----------------------------------------------------------------------===//
81 // Affine Symbol Expression.
82 //===----------------------------------------------------------------------===//
83 
mlirAffineExprIsASymbol(MlirAffineExpr affineExpr)84 bool mlirAffineExprIsASymbol(MlirAffineExpr affineExpr) {
85   return isa<AffineSymbolExpr>(unwrap(affineExpr));
86 }
87 
mlirAffineSymbolExprGet(MlirContext ctx,intptr_t position)88 MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) {
89   return wrap(getAffineSymbolExpr(position, unwrap(ctx)));
90 }
91 
mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr)92 intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) {
93   return cast<AffineSymbolExpr>(unwrap(affineExpr)).getPosition();
94 }
95 
96 //===----------------------------------------------------------------------===//
97 // Affine Constant Expression.
98 //===----------------------------------------------------------------------===//
99 
mlirAffineExprIsAConstant(MlirAffineExpr affineExpr)100 bool mlirAffineExprIsAConstant(MlirAffineExpr affineExpr) {
101   return isa<AffineConstantExpr>(unwrap(affineExpr));
102 }
103 
mlirAffineConstantExprGet(MlirContext ctx,int64_t constant)104 MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) {
105   return wrap(getAffineConstantExpr(constant, unwrap(ctx)));
106 }
107 
mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr)108 int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) {
109   return cast<AffineConstantExpr>(unwrap(affineExpr)).getValue();
110 }
111 
112 //===----------------------------------------------------------------------===//
113 // Affine Add Expression.
114 //===----------------------------------------------------------------------===//
115 
mlirAffineExprIsAAdd(MlirAffineExpr affineExpr)116 bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) {
117   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add;
118 }
119 
mlirAffineAddExprGet(MlirAffineExpr lhs,MlirAffineExpr rhs)120 MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
121   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Add, unwrap(lhs),
122                                     unwrap(rhs)));
123 }
124 
125 //===----------------------------------------------------------------------===//
126 // Affine Mul Expression.
127 //===----------------------------------------------------------------------===//
128 
mlirAffineExprIsAMul(MlirAffineExpr affineExpr)129 bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr) {
130   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul;
131 }
132 
mlirAffineMulExprGet(MlirAffineExpr lhs,MlirAffineExpr rhs)133 MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
134   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mul, unwrap(lhs),
135                                     unwrap(rhs)));
136 }
137 
138 //===----------------------------------------------------------------------===//
139 // Affine Mod Expression.
140 //===----------------------------------------------------------------------===//
141 
mlirAffineExprIsAMod(MlirAffineExpr affineExpr)142 bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr) {
143   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod;
144 }
145 
mlirAffineModExprGet(MlirAffineExpr lhs,MlirAffineExpr rhs)146 MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) {
147   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mod, unwrap(lhs),
148                                     unwrap(rhs)));
149 }
150 
151 //===----------------------------------------------------------------------===//
152 // Affine FloorDiv Expression.
153 //===----------------------------------------------------------------------===//
154 
mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr)155 bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) {
156   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv;
157 }
158 
mlirAffineFloorDivExprGet(MlirAffineExpr lhs,MlirAffineExpr rhs)159 MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs,
160                                          MlirAffineExpr rhs) {
161   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::FloorDiv, unwrap(lhs),
162                                     unwrap(rhs)));
163 }
164 
165 //===----------------------------------------------------------------------===//
166 // Affine CeilDiv Expression.
167 //===----------------------------------------------------------------------===//
168 
mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr)169 bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) {
170   return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv;
171 }
172 
mlirAffineCeilDivExprGet(MlirAffineExpr lhs,MlirAffineExpr rhs)173 MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs,
174                                         MlirAffineExpr rhs) {
175   return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::CeilDiv, unwrap(lhs),
176                                     unwrap(rhs)));
177 }
178 
179 //===----------------------------------------------------------------------===//
180 // Affine Binary Operation Expression.
181 //===----------------------------------------------------------------------===//
182 
mlirAffineExprIsABinary(MlirAffineExpr affineExpr)183 bool mlirAffineExprIsABinary(MlirAffineExpr affineExpr) {
184   return isa<AffineBinaryOpExpr>(unwrap(affineExpr));
185 }
186 
mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr)187 MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) {
188   return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getLHS());
189 }
190 
mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr)191 MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) {
192   return wrap(cast<AffineBinaryOpExpr>(unwrap(affineExpr)).getRHS());
193 }
194