xref: /llvm-project/mlir/lib/CAPI/IR/AffineMap.cpp (revision 984b800a036fc61ccb129a8da7592af9cadc94dd)
174f57784SAlex Zinenko //===- AffineMap.cpp - C API for MLIR Affine Maps -------------------------===//
274f57784SAlex Zinenko //
374f57784SAlex Zinenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
474f57784SAlex Zinenko // See https://llvm.org/LICENSE.txt for license information.
574f57784SAlex Zinenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
674f57784SAlex Zinenko //
774f57784SAlex Zinenko //===----------------------------------------------------------------------===//
874f57784SAlex Zinenko 
974f57784SAlex Zinenko #include "mlir-c/AffineMap.h"
1074f57784SAlex Zinenko #include "mlir-c/IR.h"
11e79bd0b4SAlex Zinenko #include "mlir/CAPI/AffineExpr.h"
1274f57784SAlex Zinenko #include "mlir/CAPI/AffineMap.h"
13b76f523bSzhanghb97 #include "mlir/CAPI/IR.h"
14b76f523bSzhanghb97 #include "mlir/CAPI/Utils.h"
1574f57784SAlex Zinenko #include "mlir/IR/AffineMap.h"
1674f57784SAlex Zinenko 
17b76f523bSzhanghb97 // TODO: expose the C API related to `AffineExpr` and mutable affine map.
18b76f523bSzhanghb97 
19b76f523bSzhanghb97 using namespace mlir;
20b76f523bSzhanghb97 
mlirAffineMapGetContext(MlirAffineMap affineMap)21b76f523bSzhanghb97 MlirContext mlirAffineMapGetContext(MlirAffineMap affineMap) {
22b76f523bSzhanghb97   return wrap(unwrap(affineMap).getContext());
23b76f523bSzhanghb97 }
24b76f523bSzhanghb97 
mlirAffineMapEqual(MlirAffineMap a1,MlirAffineMap a2)2562195b75SStella Laurenzo bool mlirAffineMapEqual(MlirAffineMap a1, MlirAffineMap a2) {
26b76f523bSzhanghb97   return unwrap(a1) == unwrap(a2);
27b76f523bSzhanghb97 }
28b76f523bSzhanghb97 
mlirAffineMapPrint(MlirAffineMap affineMap,MlirStringCallback callback,void * userData)29b76f523bSzhanghb97 void mlirAffineMapPrint(MlirAffineMap affineMap, MlirStringCallback callback,
30b76f523bSzhanghb97                         void *userData) {
31b76f523bSzhanghb97   mlir::detail::CallbackOstream stream(callback, userData);
32b76f523bSzhanghb97   unwrap(affineMap).print(stream);
33b76f523bSzhanghb97 }
34b76f523bSzhanghb97 
mlirAffineMapDump(MlirAffineMap affineMap)35b76f523bSzhanghb97 void mlirAffineMapDump(MlirAffineMap affineMap) { unwrap(affineMap).dump(); }
36b76f523bSzhanghb97 
mlirAffineMapEmptyGet(MlirContext ctx)37b76f523bSzhanghb97 MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx) {
38b76f523bSzhanghb97   return wrap(AffineMap::get(unwrap(ctx)));
39b76f523bSzhanghb97 }
40b76f523bSzhanghb97 
mlirAffineMapZeroResultGet(MlirContext ctx,intptr_t dimCount,intptr_t symbolCount)41e79bd0b4SAlex Zinenko MlirAffineMap mlirAffineMapZeroResultGet(MlirContext ctx, intptr_t dimCount,
42b76f523bSzhanghb97                                          intptr_t symbolCount) {
43b76f523bSzhanghb97   return wrap(AffineMap::get(dimCount, symbolCount, unwrap(ctx)));
44b76f523bSzhanghb97 }
45b76f523bSzhanghb97 
mlirAffineMapGet(MlirContext ctx,intptr_t dimCount,intptr_t symbolCount,intptr_t nAffineExprs,MlirAffineExpr * affineExprs)46e79bd0b4SAlex Zinenko MlirAffineMap mlirAffineMapGet(MlirContext ctx, intptr_t dimCount,
47e79bd0b4SAlex Zinenko                                intptr_t symbolCount, intptr_t nAffineExprs,
48e79bd0b4SAlex Zinenko                                MlirAffineExpr *affineExprs) {
49e79bd0b4SAlex Zinenko   SmallVector<AffineExpr, 4> exprs;
50e79bd0b4SAlex Zinenko   ArrayRef<AffineExpr> exprList = unwrapList(nAffineExprs, affineExprs, exprs);
51e79bd0b4SAlex Zinenko   return wrap(AffineMap::get(dimCount, symbolCount, exprList, unwrap(ctx)));
52e79bd0b4SAlex Zinenko }
53e79bd0b4SAlex Zinenko 
mlirAffineMapConstantGet(MlirContext ctx,int64_t val)54b76f523bSzhanghb97 MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val) {
55b76f523bSzhanghb97   return wrap(AffineMap::getConstantMap(val, unwrap(ctx)));
56b76f523bSzhanghb97 }
57b76f523bSzhanghb97 
mlirAffineMapMultiDimIdentityGet(MlirContext ctx,intptr_t numDims)58b76f523bSzhanghb97 MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx,
59b76f523bSzhanghb97                                                intptr_t numDims) {
60b76f523bSzhanghb97   return wrap(AffineMap::getMultiDimIdentityMap(numDims, unwrap(ctx)));
61b76f523bSzhanghb97 }
62b76f523bSzhanghb97 
mlirAffineMapMinorIdentityGet(MlirContext ctx,intptr_t dims,intptr_t results)63b76f523bSzhanghb97 MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims,
64b76f523bSzhanghb97                                             intptr_t results) {
65b76f523bSzhanghb97   return wrap(AffineMap::getMinorIdentityMap(dims, results, unwrap(ctx)));
66b76f523bSzhanghb97 }
67b76f523bSzhanghb97 
mlirAffineMapPermutationGet(MlirContext ctx,intptr_t size,unsigned * permutation)68b76f523bSzhanghb97 MlirAffineMap mlirAffineMapPermutationGet(MlirContext ctx, intptr_t size,
69b76f523bSzhanghb97                                           unsigned *permutation) {
70b76f523bSzhanghb97   return wrap(AffineMap::getPermutationMap(
71*984b800aSserge-sans-paille       llvm::ArrayRef(permutation, static_cast<size_t>(size)), unwrap(ctx)));
72b76f523bSzhanghb97 }
73b76f523bSzhanghb97 
mlirAffineMapIsIdentity(MlirAffineMap affineMap)7462195b75SStella Laurenzo bool mlirAffineMapIsIdentity(MlirAffineMap affineMap) {
75b76f523bSzhanghb97   return unwrap(affineMap).isIdentity();
76b76f523bSzhanghb97 }
77b76f523bSzhanghb97 
mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap)7862195b75SStella Laurenzo bool mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap) {
79b76f523bSzhanghb97   return unwrap(affineMap).isMinorIdentity();
80b76f523bSzhanghb97 }
81b76f523bSzhanghb97 
mlirAffineMapIsEmpty(MlirAffineMap affineMap)8262195b75SStella Laurenzo bool mlirAffineMapIsEmpty(MlirAffineMap affineMap) {
83b76f523bSzhanghb97   return unwrap(affineMap).isEmpty();
84b76f523bSzhanghb97 }
85b76f523bSzhanghb97 
mlirAffineMapIsSingleConstant(MlirAffineMap affineMap)8662195b75SStella Laurenzo bool mlirAffineMapIsSingleConstant(MlirAffineMap affineMap) {
87b76f523bSzhanghb97   return unwrap(affineMap).isSingleConstant();
88b76f523bSzhanghb97 }
89b76f523bSzhanghb97 
mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap)90b76f523bSzhanghb97 int64_t mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap) {
91b76f523bSzhanghb97   return unwrap(affineMap).getSingleConstantResult();
92b76f523bSzhanghb97 }
93b76f523bSzhanghb97 
mlirAffineMapGetNumDims(MlirAffineMap affineMap)94b76f523bSzhanghb97 intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap) {
95b76f523bSzhanghb97   return unwrap(affineMap).getNumDims();
96b76f523bSzhanghb97 }
97b76f523bSzhanghb97 
mlirAffineMapGetNumSymbols(MlirAffineMap affineMap)98b76f523bSzhanghb97 intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap) {
99b76f523bSzhanghb97   return unwrap(affineMap).getNumSymbols();
100b76f523bSzhanghb97 }
101b76f523bSzhanghb97 
mlirAffineMapGetNumResults(MlirAffineMap affineMap)102b76f523bSzhanghb97 intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap) {
103b76f523bSzhanghb97   return unwrap(affineMap).getNumResults();
104b76f523bSzhanghb97 }
105b76f523bSzhanghb97 
mlirAffineMapGetResult(MlirAffineMap affineMap,intptr_t pos)106e79bd0b4SAlex Zinenko MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos) {
107e79bd0b4SAlex Zinenko   return wrap(unwrap(affineMap).getResult(static_cast<unsigned>(pos)));
108e79bd0b4SAlex Zinenko }
109e79bd0b4SAlex Zinenko 
mlirAffineMapGetNumInputs(MlirAffineMap affineMap)110b76f523bSzhanghb97 intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap) {
111b76f523bSzhanghb97   return unwrap(affineMap).getNumInputs();
112b76f523bSzhanghb97 }
113b76f523bSzhanghb97 
mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap)11462195b75SStella Laurenzo bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap) {
115b76f523bSzhanghb97   return unwrap(affineMap).isProjectedPermutation();
116b76f523bSzhanghb97 }
117b76f523bSzhanghb97 
mlirAffineMapIsPermutation(MlirAffineMap affineMap)11862195b75SStella Laurenzo bool mlirAffineMapIsPermutation(MlirAffineMap affineMap) {
119b76f523bSzhanghb97   return unwrap(affineMap).isPermutation();
120b76f523bSzhanghb97 }
121b76f523bSzhanghb97 
mlirAffineMapGetSubMap(MlirAffineMap affineMap,intptr_t size,intptr_t * resultPos)122b76f523bSzhanghb97 MlirAffineMap mlirAffineMapGetSubMap(MlirAffineMap affineMap, intptr_t size,
123b76f523bSzhanghb97                                      intptr_t *resultPos) {
124b76f523bSzhanghb97   SmallVector<unsigned, 8> pos;
125b76f523bSzhanghb97   pos.reserve(size);
126b76f523bSzhanghb97   for (intptr_t i = 0; i < size; ++i)
127b76f523bSzhanghb97     pos.push_back(static_cast<unsigned>(resultPos[i]));
128b76f523bSzhanghb97   return wrap(unwrap(affineMap).getSubMap(pos));
129b76f523bSzhanghb97 }
130b76f523bSzhanghb97 
mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,intptr_t numResults)131b76f523bSzhanghb97 MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,
132b76f523bSzhanghb97                                           intptr_t numResults) {
133b76f523bSzhanghb97   return wrap(unwrap(affineMap).getMajorSubMap(numResults));
134b76f523bSzhanghb97 }
135b76f523bSzhanghb97 
mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,intptr_t numResults)136b76f523bSzhanghb97 MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,
137b76f523bSzhanghb97                                           intptr_t numResults) {
138b76f523bSzhanghb97   return wrap(unwrap(affineMap).getMinorSubMap(numResults));
139b76f523bSzhanghb97 }
140335d2df5SNicolas Vasilache 
mlirAffineMapReplace(MlirAffineMap affineMap,MlirAffineExpr expression,MlirAffineExpr replacement,intptr_t numResultDims,intptr_t numResultSyms)14131f888eaSTobias Gysi MlirAffineMap mlirAffineMapReplace(MlirAffineMap affineMap,
14231f888eaSTobias Gysi                                    MlirAffineExpr expression,
14331f888eaSTobias Gysi                                    MlirAffineExpr replacement,
14431f888eaSTobias Gysi                                    intptr_t numResultDims,
14531f888eaSTobias Gysi                                    intptr_t numResultSyms) {
14631f888eaSTobias Gysi   return wrap(unwrap(affineMap).replace(unwrap(expression), unwrap(replacement),
14731f888eaSTobias Gysi                                         numResultDims, numResultSyms));
14831f888eaSTobias Gysi }
14931f888eaSTobias Gysi 
mlirAffineMapCompressUnusedSymbols(MlirAffineMap * affineMaps,intptr_t size,void * result,void (* populateResult)(void * res,intptr_t idx,MlirAffineMap m))150335d2df5SNicolas Vasilache void mlirAffineMapCompressUnusedSymbols(
151335d2df5SNicolas Vasilache     MlirAffineMap *affineMaps, intptr_t size, void *result,
152335d2df5SNicolas Vasilache     void (*populateResult)(void *res, intptr_t idx, MlirAffineMap m)) {
153335d2df5SNicolas Vasilache   SmallVector<AffineMap> maps;
154335d2df5SNicolas Vasilache   for (intptr_t idx = 0; idx < size; ++idx)
155335d2df5SNicolas Vasilache     maps.push_back(unwrap(affineMaps[idx]));
156335d2df5SNicolas Vasilache   intptr_t idx = 0;
157335d2df5SNicolas Vasilache   for (auto m : mlir::compressUnusedSymbols(maps))
158335d2df5SNicolas Vasilache     populateResult(result, idx++, wrap(m));
159335d2df5SNicolas Vasilache }
160