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