xref: /aosp_15_r20/external/executorch/exir/schema.py (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates.
2*523fa7a6SAndroid Build Coastguard Worker# All rights reserved.
3*523fa7a6SAndroid Build Coastguard Worker#
4*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the
5*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree.
6*523fa7a6SAndroid Build Coastguard Worker
7*523fa7a6SAndroid Build Coastguard Worker# pyre-strict
8*523fa7a6SAndroid Build Coastguard Worker
9*523fa7a6SAndroid Build Coastguard Workerfrom dataclasses import dataclass
10*523fa7a6SAndroid Build Coastguard Workerfrom enum import IntEnum
11*523fa7a6SAndroid Build Coastguard Workerfrom typing import List, Optional, Union
12*523fa7a6SAndroid Build Coastguard Worker
13*523fa7a6SAndroid Build Coastguard Workerfrom executorch.exir.backend.compile_spec_schema import CompileSpec
14*523fa7a6SAndroid Build Coastguard Worker
15*523fa7a6SAndroid Build Coastguard Workerfrom executorch.exir.scalar_type import ScalarType
16*523fa7a6SAndroid Build Coastguard Worker
17*523fa7a6SAndroid Build Coastguard Worker
18*523fa7a6SAndroid Build Coastguard Worker@dataclass
19*523fa7a6SAndroid Build Coastguard Workerclass AllocationDetails:
20*523fa7a6SAndroid Build Coastguard Worker    memory_id: int
21*523fa7a6SAndroid Build Coastguard Worker    # Low 32 bits
22*523fa7a6SAndroid Build Coastguard Worker    memory_offset_low: int
23*523fa7a6SAndroid Build Coastguard Worker    # High 32 bits (typically zero)
24*523fa7a6SAndroid Build Coastguard Worker    memory_offset_high: int
25*523fa7a6SAndroid Build Coastguard Worker
26*523fa7a6SAndroid Build Coastguard Worker    @property
27*523fa7a6SAndroid Build Coastguard Worker    def memory_offset(self) -> int:
28*523fa7a6SAndroid Build Coastguard Worker        return self.memory_offset_low | (self.memory_offset_high << 32)
29*523fa7a6SAndroid Build Coastguard Worker
30*523fa7a6SAndroid Build Coastguard Worker
31*523fa7a6SAndroid Build Coastguard Worker@dataclass
32*523fa7a6SAndroid Build Coastguard Workerclass OptionalTensorList:
33*523fa7a6SAndroid Build Coastguard Worker    items: List[int]
34*523fa7a6SAndroid Build Coastguard Worker
35*523fa7a6SAndroid Build Coastguard Worker
36*523fa7a6SAndroid Build Coastguard Workerclass TensorShapeDynamism(IntEnum):
37*523fa7a6SAndroid Build Coastguard Worker    """
38*523fa7a6SAndroid Build Coastguard Worker    Check program.fbs for explanations of this enum.
39*523fa7a6SAndroid Build Coastguard Worker    """
40*523fa7a6SAndroid Build Coastguard Worker
41*523fa7a6SAndroid Build Coastguard Worker    STATIC = 0
42*523fa7a6SAndroid Build Coastguard Worker    DYNAMIC_BOUND = 1
43*523fa7a6SAndroid Build Coastguard Worker    DYNAMIC_UNBOUND = 2
44*523fa7a6SAndroid Build Coastguard Worker
45*523fa7a6SAndroid Build Coastguard Worker
46*523fa7a6SAndroid Build Coastguard Worker@dataclass
47*523fa7a6SAndroid Build Coastguard Workerclass ExtraTensorInfo:
48*523fa7a6SAndroid Build Coastguard Worker    """
49*523fa7a6SAndroid Build Coastguard Worker    Check program.fbs for explanations of this enum.
50*523fa7a6SAndroid Build Coastguard Worker    """
51*523fa7a6SAndroid Build Coastguard Worker
52*523fa7a6SAndroid Build Coastguard Worker    mutable_data_segments_idx: Optional[int] = None
53*523fa7a6SAndroid Build Coastguard Worker    fully_qualified_name: Optional[str] = None
54*523fa7a6SAndroid Build Coastguard Worker
55*523fa7a6SAndroid Build Coastguard Worker
56*523fa7a6SAndroid Build Coastguard Worker@dataclass
57*523fa7a6SAndroid Build Coastguard Workerclass Tensor:
58*523fa7a6SAndroid Build Coastguard Worker    scalar_type: ScalarType
59*523fa7a6SAndroid Build Coastguard Worker    storage_offset: int
60*523fa7a6SAndroid Build Coastguard Worker    sizes: List[int]
61*523fa7a6SAndroid Build Coastguard Worker    dim_order: List[bytes]
62*523fa7a6SAndroid Build Coastguard Worker    requires_grad: bool
63*523fa7a6SAndroid Build Coastguard Worker    layout: int
64*523fa7a6SAndroid Build Coastguard Worker    data_buffer_idx: int
65*523fa7a6SAndroid Build Coastguard Worker    allocation_info: Optional[AllocationDetails]
66*523fa7a6SAndroid Build Coastguard Worker
67*523fa7a6SAndroid Build Coastguard Worker    # check program.fbs for explanations.
68*523fa7a6SAndroid Build Coastguard Worker    shape_dynamism: TensorShapeDynamism
69*523fa7a6SAndroid Build Coastguard Worker    extra_tensor_info: Optional[ExtraTensorInfo] = None
70*523fa7a6SAndroid Build Coastguard Worker
71*523fa7a6SAndroid Build Coastguard Worker
72*523fa7a6SAndroid Build Coastguard Worker@dataclass
73*523fa7a6SAndroid Build Coastguard Workerclass Null:
74*523fa7a6SAndroid Build Coastguard Worker    pass
75*523fa7a6SAndroid Build Coastguard Worker
76*523fa7a6SAndroid Build Coastguard Worker
77*523fa7a6SAndroid Build Coastguard Worker@dataclass
78*523fa7a6SAndroid Build Coastguard Workerclass Int:
79*523fa7a6SAndroid Build Coastguard Worker    int_val: int
80*523fa7a6SAndroid Build Coastguard Worker
81*523fa7a6SAndroid Build Coastguard Worker
82*523fa7a6SAndroid Build Coastguard Worker@dataclass
83*523fa7a6SAndroid Build Coastguard Workerclass Bool:
84*523fa7a6SAndroid Build Coastguard Worker    bool_val: bool
85*523fa7a6SAndroid Build Coastguard Worker
86*523fa7a6SAndroid Build Coastguard Worker
87*523fa7a6SAndroid Build Coastguard Worker@dataclass
88*523fa7a6SAndroid Build Coastguard Workerclass Double:
89*523fa7a6SAndroid Build Coastguard Worker    double_val: Union[float, str]
90*523fa7a6SAndroid Build Coastguard Worker
91*523fa7a6SAndroid Build Coastguard Worker    def __init__(self, double_val: float) -> None:
92*523fa7a6SAndroid Build Coastguard Worker        if double_val == float("inf"):
93*523fa7a6SAndroid Build Coastguard Worker            self.double_val = "inf"
94*523fa7a6SAndroid Build Coastguard Worker        elif double_val == float("-inf"):
95*523fa7a6SAndroid Build Coastguard Worker            self.double_val = "-inf"
96*523fa7a6SAndroid Build Coastguard Worker        else:
97*523fa7a6SAndroid Build Coastguard Worker            self.double_val = double_val
98*523fa7a6SAndroid Build Coastguard Worker
99*523fa7a6SAndroid Build Coastguard Worker    def __post_init__(self) -> None:
100*523fa7a6SAndroid Build Coastguard Worker        if isinstance(self.double_val, str):
101*523fa7a6SAndroid Build Coastguard Worker            assert self.double_val in ["inf", "-inf"]
102*523fa7a6SAndroid Build Coastguard Worker        else:
103*523fa7a6SAndroid Build Coastguard Worker            assert isinstance(self.double_val, float)
104*523fa7a6SAndroid Build Coastguard Worker            assert not self.double_val == float("inf")
105*523fa7a6SAndroid Build Coastguard Worker            assert not self.double_val == float("-inf")
106*523fa7a6SAndroid Build Coastguard Worker
107*523fa7a6SAndroid Build Coastguard Worker
108*523fa7a6SAndroid Build Coastguard Worker@dataclass
109*523fa7a6SAndroid Build Coastguard Workerclass String:
110*523fa7a6SAndroid Build Coastguard Worker    string_val: str
111*523fa7a6SAndroid Build Coastguard Worker
112*523fa7a6SAndroid Build Coastguard Worker
113*523fa7a6SAndroid Build Coastguard Worker@dataclass
114*523fa7a6SAndroid Build Coastguard Workerclass ContainerMetadata:
115*523fa7a6SAndroid Build Coastguard Worker    encoded_inp_str: str
116*523fa7a6SAndroid Build Coastguard Worker    encoded_out_str: str
117*523fa7a6SAndroid Build Coastguard Worker
118*523fa7a6SAndroid Build Coastguard Worker
119*523fa7a6SAndroid Build Coastguard Worker@dataclass
120*523fa7a6SAndroid Build Coastguard Workerclass IntList:
121*523fa7a6SAndroid Build Coastguard Worker    items: List[int]
122*523fa7a6SAndroid Build Coastguard Worker
123*523fa7a6SAndroid Build Coastguard Worker
124*523fa7a6SAndroid Build Coastguard Worker@dataclass
125*523fa7a6SAndroid Build Coastguard Workerclass DoubleList:
126*523fa7a6SAndroid Build Coastguard Worker    items: List[float]
127*523fa7a6SAndroid Build Coastguard Worker
128*523fa7a6SAndroid Build Coastguard Worker
129*523fa7a6SAndroid Build Coastguard Worker@dataclass
130*523fa7a6SAndroid Build Coastguard Workerclass BoolList:
131*523fa7a6SAndroid Build Coastguard Worker    items: List[bool]
132*523fa7a6SAndroid Build Coastguard Worker
133*523fa7a6SAndroid Build Coastguard Worker
134*523fa7a6SAndroid Build Coastguard Worker@dataclass
135*523fa7a6SAndroid Build Coastguard Workerclass TensorList:
136*523fa7a6SAndroid Build Coastguard Worker    items: List[int]
137*523fa7a6SAndroid Build Coastguard Worker
138*523fa7a6SAndroid Build Coastguard Worker
139*523fa7a6SAndroid Build Coastguard WorkerKernelTypes = Union[
140*523fa7a6SAndroid Build Coastguard Worker    Int,
141*523fa7a6SAndroid Build Coastguard Worker    Double,
142*523fa7a6SAndroid Build Coastguard Worker    Bool,
143*523fa7a6SAndroid Build Coastguard Worker    String,
144*523fa7a6SAndroid Build Coastguard Worker    Tensor,
145*523fa7a6SAndroid Build Coastguard Worker    IntList,
146*523fa7a6SAndroid Build Coastguard Worker    BoolList,
147*523fa7a6SAndroid Build Coastguard Worker    DoubleList,
148*523fa7a6SAndroid Build Coastguard Worker    TensorList,
149*523fa7a6SAndroid Build Coastguard Worker    Null,
150*523fa7a6SAndroid Build Coastguard Worker    OptionalTensorList,
151*523fa7a6SAndroid Build Coastguard Worker]
152*523fa7a6SAndroid Build Coastguard Worker
153*523fa7a6SAndroid Build Coastguard Worker
154*523fa7a6SAndroid Build Coastguard Worker@dataclass
155*523fa7a6SAndroid Build Coastguard Workerclass EValue:
156*523fa7a6SAndroid Build Coastguard Worker    # Union types must be specified as strings so DataclassEncoder can see them.
157*523fa7a6SAndroid Build Coastguard Worker    val: "KernelTypes"
158*523fa7a6SAndroid Build Coastguard Worker
159*523fa7a6SAndroid Build Coastguard Worker
160*523fa7a6SAndroid Build Coastguard Worker@dataclass
161*523fa7a6SAndroid Build Coastguard Workerclass Buffer:
162*523fa7a6SAndroid Build Coastguard Worker    storage: bytes
163*523fa7a6SAndroid Build Coastguard Worker
164*523fa7a6SAndroid Build Coastguard Worker
165*523fa7a6SAndroid Build Coastguard Worker@dataclass
166*523fa7a6SAndroid Build Coastguard Workerclass BackendDelegateInlineData:
167*523fa7a6SAndroid Build Coastguard Worker    data: bytes
168*523fa7a6SAndroid Build Coastguard Worker
169*523fa7a6SAndroid Build Coastguard Worker
170*523fa7a6SAndroid Build Coastguard Worker@dataclass
171*523fa7a6SAndroid Build Coastguard Workerclass KernelCall:
172*523fa7a6SAndroid Build Coastguard Worker    op_index: int
173*523fa7a6SAndroid Build Coastguard Worker    args: List[int]
174*523fa7a6SAndroid Build Coastguard Worker
175*523fa7a6SAndroid Build Coastguard Worker
176*523fa7a6SAndroid Build Coastguard Worker@dataclass
177*523fa7a6SAndroid Build Coastguard Workerclass DelegateCall:
178*523fa7a6SAndroid Build Coastguard Worker    delegate_index: int
179*523fa7a6SAndroid Build Coastguard Worker    args: List[int]
180*523fa7a6SAndroid Build Coastguard Worker
181*523fa7a6SAndroid Build Coastguard Worker
182*523fa7a6SAndroid Build Coastguard Worker@dataclass
183*523fa7a6SAndroid Build Coastguard Workerclass MoveCall:
184*523fa7a6SAndroid Build Coastguard Worker    move_from: int
185*523fa7a6SAndroid Build Coastguard Worker    move_to: int
186*523fa7a6SAndroid Build Coastguard Worker
187*523fa7a6SAndroid Build Coastguard Worker
188*523fa7a6SAndroid Build Coastguard Worker@dataclass
189*523fa7a6SAndroid Build Coastguard Workerclass JumpFalseCall:
190*523fa7a6SAndroid Build Coastguard Worker    cond_value_index: int
191*523fa7a6SAndroid Build Coastguard Worker    destination_instruction: int
192*523fa7a6SAndroid Build Coastguard Worker
193*523fa7a6SAndroid Build Coastguard Worker
194*523fa7a6SAndroid Build Coastguard Worker@dataclass
195*523fa7a6SAndroid Build Coastguard Workerclass FreeCall:
196*523fa7a6SAndroid Build Coastguard Worker    value_index: int
197*523fa7a6SAndroid Build Coastguard Worker
198*523fa7a6SAndroid Build Coastguard Worker
199*523fa7a6SAndroid Build Coastguard WorkerInstructionArguments = Union[
200*523fa7a6SAndroid Build Coastguard Worker    KernelCall,
201*523fa7a6SAndroid Build Coastguard Worker    DelegateCall,
202*523fa7a6SAndroid Build Coastguard Worker    MoveCall,
203*523fa7a6SAndroid Build Coastguard Worker    JumpFalseCall,
204*523fa7a6SAndroid Build Coastguard Worker    FreeCall,
205*523fa7a6SAndroid Build Coastguard Worker]
206*523fa7a6SAndroid Build Coastguard Worker
207*523fa7a6SAndroid Build Coastguard Worker
208*523fa7a6SAndroid Build Coastguard Worker@dataclass
209*523fa7a6SAndroid Build Coastguard Workerclass Instruction:
210*523fa7a6SAndroid Build Coastguard Worker    instr_args: "InstructionArguments"
211*523fa7a6SAndroid Build Coastguard Worker
212*523fa7a6SAndroid Build Coastguard Worker
213*523fa7a6SAndroid Build Coastguard Worker@dataclass
214*523fa7a6SAndroid Build Coastguard Workerclass Frame:
215*523fa7a6SAndroid Build Coastguard Worker    filename: str
216*523fa7a6SAndroid Build Coastguard Worker    lineno: int
217*523fa7a6SAndroid Build Coastguard Worker    name: str
218*523fa7a6SAndroid Build Coastguard Worker    context: str
219*523fa7a6SAndroid Build Coastguard Worker
220*523fa7a6SAndroid Build Coastguard Worker
221*523fa7a6SAndroid Build Coastguard Worker@dataclass
222*523fa7a6SAndroid Build Coastguard Workerclass FrameList:
223*523fa7a6SAndroid Build Coastguard Worker    items: List[Frame]
224*523fa7a6SAndroid Build Coastguard Worker
225*523fa7a6SAndroid Build Coastguard Worker
226*523fa7a6SAndroid Build Coastguard Workerclass DataLocation(IntEnum):
227*523fa7a6SAndroid Build Coastguard Worker    INLINE = 0
228*523fa7a6SAndroid Build Coastguard Worker    SEGMENT = 1
229*523fa7a6SAndroid Build Coastguard Worker
230*523fa7a6SAndroid Build Coastguard Worker
231*523fa7a6SAndroid Build Coastguard Worker@dataclass
232*523fa7a6SAndroid Build Coastguard Workerclass BackendDelegateDataReference:
233*523fa7a6SAndroid Build Coastguard Worker    location: DataLocation
234*523fa7a6SAndroid Build Coastguard Worker    index: int
235*523fa7a6SAndroid Build Coastguard Worker
236*523fa7a6SAndroid Build Coastguard Worker
237*523fa7a6SAndroid Build Coastguard Worker@dataclass
238*523fa7a6SAndroid Build Coastguard Workerclass BackendDelegate:
239*523fa7a6SAndroid Build Coastguard Worker    id: str
240*523fa7a6SAndroid Build Coastguard Worker    processed: BackendDelegateDataReference
241*523fa7a6SAndroid Build Coastguard Worker    compile_specs: List[CompileSpec]
242*523fa7a6SAndroid Build Coastguard Worker
243*523fa7a6SAndroid Build Coastguard Worker
244*523fa7a6SAndroid Build Coastguard Worker@dataclass
245*523fa7a6SAndroid Build Coastguard Workerclass Chain:
246*523fa7a6SAndroid Build Coastguard Worker    inputs: List[int]
247*523fa7a6SAndroid Build Coastguard Worker    outputs: List[int]
248*523fa7a6SAndroid Build Coastguard Worker    instructions: List[Instruction]
249*523fa7a6SAndroid Build Coastguard Worker    stacktrace: Optional[List[FrameList]]
250*523fa7a6SAndroid Build Coastguard Worker
251*523fa7a6SAndroid Build Coastguard Worker
252*523fa7a6SAndroid Build Coastguard Worker@dataclass
253*523fa7a6SAndroid Build Coastguard Workerclass Operator:
254*523fa7a6SAndroid Build Coastguard Worker    name: str
255*523fa7a6SAndroid Build Coastguard Worker    overload: str
256*523fa7a6SAndroid Build Coastguard Worker
257*523fa7a6SAndroid Build Coastguard Worker
258*523fa7a6SAndroid Build Coastguard Worker@dataclass
259*523fa7a6SAndroid Build Coastguard Workerclass ExecutionPlan:
260*523fa7a6SAndroid Build Coastguard Worker    name: str
261*523fa7a6SAndroid Build Coastguard Worker    container_meta_type: ContainerMetadata
262*523fa7a6SAndroid Build Coastguard Worker    values: List[EValue]
263*523fa7a6SAndroid Build Coastguard Worker    inputs: List[int]
264*523fa7a6SAndroid Build Coastguard Worker    outputs: List[int]
265*523fa7a6SAndroid Build Coastguard Worker    chains: List[Chain]
266*523fa7a6SAndroid Build Coastguard Worker    operators: List[Operator]
267*523fa7a6SAndroid Build Coastguard Worker    delegates: List[BackendDelegate]
268*523fa7a6SAndroid Build Coastguard Worker    # the list index is memory buffer id, the value is the memory buffer size.
269*523fa7a6SAndroid Build Coastguard Worker    # memory_buffer_id == 0 is special and is for constant memory buffer.
270*523fa7a6SAndroid Build Coastguard Worker    # Runtime should use the len(constant_buffer) as the ground truch of
271*523fa7a6SAndroid Build Coastguard Worker    # constant memory buffer size, and ignore non_const_buffer_sizes[0].
272*523fa7a6SAndroid Build Coastguard Worker    non_const_buffer_sizes: List[int]
273*523fa7a6SAndroid Build Coastguard Worker
274*523fa7a6SAndroid Build Coastguard Worker
275*523fa7a6SAndroid Build Coastguard Worker@dataclass
276*523fa7a6SAndroid Build Coastguard Workerclass DataSegment:
277*523fa7a6SAndroid Build Coastguard Worker    offset: int
278*523fa7a6SAndroid Build Coastguard Worker    size: int
279*523fa7a6SAndroid Build Coastguard Worker
280*523fa7a6SAndroid Build Coastguard Worker
281*523fa7a6SAndroid Build Coastguard Worker@dataclass
282*523fa7a6SAndroid Build Coastguard Workerclass SubsegmentOffsets:
283*523fa7a6SAndroid Build Coastguard Worker    segment_index: int
284*523fa7a6SAndroid Build Coastguard Worker    offsets: List[int]
285*523fa7a6SAndroid Build Coastguard Worker
286*523fa7a6SAndroid Build Coastguard Worker
287*523fa7a6SAndroid Build Coastguard Worker@dataclass
288*523fa7a6SAndroid Build Coastguard Workerclass Program:
289*523fa7a6SAndroid Build Coastguard Worker    version: int
290*523fa7a6SAndroid Build Coastguard Worker    execution_plan: List[ExecutionPlan]
291*523fa7a6SAndroid Build Coastguard Worker    constant_buffer: List[Buffer]
292*523fa7a6SAndroid Build Coastguard Worker    backend_delegate_data: List[BackendDelegateInlineData]
293*523fa7a6SAndroid Build Coastguard Worker    segments: List[DataSegment]
294*523fa7a6SAndroid Build Coastguard Worker    constant_segment: SubsegmentOffsets
295*523fa7a6SAndroid Build Coastguard Worker    mutable_data_segments: Optional[List[SubsegmentOffsets]] = None
296