1 //===- AffineExpr.cpp - C API for MLIR Affine Expressions -----------------===// 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/AffineExpr.h" 10 #include "mlir-c/AffineMap.h" 11 #include "mlir-c/IR.h" 12 #include "mlir/CAPI/AffineExpr.h" 13 #include "mlir/CAPI/AffineMap.h" 14 #include "mlir/CAPI/IR.h" 15 #include "mlir/CAPI/Utils.h" 16 #include "mlir/IR/AffineExpr.h" 17 18 using namespace mlir; 19 20 MlirContext mlirAffineExprGetContext(MlirAffineExpr affineExpr) { 21 return wrap(unwrap(affineExpr).getContext()); 22 } 23 24 void mlirAffineExprPrint(MlirAffineExpr affineExpr, MlirStringCallback callback, 25 void *userData) { 26 mlir::detail::CallbackOstream stream(callback, userData); 27 unwrap(affineExpr).print(stream); 28 } 29 30 void mlirAffineExprDump(MlirAffineExpr affineExpr) { 31 unwrap(affineExpr).dump(); 32 } 33 34 bool mlirAffineExprIsSymbolicOrConstant(MlirAffineExpr affineExpr) { 35 return unwrap(affineExpr).isSymbolicOrConstant(); 36 } 37 38 bool mlirAffineExprIsPureAffine(MlirAffineExpr affineExpr) { 39 return unwrap(affineExpr).isPureAffine(); 40 } 41 42 int64_t mlirAffineExprGetLargestKnownDivisor(MlirAffineExpr affineExpr) { 43 return unwrap(affineExpr).getLargestKnownDivisor(); 44 } 45 46 bool mlirAffineExprIsMultipleOf(MlirAffineExpr affineExpr, int64_t factor) { 47 return unwrap(affineExpr).isMultipleOf(factor); 48 } 49 50 bool mlirAffineExprIsFunctionOfDim(MlirAffineExpr affineExpr, 51 intptr_t position) { 52 return unwrap(affineExpr).isFunctionOfDim(position); 53 } 54 55 //===----------------------------------------------------------------------===// 56 // Affine Dimension Expression. 57 //===----------------------------------------------------------------------===// 58 59 MlirAffineExpr mlirAffineDimExprGet(MlirContext ctx, intptr_t position) { 60 return wrap(getAffineDimExpr(position, unwrap(ctx))); 61 } 62 63 intptr_t mlirAffineDimExprGetPosition(MlirAffineExpr affineExpr) { 64 return unwrap(affineExpr).cast<AffineDimExpr>().getPosition(); 65 } 66 67 //===----------------------------------------------------------------------===// 68 // Affine Symbol Expression. 69 //===----------------------------------------------------------------------===// 70 71 MlirAffineExpr mlirAffineSymbolExprGet(MlirContext ctx, intptr_t position) { 72 return wrap(getAffineSymbolExpr(position, unwrap(ctx))); 73 } 74 75 intptr_t mlirAffineSymbolExprGetPosition(MlirAffineExpr affineExpr) { 76 return unwrap(affineExpr).cast<AffineSymbolExpr>().getPosition(); 77 } 78 79 //===----------------------------------------------------------------------===// 80 // Affine Constant Expression. 81 //===----------------------------------------------------------------------===// 82 83 MlirAffineExpr mlirAffineConstantExprGet(MlirContext ctx, int64_t constant) { 84 return wrap(getAffineConstantExpr(constant, unwrap(ctx))); 85 } 86 87 int64_t mlirAffineConstantExprGetValue(MlirAffineExpr affineExpr) { 88 return unwrap(affineExpr).cast<AffineConstantExpr>().getValue(); 89 } 90 91 //===----------------------------------------------------------------------===// 92 // Affine Add Expression. 93 //===----------------------------------------------------------------------===// 94 95 bool mlirAffineExprIsAAdd(MlirAffineExpr affineExpr) { 96 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Add; 97 } 98 99 MlirAffineExpr mlirAffineAddExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) { 100 return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Add, unwrap(lhs), 101 unwrap(rhs))); 102 } 103 104 //===----------------------------------------------------------------------===// 105 // Affine Mul Expression. 106 //===----------------------------------------------------------------------===// 107 108 bool mlirAffineExprIsAMul(MlirAffineExpr affineExpr) { 109 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mul; 110 } 111 112 MlirAffineExpr mlirAffineMulExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) { 113 return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mul, unwrap(lhs), 114 unwrap(rhs))); 115 } 116 117 //===----------------------------------------------------------------------===// 118 // Affine Mod Expression. 119 //===----------------------------------------------------------------------===// 120 121 bool mlirAffineExprIsAMod(MlirAffineExpr affineExpr) { 122 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::Mod; 123 } 124 125 MlirAffineExpr mlirAffineModExprGet(MlirAffineExpr lhs, MlirAffineExpr rhs) { 126 return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::Mod, unwrap(lhs), 127 unwrap(rhs))); 128 } 129 130 //===----------------------------------------------------------------------===// 131 // Affine FloorDiv Expression. 132 //===----------------------------------------------------------------------===// 133 134 bool mlirAffineExprIsAFloorDiv(MlirAffineExpr affineExpr) { 135 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::FloorDiv; 136 } 137 138 MlirAffineExpr mlirAffineFloorDivExprGet(MlirAffineExpr lhs, 139 MlirAffineExpr rhs) { 140 return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::FloorDiv, unwrap(lhs), 141 unwrap(rhs))); 142 } 143 144 //===----------------------------------------------------------------------===// 145 // Affine CeilDiv Expression. 146 //===----------------------------------------------------------------------===// 147 148 bool mlirAffineExprIsACeilDiv(MlirAffineExpr affineExpr) { 149 return unwrap(affineExpr).getKind() == mlir::AffineExprKind::CeilDiv; 150 } 151 152 MlirAffineExpr mlirAffineCeilDivExprGet(MlirAffineExpr lhs, 153 MlirAffineExpr rhs) { 154 return wrap(getAffineBinaryOpExpr(mlir::AffineExprKind::CeilDiv, unwrap(lhs), 155 unwrap(rhs))); 156 } 157 158 //===----------------------------------------------------------------------===// 159 // Affine Binary Operation Expression. 160 //===----------------------------------------------------------------------===// 161 162 MlirAffineExpr mlirAffineBinaryOpExprGetLHS(MlirAffineExpr affineExpr) { 163 return wrap(unwrap(affineExpr).cast<AffineBinaryOpExpr>().getLHS()); 164 } 165 166 MlirAffineExpr mlirAffineBinaryOpExprGetRHS(MlirAffineExpr affineExpr) { 167 return wrap(unwrap(affineExpr).cast<AffineBinaryOpExpr>().getRHS()); 168 } 169