1 | //===- DimLvlMapParser.h - `DimLvlMap` parser -------------------*- C++ -*-===// |
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 | #ifndef MLIR_DIALECT_SPARSETENSOR_IR_DETAIL_DIMLVLMAPPARSER_H |
10 | #define MLIR_DIALECT_SPARSETENSOR_IR_DETAIL_DIMLVLMAPPARSER_H |
11 | |
12 | #include "DimLvlMap.h" |
13 | #include "LvlTypeParser.h" |
14 | |
15 | namespace mlir { |
16 | namespace sparse_tensor { |
17 | namespace ir_detail { |
18 | |
19 | /// |
20 | /// Parses the Sparse Tensor Encoding Attribute (STEA). |
21 | /// |
22 | /// General syntax is as follows, |
23 | /// |
24 | /// [s0, ...] // optional forward decl sym-vars |
25 | /// {l0, ...} // optional forward decl lvl-vars |
26 | /// ( |
27 | /// d0 = ..., // dim-var = dim-exp |
28 | /// ... |
29 | /// ) -> ( |
30 | /// l0 = ..., // lvl-var = lvl-exp |
31 | /// ... |
32 | /// ) |
33 | /// |
34 | /// with simplifications when variables are implicit. |
35 | /// |
36 | class DimLvlMapParser final { |
37 | public: |
38 | explicit DimLvlMapParser(AsmParser &parser) : parser(parser) {} |
39 | |
40 | // Parses the input for a sparse tensor dimension-level map |
41 | // and returns the map on success. |
42 | FailureOr<DimLvlMap> parseDimLvlMap(); |
43 | |
44 | private: |
45 | /// Client code should prefer using `parseVarUsage` |
46 | /// and `parseVarBinding` rather than calling this method directly. |
47 | OptionalParseResult parseVar(VarKind vk, bool isOptional, |
48 | Policy creationPolicy, VarInfo::ID &id, |
49 | bool &didCreate); |
50 | |
51 | /// Parses a variable occurence which is a *use* of that variable. |
52 | /// When a valid variable name is currently unused, if |
53 | /// `requireKnown=true`, an error is raised; if `requireKnown=false`, |
54 | /// a new unbound variable will be created. |
55 | FailureOr<VarInfo::ID> parseVarUsage(VarKind vk, bool requireKnown); |
56 | |
57 | /// Parses a variable occurence which is a *binding* of that variable. |
58 | /// The `requireKnown` parameter is for handling the binding of |
59 | /// forward-declared variables. |
60 | FailureOr<VarInfo::ID> parseVarBinding(VarKind vk, bool requireKnown = false); |
61 | |
62 | /// Parses an optional variable binding. When the next token is |
63 | /// not a valid variable name, this will bind a new unnamed variable. |
64 | /// The returned `bool` indicates whether a variable name was parsed. |
65 | FailureOr<std::pair<Var, bool>> |
66 | parseOptionalVarBinding(VarKind vk, bool requireKnown = false); |
67 | |
68 | /// Binds the given variable: both updating the `VarEnv` itself, and |
69 | /// the `{dims,lvls}AndSymbols` lists (which will be passed |
70 | /// to `AsmParser::parseAffineExpr`). This method is already called by the |
71 | /// `parseVarBinding`/`parseOptionalVarBinding` methods, therefore should |
72 | /// not need to be called elsewhere. |
73 | Var bindVar(llvm::SMLoc loc, VarInfo::ID id); |
74 | |
75 | ParseResult parseSymbolBindingList(); |
76 | ParseResult parseLvlVarBindingList(); |
77 | ParseResult parseDimSpec(); |
78 | ParseResult parseDimSpecList(); |
79 | FailureOr<LvlVar> parseLvlVarBinding(bool requireLvlVarBinding); |
80 | ParseResult parseLvlSpec(bool requireLvlVarBinding); |
81 | ParseResult parseLvlSpecList(); |
82 | |
83 | AsmParser &parser; |
84 | LvlTypeParser lvlTypeParser; |
85 | VarEnv env; |
86 | // The parser maintains the `{dims,lvls}AndSymbols` lists to avoid |
87 | // the O(n^2) cost of repeatedly constructing them inside of the |
88 | // `parse{Dim,Lvl}Spec` methods. |
89 | SmallVector<std::pair<StringRef, AffineExpr>, 4> dimsAndSymbols; |
90 | SmallVector<std::pair<StringRef, AffineExpr>, 4> lvlsAndSymbols; |
91 | SmallVector<DimSpec> dimSpecs; |
92 | SmallVector<LvlSpec> lvlSpecs; |
93 | }; |
94 | |
95 | } // namespace ir_detail |
96 | } // namespace sparse_tensor |
97 | } // namespace mlir |
98 | |
99 | #endif // MLIR_DIALECT_SPARSETENSOR_IR_DETAIL_DIMLVLMAPPARSER_H |
100 | |