1 //===-- mlir-c/IntegerSet.h - C API for MLIR Affine maps ----------*- C -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM 4 // Exceptions. 5 // See https://llvm.org/LICENSE.txt for license information. 6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef MLIR_C_INTEGERSET_H 11 #define MLIR_C_INTEGERSET_H 12 13 #include "mlir-c/AffineExpr.h" 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 //===----------------------------------------------------------------------===// 20 // Opaque type declarations. 21 // 22 // Types are exposed to C bindings as structs containing opaque pointers. They 23 // are not supposed to be inspected from C. This allows the underlying 24 // representation to change without affecting the API users. The use of structs 25 // instead of typedefs enables some type safety as structs are not implicitly 26 // convertible to each other. 27 // 28 // Instances of these types may or may not own the underlying object. The 29 // ownership semantics is defined by how an instance of the type was obtained. 30 //===----------------------------------------------------------------------===// 31 32 #define DEFINE_C_API_STRUCT(name, storage) \ 33 struct name { \ 34 storage *ptr; \ 35 }; \ 36 typedef struct name name 37 38 DEFINE_C_API_STRUCT(MlirIntegerSet, const void); 39 40 #undef DEFINE_C_API_STRUCT 41 42 /// Gets the context in which the given integer set lives. 43 MLIR_CAPI_EXPORTED MlirContext mlirIntegerSetGetContext(MlirIntegerSet set); 44 45 /// Checks whether an integer set is a null object. 46 static inline bool mlirIntegerSetIsNull(MlirIntegerSet set) { return !set.ptr; } 47 48 /// Checks if two integer set objects are equal. This is a "shallow" comparison 49 /// of two objects. Only the sets with some small number of constraints are 50 /// uniqued and compare equal here. Set objects that represent the same integer 51 /// set with different constraints may be considered non-equal by this check. 52 /// Set difference followed by an (expensive) emptiness check should be used to 53 /// check equivalence of the underlying integer sets. 54 MLIR_CAPI_EXPORTED bool mlirIntegerSetEqual(MlirIntegerSet s1, 55 MlirIntegerSet s2); 56 57 /// Prints an integer set by sending chunks of the string representation and 58 /// forwarding `userData to `callback`. Note that the callback may be called 59 /// several times with consecutive chunks of the string. 60 MLIR_CAPI_EXPORTED void mlirIntegerSetPrint(MlirIntegerSet set, 61 MlirStringCallback callback, 62 void *userData); 63 64 /// Prints an integer set to the standard error stream. 65 MLIR_CAPI_EXPORTED void mlirIntegerSetDump(MlirIntegerSet set); 66 67 /// Gets or creates a new canonically empty integer set with the give number of 68 /// dimensions and symbols in the given context. 69 MLIR_CAPI_EXPORTED MlirIntegerSet mlirIntegerSetEmptyGet(MlirContext context, 70 intptr_t numDims, 71 intptr_t numSymbols); 72 73 /// Gets or creates a new integer set in the given context. The set is defined 74 /// by a list of affine constraints, with the given number of input dimensions 75 /// and symbols, which are treated as either equalities (eqFlags is 1) or 76 /// inequalities (eqFlags is 0). Both `constraints` and `eqFlags` are expected 77 /// to point to at least `numConstraint` consecutive values. 78 MLIR_CAPI_EXPORTED MlirIntegerSet 79 mlirIntegerSetGet(MlirContext context, intptr_t numDims, intptr_t numSymbols, 80 intptr_t numConstraints, const MlirAffineExpr *constraints, 81 const bool *eqFlags); 82 83 /// Gets or creates a new integer set in which the values and dimensions of the 84 /// given set are replaced with the given affine expressions. `dimReplacements` 85 /// and `symbolReplacements` are expected to point to at least as many 86 /// consecutive expressions as the given set has dimensions and symbols, 87 /// respectively. The new set will have `numResultDims` and `numResultSymbols` 88 /// dimensions and symbols, respectively. 89 MLIR_CAPI_EXPORTED MlirIntegerSet mlirIntegerSetReplaceGet( 90 MlirIntegerSet set, const MlirAffineExpr *dimReplacements, 91 const MlirAffineExpr *symbolReplacements, intptr_t numResultDims, 92 intptr_t numResultSymbols); 93 94 /// Checks whether the given set is a canonical empty set, e.g., the set 95 /// returned by mlirIntegerSetEmptyGet. 96 MLIR_CAPI_EXPORTED bool mlirIntegerSetIsCanonicalEmpty(MlirIntegerSet set); 97 98 /// Returns the number of dimensions in the given set. 99 MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumDims(MlirIntegerSet set); 100 101 /// Returns the number of symbols in the given set. 102 MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumSymbols(MlirIntegerSet set); 103 104 /// Returns the number of inputs (dimensions + symbols) in the given set. 105 MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumInputs(MlirIntegerSet set); 106 107 /// Returns the number of constraints (equalities + inequalities) in the given 108 /// set. 109 MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumConstraints(MlirIntegerSet set); 110 111 /// Returns the number of equalities in the given set. 112 MLIR_CAPI_EXPORTED intptr_t mlirIntegerSetGetNumEqualities(MlirIntegerSet set); 113 114 /// Returns the number of inequalities in the given set. 115 MLIR_CAPI_EXPORTED intptr_t 116 mlirIntegerSetGetNumInequalities(MlirIntegerSet set); 117 118 /// Returns `pos`-th constraint of the set. 119 MLIR_CAPI_EXPORTED MlirAffineExpr 120 mlirIntegerSetGetConstraint(MlirIntegerSet set, intptr_t pos); 121 122 /// Returns `true` of the `pos`-th constraint of the set is an equality 123 /// constraint, `false` otherwise. 124 MLIR_CAPI_EXPORTED bool mlirIntegerSetIsConstraintEq(MlirIntegerSet set, 125 intptr_t pos); 126 127 #ifdef __cplusplus 128 } 129 #endif 130 131 #endif // MLIR_C_INTEGERSET_H 132