brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · 1889765 Raw
160 lines · cpp
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-exception6//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 19using namespace mlir;20 21MlirContext mlirAffineMapGetContext(MlirAffineMap affineMap) {22  return wrap(unwrap(affineMap).getContext());23}24 25bool mlirAffineMapEqual(MlirAffineMap a1, MlirAffineMap a2) {26  return unwrap(a1) == unwrap(a2);27}28 29void mlirAffineMapPrint(MlirAffineMap affineMap, MlirStringCallback callback,30                        void *userData) {31  mlir::detail::CallbackOstream stream(callback, userData);32  unwrap(affineMap).print(stream);33}34 35void mlirAffineMapDump(MlirAffineMap affineMap) { unwrap(affineMap).dump(); }36 37MlirAffineMap mlirAffineMapEmptyGet(MlirContext ctx) {38  return wrap(AffineMap::get(unwrap(ctx)));39}40 41MlirAffineMap mlirAffineMapZeroResultGet(MlirContext ctx, intptr_t dimCount,42                                         intptr_t symbolCount) {43  return wrap(AffineMap::get(dimCount, symbolCount, unwrap(ctx)));44}45 46MlirAffineMap 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 54MlirAffineMap mlirAffineMapConstantGet(MlirContext ctx, int64_t val) {55  return wrap(AffineMap::getConstantMap(val, unwrap(ctx)));56}57 58MlirAffineMap mlirAffineMapMultiDimIdentityGet(MlirContext ctx,59                                               intptr_t numDims) {60  return wrap(AffineMap::getMultiDimIdentityMap(numDims, unwrap(ctx)));61}62 63MlirAffineMap mlirAffineMapMinorIdentityGet(MlirContext ctx, intptr_t dims,64                                            intptr_t results) {65  return wrap(AffineMap::getMinorIdentityMap(dims, results, unwrap(ctx)));66}67 68MlirAffineMap 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 74bool mlirAffineMapIsIdentity(MlirAffineMap affineMap) {75  return unwrap(affineMap).isIdentity();76}77 78bool mlirAffineMapIsMinorIdentity(MlirAffineMap affineMap) {79  return unwrap(affineMap).isMinorIdentity();80}81 82bool mlirAffineMapIsEmpty(MlirAffineMap affineMap) {83  return unwrap(affineMap).isEmpty();84}85 86bool mlirAffineMapIsSingleConstant(MlirAffineMap affineMap) {87  return unwrap(affineMap).isSingleConstant();88}89 90int64_t mlirAffineMapGetSingleConstantResult(MlirAffineMap affineMap) {91  return unwrap(affineMap).getSingleConstantResult();92}93 94intptr_t mlirAffineMapGetNumDims(MlirAffineMap affineMap) {95  return unwrap(affineMap).getNumDims();96}97 98intptr_t mlirAffineMapGetNumSymbols(MlirAffineMap affineMap) {99  return unwrap(affineMap).getNumSymbols();100}101 102intptr_t mlirAffineMapGetNumResults(MlirAffineMap affineMap) {103  return unwrap(affineMap).getNumResults();104}105 106MlirAffineExpr mlirAffineMapGetResult(MlirAffineMap affineMap, intptr_t pos) {107  return wrap(unwrap(affineMap).getResult(static_cast<unsigned>(pos)));108}109 110intptr_t mlirAffineMapGetNumInputs(MlirAffineMap affineMap) {111  return unwrap(affineMap).getNumInputs();112}113 114bool mlirAffineMapIsProjectedPermutation(MlirAffineMap affineMap) {115  return unwrap(affineMap).isProjectedPermutation();116}117 118bool mlirAffineMapIsPermutation(MlirAffineMap affineMap) {119  return unwrap(affineMap).isPermutation();120}121 122MlirAffineMap 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 131MlirAffineMap mlirAffineMapGetMajorSubMap(MlirAffineMap affineMap,132                                          intptr_t numResults) {133  return wrap(unwrap(affineMap).getMajorSubMap(numResults));134}135 136MlirAffineMap mlirAffineMapGetMinorSubMap(MlirAffineMap affineMap,137                                          intptr_t numResults) {138  return wrap(unwrap(affineMap).getMinorSubMap(numResults));139}140 141MlirAffineMap 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 150void 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