xref: /llvm-project/mlir/lib/CAPI/IR/AffineMap.cpp (revision 984b800a036fc61ccb129a8da7592af9cadc94dd)
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