18c867f78SGroverkss //===- Parser.h - Parser for Presburger library -----------------*- C++ -*-===//
28c867f78SGroverkss //
38c867f78SGroverkss // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48c867f78SGroverkss // See https://llvm.org/LICENSE.txt for license information.
58c867f78SGroverkss // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68c867f78SGroverkss //
78c867f78SGroverkss //===----------------------------------------------------------------------===//
88c867f78SGroverkss //
98c867f78SGroverkss // This file defines functions to parse strings into Presburger library
108c867f78SGroverkss // constructs.
118c867f78SGroverkss //
128c867f78SGroverkss //===----------------------------------------------------------------------===//
138c867f78SGroverkss
148c867f78SGroverkss #ifndef MLIR_UNITTESTS_ANALYSIS_PRESBURGER_PARSER_H
158c867f78SGroverkss #define MLIR_UNITTESTS_ANALYSIS_PRESBURGER_PARSER_H
168c867f78SGroverkss
178c867f78SGroverkss #include "mlir/Analysis/Presburger/IntegerRelation.h"
188c867f78SGroverkss #include "mlir/Analysis/Presburger/PWMAFunction.h"
198c867f78SGroverkss #include "mlir/Analysis/Presburger/PresburgerRelation.h"
208c867f78SGroverkss #include "mlir/AsmParser/AsmParser.h"
218c867f78SGroverkss #include "mlir/Dialect/Affine/Analysis/AffineStructures.h"
228c867f78SGroverkss #include "mlir/IR/AffineExpr.h"
238c867f78SGroverkss #include "mlir/IR/AffineMap.h"
248c867f78SGroverkss #include "mlir/IR/IntegerSet.h"
258c867f78SGroverkss
268c867f78SGroverkss namespace mlir {
278c867f78SGroverkss namespace presburger {
288c867f78SGroverkss
298c867f78SGroverkss /// Parses an IntegerPolyhedron from a StringRef. It is expected that the string
308c867f78SGroverkss /// represents a valid IntegerSet.
parseIntegerPolyhedron(StringRef str)318c867f78SGroverkss inline IntegerPolyhedron parseIntegerPolyhedron(StringRef str) {
328c867f78SGroverkss MLIRContext context(MLIRContext::Threading::DISABLED);
334c48f016SMatthias Springer return affine::FlatAffineValueConstraints(parseIntegerSet(str, &context));
348c867f78SGroverkss }
358c867f78SGroverkss
368c867f78SGroverkss /// Parse a list of StringRefs to IntegerRelation and combine them into a
378c867f78SGroverkss /// PresburgerSet by using the union operation. It is expected that the strings
388c867f78SGroverkss /// are all valid IntegerSet representation and that all of them have compatible
398c867f78SGroverkss /// spaces.
parsePresburgerSet(ArrayRef<StringRef> strs)408c867f78SGroverkss inline PresburgerSet parsePresburgerSet(ArrayRef<StringRef> strs) {
418c867f78SGroverkss assert(!strs.empty() && "strs should not be empty");
428c867f78SGroverkss
438c867f78SGroverkss IntegerPolyhedron initPoly = parseIntegerPolyhedron(strs[0]);
448c867f78SGroverkss PresburgerSet result(initPoly);
458c867f78SGroverkss for (unsigned i = 1, e = strs.size(); i < e; ++i)
468c867f78SGroverkss result.unionInPlace(parseIntegerPolyhedron(strs[i]));
478c867f78SGroverkss return result;
488c867f78SGroverkss }
498c867f78SGroverkss
parseMultiAffineFunction(StringRef str)508c867f78SGroverkss inline MultiAffineFunction parseMultiAffineFunction(StringRef str) {
518c867f78SGroverkss MLIRContext context(MLIRContext::Threading::DISABLED);
528c867f78SGroverkss
538c867f78SGroverkss // TODO: Add default constructor for MultiAffineFunction.
548c867f78SGroverkss MultiAffineFunction multiAff(PresburgerSpace::getRelationSpace(),
55*c1b99746SAbhinav271828 IntMatrix(0, 1));
568c867f78SGroverkss if (getMultiAffineFunctionFromMap(parseAffineMap(str, &context), multiAff)
578c867f78SGroverkss .failed())
588c867f78SGroverkss llvm_unreachable(
598c867f78SGroverkss "Failed to parse MultiAffineFunction because of semi-affinity");
608c867f78SGroverkss return multiAff;
618c867f78SGroverkss }
628c867f78SGroverkss
638c867f78SGroverkss inline PWMAFunction
parsePWMAF(ArrayRef<std::pair<StringRef,StringRef>> pieces)648c867f78SGroverkss parsePWMAF(ArrayRef<std::pair<StringRef, StringRef>> pieces) {
658c867f78SGroverkss assert(!pieces.empty() && "At least one piece should be present.");
668c867f78SGroverkss
678c867f78SGroverkss MLIRContext context(MLIRContext::Threading::DISABLED);
688c867f78SGroverkss
698c867f78SGroverkss IntegerPolyhedron initDomain = parseIntegerPolyhedron(pieces[0].first);
708c867f78SGroverkss MultiAffineFunction initMultiAff = parseMultiAffineFunction(pieces[0].second);
718c867f78SGroverkss
728c867f78SGroverkss PWMAFunction func(PresburgerSpace::getRelationSpace(
738c867f78SGroverkss initMultiAff.getNumDomainVars(), initMultiAff.getNumOutputs(),
748c867f78SGroverkss initMultiAff.getNumSymbolVars()));
758c867f78SGroverkss
768c867f78SGroverkss func.addPiece({PresburgerSet(initDomain), initMultiAff});
778c867f78SGroverkss for (unsigned i = 1, e = pieces.size(); i < e; ++i)
788c867f78SGroverkss func.addPiece({PresburgerSet(parseIntegerPolyhedron(pieces[i].first)),
798c867f78SGroverkss parseMultiAffineFunction(pieces[i].second)});
808c867f78SGroverkss return func;
818c867f78SGroverkss }
828c867f78SGroverkss
parseRelationFromSet(StringRef set,unsigned numDomain)83ccf194b8SBharathi Ramana Joshi inline IntegerRelation parseRelationFromSet(StringRef set, unsigned numDomain) {
84ccf194b8SBharathi Ramana Joshi IntegerRelation rel = parseIntegerPolyhedron(set);
85ccf194b8SBharathi Ramana Joshi
86ccf194b8SBharathi Ramana Joshi rel.convertVarKind(VarKind::SetDim, 0, numDomain, VarKind::Domain);
87ccf194b8SBharathi Ramana Joshi
88ccf194b8SBharathi Ramana Joshi return rel;
89ccf194b8SBharathi Ramana Joshi }
90ccf194b8SBharathi Ramana Joshi
91ccf194b8SBharathi Ramana Joshi inline PresburgerRelation
parsePresburgerRelationFromPresburgerSet(ArrayRef<StringRef> strs,unsigned numDomain)92ccf194b8SBharathi Ramana Joshi parsePresburgerRelationFromPresburgerSet(ArrayRef<StringRef> strs,
93ccf194b8SBharathi Ramana Joshi unsigned numDomain) {
94ccf194b8SBharathi Ramana Joshi assert(!strs.empty() && "strs should not be empty");
95ccf194b8SBharathi Ramana Joshi
96ccf194b8SBharathi Ramana Joshi IntegerRelation rel = parseIntegerPolyhedron(strs[0]);
97ccf194b8SBharathi Ramana Joshi PresburgerRelation result(rel);
98ccf194b8SBharathi Ramana Joshi for (unsigned i = 1, e = strs.size(); i < e; ++i)
99ccf194b8SBharathi Ramana Joshi result.unionInPlace(parseIntegerPolyhedron(strs[i]));
100ccf194b8SBharathi Ramana Joshi result.convertVarKind(VarKind::SetDim, 0, numDomain, VarKind::Domain, 0);
101ccf194b8SBharathi Ramana Joshi return result;
102ccf194b8SBharathi Ramana Joshi }
103ccf194b8SBharathi Ramana Joshi
1048c867f78SGroverkss } // namespace presburger
1058c867f78SGroverkss } // namespace mlir
1068c867f78SGroverkss
1078c867f78SGroverkss #endif // MLIR_UNITTESTS_ANALYSIS_PRESBURGER_PARSER_H
108