1 //===- AffineMap.cpp - C API for MLIR Affine Maps -------------------------===//
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/AffineMap.h"
10 #include "mlir-c/IR.h"
11 #include "mlir/CAPI/AffineExpr.h"
12 #include "mlir/CAPI/AffineMap.h"
13 #include "mlir/CAPI/IR.h"
14 #include "mlir/CAPI/Utils.h"
15 #include "mlir/IR/AffineMap.h"
16
17 // TODO: expose the C API related to `AffineExpr` and mutable affine map.
18
19 using namespace mlir;
20
mlirAffineMapGetContext(MlirAffineMap affineMap)21 MlirContext mlirAffineMapGetContext(MlirAffineMap affineMap) {
22 return wrap(unwrap(affineMap).getContext());
23 }
24
mlirAffineMapEqual(MlirAffineMap a1,MlirAffineMap a2)25 bool mlirAffineMapEqual(MlirAffineMap a1, MlirAffineMap a2) {
26 return unwrap(a1) == unwrap(a2);
27 }
28
mlirAffineMapPrint(MlirAffineMap affineMap,MlirStringCallback callback,void * userData)29 void mlirAffineMapPrint(MlirAffineMap affineMap, MlirStringCallback callback,
30 void *userData) {
31 mlir::detail::CallbackOstream stream(callback, userData);
32 unwrap(affineMap).print(stream);
33 }
34
mlirAffineMapDump(MlirAffineMap affineMap)35 void mlirAffineMapDump(MlirAffineMap affineMap) { unwrap(affineMap).dump(); }
36
mlirAffineMapEmptyGet(MlirContext ctx)37 MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx) {
38 return wrap(AffineMap::get(unwrap(ctx)));
39 }
40
mlirAffineMapZeroResultGet(MlirContext ctx,intptr_t dimCount,intptr_t symbolCount)41 MlirAffineMap mlirAffineMapZeroResultGet(MlirContext ctx, intptr_t dimCount,
42 intptr_t symbolCount) {
43 return wrap(AffineMap::get(dimCount, symbolCount, unwrap(ctx)));
44 }
45
mlirAffineMapGet(MlirContext ctx,intptr_t dimCount,intptr_t symbolCount,intptr_t nAffineExprs,MlirAffineExpr * affineExprs)46 MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount,
47 intptr_t symbolCount, intptr_t nAffineExprs,
48 MlirAffineExpr *affineExprs) {
49 SmallVector<AffineExpr, 4> exprs;
50 ArrayRef<AffineExpr> exprList = unwrapList(nAffineExprs, affineExprs, exprs);
51 return wrap(AffineMap::get(dimCount, symbolCount, exprList, unwrap(ctx)));
52 }
53
mlirAffineMapConstantGet(MlirContext ctx,int64_t val)54 MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val) {
55 return wrap(AffineMap::getConstantMap(val, unwrap(ctx)));
56 }
57
mlirAffineMapMultiDimIdentityGet(MlirContext ctx,intptr_t numDims)58 MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx,
59 intptr_t numDims) {
60 return wrap(AffineMap::getMultiDimIdentityMap(numDims, unwrap(ctx)));
61 }
62
mlirAffineMapMinorIdentityGet(MlirContext ctx,intptr_t dims,intptr_t results)63 MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims,
64 intptr_t results) {
65 return wrap(AffineMap::getMinorIdentityMap(dims, results, unwrap(ctx)));
66 }
67
mlirAffineMapPermutationGet(MlirContext ctx,intptr_t size,unsigned * permutation)68 MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size,
69 unsigned *permutation) {
70 return wrap(AffineMap::getPermutationMap(
71 llvm::ArrayRef(permutation, static_cast<size_t>(size)), unwrap(ctx)));
72 }
73
mlirAffineMapIsIdentity(MlirAffineMap affineMap)74 bool mlirAffineMapIsIdentity(MlirAffineMap affineMap) {
75 return unwrap(affineMap).isIdentity();
76 }
77
mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap)78 bool mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap) {
79 return unwrap(affineMap).isMinorIdentity();
80 }
81
mlirAffineMapIsEmpty(MlirAffineMap affineMap)82 bool mlirAffineMapIsEmpty(MlirAffineMap affineMap) {
83 return unwrap(affineMap).isEmpty();
84 }
85
mlirAffineMapIsSingleConstant(MlirAffineMap affineMap)86 bool mlirAffineMapIsSingleConstant(MlirAffineMap affineMap) {
87 return unwrap(affineMap).isSingleConstant();
88 }
89
mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap)90 int64_t mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap) {
91 return unwrap(affineMap).getSingleConstantResult();
92 }
93
mlirAffineMapGetNumDims(MlirAffineMap affineMap)94 intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap) {
95 return unwrap(affineMap).getNumDims();
96 }
97
mlirAffineMapGetNumSymbols(MlirAffineMap affineMap)98 intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap) {
99 return unwrap(affineMap).getNumSymbols();
100 }
101
mlirAffineMapGetNumResults(MlirAffineMap affineMap)102 intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap) {
103 return unwrap(affineMap).getNumResults();
104 }
105
mlirAffineMapGetResult(MlirAffineMap affineMap,intptr_t pos)106 MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos) {
107 return wrap(unwrap(affineMap).getResult(static_cast<unsigned>(pos)));
108 }
109
mlirAffineMapGetNumInputs(MlirAffineMap affineMap)110 intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap) {
111 return unwrap(affineMap).getNumInputs();
112 }
113
mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap)114 bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap) {
115 return unwrap(affineMap).isProjectedPermutation();
116 }
117
mlirAffineMapIsPermutation(MlirAffineMap affineMap)118 bool mlirAffineMapIsPermutation(MlirAffineMap affineMap) {
119 return unwrap(affineMap).isPermutation();
120 }
121
mlirAffineMapGetSubMap(MlirAffineMap affineMap,intptr_t size,intptr_t * resultPos)122 MlirAffineMap mlirAffineMapGetSubMap(MlirAffineMap affineMap, intptr_t size,
123 intptr_t *resultPos) {
124 SmallVector<unsigned, 8> pos;
125 pos.reserve(size);
126 for (intptr_t i = 0; i < size; ++i)
127 pos.push_back(static_cast<unsigned>(resultPos[i]));
128 return wrap(unwrap(affineMap).getSubMap(pos));
129 }
130
mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,intptr_t numResults)131 MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,
132 intptr_t numResults) {
133 return wrap(unwrap(affineMap).getMajorSubMap(numResults));
134 }
135
mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,intptr_t numResults)136 MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,
137 intptr_t numResults) {
138 return wrap(unwrap(affineMap).getMinorSubMap(numResults));
139 }
140
mlirAffineMapReplace(MlirAffineMap affineMap,MlirAffineExpr expression,MlirAffineExpr replacement,intptr_t numResultDims,intptr_t numResultSyms)141 MlirAffineMap mlirAffineMapReplace(MlirAffineMap affineMap,
142 MlirAffineExpr expression,
143 MlirAffineExpr replacement,
144 intptr_t numResultDims,
145 intptr_t numResultSyms) {
146 return wrap(unwrap(affineMap).replace(unwrap(expression), unwrap(replacement),
147 numResultDims, numResultSyms));
148 }
149
mlirAffineMapCompressUnusedSymbols(MlirAffineMap * affineMaps,intptr_t size,void * result,void (* populateResult)(void * res,intptr_t idx,MlirAffineMap m))150 void mlirAffineMapCompressUnusedSymbols(
151 MlirAffineMap *affineMaps, intptr_t size, void *result,
152 void (*populateResult)(void *res, intptr_t idx, MlirAffineMap m)) {
153 SmallVector<AffineMap> maps;
154 for (intptr_t idx = 0; idx < size; ++idx)
155 maps.push_back(unwrap(affineMaps[idx]));
156 intptr_t idx = 0;
157 for (auto m : mlir::compressUnusedSymbols(maps))
158 populateResult(result, idx++, wrap(m));
159 }
160