xref: /llvm-project/mlir/unittests/Analysis/Presburger/Parser.h (revision c1b997464bb68ae37c9ed9b5594cb440c8a13382)
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