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 Workerimport json 10*523fa7a6SAndroid Build Coastguard Workerimport os 11*523fa7a6SAndroid Build Coastguard Workerimport tempfile 12*523fa7a6SAndroid Build Coastguard Worker 13*523fa7a6SAndroid Build Coastguard Workerimport pkg_resources 14*523fa7a6SAndroid Build Coastguard Workerfrom executorch.devtools.etdump.schema_flatcc import ETDumpFlatCC 15*523fa7a6SAndroid Build Coastguard Worker 16*523fa7a6SAndroid Build Coastguard Workerfrom executorch.exir._serialize._dataclass import _DataclassEncoder, _json_to_dataclass 17*523fa7a6SAndroid Build Coastguard Worker 18*523fa7a6SAndroid Build Coastguard Workerfrom executorch.exir._serialize._flatbuffer import _flatc_compile, _flatc_decompile 19*523fa7a6SAndroid Build Coastguard Worker 20*523fa7a6SAndroid Build Coastguard Worker# The prefix of schema files used for etdump 21*523fa7a6SAndroid Build Coastguard WorkerETDUMP_FLATCC_SCHEMA_NAME = "etdump_schema_flatcc" 22*523fa7a6SAndroid Build Coastguard WorkerSCALAR_TYPE_SCHEMA_NAME = "scalar_type" 23*523fa7a6SAndroid Build Coastguard Worker 24*523fa7a6SAndroid Build Coastguard Worker 25*523fa7a6SAndroid Build Coastguard Workerdef _write_schema(d: str, schema_name: str) -> None: 26*523fa7a6SAndroid Build Coastguard Worker schema_path = os.path.join(d, "{}.fbs".format(schema_name)) 27*523fa7a6SAndroid Build Coastguard Worker with open(schema_path, "wb") as schema_file: 28*523fa7a6SAndroid Build Coastguard Worker schema_file.write( 29*523fa7a6SAndroid Build Coastguard Worker pkg_resources.resource_string(__name__, "{}.fbs".format(schema_name)) 30*523fa7a6SAndroid Build Coastguard Worker ) 31*523fa7a6SAndroid Build Coastguard Worker 32*523fa7a6SAndroid Build Coastguard Worker 33*523fa7a6SAndroid Build Coastguard Workerdef _serialize_from_etdump_to_json(etdump: ETDumpFlatCC) -> str: 34*523fa7a6SAndroid Build Coastguard Worker return json.dumps(etdump, cls=_DataclassEncoder, indent=4) 35*523fa7a6SAndroid Build Coastguard Worker 36*523fa7a6SAndroid Build Coastguard Worker 37*523fa7a6SAndroid Build Coastguard Worker""" 38*523fa7a6SAndroid Build Coastguard WorkerETDump FlatCC Schema Implementations 39*523fa7a6SAndroid Build Coastguard Worker""" 40*523fa7a6SAndroid Build Coastguard Worker 41*523fa7a6SAndroid Build Coastguard Worker 42*523fa7a6SAndroid Build Coastguard Worker# from json to etdump 43*523fa7a6SAndroid Build Coastguard Workerdef _deserialize_from_json_to_etdump_flatcc(etdump_json: bytes) -> ETDumpFlatCC: 44*523fa7a6SAndroid Build Coastguard Worker etdump_json = json.loads(etdump_json) 45*523fa7a6SAndroid Build Coastguard Worker return _json_to_dataclass(etdump_json, ETDumpFlatCC) 46*523fa7a6SAndroid Build Coastguard Worker 47*523fa7a6SAndroid Build Coastguard Worker 48*523fa7a6SAndroid Build Coastguard Workerdef _convert_to_flatcc(etdump_json: str) -> bytes: 49*523fa7a6SAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as d: 50*523fa7a6SAndroid Build Coastguard Worker # load given and common schema 51*523fa7a6SAndroid Build Coastguard Worker _write_schema(d, ETDUMP_FLATCC_SCHEMA_NAME) 52*523fa7a6SAndroid Build Coastguard Worker _write_schema(d, SCALAR_TYPE_SCHEMA_NAME) 53*523fa7a6SAndroid Build Coastguard Worker 54*523fa7a6SAndroid Build Coastguard Worker schema_path = os.path.join(d, "{}.fbs".format(ETDUMP_FLATCC_SCHEMA_NAME)) 55*523fa7a6SAndroid Build Coastguard Worker json_path = os.path.join(d, "{}.json".format(ETDUMP_FLATCC_SCHEMA_NAME)) 56*523fa7a6SAndroid Build Coastguard Worker with open(json_path, "wb") as json_file: 57*523fa7a6SAndroid Build Coastguard Worker json_file.write(etdump_json.encode("ascii")) 58*523fa7a6SAndroid Build Coastguard Worker 59*523fa7a6SAndroid Build Coastguard Worker _flatc_compile(d, schema_path, json_path) 60*523fa7a6SAndroid Build Coastguard Worker output_path = os.path.join(d, "{}.etdp".format(ETDUMP_FLATCC_SCHEMA_NAME)) 61*523fa7a6SAndroid Build Coastguard Worker with open(output_path, "rb") as output_file: 62*523fa7a6SAndroid Build Coastguard Worker return output_file.read() 63*523fa7a6SAndroid Build Coastguard Worker 64*523fa7a6SAndroid Build Coastguard Worker 65*523fa7a6SAndroid Build Coastguard Workerdef _convert_from_flatcc(etdump_flatbuffer: bytes, size_prefixed: bool = True) -> bytes: 66*523fa7a6SAndroid Build Coastguard Worker with tempfile.TemporaryDirectory() as d: 67*523fa7a6SAndroid Build Coastguard Worker _write_schema(d, ETDUMP_FLATCC_SCHEMA_NAME) 68*523fa7a6SAndroid Build Coastguard Worker _write_schema(d, SCALAR_TYPE_SCHEMA_NAME) 69*523fa7a6SAndroid Build Coastguard Worker 70*523fa7a6SAndroid Build Coastguard Worker schema_path = os.path.join(d, "{}.fbs".format(ETDUMP_FLATCC_SCHEMA_NAME)) 71*523fa7a6SAndroid Build Coastguard Worker bin_path = os.path.join(d, "schema.bin") 72*523fa7a6SAndroid Build Coastguard Worker with open(bin_path, "wb") as bin_file: 73*523fa7a6SAndroid Build Coastguard Worker bin_file.write(etdump_flatbuffer) 74*523fa7a6SAndroid Build Coastguard Worker additional_args = [] 75*523fa7a6SAndroid Build Coastguard Worker if size_prefixed: 76*523fa7a6SAndroid Build Coastguard Worker additional_args = ["--size-prefixed"] 77*523fa7a6SAndroid Build Coastguard Worker _flatc_decompile(d, schema_path, bin_path, additional_args) 78*523fa7a6SAndroid Build Coastguard Worker output_path = os.path.join(d, "schema.json") 79*523fa7a6SAndroid Build Coastguard Worker with open(output_path, "rb") as output_file: 80*523fa7a6SAndroid Build Coastguard Worker return output_file.read() 81*523fa7a6SAndroid Build Coastguard Worker 82*523fa7a6SAndroid Build Coastguard Worker 83*523fa7a6SAndroid Build Coastguard Workerdef serialize_to_etdump_flatcc( 84*523fa7a6SAndroid Build Coastguard Worker etdump: ETDumpFlatCC, 85*523fa7a6SAndroid Build Coastguard Worker) -> bytes: 86*523fa7a6SAndroid Build Coastguard Worker """ 87*523fa7a6SAndroid Build Coastguard Worker Given an ETdump python object this function will return a serialized object 88*523fa7a6SAndroid Build Coastguard Worker that can then be written to a file using the FlatCC schema. 89*523fa7a6SAndroid Build Coastguard Worker Args: 90*523fa7a6SAndroid Build Coastguard Worker etdump: ETDump python object that the user wants to serialize. 91*523fa7a6SAndroid Build Coastguard Worker Returns: 92*523fa7a6SAndroid Build Coastguard Worker Serialized etdump binary blob using the FlatCC schema 93*523fa7a6SAndroid Build Coastguard Worker """ 94*523fa7a6SAndroid Build Coastguard Worker return _convert_to_flatcc(_serialize_from_etdump_to_json(etdump)) 95*523fa7a6SAndroid Build Coastguard Worker 96*523fa7a6SAndroid Build Coastguard Worker 97*523fa7a6SAndroid Build Coastguard Workerdef deserialize_from_etdump_flatcc( 98*523fa7a6SAndroid Build Coastguard Worker data: bytes, size_prefixed: bool = True 99*523fa7a6SAndroid Build Coastguard Worker) -> ETDumpFlatCC: 100*523fa7a6SAndroid Build Coastguard Worker """ 101*523fa7a6SAndroid Build Coastguard Worker Given an etdump binary blob (constructed using the FlatCC schema) this function will deserialize 102*523fa7a6SAndroid Build Coastguard Worker it and return the FlatCC python object representation of etdump. 103*523fa7a6SAndroid Build Coastguard Worker Args: 104*523fa7a6SAndroid Build Coastguard Worker data: Serialized etdump binary blob. 105*523fa7a6SAndroid Build Coastguard Worker Returns: 106*523fa7a6SAndroid Build Coastguard Worker Deserialized ETDump python object. 107*523fa7a6SAndroid Build Coastguard Worker """ 108*523fa7a6SAndroid Build Coastguard Worker return _deserialize_from_json_to_etdump_flatcc( 109*523fa7a6SAndroid Build Coastguard Worker _convert_from_flatcc(data, size_prefixed) 110*523fa7a6SAndroid Build Coastguard Worker ) 111