1+ #ifndef MLIR_C_PRESBURGER_H
2+ #define MLIR_C_PRESBURGER_H
3+ #include " mlir-c/AffineExpr.h"
4+ #include " mlir-c/Support.h"
5+ #include < vector>
6+
7+ #ifdef __cplusplus
8+ extern " C" {
9+ #endif
10+
11+ enum MlirPresburgerVariableKind {
12+ Symbol,
13+ Local,
14+ Domain,
15+ Range,
16+ SetDim = Range
17+ };
18+
19+ #define DEFINE_C_API_STRUCT (name, storage ) \
20+ struct name { \
21+ storage *ptr; \
22+ }; \
23+ typedef struct name name
24+ DEFINE_C_API_STRUCT (MlirPresburgerIntegerRelation, void );
25+ DEFINE_C_API_STRUCT (MlirPresburgerDynamicAPInt, const void );
26+ #undef DEFINE_C_API_STRUCT
27+
28+ // ===----------------------------------------------------------------------===//
29+ // IntegerRelation creation/destruction and basic metadata operations
30+ // ===----------------------------------------------------------------------===//
31+
32+ // / Constructs a relation reserving memory for the specified number
33+ // / of constraints and variables.
34+ MLIR_CAPI_EXPORTED MlirPresburgerIntegerRelation
35+ mlirPresburgerIntegerRelationCreate (unsigned numReservedInequalities,
36+ unsigned numReservedEqualities,
37+ unsigned numReservedCols);
38+
39+ // / Constructs an IntegerRelation from a packed 2D matrix of tableau
40+ // / coefficients in row-major order. The first `numDomainVars` columns are
41+ // / considered domain and the remaining `numRangeVars` columns are domain
42+ // / variables.
43+ MLIR_CAPI_EXPORTED MlirPresburgerIntegerRelation
44+ mlirPresburgerIntegerRelationCreateFromCoefficients (
45+ const int64_t *inequalityCoefficients, unsigned numInequalities,
46+ const int64_t *equalityCoefficients, unsigned numEqualities,
47+ unsigned numDomainVars, unsigned numRangeVars,
48+ unsigned numExtraReservedInequalities = 0 ,
49+ unsigned numExtraReservedEqualities = 0 , unsigned numExtraReservedCols = 0 );
50+
51+ // / Destroys an IntegerRelation.
52+ MLIR_CAPI_EXPORTED void
53+ mlirPresburgerIntegerRelationDestroy (MlirPresburgerIntegerRelation relation);
54+
55+ // ===----------------------------------------------------------------------===//
56+ // IntegerRelation binary operations
57+ // ===----------------------------------------------------------------------===//
58+
59+ MLIR_CAPI_EXPORTED void
60+ mlirPresburgerIntegerRelationAppend (MlirPresburgerIntegerRelation lhs,
61+ MlirPresburgerIntegerRelation rhs);
62+
63+ // / Return the intersection of the two relations.
64+ // / If there are locals, they will be merged.
65+ MLIR_CAPI_EXPORTED MlirPresburgerIntegerRelation
66+ mlirPresburgerIntegerRelationIntersect (MlirPresburgerIntegerRelation lhs,
67+ MlirPresburgerIntegerRelation rhs);
68+
69+ // / Return whether `lhs` and `rhs` are equal. This is integer-exact
70+ // / and somewhat expensive, since it uses the integer emptiness check
71+ // / (see IntegerRelation::findIntegerSample()).
72+ MLIR_CAPI_EXPORTED bool
73+ mlirPresburgerIntegerRelationIsEqual (MlirPresburgerIntegerRelation lhs,
74+ MlirPresburgerIntegerRelation rhs);
75+
76+ MLIR_CAPI_EXPORTED bool mlirPresburgerIntegerRelationIsObviouslyEqual (
77+ MlirPresburgerIntegerRelation lhs, MlirPresburgerIntegerRelation rhs);
78+
79+ MLIR_CAPI_EXPORTED bool
80+ mlirPresburgerIntegerRelationIsSubsetOf (MlirPresburgerIntegerRelation lhs,
81+ MlirPresburgerIntegerRelation rhs);
82+
83+ // ===----------------------------------------------------------------------===//
84+ // IntegerRelation Tableau Inspection
85+ // ===----------------------------------------------------------------------===//
86+
87+ // / Returns the value at the specified equality row and column.
88+ MLIR_CAPI_EXPORTED MlirPresburgerDynamicAPInt
89+ mlirPresburgerIntegerRelationAtEq (unsigned i, unsigned j);
90+
91+ // / The same, but casts to int64_t. This is unsafe and will assert-fail if the
92+ // / value does not fit in an int64_t.
93+ MLIR_CAPI_EXPORTED int64_t mlirPresburgerIntegerRelationAtEq64 (
94+ MlirPresburgerIntegerRelation relation, unsigned row, unsigned col);
95+
96+ // / Returns the value at the specified inequality row and column.
97+ MLIR_CAPI_EXPORTED MlirPresburgerDynamicAPInt
98+ mlirPresburgerIntegerRelationAtIneq (MlirPresburgerIntegerRelation relation,
99+ unsigned row, unsigned col);
100+
101+ MLIR_CAPI_EXPORTED int64_t mlirPresburgerIntegerRelationAtIneq64 (
102+ MlirPresburgerIntegerRelation relation, unsigned row, unsigned col);
103+
104+ // / Returns the number of inequalities and equalities.
105+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumConstraints (
106+ MlirPresburgerIntegerRelation relation);
107+
108+ // / Returns the number of columns classified as domain variables.
109+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumDomainVars (
110+ MlirPresburgerIntegerRelation relation);
111+
112+ // / Returns the number of columns classified as range variables.
113+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumRangeVars (
114+ MlirPresburgerIntegerRelation relation);
115+
116+ // / Returns the number of columns classified as symbol variables.
117+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumSymbolVars (
118+ MlirPresburgerIntegerRelation relation);
119+
120+ // / Returns the number of columns classified as local variables.
121+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumLocalVars (
122+ MlirPresburgerIntegerRelation relation);
123+
124+ MLIR_CAPI_EXPORTED unsigned
125+ mlirPresburgerIntegerRelationNumDimVars (MlirPresburgerIntegerRelation relation);
126+
127+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumDimAndSymbolVars (
128+ MlirPresburgerIntegerRelation relation);
129+
130+ MLIR_CAPI_EXPORTED unsigned
131+ mlirPresburgerIntegerRelationNumVars (MlirPresburgerIntegerRelation relation);
132+
133+ MLIR_CAPI_EXPORTED unsigned
134+ mlirPresburgerIntegerRelationNumCols (MlirPresburgerIntegerRelation relation);
135+
136+ // / Returns the number of equality constraints.
137+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumEqualities (
138+ MlirPresburgerIntegerRelation relation);
139+
140+ // / Returns the number of inequality constraints.
141+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumInequalities (
142+ MlirPresburgerIntegerRelation relation);
143+
144+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationNumReservedEqualities (
145+ MlirPresburgerIntegerRelation relation);
146+
147+ MLIR_CAPI_EXPORTED unsigned
148+ mlirPresburgerIntegerRelationNumReservedInequalities (
149+ MlirPresburgerIntegerRelation relation);
150+
151+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationGetNumVarKind (
152+ MlirPresburgerIntegerRelation relation, MlirPresburgerVariableKind kind);
153+
154+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationGetVarKindOffset (
155+ MlirPresburgerIntegerRelation relation, MlirPresburgerVariableKind kind);
156+
157+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationGetVarKindEnd (
158+ MlirPresburgerIntegerRelation relation, MlirPresburgerVariableKind kind);
159+
160+ MLIR_CAPI_EXPORTED unsigned mlirPresburgerIntegerRelationGetVarKindOverLap (
161+ MlirPresburgerIntegerRelation relation, MlirPresburgerVariableKind kind,
162+ unsigned varStart, unsigned varLimit);
163+
164+ // / Return the VarKind of the var at the specified position.
165+ MLIR_CAPI_EXPORTED MlirPresburgerVariableKind
166+ mlirPresburgerIntegerRelationGetVarKindAt (
167+ MlirPresburgerIntegerRelation relation, unsigned pos);
168+
169+ // ===----------------------------------------------------------------------===//
170+ // IntegerRelation Tableau Manipulation
171+ // ===----------------------------------------------------------------------===//
172+
173+ MLIR_CAPI_EXPORTED unsigned
174+ mlirPresburgerIntegerRelationInsertVar (MlirPresburgerIntegerRelation relation,
175+ MlirPresburgerVariableKind kind,
176+ unsigned pos, unsigned num = 1 );
177+
178+ MLIR_CAPI_EXPORTED unsigned
179+ mlirPresburgerIntegerRelationAppendVar (MlirPresburgerIntegerRelation relation,
180+ MlirPresburgerVariableKind kind,
181+ unsigned num = 1 );
182+
183+ // / Adds an equality with the given coefficients.
184+ MLIR_CAPI_EXPORTED void
185+ mlirPresburgerIntegerRelationAddEquality (MlirPresburgerIntegerRelation relation,
186+ const std::vector<int64_t > &eq);
187+
188+ // / Adds an inequality with the given coefficients.
189+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationAddInequality (
190+ MlirPresburgerIntegerRelation relation, const std::vector<int64_t > &inEq);
191+
192+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationEliminateRedundantLocalVar (
193+ MlirPresburgerIntegerRelation relation, unsigned posA, unsigned posB);
194+
195+ // / Removes variables of the specified kind with the specified pos (or
196+ // / within the specified range) from the system. The specified location is
197+ // / relative to the first variable of the specified kind.
198+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationRemoveVarKind (
199+ MlirPresburgerIntegerRelation relation, MlirPresburgerVariableKind kind,
200+ unsigned pos);
201+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationRemoveVarRangeKind (
202+ MlirPresburgerIntegerRelation relation, MlirPresburgerVariableKind kind,
203+ unsigned varStart, unsigned varLimit);
204+
205+ // / Removes the specified variable from the system.
206+ MLIR_CAPI_EXPORTED void
207+ mlirPresburgerIntegerRelationRemoveVar (MlirPresburgerIntegerRelation relation,
208+ unsigned pos);
209+
210+ // / Remove the (in)equalities at specified position.
211+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationRemoveEquality (
212+ MlirPresburgerIntegerRelation relation, unsigned pos);
213+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationRemoveInequality (
214+ MlirPresburgerIntegerRelation relation, unsigned pos);
215+
216+ // / Remove the (in)equalities at positions [start, end).
217+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationRemoveEqualityRange (
218+ MlirPresburgerIntegerRelation relation, unsigned start, unsigned end);
219+ MLIR_CAPI_EXPORTED void mlirPresburgerIntegerRelationRemoveInequalityRange (
220+ MlirPresburgerIntegerRelation relation, unsigned start, unsigned end);
221+
222+ // ===----------------------------------------------------------------------===//
223+ // IntegerRelation Dump
224+ // ===----------------------------------------------------------------------===//
225+ MLIR_CAPI_EXPORTED void
226+ mlirPresburgerIntegerRelationDump (MlirPresburgerIntegerRelation relation);
227+ #ifdef __cplusplus
228+ }
229+ #endif
230+ #endif // MLIR_C_PRESBURGER_H
0 commit comments