Parser utilities#

A few helpers act at parse time (when TVMScript is turned into TIRx), letting you inline Python-computed values, factor out reusable fragments, and bundle parser-side state.

T.meta_var — inline a Python value#

T.meta_var(x) tells the parser to treat x — a value computed in Python — as a compile-time meta value and inline it directly into the IR, rather than parse it as a script variable. It avoids a throwaway local, and it drives metaprogramming: a plain Python for over a meta value unrolls in the parser.

n = T.meta_var(4)              # n is a Python int, inlined
for j in range(n):            # unrolled at parse time
    acc[0] = acc[0] + A[tx, j]

@T.inline — inline functions#

@T.inline defines a function whose body is inlined at each call site during parsing — no call appears in the generated code. It follows Python’s lexical (LEGB) scoping with late binding, so a parameter shadows an enclosing variable:

@T.inline
def add_into(acc, x):
    acc[0] = acc[0] + x

add_into(acc, A[tx, j])       # inlined -> acc[0] = acc[0] + A[tx, j]

@T.meta_class — parser-side state objects#

@T.meta_class marks a plain Python class whose instances are parser meta values: their fields can hold buffers and scalars, so you can bundle related allocations and state into one object and use it in the kernel body.

@T.meta_class
class State:
    def __init__(self, smem):
        self.acc = T.alloc_local([1], "float32")
        self.buf = T.decl_buffer([64], "float16", smem, scope="shared.dyn")

s = State(smem.data)
s.acc[0] = T.float32(0.0)     # use its fields like ordinary buffers
# ... s.buf[i] ...

This is handy for grouping a kernel’s pipeline state (barriers, accumulators, scratch views) instead of threading many separate locals through the body.

T.constexpr#

T.constexpr marks a compile-time kernel parameter, baked in by @T.jit’s .specialize(...). See Introduction to TIRx for the details.