MLIR  19.0.0git
DimLvlMapParser.h
Go to the documentation of this file.
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.
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.
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.
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
This base class exposes generic asm parser hooks, usable across the various derived parsers.
This class provides support for representing a failure result, or a valid value of type T.
Definition: LogicalResult.h:78
This class implements Optional functionality for ParseResult.
Definition: OpDefinition.h:39
This class represents success/failure for parsing-like operations that find it important to chain tog...
Parses the Sparse Tensor Encoding Attribute (STEA).
ID
Newtype for unique identifiers of VarInfo records, to ensure they aren't confused with Var::Num.
Definition: Var.h:279
A concrete variable, to be used in our variant of AffineExpr.
Definition: Var.h:61
VarKind
The three kinds of variables that Var can be.
Definition: Var.h:32
Include the generated interface declarations.