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