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/AffineMap.h"
12 #include "mlir/CAPI/IR.h"
13 #include "mlir/CAPI/Utils.h"
14 #include "mlir/IR/AffineMap.h"
15 
16 // TODO: expose the C API related to `AffineExpr` and mutable affine map.
17 
18 using namespace mlir;
19 
20 MlirContext mlirAffineMapGetContext(MlirAffineMap affineMap) {
21   return wrap(unwrap(affineMap).getContext());
22 }
23 
24 int mlirAffineMapEqual(MlirAffineMap a1, MlirAffineMap a2) {
25   return unwrap(a1) == unwrap(a2);
26 }
27 
28 void mlirAffineMapPrint(MlirAffineMap affineMap, MlirStringCallback callback,
29                         void *userData) {
30   mlir::detail::CallbackOstream stream(callback, userData);
31   unwrap(affineMap).print(stream);
32   stream.flush();
33 }
34 
35 void mlirAffineMapDump(MlirAffineMap affineMap) { unwrap(affineMap).dump(); }
36 
37 MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx) {
38   return wrap(AffineMap::get(unwrap(ctx)));
39 }
40 
41 MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount,
42                                intptr_t symbolCount) {
43   return wrap(AffineMap::get(dimCount, symbolCount, unwrap(ctx)));
44 }
45 
46 MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val) {
47   return wrap(AffineMap::getConstantMap(val, unwrap(ctx)));
48 }
49 
50 MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx,
51                                                intptr_t numDims) {
52   return wrap(AffineMap::getMultiDimIdentityMap(numDims, unwrap(ctx)));
53 }
54 
55 MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims,
56                                             intptr_t results) {
57   return wrap(AffineMap::getMinorIdentityMap(dims, results, unwrap(ctx)));
58 }
59 
60 MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size,
61                                           unsigned *permutation) {
62   return wrap(AffineMap::getPermutationMap(
63       llvm::makeArrayRef(permutation, static_cast<size_t>(size)), unwrap(ctx)));
64 }
65 
66 int mlirAffineMapIsIdentity(MlirAffineMap affineMap) {
67   return unwrap(affineMap).isIdentity();
68 }
69 
70 int mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap) {
71   return unwrap(affineMap).isMinorIdentity();
72 }
73 
74 int mlirAffineMapIsEmpty(MlirAffineMap affineMap) {
75   return unwrap(affineMap).isEmpty();
76 }
77 
78 int mlirAffineMapIsSingleConstant(MlirAffineMap affineMap) {
79   return unwrap(affineMap).isSingleConstant();
80 }
81 
82 int64_t mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap) {
83   return unwrap(affineMap).getSingleConstantResult();
84 }
85 
86 intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap) {
87   return unwrap(affineMap).getNumDims();
88 }
89 
90 intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap) {
91   return unwrap(affineMap).getNumSymbols();
92 }
93 
94 intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap) {
95   return unwrap(affineMap).getNumResults();
96 }
97 
98 intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap) {
99   return unwrap(affineMap).getNumInputs();
100 }
101 
102 int mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap) {
103   return unwrap(affineMap).isProjectedPermutation();
104 }
105 
106 int mlirAffineMapIsPermutation(MlirAffineMap affineMap) {
107   return unwrap(affineMap).isPermutation();
108 }
109 
110 MlirAffineMap mlirAffineMapGetSubMap(MlirAffineMap affineMap, intptr_t size,
111                                      intptr_t *resultPos) {
112   SmallVector<unsigned, 8> pos;
113   pos.reserve(size);
114   for (intptr_t i = 0; i < size; ++i)
115     pos.push_back(static_cast<unsigned>(resultPos[i]));
116   return wrap(unwrap(affineMap).getSubMap(pos));
117 }
118 
119 MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,
120                                           intptr_t numResults) {
121   return wrap(unwrap(affineMap).getMajorSubMap(numResults));
122 }
123 
124 MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,
125                                           intptr_t numResults) {
126   return wrap(unwrap(affineMap).getMinorSubMap(numResults));
127 }
128