tvm
Loading...
Searching...
No Matches
dataflow_pattern.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
24#ifndef TVM_RELAX_DATAFLOW_PATTERN_H_
25#define TVM_RELAX_DATAFLOW_PATTERN_H_
26
27#include <tvm/ffi/container/array.h>
28#include <tvm/ffi/optional.h>
29#include <tvm/ffi/reflection/registry.h>
30#include <tvm/ir/expr.h>
31#include <tvm/ir/with_context.h>
32#include <tvm/relax/expr.h>
33#include <tvm/relax/type.h>
34
35#include <cstdint>
36#include <functional>
37#include <map>
38#include <memory>
39#include <string>
40#include <tuple>
41#include <utility>
42#include <vector>
43
44namespace tvm {
45
46namespace sym {
47class AnalyzerObj;
48class Analyzer;
49} // namespace sym
50
51namespace relax {
52
53class PatternSeq;
54class CallPattern;
55class OrPattern;
56class AndPattern;
57class NotPattern;
58class ShapePattern;
59class TypePattern;
60class DataTypePattern;
61class AttrPattern;
62class SameShapeConstraint;
63
72TVM_DLL PatternSeq UsedBy(const PatternSeq& lhs, const PatternSeq& rhs, int index = -1);
74TVM_DLL PatternSeq operator^(const PatternSeq& lhs, const PatternSeq& rhs);
75
84TVM_DLL PatternSeq OnlyUsedBy(const PatternSeq& lhs, const PatternSeq& rhs, int index = -1);
86TVM_DLL PatternSeq operator>>(const PatternSeq& lhs, const PatternSeq& rhs);
87
92class DFPatternNode : public ffi::Object {
93 public:
94 static constexpr const uint32_t _type_child_slots = 21;
95 TVM_FFI_DECLARE_OBJECT_INFO("relax.dpl.DFPattern", DFPatternNode, ffi::Object);
96};
97
102class DFPattern : public ffi::ObjectRef {
103 public:
105 template <typename... Args>
106 CallPattern operator()(Args&&... args) const;
108 TVM_DLL CallPattern operator()(const std::vector<DFPattern>& args) const;
110 TVM_DLL OrPattern operator|(const DFPattern& other) const;
112 TVM_DLL AndPattern operator&(const DFPattern& other) const;
114 TVM_DLL NotPattern operator~() const;
116 TVM_DLL AttrPattern HasAttr(const ffi::Map<ffi::String, Any>& attrs) const;
118 TVM_DLL TypePattern HasType(const Type& ty) const;
120 TVM_DLL DataTypePattern HasDtype(DLDataType dtype) const;
122 TVM_DLL DataTypePattern HasDtype(const std::string& dtype) const;
124 TVM_DLL ShapePattern HasShape(const ffi::Array<PrimExpr>& shape) const;
126 TVM_DLL SameShapeConstraint HasSameShapeAs(const DFPattern& other) const;
128 TVM_DLL DFPattern dup() const;
129
131 TVM_DLL operator PatternSeq() const;
132
134};
135
137struct PairCons {
143 int index = -1;
151 TVM_DLL explicit PairCons(Type t, int index = -1) : type(t), index(index) {}
152
153 bool operator==(const PairCons& other) const {
154 return type == other.type && index == other.index;
155 }
156};
157
165class DFConstraintNode : public ffi::Object {
166 public:
168 virtual ffi::Array<DFPattern> GetDependentPatterns() const = 0;
169
197 virtual std::tuple<PrimExpr, bool> AsCondition(
198 std::function<ffi::Optional<Var>(const DFPatternNode*)> match_state) const = 0;
199
200 static constexpr const uint32_t _type_child_slots = 1;
201 TVM_FFI_DECLARE_OBJECT_INFO("relax.dpl.DFConstraint", DFConstraintNode, ffi::Object);
202};
203
204class DFConstraint : public ffi::ObjectRef {
205 public:
207};
208
213class PatternSeqNode final : public ffi::Object {
214 public:
215 tvm::ffi::Array<DFPattern> patterns;
216 std::vector<PairCons> pair_constraints;
218 static void RegisterReflection() {
219 namespace refl = tvm::ffi::reflection;
220 refl::ObjectDef<PatternSeqNode>().def_ro("patterns", &PatternSeqNode::patterns);
221 }
222 TVM_FFI_DECLARE_OBJECT_INFO("relax.dpl.PatternSeq", PatternSeqNode, ffi::Object);
223};
224
229class PatternSeq final : public ffi::ObjectRef {
230 public:
231 TVM_DLL explicit PatternSeq(DFPattern init_pattern);
232 TVM_DLL explicit PatternSeq(tvm::ffi::Array<DFPattern> patterns, bool only_used_by = false);
233
234 PatternSeq UsedBy(PatternSeq other, int index = -1) const;
235 PatternSeq OnlyUsedBy(PatternSeq other, int index = -1) const;
236
239
240 // friend functions
241 friend PatternSeq UsedBy(const PatternSeq& lhs, const PatternSeq& rhs, int index);
242 friend PatternSeq OnlyUsedBy(const PatternSeq& lhs, const PatternSeq& rhs, int index);
243
245};
246
251class PatternContextObj : public ffi::Object {
252 public:
258
259 // src node -> <dst node, constraint type> constraints.
260 // Dst nodes are kept in a vector to keep them ordered.
261 std::map<DFPattern, std::vector<std::pair<DFPattern, std::vector<PairCons>>>> edge_constraints;
262
263 // Underlying DFPattern nodes which the edge constraints may reference
264 // Kept as a separate vector of patterns to process constraints in a fixed order.
265 std::vector<DFPattern> src_ordered;
266
267 // Non-edge constraints
268 std::vector<DFConstraint> validation_constraints;
269 TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.PatternContext", PatternContextObj, ffi::Object);
270};
271
276class PatternContext : public ffi::ObjectRef {
277 public:
278 explicit PatternContext(ffi::UnsafeInit tag) : ffi::ObjectRef(tag) {}
279 static constexpr bool _type_is_nullable = false;
280 TVM_DLL explicit PatternContext(bool incremental = false);
281
283 TVM_FFI_ICHECK(get() != nullptr);
284 return static_cast<const PatternContextObj*>(get());
285 }
286
288 TVM_FFI_ICHECK(get() != nullptr);
289 return static_cast<PatternContextObj*>(get_mutable());
290 }
291
299 void add_constraint(DFPattern producer, DFPattern consumer, PairCons cons) {
300 auto& pairs = (*this)->edge_constraints[producer];
301 auto it = std::find_if(pairs.begin(), pairs.end(),
302 [consumer](auto p) { return p.first == consumer; });
303 if (it == pairs.end()) {
304 pairs.emplace_back(consumer, std::vector{cons});
305 } else {
306 auto& vec = it->second;
307 TVM_FFI_ICHECK(std::find(vec.cbegin(), vec.cend(), cons) == vec.cend())
308 << "Constraint already exists";
309 vec.push_back(cons);
310 }
311
312 auto& patterns = (*this)->src_ordered;
313 if (std::find(patterns.begin(), patterns.end(), producer) == patterns.end()) {
314 patterns.push_back(producer);
315 }
316 }
317
323 void add_constraint(DFConstraint constraint) {
324 (*this)->validation_constraints.push_back(constraint);
325 }
326
328 TVM_DLL static ffi::Optional<PatternContext> Current();
329
331 TVM_DLL void EnterWithScope() const;
333 TVM_DLL void ExitWithScope() const;
334
335 private:
336 friend class With<PatternContext>;
337};
338
344 public:
345 explicit ExprPatternNode(Expr expr) : expr(std::move(expr)) {}
346 explicit ExprPatternNode(ffi::UnsafeInit) : expr(ffi::UnsafeInit{}) {}
347
350 static void RegisterReflection() {
351 namespace refl = tvm::ffi::reflection;
352 refl::ObjectDef<ExprPatternNode>().def_ro("expr", &ExprPatternNode::expr);
353 }
355};
356
366
373 public:
374 ffi::String name;
375 const ffi::String& name_hint() const { return name; }
376
377 static void RegisterReflection() {
378 namespace refl = tvm::ffi::reflection;
379 refl::ObjectDef<VarPatternNode>().def_ro("name", &VarPatternNode::name);
380 }
381
382 static constexpr const uint32_t _type_child_slots = 1;
384};
385
400
406 public:
407 static void RegisterReflection() {
408 namespace refl = tvm::ffi::reflection;
409 refl::ObjectDef<DataflowVarPatternNode>();
410 }
413};
414
426
432 public:
435};
436
446
452 public:
453 static void RegisterReflection() {
454 namespace refl = tvm::ffi::reflection;
455 refl::ObjectDef<ConstantPatternNode>();
456 }
459};
460
466 public:
467 explicit ConstantPattern(ffi::UnsafeInit tag, ffi::ObjectPtr<ConstantPatternNode> n)
468 : DFPattern(tag) {
469 data_ = std::move(n);
470 }
472};
473
479 public:
480 explicit CallPatternNode(DFPattern op) : op(std::move(op)) {}
481 explicit CallPatternNode(ffi::UnsafeInit) : op(ffi::UnsafeInit{}) {}
482
489 tvm::ffi::Array<DFPattern> args;
498 // Todo(relax-team): Dataflow pattern for Type, and match ty_args
499
500 static void RegisterReflection() {
501 namespace refl = tvm::ffi::reflection;
502 refl::ObjectDef<CallPatternNode>()
503 .def_ro("op", &CallPatternNode::op)
504 .def_ro("args", &CallPatternNode::args);
505 }
507};
508
509class CallPattern : public DFPattern {
510 public:
511 TVM_DLL CallPattern(DFPattern op, ffi::Array<DFPattern> args, bool varg_default_wildcard = false);
513};
514
521 public:
522 ffi::Array<PrimExpr> fields;
524 static void RegisterReflection() {
525 namespace refl = tvm::ffi::reflection;
526 refl::ObjectDef<PrimArrPatternNode>().def_ro("fields", &PrimArrPatternNode::fields);
527 }
529};
530
540
547 public:
548 explicit FunctionPatternNode(DFPattern body) : body(std::move(body)) {}
549 explicit FunctionPatternNode(ffi::UnsafeInit) : body(ffi::UnsafeInit{}) {}
550
551 tvm::ffi::Array<DFPattern> params;
560 static void RegisterReflection() {
561 namespace refl = tvm::ffi::reflection;
562 refl::ObjectDef<FunctionPatternNode>()
563 .def_ro("params", &FunctionPatternNode::params)
564 .def_ro("body", &FunctionPatternNode::body);
565 }
568};
569
575 public:
581 TVM_DLL FunctionPattern(tvm::ffi::Array<DFPattern> params, DFPattern body);
582
584};
585
591 public:
592 tvm::ffi::Array<DFPattern> fields;
594 static void RegisterReflection() {
595 namespace refl = tvm::ffi::reflection;
596 refl::ObjectDef<TuplePatternNode>().def_ro("fields", &TuplePatternNode::fields);
597 }
599};
600
605class TuplePattern : public DFPattern {
606 public:
607 TVM_DLL explicit TuplePattern(tvm::ffi::Array<DFPattern> fields);
609};
610
616 public:
617 tvm::ffi::Array<DFPattern> fields;
619 static void RegisterReflection() {
620 namespace refl = tvm::ffi::reflection;
621 refl::ObjectDef<UnorderedTuplePatternNode>().def_ro("fields",
623 }
626};
627
638
645 public:
647 explicit TupleGetItemPatternNode(ffi::UnsafeInit) : tuple(ffi::UnsafeInit{}) {}
648
650 int index;
652 static void RegisterReflection() {
653 namespace refl = tvm::ffi::reflection;
654 refl::ObjectDef<TupleGetItemPatternNode>()
655 .def_ro("tuple", &TupleGetItemPatternNode::tuple)
656 .def_ro("index", &TupleGetItemPatternNode::index);
657 }
660};
661
672
678 public:
680 : left(std::move(left)), right(std::move(right)) {}
681 explicit AndPatternNode(ffi::UnsafeInit) : left(ffi::UnsafeInit{}), right(ffi::UnsafeInit{}) {}
682
686 static void RegisterReflection() {
687 namespace refl = tvm::ffi::reflection;
688 refl::ObjectDef<AndPatternNode>()
689 .def_ro("left", &AndPatternNode::left)
690 .def_ro("right", &AndPatternNode::right);
691 }
693};
694
704
710 public:
712 : left(std::move(left)), right(std::move(right)) {}
713 explicit OrPatternNode(ffi::UnsafeInit) : left(ffi::UnsafeInit{}), right(ffi::UnsafeInit{}) {}
714
718 static void RegisterReflection() {
719 namespace refl = tvm::ffi::reflection;
720 refl::ObjectDef<OrPatternNode>()
721 .def_ro("left", &OrPatternNode::left)
722 .def_ro("right", &OrPatternNode::right);
723 }
725};
726
736
742 public:
743 explicit NotPatternNode(DFPattern reject) : reject(std::move(reject)) {}
744 explicit NotPatternNode(ffi::UnsafeInit) : reject(ffi::UnsafeInit{}) {}
745
748 static void RegisterReflection() {
749 namespace refl = tvm::ffi::reflection;
750 refl::ObjectDef<NotPatternNode>().def_ro("reject", &NotPatternNode::reject);
751 }
753};
754
764
770 public:
771 static void RegisterReflection() {
772 namespace refl = tvm::ffi::reflection;
773 refl::ObjectDef<WildcardPatternNode>();
774 }
777};
778
784 public:
786 explicit WildcardPattern(ffi::ObjectPtr<WildcardPatternNode> data)
787 : DFPattern(ffi::UnsafeInit{}) {
788 TVM_FFI_ICHECK(data != nullptr);
789 data_ = std::move(data);
790 }
791
792 // Declaring WildcardPattern declared as non-nullable avoids the
793 // default zero-parameter constructor for ffi::ObjectRef with `data_ =
794 // nullptr`. This allows a zero-parameter constructor to be
795 // declared here, to create a valid wildcard instance.
796
798};
799
805 public:
807 explicit TypePatternNode(ffi::UnsafeInit) : pattern(ffi::UnsafeInit{}) {}
808
812 static void RegisterReflection() {
813 namespace refl = tvm::ffi::reflection;
814 refl::ObjectDef<TypePatternNode>()
815 .def_ro("pattern", &TypePatternNode::pattern)
816 .def_ro("ty", &TypePatternNode::ty);
817 }
819};
820
826
832 public:
834 explicit ShapePatternNode(ffi::UnsafeInit) : pattern(ffi::UnsafeInit{}) {}
835
837 ffi::Array<PrimExpr> shape;
839 static void RegisterReflection() {
840 namespace refl = tvm::ffi::reflection;
841 refl::ObjectDef<ShapePatternNode>()
842 .def_ro("pattern", &ShapePatternNode::pattern)
843 .def_ro("shape", &ShapePatternNode::shape);
844 }
846};
847
852class ShapePattern : public DFPattern {
853 public:
854 TVM_DLL ShapePattern(DFPattern pattern, ffi::Array<PrimExpr> type);
856};
857
863 public:
864 ffi::Array<DFPattern> args;
866 ffi::Array<DFPattern> GetDependentPatterns() const override { return args; }
867
868 std::tuple<PrimExpr, bool> AsCondition(
869 std::function<ffi::Optional<Var>(const DFPatternNode*)> match_state) const override;
870
871 static void RegisterReflection() {
872 namespace refl = tvm::ffi::reflection;
873 refl::ObjectDef<SameShapeConstraintNode>().def_ro("args", &SameShapeConstraintNode::args);
874 }
877};
878
889
895 public:
897 explicit DataTypePatternNode(ffi::UnsafeInit) : pattern(ffi::UnsafeInit{}) {}
898
900 DLDataType dtype;
902 static void RegisterReflection() {
903 namespace refl = tvm::ffi::reflection;
904 refl::ObjectDef<DataTypePatternNode>()
905 .def_ro("pattern", &DataTypePatternNode::pattern)
906 .def_ro("dtype", &DataTypePatternNode::dtype);
907 }
910};
911
921
927 public:
929 explicit AttrPatternNode(ffi::UnsafeInit) : pattern(ffi::UnsafeInit{}) {}
930
934 static void RegisterReflection() {
935 namespace refl = tvm::ffi::reflection;
936 refl::ObjectDef<AttrPatternNode>()
937 .def_ro("pattern", &AttrPatternNode::pattern)
938 .def_ro("attrs", &AttrPatternNode::attrs);
939 }
941};
942
952
959 public:
960 ffi::String global_symbol_;
963 const ffi::String& global_symbol() const { return global_symbol_; }
964
965 static void RegisterReflection() {
966 namespace refl = tvm::ffi::reflection;
967 refl::ObjectDef<ExternFuncPatternNode>().def_ro("global_symbol",
969 }
972};
973
984
986VarPattern IsVar(const ffi::String& name);
994ExprPattern IsOp(const ffi::String& op_name);
996// Todo(relax-team): Dataflow pattern for Type, and match out_ty
997CallPattern IsCallTIR(const ffi::String& name, ffi::Optional<TuplePattern> args = std::nullopt);
999CallPattern IsCallTIR(const ffi::String& name, TuplePattern var_args);
1001CallPattern IsCallDPSPacked(const ffi::String& name,
1002 ffi::Optional<TuplePattern> args = std::nullopt);
1004CallPattern IsCallDPSPacked(const ffi::String& name, TuplePattern var_args);
1006DFPattern IsTuple(const ffi::Array<DFPattern>& fields, bool unordered = false);
1008TupleGetItemPattern IsTupleGetItem(const DFPattern tuple, int index = -1);
1009
1011template <typename... Args>
1012CallPattern DFPattern::operator()(Args&&... args) const {
1013 return CallPattern(ffi::GetRef<DFPattern>(this->get()),
1014 ffi::Array<DFPattern>({std::forward<Args>(args)...}));
1015}
1016
1017} // namespace relax
1018} // namespace tvm
1019#endif // TVM_RELAX_DATAFLOW_PATTERN_H_
Managed reference to DictAttrsNode.
Definition attrs.h:108
Managed reference to ExprNode.
Definition base_expr.h:359
Managed reference to TypeNode.
Definition base_expr.h:80
static TVM_TIRX_DLL Type Missing()
Construct a MissingType for type information not yet populated.
RAII wrapper function to enter and exit a context object similar to python's with syntax.
Definition with_context.h:59
Match a conjunction of other patterns.
Definition dataflow_pattern.h:677
DFPattern left
Definition dataflow_pattern.h:683
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.AndPattern", AndPatternNode, DFPatternNode)
DFPattern right
Definition dataflow_pattern.h:684
static void RegisterReflection()
Definition dataflow_pattern.h:686
AndPatternNode(DFPattern left, DFPattern right)
Definition dataflow_pattern.h:679
AndPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:681
Managed reference to AndPatternNode.
Definition dataflow_pattern.h:699
AndPattern(DFPattern lhs, DFPattern rhs)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(AndPattern, DFPattern, AndPatternNode)
A pattern that asserting a root pattern has certain attributes.
Definition dataflow_pattern.h:926
DictAttrs attrs
Definition dataflow_pattern.h:932
DFPattern pattern
Definition dataflow_pattern.h:931
static void RegisterReflection()
Definition dataflow_pattern.h:934
AttrPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:929
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.AttrPattern", AttrPatternNode, DFPatternNode)
AttrPatternNode(DFPattern pattern)
Definition dataflow_pattern.h:928
Managed reference to AttrPatternNode.
Definition dataflow_pattern.h:947
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(AttrPattern, DFPattern, AttrPatternNode)
AttrPattern(DFPattern pattern, DictAttrs attrs)
A pattern to match a callable node in Relax.
Definition dataflow_pattern.h:478
bool varg_default_wildcard
Definition dataflow_pattern.h:496
static void RegisterReflection()
Definition dataflow_pattern.h:500
tvm::ffi::Array< DFPattern > args
Definition dataflow_pattern.h:489
CallPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:481
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.CallPattern", CallPatternNode, DFPatternNode)
CallPatternNode(DFPattern op)
Definition dataflow_pattern.h:480
DFPattern op
Definition dataflow_pattern.h:488
Definition dataflow_pattern.h:509
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(CallPattern, DFPattern, CallPatternNode)
CallPattern(DFPattern op, ffi::Array< DFPattern > args, bool varg_default_wildcard=false)
A Pattern to Match a Relax GenericConst.
Definition dataflow_pattern.h:451
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.ConstantPattern", ConstantPatternNode, DFPatternNode)
static void RegisterReflection()
Definition dataflow_pattern.h:453
Managed reference to a ConstantPattern.
Definition dataflow_pattern.h:465
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(ConstantPattern, DFPattern, ConstantPatternNode)
ConstantPattern(ffi::UnsafeInit tag, ffi::ObjectPtr< ConstantPatternNode > n)
Definition dataflow_pattern.h:467
Additional constraints on the graph.
Definition dataflow_pattern.h:165
virtual ffi::Array< DFPattern > GetDependentPatterns() const =0
Return the patterns on which the constraint depends.
virtual std::tuple< PrimExpr, bool > AsCondition(std::function< ffi::Optional< Var >(const DFPatternNode *)> match_state) const =0
Convert the constraint to a PrimExpr.
TVM_FFI_DECLARE_OBJECT_INFO("relax.dpl.DFConstraint", DFConstraintNode, ffi::Object)
static constexpr const uint32_t _type_child_slots
Definition dataflow_pattern.h:200
Definition dataflow_pattern.h:204
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(DFConstraint, ffi::ObjectRef, DFConstraintNode)
Base type of all dataflow patterns.
Definition dataflow_pattern.h:92
static constexpr const uint32_t _type_child_slots
Definition dataflow_pattern.h:94
TVM_FFI_DECLARE_OBJECT_INFO("relax.dpl.DFPattern", DFPatternNode, ffi::Object)
Managed reference to dataflow patterns.
Definition dataflow_pattern.h:102
CallPattern operator()(const std::vector< DFPattern > &args) const
Syntatic Sugar for creating a CallPattern.
SameShapeConstraint HasSameShapeAs(const DFPattern &other) const
Syntatic Sugar for creating a ShapePattern.
OrPattern operator|(const DFPattern &other) const
Syntatic Sugar for creating an OrPattern.
CallPattern operator()(Args &&... args) const
Syntatic Sugar for creating a CallPattern.
Definition dataflow_pattern.h:1012
TypePattern HasType(const Type &ty) const
Syntatic Sugar for creating a TypePattern.
AttrPattern HasAttr(const ffi::Map< ffi::String, Any > &attrs) const
Syntatic Sugar for creating an AttrPattern.
ShapePattern HasShape(const ffi::Array< PrimExpr > &shape) const
Syntatic Sugar for creating a ShapePattern.
AndPattern operator&(const DFPattern &other) const
Syntatic Sugar for creating an AndPattern.
DFPattern dup() const
Syntatic Sugar for duplicating the current pattern.
NotPattern operator~() const
Syntatic Sugar for creating a NotPattern.
DataTypePattern HasDtype(const std::string &dtype) const
Syntatic Sugar for creating a DataTypePattern with a data type's name.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(DFPattern, ffi::ObjectRef, DFPatternNode)
DataTypePattern HasDtype(DLDataType dtype) const
Syntatic Sugar for creating a DataTypePattern with a dtype.
A pattern that asserting a root pattern has a certain data type.
Definition dataflow_pattern.h:894
DFPattern pattern
Definition dataflow_pattern.h:899
DLDataType dtype
Definition dataflow_pattern.h:900
DataTypePatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:897
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.DataTypePattern", DataTypePatternNode, DFPatternNode)
static void RegisterReflection()
Definition dataflow_pattern.h:902
DataTypePatternNode(DFPattern pattern)
Definition dataflow_pattern.h:896
Managed reference to DataTypePatternNode.
Definition dataflow_pattern.h:916
DataTypePattern(DFPattern pattern, DLDataType dtype)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(DataTypePattern, DFPattern, DataTypePatternNode)
A Pattern to Match a Relax Dataflow Variable.
Definition dataflow_pattern.h:405
static void RegisterReflection()
Definition dataflow_pattern.h:407
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.DataflowVarPattern", DataflowVarPatternNode, VarPatternNode)
Managed reference to a DataflowVarPattern.
Definition dataflow_pattern.h:419
DataflowVarPattern(ffi::String name_hint)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(DataflowVarPattern, DFPattern, DataflowVarPatternNode)
Pattern for Relax Expression.
Definition dataflow_pattern.h:343
ExprPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:346
Expr expr
Definition dataflow_pattern.h:348
ExprPatternNode(Expr expr)
Definition dataflow_pattern.h:345
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.ExprPattern", ExprPatternNode, DFPatternNode)
static void RegisterReflection()
Definition dataflow_pattern.h:350
Managed reference to an ExprPattern.
Definition dataflow_pattern.h:361
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(ExprPattern, DFPattern, ExprPatternNode)
A pattern of external function.
Definition dataflow_pattern.h:958
static void RegisterReflection()
Definition dataflow_pattern.h:965
ffi::String global_symbol_
Definition dataflow_pattern.h:960
const ffi::String & global_symbol() const
The external function name.
Definition dataflow_pattern.h:963
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.ExternFuncPattern", ExternFuncPatternNode, DFPatternNode)
Managed reference to ExternFuncPatternNode.
Definition dataflow_pattern.h:978
ExternFuncPattern(ffi::String global_symbol)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(ExternFuncPattern, DFPattern, ExternFuncPatternNode)
A pattern to match a Relax Function.
Definition dataflow_pattern.h:546
static void RegisterReflection()
Definition dataflow_pattern.h:560
FunctionPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:549
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.FunctionPattern", FunctionPatternNode, DFPatternNode)
FunctionPatternNode(DFPattern body)
Definition dataflow_pattern.h:548
DFPattern body
Definition dataflow_pattern.h:558
tvm::ffi::Array< DFPattern > params
Definition dataflow_pattern.h:551
Managed reference to FunctionPatternNode.
Definition dataflow_pattern.h:574
FunctionPattern(tvm::ffi::Array< DFPattern > params, DFPattern body)
Constructor.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(FunctionPattern, DFPattern, FunctionPatternNode)
A Pattern to Match a Relax Global Variable.
Definition dataflow_pattern.h:431
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.GlobalVarPattern", GlobalVarPatternNode, DFPatternNode)
Managed reference to a GlobalVarPattern.
Definition dataflow_pattern.h:441
GlobalVarPattern(ffi::String name_hint)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(GlobalVarPattern, DFPattern, GlobalVarPatternNode)
Pattern for rejecting a certain pattern.
Definition dataflow_pattern.h:741
DFPattern reject
Definition dataflow_pattern.h:746
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.NotPattern", NotPatternNode, DFPatternNode)
static void RegisterReflection()
Definition dataflow_pattern.h:748
NotPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:744
NotPatternNode(DFPattern reject)
Definition dataflow_pattern.h:743
Managed reference to NotPatternNode.
Definition dataflow_pattern.h:759
NotPattern(DFPattern reject)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(NotPattern, DFPattern, NotPatternNode)
Match a disjunction of other patterns.
Definition dataflow_pattern.h:709
DFPattern left
Definition dataflow_pattern.h:715
DFPattern right
Definition dataflow_pattern.h:716
OrPatternNode(DFPattern left, DFPattern right)
Definition dataflow_pattern.h:711
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.OrPattern", OrPatternNode, DFPatternNode)
static void RegisterReflection()
Definition dataflow_pattern.h:718
OrPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:713
Managed reference to OrPatternNode.
Definition dataflow_pattern.h:731
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(OrPattern, DFPattern, OrPatternNode)
OrPattern(DFPattern left, DFPattern right)
A context to manage the graph-level pattern matching.
Definition dataflow_pattern.h:251
std::vector< DFPattern > src_ordered
Definition dataflow_pattern.h:265
ExternUse
Constrainting matched graph with assertion to external uses.
Definition dataflow_pattern.h:254
@ kMay
Definition dataflow_pattern.h:255
@ kMustNot
Definition dataflow_pattern.h:256
enum tvm::relax::PatternContextObj::ExternUse allow_extern_use
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.PatternContext", PatternContextObj, ffi::Object)
std::map< DFPattern, std::vector< std::pair< DFPattern, std::vector< PairCons > > > > edge_constraints
Definition dataflow_pattern.h:261
std::vector< DFConstraint > validation_constraints
Definition dataflow_pattern.h:268
Managed reference to a pattern context.
Definition dataflow_pattern.h:276
void add_constraint(DFConstraint constraint)
Add a validation constraint.
Definition dataflow_pattern.h:323
void ExitWithScope() const
The RAII-like exit of a constraint context scope.
static ffi::Optional< PatternContext > Current()
Get the constraint context object on the top of the stack.
void add_constraint(DFPattern producer, DFPattern consumer, PairCons cons)
Build an edge constraint between two patterns (producer and consumer).
Definition dataflow_pattern.h:299
PatternContextObj * operator->()
Definition dataflow_pattern.h:287
const PatternContextObj * operator->() const
Definition dataflow_pattern.h:282
PatternContext(bool incremental=false)
static constexpr bool _type_is_nullable
Definition dataflow_pattern.h:279
PatternContext(ffi::UnsafeInit tag)
Definition dataflow_pattern.h:278
void EnterWithScope() const
The RAII-like entry of a constraint context scope.
A sequence of DFPatterns that the previous DFPattern is connected to the next one.
Definition dataflow_pattern.h:213
static void RegisterReflection()
Definition dataflow_pattern.h:218
TVM_FFI_DECLARE_OBJECT_INFO("relax.dpl.PatternSeq", PatternSeqNode, ffi::Object)
std::vector< PairCons > pair_constraints
Definition dataflow_pattern.h:216
tvm::ffi::Array< DFPattern > patterns
Definition dataflow_pattern.h:215
Managed reference to pattern sequences.
Definition dataflow_pattern.h:229
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(PatternSeq, ffi::ObjectRef, PatternSeqNode)
PatternSeq OnlyUsedBy(PatternSeq other, int index=-1) const
PatternSeq UsedBy(PatternSeq other, int index=-1) const
PatternSeq(tvm::ffi::Array< DFPattern > patterns, bool only_used_by=false)
friend PatternSeq UsedBy(const PatternSeq &lhs, const PatternSeq &rhs, int index)
Create used-by relationship between lhs[-1] and rhs[0], with [*lhs, *rhs] returned.
PatternSeq(DFPattern init_pattern)
friend PatternSeq OnlyUsedBy(const PatternSeq &lhs, const PatternSeq &rhs, int index)
Create only-used-by relationship between lhs[-1] and rhs[0], with [*lhs, *rhs] returned.
PatternSeq dup() const
Syntatic Sugar for duplicating the current pattern sequence.
A pattern to match an array of PrimExpr.
Definition dataflow_pattern.h:520
ffi::Array< PrimExpr > fields
Definition dataflow_pattern.h:522
static void RegisterReflection()
Definition dataflow_pattern.h:524
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.PrimArrPattern", PrimArrPatternNode, DFPatternNode)
Managed reference to a PrimArrPattern.
Definition dataflow_pattern.h:535
PrimArrPattern(ffi::Array< PrimExpr > arr)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(PrimArrPattern, DFPattern, PrimArrPatternNode)
A pattern that asserting multiple root patterns have the same shape.
Definition dataflow_pattern.h:862
std::tuple< PrimExpr, bool > AsCondition(std::function< ffi::Optional< Var >(const DFPatternNode *)> match_state) const override
Convert the constraint to a PrimExpr.
ffi::Array< DFPattern > GetDependentPatterns() const override
Return the patterns on which the constraint depends.
Definition dataflow_pattern.h:866
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.SameShapeConstraint", SameShapeConstraintNode, DFConstraintNode)
static void RegisterReflection()
Definition dataflow_pattern.h:871
ffi::Array< DFPattern > args
Definition dataflow_pattern.h:864
Managed reference to SameShapePatternNode.
Definition dataflow_pattern.h:883
SameShapeConstraint(ffi::Array< DFPattern > args)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(SameShapeConstraint, DFConstraint, SameShapeConstraintNode)
A pattern that asserting a root pattern has a certain shape.
Definition dataflow_pattern.h:831
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.ShapePattern", ShapePatternNode, DFPatternNode)
ShapePatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:834
ffi::Array< PrimExpr > shape
Definition dataflow_pattern.h:837
DFPattern pattern
Definition dataflow_pattern.h:836
ShapePatternNode(DFPattern pattern)
Definition dataflow_pattern.h:833
static void RegisterReflection()
Definition dataflow_pattern.h:839
Managed reference to ShapePatternNode.
Definition dataflow_pattern.h:852
ShapePattern(DFPattern pattern, ffi::Array< PrimExpr > type)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(ShapePattern, DFPattern, ShapePatternNode)
A pattern to match n'th indexing to a tuple.
Definition dataflow_pattern.h:644
TupleGetItemPatternNode(DFPattern tuple)
Definition dataflow_pattern.h:646
static void RegisterReflection()
Definition dataflow_pattern.h:652
DFPattern tuple
Definition dataflow_pattern.h:649
TupleGetItemPatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:647
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.TupleGetItemPattern", TupleGetItemPatternNode, DFPatternNode)
int index
Definition dataflow_pattern.h:650
Managed reference to TupleGetItemPatternNode.
Definition dataflow_pattern.h:666
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(TupleGetItemPattern, DFPattern, TupleGetItemPatternNode)
TupleGetItemPattern(DFPattern tuple, int index)
Pattern to match a tuple of ordered expressions.
Definition dataflow_pattern.h:590
tvm::ffi::Array< DFPattern > fields
Definition dataflow_pattern.h:592
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.TuplePattern", TuplePatternNode, DFPatternNode)
static void RegisterReflection()
Definition dataflow_pattern.h:594
Managed reference to TuplePatternNode.
Definition dataflow_pattern.h:605
TuplePattern(tvm::ffi::Array< DFPattern > fields)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(TuplePattern, DFPattern, TuplePatternNode)
Pattern for matching a certain type.
Definition dataflow_pattern.h:804
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.TypePattern", TypePatternNode, DFPatternNode)
TypePatternNode(ffi::UnsafeInit)
Definition dataflow_pattern.h:807
Type ty
Definition dataflow_pattern.h:810
DFPattern pattern
Definition dataflow_pattern.h:809
TypePatternNode(DFPattern pattern)
Definition dataflow_pattern.h:806
static void RegisterReflection()
Definition dataflow_pattern.h:812
Definition dataflow_pattern.h:821
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(TypePattern, DFPattern, TypePatternNode)
TypePattern(DFPattern pattern, Type ty)
A pattern to match multiple expressions unorderedly.
Definition dataflow_pattern.h:615
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.UnorderedTuplePattern", UnorderedTuplePatternNode, DFPatternNode)
tvm::ffi::Array< DFPattern > fields
Definition dataflow_pattern.h:617
static void RegisterReflection()
Definition dataflow_pattern.h:619
Managed reference to UnorderedTuplePatternNode.
Definition dataflow_pattern.h:632
UnorderedTuplePattern(tvm::ffi::Array< DFPattern > fields)
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(UnorderedTuplePattern, DFPattern, UnorderedTuplePatternNode)
A Pattern to Match a Relax Variable.
Definition dataflow_pattern.h:372
static constexpr const uint32_t _type_child_slots
Definition dataflow_pattern.h:382
const ffi::String & name_hint() const
Definition dataflow_pattern.h:375
ffi::String name
Definition dataflow_pattern.h:374
TVM_FFI_DECLARE_OBJECT_INFO("relax.dpl.VarPattern", VarPatternNode, DFPatternNode)
static void RegisterReflection()
Definition dataflow_pattern.h:377
Managed reference to a VarPattern.
Definition dataflow_pattern.h:390
VarPattern(ffi::String name_hint)
Create a pattern matching by variable name.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(VarPattern, DFPattern, VarPatternNode)
Wildcard Pattern is a pattern that can match anything.
Definition dataflow_pattern.h:769
static void RegisterReflection()
Definition dataflow_pattern.h:771
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("relax.dpl.WildcardPattern", WildcardPatternNode, DFPatternNode)
Managed reference to WildcardPatternNode.
Definition dataflow_pattern.h:783
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(WildcardPattern, DFPattern, WildcardPatternNode)
WildcardPattern(ffi::ObjectPtr< WildcardPatternNode > data)
Definition dataflow_pattern.h:786
Analyzer that contains bunch of sub-analyzers.
Definition analyzer.h:715
Managed reference to AnalyzerObj.
Definition analyzer.h:916
Base expr nodes in TVM.
PatternSeq operator^(const PatternSeq &lhs, const PatternSeq &rhs)
Syntax sugar of UsedBy(lhs, rhs, -1).
ExprPattern IsOp(const ffi::String &op_name)
Syntatic Sugar for creating a ExprPattern base on an Op.
DFPattern IsTuple(const ffi::Array< DFPattern > &fields, bool unordered=false)
Syntatic Sugar for creating TuplePattern or UnorderedTuplePattern (unordered=true)
CallPattern IsCallTIR(const ffi::String &name, ffi::Optional< TuplePattern > args=std::nullopt)
Syntatic Sugar for call_tir (return a tensor)
CallPattern IsCallDPSPacked(const ffi::String &name, ffi::Optional< TuplePattern > args=std::nullopt)
Syntatic Sugar for call_dps_packed (return a tensor)
WildcardPattern Wildcard()
Syntatic Sugar for creating a WildcardPattern.
VarPattern IsVar(const ffi::String &name)
Syntatic Sugar for creating a VarPattern with a name.
ConstantPattern IsConst()
Syntatic Sugar for creating a ConstantPattern.
PatternSeq UsedBy(const PatternSeq &lhs, const PatternSeq &rhs, int index=-1)
Create used-by relationship between lhs[-1] and rhs[0], with [*lhs, *rhs] returned.
PatternSeq OnlyUsedBy(const PatternSeq &lhs, const PatternSeq &rhs, int index=-1)
Create only-used-by relationship between lhs[-1] and rhs[0], with [*lhs, *rhs] returned.
ExprPattern IsExpr(const Expr &expr)
Syntatic Sugar for creating a ExprPattern.
PatternSeq operator>>(const PatternSeq &lhs, const PatternSeq &rhs)
Syntax sugar of OnlyUsedBy(lhs, rhs, -1).
TupleGetItemPattern IsTupleGetItem(const DFPattern tuple, int index=-1)
Syntatic Sugar for creating a TupleGetItemPattern.
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23
Relax types, including the richer dependent Relax type nodes.
Constraint of a DFPattern edge (producer -> consumer) in graph-level matching.
Definition dataflow_pattern.h:137
int index
Definition dataflow_pattern.h:143
bool operator==(const PairCons &other) const
Definition dataflow_pattern.h:153
enum tvm::relax::PairCons::Type type
Type
Constraint types of the edge.
Definition dataflow_pattern.h:139
@ kOnlyUsedBy
Definition dataflow_pattern.h:141
@ kUsedBy
Definition dataflow_pattern.h:140
PairCons(Type t, int index=-1)
Construct a new PairCons object.
Definition dataflow_pattern.h:151
RAII wrapper function to enter and exit a context object similar to python's with syntax.