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