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