Files
wehub-resource-sync 26446540fa
Lint / lint (push) Waiting to run
CI / MacOS (push) Waiting to run
CI / Windows (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:36:25 +08:00

1911 lines
54 KiB
Python

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# pylint: disable=no-else-return, unidiomatic-typecheck, invalid-name, arguments-differ
# ruff: noqa: RUF012
"""The expression and statement functor of TIR."""
from collections.abc import Callable
import tvm_ffi
from tvm.ir import Call, Expr
from tvm.ir.utils import derived_object
from . import _ffi_api
from .expr import (
EQ,
GE,
GT,
LE,
LT,
NE,
Add,
And,
Broadcast,
BufferLoad,
Cast,
Div,
FloatImm,
FloorDiv,
FloorMod,
IntImm,
Let,
Max,
Min,
Mod,
Mul,
Not,
Or,
ProducerLoad,
Ramp,
Reduce,
Select,
Shuffle,
StringImm,
Sub,
Var,
)
from .stmt import (
AllocBuffer,
AssertStmt,
AttrStmt,
Bind,
BufferStore,
DeclBuffer,
Evaluate,
For,
IfThenElse,
SBlock,
SBlockRealize,
SeqStmt,
Stmt,
While,
)
# visitor and mutator are aliases for derived_object
visitor = derived_object
mutator = derived_object
"""
A decorator to wrap user-customized PyStmtExprMutator as TVM object _PyStmtExprMutator.
Parameters
----------
mutator_cls : PyStmtExprMutator
The user-customized PyStmtExprMutator.
Returns
-------
cls : _PyStmtExprMutator
The decorated TVM object _PyStmtExprMutator(StmtExprMutator on the C++ side).
Example
-------
.. code-block:: python
@tirx.functor.stmt_expr_mutator
class MyStmtExprMutator(PyStmtExprMutator):
# customize rewrite function
def visit_add_(self, op: Add) -> Expr:
# just for demo purposes
...
# mymutator is now a special mutator that rewrite every Add with
# user-customized visit_add_
mymutator = MyStmtExprMutator()
# apply mymutator to Expr and Stmt
mymutator.visit_expr(expr)
mymutator.visit_stmt(stmt)
"""
@tvm_ffi.register_object("tirx.PyStmtExprVisitor")
class _PyStmtExprVisitor(tvm_ffi.core.Object):
"""
An internal wrapper to interface between C++ and Python StmtExprVisitor.
This is the TVM object that wraps PyStmtExprVisitor.
Do not use this class directly. Use PyStmtExprVisitor instead.
See also: PyStmtExprVisitor, stmt_expr_visitor
"""
def __init__(
self,
f_visit_stmt: Callable | None = None,
f_visit_expr: Callable | None = None,
# Stmt
f_visit_bind: Callable | None = None,
f_visit_attr_stmt: Callable | None = None,
f_visit_if_then_else: Callable | None = None,
f_visit_for: Callable | None = None,
f_visit_while: Callable | None = None,
f_visit_alloc_buffer: Callable | None = None,
f_visit_decl_buffer: Callable | None = None,
f_visit_buffer_store: Callable | None = None,
f_visit_assert_stmt: Callable | None = None,
f_visit_seq_stmt: Callable | None = None,
f_visit_evaluate: Callable | None = None,
f_visit_block: Callable | None = None,
f_visit_sblock_realize: Callable | None = None,
# Expr
f_visit_var: Callable | None = None,
f_visit_buffer_load: Callable | None = None,
f_visit_producer_load: Callable | None = None,
f_visit_let: Callable | None = None,
f_visit_call: Callable | None = None,
f_visit_add: Callable | None = None,
f_visit_sub: Callable | None = None,
f_visit_mul: Callable | None = None,
f_visit_div: Callable | None = None,
f_visit_mod: Callable | None = None,
f_visit_floor_div: Callable | None = None,
f_visit_floor_mod: Callable | None = None,
f_visit_min: Callable | None = None,
f_visit_max: Callable | None = None,
f_visit_eq: Callable | None = None,
f_visit_ne: Callable | None = None,
f_visit_lt: Callable | None = None,
f_visit_le: Callable | None = None,
f_visit_gt: Callable | None = None,
f_visit_ge: Callable | None = None,
f_visit_and: Callable | None = None,
f_visit_or: Callable | None = None,
f_visit_reduce: Callable | None = None,
f_visit_cast: Callable | None = None,
f_visit_not: Callable | None = None,
f_visit_select: Callable | None = None,
f_visit_ramp: Callable | None = None,
f_visit_broadcast: Callable | None = None,
f_visit_shuffle: Callable | None = None,
f_visit_int_imm: Callable | None = None,
f_visit_float_imm: Callable | None = None,
f_visit_string_imm: Callable | None = None,
) -> None:
"""Constructor."""
self.__init_handle_by_constructor__(
_ffi_api.MakePyStmtExprVisitor, # type: ignore
f_visit_stmt,
f_visit_expr,
# Stmt
f_visit_bind,
f_visit_attr_stmt,
f_visit_if_then_else,
f_visit_for,
f_visit_while,
f_visit_alloc_buffer,
f_visit_decl_buffer,
f_visit_buffer_store,
f_visit_assert_stmt,
f_visit_seq_stmt,
f_visit_evaluate,
f_visit_block,
f_visit_sblock_realize,
# Expr
f_visit_var,
f_visit_buffer_load,
f_visit_producer_load,
f_visit_let,
f_visit_call,
f_visit_add,
f_visit_sub,
f_visit_mul,
f_visit_div,
f_visit_mod,
f_visit_floor_div,
f_visit_floor_mod,
f_visit_min,
f_visit_max,
f_visit_eq,
f_visit_ne,
f_visit_lt,
f_visit_le,
f_visit_gt,
f_visit_ge,
f_visit_and,
f_visit_or,
f_visit_reduce,
f_visit_cast,
f_visit_not,
f_visit_select,
f_visit_ramp,
f_visit_broadcast,
f_visit_shuffle,
f_visit_int_imm,
f_visit_float_imm,
f_visit_string_imm,
)
class PyStmtExprVisitor:
"""
A Python StmtExprVisitor to define custom visitor for both Stmt and Expr.
Users can customize any of the visit function.
"""
_tvm_metadata = {
"cls": _PyStmtExprVisitor,
"methods": [
"visit_stmt",
"visit_expr",
# Stmt
"visit_bind_",
"visit_attr_stmt_",
"visit_if_then_else_",
"visit_for_",
"visit_while_",
"visit_alloc_buffer_",
"visit_decl_buffer_",
"visit_buffer_store_",
"visit_assert_stmt_",
"visit_seq_stmt_",
"visit_evaluate_",
"visit_sblock_",
"visit_sblock_realize_",
# Expr
"visit_var_",
"visit_buffer_load_",
"visit_producer_load_",
"visit_let_",
"visit_call_",
"visit_add_",
"visit_sub_",
"visit_mul_",
"visit_div_",
"visit_mod_",
"visit_floor_div_",
"visit_floor_mod_",
"visit_min_",
"visit_max_",
"visit_eq_",
"visit_ne_",
"visit_lt_",
"visit_le_",
"visit_gt_",
"visit_ge_",
"visit_and_",
"visit_or_",
"visit_reduce_",
"visit_cast_",
"visit_not_",
"visit_select_",
"visit_ramp_",
"visit_broadcast_",
"visit_shuffle_",
"visit_int_imm_",
"visit_float_imm_",
"visit_string_imm_",
],
}
def visit_stmt(self, stmt: Stmt) -> None:
"""Visit a Stmt.
Parameters
----------
stmt : Stmt
The Stmt to be visited.
"""
_ffi_api.PyStmtExprVisitorVisitStmt(self._outer(), stmt) # type: ignore
def visit_expr(self, expr: Expr) -> None:
"""Visit a Expr.
Parameters
----------
expr : Expr
The Expr to be visited.
"""
_ffi_api.PyStmtExprVisitorVisitExpr(self._outer(), expr) # type: ignore
def visit_attr_stmt_(self, op: AttrStmt) -> None:
"""Visit AttrStmt.
Users can customize this function to overwrite VisitStmt_(const AttrStmtNode* op)
on the C++ side.
Parameters
----------
op : AttrStmt
The AttrStmt to be visited.
"""
print("visit_attr_stmt_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_if_then_else_(self, op: IfThenElse) -> None:
"""Visit IfThenElse.
Users can customize this function to overwrite VisitStmt_(const IfThenElseNode* op)
on the C++ side.
Parameters
----------
op : IfThenElse
The IfThenElse to be visited.
"""
print("visit_if_then_else_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_bind_(self, op: Bind) -> None:
"""Visit Bind.
Users can customize this function to overwrite VisitStmt_(const BindNode* op)
on the C++ side.
Parameters
----------
op : Bind
The Bind node to be visited.
"""
print("visit_bind_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_for_(self, op: For) -> None:
"""Visit For.
Users can customize this function to overwrite VisitStmt_(const ForNode* op)
on the C++ side.
Parameters
----------
op : For
The For to be visited.
"""
print("visit_for_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_while_(self, op: While) -> None:
"""Visit While.
Users can customize this function to overwrite VisitStmt_(const WhileNode* op)
on the C++ side.
Parameters
----------
op : While
The While to be visited.
"""
print("visit_while_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_alloc_buffer_(self, op: AllocBuffer) -> None:
"""Visit AllocBuffer.
Users can customize this function to overwrite VisitStmt_(const AllocBufferNode* op)
on the C++ side.
Parameters
----------
op : AllocBuffer
The AllocBuffer to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_decl_buffer_(self, op: DeclBuffer) -> None:
"""Visit DeclBuffer.
Users can customize this function to overwrite VisitStmt_(const DeclBufferNode* op)
on the C++ side.
Parameters
----------
op : DeclBuffer
The DeclBuffer to be visited.
"""
print("visit_decl_buffer_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_buffer_store_(self, op: BufferStore) -> None:
"""Visit BufferStore.
Users can customize this function to overwrite VisitStmt_(const BufferStoreNode* op)
on the C++ side.
Parameters
----------
op : BufferStore
The BufferStore to be visited.
"""
print("visit_buffer_store_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_assert_stmt_(self, op: AssertStmt) -> None:
"""Visit AssertStmt.
Users can customize this function to overwrite VisitStmt_(const AssertStmtNode* op)
on the C++ side.
Parameters
----------
op : AssertStmt
The AssertStmt to be visited.
"""
print("visit_assert_stmt_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_seq_stmt_(self, op: SeqStmt) -> None:
"""Visit SeqStmt.
Users can customize this function to overwrite VisitStmt_(const SeqStmtNode* op)
on the C++ side.
Parameters
----------
op : SeqStmt
The SeqStmt to be visited.
"""
print("visit_seq_stmt_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_evaluate_(self, op: Evaluate) -> None:
"""Visit Evaluate.
Users can customize this function to overwrite VisitStmt_(const EvaluateNode* op)
on the C++ side.
Parameters
----------
op : Evaluate
The Evaluate to be visited.
"""
print("visit_evaluate_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_sblock_(self, op: SBlock) -> None:
"""Visit SBlock.
Users can customize this function to overwrite VisitStmt_(const SBlockNode* op)
on the C++ side.
Parameters
----------
op : SBlock
The SBlock to be visited.
"""
print("visit_sblock_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_sblock_realize_(self, op: SBlockRealize) -> None:
"""Visit BlockRealize.
Users can customize this function to overwrite VisitStmt_(const SBlockRealizeNode* op)
on the C++ side.
Parameters
----------
op : SBlockRealize
The BlockRealize to be visited.
"""
print("visit_sblock_realize_", op)
_ffi_api.PyStmtExprVisitorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_var_(self, op: Var) -> None:
"""Visit Var.
Users can customize this function to overwrite VisitVar_(const VarNode* op)
on the C++ side.
Parameters
----------
op : Var
The Var to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_buffer_load_(self, op: BufferLoad) -> None:
"""Visit BufferLoad.
Users can customize this function to overwrite VisitBufferLoad_(const BufferLoadNode* op)
on the C++ side.
Parameters
----------
op : BufferLoad
The BufferLoad to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_producer_load_(self, op: ProducerLoad) -> None:
"""Visit ProducerLoad.
Users can customize this function to overwrite
VisitProducerLoad_(const ProducerLoadNode* op) on the C++ side.
Parameters
----------
op : ProducerLoad
The ProducerLoad to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_let_(self, op: Let) -> None:
"""Visit Let.
Users can customize this function to overwrite VisitLet_(const LetNode* op)
on the C++ side.
Parameters
----------
op : Let
The Let to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_call_(self, op: Call) -> None:
"""Visit Call.
Users can customize this function to overwrite VisitCall_(const CallNode* op)
on the C++ side.
Parameters
----------
op : Call
The Call to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_add_(self, op: Add) -> None:
"""Visit Add.
Users can customize this function to overwrite VisitAdd_(const AddNode* op)
on the C++ side.
Parameters
----------
op : Add
The Add to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_sub_(self, op: Sub) -> None:
"""Visit Sub.
Users can customize this function to overwrite VisitSub_(const SubNode* op)
on the C++ side.
Parameters
----------
op : Sub
The Sub to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_mul_(self, op: Mul) -> None:
"""Visit Mul.
Users can customize this function to overwrite VisitMul_(const MulNode* op)
on the C++ side.
Parameters
----------
op : Mul
The Mul to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_div_(self, op: Div) -> None:
"""Visit Div.
Users can customize this function to overwrite VisitDiv_(const DivNode* op)
on the C++ side.
Parameters
----------
op : Div
The Div to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_mod_(self, op: Mod) -> None:
"""Visit Mod.
Users can customize this function to overwrite VisitMod_(const ModNode* op)
on the C++ side.
Parameters
----------
op : Mod
The Mod to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_floor_div_(self, op: FloorDiv) -> None:
"""Visit FloorDiv.
Users can customize this function to overwrite VisitFloorDiv_(const FloorDivNode* op)
on the C++ side.
Parameters
----------
op : FloorDiv
The FloorDiv to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_floor_mod_(self, op: FloorMod) -> None:
"""Visit FloorMod.
Users can customize this function to overwrite VisitFloorMod_(const FloorModNode* op)
on the C++ side.
Parameters
----------
op : FloorMod
The FloorMod to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_min_(self, op: Min) -> None:
"""Visit Min.
Users can customize this function to overwrite VisitMin_(const MinNode* op)
on the C++ side.
Parameters
----------
op : Min
The Min to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_max_(self, op: Max) -> None:
"""Visit Max.
Users can customize this function to overwrite VisitMax_(const MaxNode* op)
on the C++ side.
Parameters
----------
op : Max
The Max to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_eq_(self, op: EQ) -> None:
"""Visit EQ.
Users can customize this function to overwrite VisitEQ_(const EQNode* op)
on the C++ side.
Parameters
----------
op : EQ
The EQ to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_ne_(self, op: NE) -> None:
"""Visit NE.
Users can customize this function to overwrite VisitNE_(const NENode* op)
on the C++ side.
Parameters
----------
op : NE
The NE to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_lt_(self, op: LT) -> None:
"""Visit LT.
Users can customize this function to overwrite VisitLT_(const LTNode* op)
on the C++ side.
Parameters
----------
op : LT
The LT to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_le_(self, op: LE) -> None:
"""Visit LE.
Users can customize this function to overwrite VisitLE_(const LENode* op)
on the C++ side.
Parameters
----------
op : LE
The LE to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_gt_(self, op: GT) -> None:
"""Visit GT.
Users can customize this function to overwrite VisitGT_(const GTNode* op)
on the C++ side.
Parameters
----------
op : GT
The GT to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_ge_(self, op: GE) -> None:
"""Visit GE.
Users can customize this function to overwrite VisitGE_(const GENode* op)
on the C++ side.
Parameters
----------
op : GE
The GE to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_and_(self, op: And) -> None:
"""Visit And.
Users can customize this function to overwrite VisitAnd_(const AndNode* op)
on the C++ side.
Parameters
----------
op : And
The And to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_or_(self, op: Or) -> None:
"""Visit Or.
Users can customize this function to overwrite VisitOr_(const OrNode* op)
on the C++ side.
Parameters
----------
op : Or
The Or to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_reduce_(self, op: Reduce) -> None:
"""Visit Reduce.
Users can customize this function to overwrite VisitReduce_(const ReduceNode* op)
on the C++ side.
Parameters
----------
op : Reduce
The Reduce to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_cast_(self, op: Cast) -> None:
"""Visit Cast.
Users can customize this function to overwrite VisitCast_(const CastNode* op)
on the C++ side.
Parameters
----------
op : Cast
The Cast to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_not_(self, op: Not) -> None:
"""Visit Not.
Users can customize this function to overwrite VisitNot_(const NotNode* op)
on the C++ side.
Parameters
----------
op : Not
The Not to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_select_(self, op: Select) -> None:
"""Visit Select.
Users can customize this function to overwrite VisitSelect_(const SelectNode* op)
on the C++ side.
Parameters
----------
op : Select
The Select to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_ramp_(self, op: Ramp) -> None:
"""Visit Ramp.
Users can customize this function to overwrite VisitRamp_(const RampNode* op)
on the C++ side.
Parameters
----------
op : Ramp
The Ramp to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_broadcast_(self, op: Broadcast) -> None:
"""Visit Broadcast.
Users can customize this function to overwrite VisitBroadcast_(const BroadcastNode* op)
on the C++ side.
Parameters
----------
op : Broadcast
The Broadcast to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_shuffle_(self, op: Shuffle) -> None:
"""Visit Shuffle.
Users can customize this function to overwrite VisitShuffle_(const ShuffleNode* op)
on the C++ side.
Parameters
----------
op : Shuffle
The Shuffle to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_int_imm_(self, op: IntImm) -> None:
"""Visit IntImm.
Users can customize this function to overwrite VisitIntImm_(const IntImmNode* op)
on the C++ side.
Parameters
----------
op : IntImm
The IntImm to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_float_imm_(self, op: FloatImm) -> None:
"""Visit FloatImm.
Users can customize this function to overwrite VisitFloatImm_(const FloatImmNode* op)
on the C++ side.
Parameters
----------
op : FloatImm
The FloatImm to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_string_imm_(self, op: StringImm) -> None:
"""Visit StringImm.
Users can customize this function to overwrite VisitStringImm_(const StringImmNode* op)
on the C++ side.
Parameters
----------
op : StringImm
The StringImm to be visited.
"""
_ffi_api.PyStmtExprVisitorDefaultVisitExpr(self._outer(), op) # type: ignore
@tvm_ffi.register_object("tirx.PyStmtExprMutator")
class _PyStmtExprMutator(tvm_ffi.core.Object):
"""
A TVM object to support customization of StmtExprMutator on the python side.
This is the decorated result returned from stmt_expr_mutator decorator.
WARNING: This is NOT the user facing class for method overwriting inheritance.
See also: stmt_expr_mutator, PyStmtExprMutator
"""
def __init__(
self,
f_visit_stmt: Callable | None = None,
f_visit_expr: Callable | None = None,
# Stmt
f_visit_bind: Callable | None = None,
f_visit_attr_stmt: Callable | None = None,
f_visit_if_then_else: Callable | None = None,
f_visit_for: Callable | None = None,
f_visit_while: Callable | None = None,
f_visit_alloc_buffer: Callable | None = None,
f_visit_decl_buffer: Callable | None = None,
f_visit_buffer_store: Callable | None = None,
f_visit_assert_stmt: Callable | None = None,
f_visit_seq_stmt: Callable | None = None,
f_visit_evaluate: Callable | None = None,
f_visit_block: Callable | None = None,
f_visit_sblock_realize: Callable | None = None,
# Expr
f_visit_var: Callable | None = None,
f_visit_buffer_load: Callable | None = None,
f_visit_producer_load: Callable | None = None,
f_visit_let: Callable | None = None,
f_visit_call: Callable | None = None,
f_visit_add: Callable | None = None,
f_visit_sub: Callable | None = None,
f_visit_mul: Callable | None = None,
f_visit_div: Callable | None = None,
f_visit_mod: Callable | None = None,
f_visit_floor_div: Callable | None = None,
f_visit_floor_mod: Callable | None = None,
f_visit_min: Callable | None = None,
f_visit_max: Callable | None = None,
f_visit_eq: Callable | None = None,
f_visit_ne: Callable | None = None,
f_visit_lt: Callable | None = None,
f_visit_le: Callable | None = None,
f_visit_gt: Callable | None = None,
f_visit_ge: Callable | None = None,
f_visit_and: Callable | None = None,
f_visit_or: Callable | None = None,
f_visit_reduce: Callable | None = None,
f_visit_cast: Callable | None = None,
f_visit_not: Callable | None = None,
f_visit_select: Callable | None = None,
f_visit_ramp: Callable | None = None,
f_visit_broadcast: Callable | None = None,
f_visit_shuffle: Callable | None = None,
f_visit_int_imm: Callable | None = None,
f_visit_float_imm: Callable | None = None,
f_visit_string_imm: Callable | None = None,
) -> None:
"""Constructor."""
self.__init_handle_by_constructor__(
_ffi_api.MakePyStmtExprMutator, # type: ignore
f_visit_stmt,
f_visit_expr,
# Stmt
f_visit_bind,
f_visit_attr_stmt,
f_visit_if_then_else,
f_visit_for,
f_visit_while,
f_visit_alloc_buffer,
f_visit_decl_buffer,
f_visit_buffer_store,
f_visit_assert_stmt,
f_visit_seq_stmt,
f_visit_evaluate,
f_visit_block,
f_visit_sblock_realize,
# Expr
f_visit_var,
f_visit_buffer_load,
f_visit_producer_load,
f_visit_let,
f_visit_call,
f_visit_add,
f_visit_sub,
f_visit_mul,
f_visit_div,
f_visit_mod,
f_visit_floor_div,
f_visit_floor_mod,
f_visit_min,
f_visit_max,
f_visit_eq,
f_visit_ne,
f_visit_lt,
f_visit_le,
f_visit_gt,
f_visit_ge,
f_visit_and,
f_visit_or,
f_visit_reduce,
f_visit_cast,
f_visit_not,
f_visit_select,
f_visit_ramp,
f_visit_broadcast,
f_visit_shuffle,
f_visit_int_imm,
f_visit_float_imm,
f_visit_string_imm,
)
class PyStmtExprMutator:
"""
A Python StmtExprMutator to define custom mutator for both Stmt and Expr.
Users can customize any of the visit function.
"""
_tvm_metadata = {
"cls": _PyStmtExprMutator,
"methods": [
"visit_stmt",
"visit_expr",
# Stmt
"visit_bind_",
"visit_attr_stmt_",
"visit_if_then_else_",
"visit_for_",
"visit_while_",
"visit_alloc_buffer_",
"visit_decl_buffer_",
"visit_buffer_store_",
"visit_assert_stmt_",
"visit_seq_stmt_",
"visit_evaluate_",
"visit_sblock_",
"visit_sblock_realize_",
# Expr
"visit_var_",
"visit_buffer_load_",
"visit_producer_load_",
"visit_let_",
"visit_call_",
"visit_add_",
"visit_sub_",
"visit_mul_",
"visit_div_",
"visit_mod_",
"visit_floor_div_",
"visit_floor_mod_",
"visit_min_",
"visit_max_",
"visit_eq_",
"visit_ne_",
"visit_lt_",
"visit_le_",
"visit_gt_",
"visit_ge_",
"visit_and_",
"visit_or_",
"visit_reduce_",
"visit_cast_",
"visit_not_",
"visit_select_",
"visit_ramp_",
"visit_broadcast_",
"visit_shuffle_",
"visit_int_imm_",
"visit_float_imm_",
"visit_string_imm_",
],
}
def visit_expr(self, expr: Expr) -> Expr:
"""Visit Expr.
Users can customize this function to overwrite VisitExpr(const Expr& expr)
on the C++ side.
Parameters
----------
expr : Expr
The Expr to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorVisitExpr(self._outer(), expr) # type: ignore
def visit_stmt(self, stmt: Stmt) -> Stmt:
"""Visit Stmt.
Users can customize this function to overwrite VisitStmt(const Stmt& stmt)
on the C++ side.
Parameters
----------
stmt : Stmt
The Stmt to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorVisitStmt(self._outer(), stmt) # type: ignore
def visit_attr_stmt_(self, op: AttrStmt) -> Stmt:
"""Visit AttrStmt.
Users can customize this function to overwrite VisitStmt_(const AttrStmtNode* op)
on the C++ side.
Parameters
----------
op : AttrStmt
The AttrStmt to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_if_then_else_(self, op: IfThenElse) -> Stmt:
"""Visit IfThenElse.
Users can customize this function to overwrite VisitStmt_(const IfThenElseNode* op)
on the C++ side.
Parameters
----------
op : IfThenElse
The IfThenElse to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_bind_(self, op: Bind) -> Stmt:
"""Visit Bind.
Users can customize this function to overwrite VisitStmt_(const BindNode* op)
on the C++ side.
Parameters
----------
op : Bind
The Bind node to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_for_(self, op: For) -> Stmt:
"""Visit For.
Users can customize this function to overwrite VisitStmt_(const ForNode* op)
on the C++ side.
Parameters
----------
op : For
The For to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_while_(self, op: While) -> Stmt:
"""Visit While.
Users can customize this function to overwrite VisitStmt_(const WhileNode* op)
on the C++ side.
Parameters
----------
op : While
The While to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_alloc_buffer_(self, op: AllocBuffer) -> Stmt:
"""Visit AllocBuffer.
Users can customize this function to overwrite VisitStmt_(const AllocBufferNode* op)
on the C++ side.
Parameters
----------
op : AllocBuffer
The AllocBuffer to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_decl_buffer_(self, op: DeclBuffer) -> Stmt:
"""Visit DeclBuffer.
Users can customize this function to overwrite VisitStmt_(const DeclBufferNode* op)
on the C++ side.
Parameters
----------
op : DeclBuffer
The DeclBuffer to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_buffer_store_(self, op: BufferStore) -> Stmt:
"""Visit BufferStore.
Users can customize this function to overwrite VisitStmt_(const BufferStoreNode* op)
on the C++ side.
Parameters
----------
op : BufferStore
The BufferStore to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_assert_stmt_(self, op: AssertStmt) -> Stmt:
"""Visit AssertStmt.
Users can customize this function to overwrite VisitStmt_(const AssertStmtNode* op)
on the C++ side.
Parameters
----------
op : AssertStmt
The AssertStmt to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_seq_stmt_(self, op: SeqStmt) -> Stmt:
"""Visit SeqStmt.
Users can customize this function to overwrite VisitStmt_(const SeqStmtNode* op)
on the C++ side.
Parameters
----------
op : SeqStmt
The SeqStmt to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_evaluate_(self, op: Evaluate) -> Stmt:
"""Visit Evaluate.
Users can customize this function to overwrite VisitStmt_(const EvaluateNode* op)
on the C++ side.
Parameters
----------
op : Evaluate
The Evaluate to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_sblock_(self, op: SBlock) -> Stmt:
"""Visit SBlock.
Users can customize this function to overwrite VisitStmt_(const SBlockNode* op)
on the C++ side.
Parameters
----------
op : SBlock
The SBlock to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_sblock_realize_(self, op: SBlockRealize) -> Stmt:
"""Visit BlockRealize.
Users can customize this function to overwrite VisitStmt_(const SBlockRealizeNode* op)
on the C++ side.
Parameters
----------
op : SBlockRealize
The SBlockRealize to be visited.
Returns
-------
result : Stmt
The mutated Stmt.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitStmt(self._outer(), op) # type: ignore
def visit_var_(self, op: Var) -> Expr:
"""Visit Var.
Users can customize this function to overwrite VisitVar_(const VarNode* op)
on the C++ side.
Parameters
----------
op : Var
The Var to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_buffer_load_(self, op: BufferLoad) -> Expr:
"""Visit BufferLoad.
Users can customize this function to overwrite VisitBufferLoad_(const BufferLoadNode* op)
on the C++ side.
Parameters
----------
op : BufferLoad
The BufferLoad to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_producer_load_(self, op: ProducerLoad) -> Expr:
"""Visit ProducerLoad.
Users can customize this function to overwrite
VisitProducerLoad_(const ProducerLoadNode* op) on the C++ side.
Parameters
----------
op : ProducerLoad
The ProducerLoad to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_let_(self, op: Let) -> Expr:
"""Visit Let.
Users can customize this function to overwrite VisitLet_(const LetNode* op)
on the C++ side.
Parameters
----------
op : Let
The Let to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_call_(self, op: Call) -> Expr:
"""Visit Call.
Users can customize this function to overwrite VisitCall_(const CallNode* op)
on the C++ side.
Parameters
----------
op : Call
The Call to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_add_(self, op: Add) -> Expr:
"""Visit Add.
Users can customize this function to overwrite VisitAdd_(const AddNode* op)
on the C++ side.
Parameters
----------
op : Add
The Add to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_sub_(self, op: Sub) -> Expr:
"""Visit Sub.
Users can customize this function to overwrite VisitSub_(const SubNode* op)
on the C++ side.
Parameters
----------
op : Sub
The Sub to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_mul_(self, op: Mul) -> Expr:
"""Visit Mul.
Users can customize this function to overwrite VisitMul_(const MulNode* op)
on the C++ side.
Parameters
----------
op : Mul
The Mul to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_div_(self, op: Div) -> Expr:
"""Visit Div.
Users can customize this function to overwrite VisitDiv_(const DivNode* op)
on the C++ side.
Parameters
----------
op : Div
The Div to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_mod_(self, op: Mod) -> Expr:
"""Visit Mod.
Users can customize this function to overwrite VisitMod_(const ModNode* op)
on the C++ side.
Parameters
----------
op : Mod
The Mod to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_floor_div_(self, op: FloorDiv) -> Expr:
"""Visit FloorDiv.
Users can customize this function to overwrite VisitFloorDiv_(const FloorDivNode* op)
on the C++ side.
Parameters
----------
op : FloorDiv
The FloorDiv to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_floor_mod_(self, op: FloorMod) -> Expr:
"""Visit FloorMod.
Users can customize this function to overwrite VisitFloorMod_(const FloorModNode* op)
on the C++ side.
Parameters
----------
op : FloorMod
The FloorMod to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_min_(self, op: Min) -> Expr:
"""Visit Min.
Users can customize this function to overwrite VisitMin_(const MinNode* op)
on the C++ side.
Parameters
----------
op : Min
The Min to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_max_(self, op: Max) -> Expr:
"""Visit Max.
Users can customize this function to overwrite VisitMax_(const MaxNode* op)
on the C++ side.
Parameters
----------
op : Max
The Max to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_eq_(self, op: EQ) -> Expr:
"""Visit EQ.
Users can customize this function to overwrite VisitEQ_(const EQNode* op)
on the C++ side.
Parameters
----------
op : EQ
The EQ to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_ne_(self, op: NE) -> Expr:
"""Visit NE.
Users can customize this function to overwrite VisitNE_(const NENode* op)
on the C++ side.
Parameters
----------
op : NE
The NE to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_lt_(self, op: LT) -> Expr:
"""Visit LT.
Users can customize this function to overwrite VisitLT_(const LTNode* op)
on the C++ side.
Parameters
----------
op : LT
The LT to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_le_(self, op: LE) -> Expr:
"""Visit LE.
Users can customize this function to overwrite VisitLE_(const LENode* op)
on the C++ side.
Parameters
----------
op : LE
The LE to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_gt_(self, op: GT) -> Expr:
"""Visit GT.
Users can customize this function to overwrite VisitGT_(const GTNode* op)
on the C++ side.
Parameters
----------
op : GT
The GT to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_ge_(self, op: GE) -> Expr:
"""Visit GE.
Users can customize this function to overwrite VisitGE_(const GENode* op)
on the C++ side.
Parameters
----------
op : GE
The GE to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_and_(self, op: And) -> Expr:
"""Visit And.
Users can customize this function to overwrite VisitAnd_(const AndNode* op)
on the C++ side.
Parameters
----------
op : And
The And to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_or_(self, op: Or) -> Expr:
"""Visit Or.
Users can customize this function to overwrite VisitOr_(const OrNode* op)
on the C++ side.
Parameters
----------
op : Or
The Or to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_reduce_(self, op: Reduce) -> Expr:
"""Visit Reduce.
Users can customize this function to overwrite VisitReduce_(const ReduceNode* op)
on the C++ side.
Parameters
----------
op : Reduce
The Reduce to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_cast_(self, op: Cast) -> Expr:
"""Visit Cast.
Users can customize this function to overwrite VisitCast_(const CastNode* op)
on the C++ side.
Parameters
----------
op : Cast
The Cast to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_not_(self, op: Not) -> Expr:
"""Visit Not.
Users can customize this function to overwrite VisitNot_(const NotNode* op)
on the C++ side.
Parameters
----------
op : Not
The Not to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_select_(self, op: Select) -> Expr:
"""Visit Select.
Users can customize this function to overwrite VisitSelect_(const SelectNode* op)
on the C++ side.
Parameters
----------
op : Select
The Select to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_ramp_(self, op: Ramp) -> Expr:
"""Visit Ramp.
Users can customize this function to overwrite VisitRamp_(const RampNode* op)
on the C++ side.
Parameters
----------
op : Ramp
The Ramp to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_broadcast_(self, op: Broadcast) -> Expr:
"""Visit Broadcast.
Users can customize this function to overwrite VisitBroadcast_(const BroadcastNode* op)
on the C++ side.
Parameters
----------
op : Broadcast
The Broadcast to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_shuffle_(self, op: Shuffle) -> Expr:
"""Visit Shuffle.
Users can customize this function to overwrite VisitShuffle_(const ShuffleNode* op)
on the C++ side.
Parameters
----------
op : Shuffle
The Shuffle to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_int_imm_(self, op: IntImm) -> Expr:
"""Visit IntImm.
Users can customize this function to overwrite VisitIntImm_(const IntImmNode* op)
on the C++ side.
Parameters
----------
op : IntImm
The IntImm to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_float_imm_(self, op: FloatImm) -> Expr:
"""Visit FloatImm.
Users can customize this function to overwrite VisitFloatImm_(const FloatImmNode* op)
on the C++ side.
Parameters
----------
op : FloatImm
The FloatImm to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore
def visit_string_imm_(self, op: StringImm) -> Expr:
"""Visit StringImm.
Users can customize this function to overwrite VisitStringImm_(const StringImmNode* op)
on the C++ side.
Parameters
----------
op : StringImm
The StringImm to be visited.
Returns
-------
result : Expr
The mutated Expr.
"""
return _ffi_api.PyStmtExprMutatorDefaultVisitExpr(self._outer(), op) # type: ignore