# Copyright (c) Meta Platforms, Inc. and affiliates. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. # pyre-strict import json import os import tempfile import pkg_resources from executorch.devtools.etdump.schema_flatcc import ETDumpFlatCC from executorch.exir._serialize._dataclass import _DataclassEncoder, _json_to_dataclass from executorch.exir._serialize._flatbuffer import _flatc_compile, _flatc_decompile # The prefix of schema files used for etdump ETDUMP_FLATCC_SCHEMA_NAME = "etdump_schema_flatcc" SCALAR_TYPE_SCHEMA_NAME = "scalar_type" def _write_schema(d: str, schema_name: str) -> None: schema_path = os.path.join(d, "{}.fbs".format(schema_name)) with open(schema_path, "wb") as schema_file: schema_file.write( pkg_resources.resource_string(__name__, "{}.fbs".format(schema_name)) ) def _serialize_from_etdump_to_json(etdump: ETDumpFlatCC) -> str: return json.dumps(etdump, cls=_DataclassEncoder, indent=4) """ ETDump FlatCC Schema Implementations """ # from json to etdump def _deserialize_from_json_to_etdump_flatcc(etdump_json: bytes) -> ETDumpFlatCC: etdump_json = json.loads(etdump_json) return _json_to_dataclass(etdump_json, ETDumpFlatCC) def _convert_to_flatcc(etdump_json: str) -> bytes: with tempfile.TemporaryDirectory() as d: # load given and common schema _write_schema(d, ETDUMP_FLATCC_SCHEMA_NAME) _write_schema(d, SCALAR_TYPE_SCHEMA_NAME) schema_path = os.path.join(d, "{}.fbs".format(ETDUMP_FLATCC_SCHEMA_NAME)) json_path = os.path.join(d, "{}.json".format(ETDUMP_FLATCC_SCHEMA_NAME)) with open(json_path, "wb") as json_file: json_file.write(etdump_json.encode("ascii")) _flatc_compile(d, schema_path, json_path) output_path = os.path.join(d, "{}.etdp".format(ETDUMP_FLATCC_SCHEMA_NAME)) with open(output_path, "rb") as output_file: return output_file.read() def _convert_from_flatcc(etdump_flatbuffer: bytes, size_prefixed: bool = True) -> bytes: with tempfile.TemporaryDirectory() as d: _write_schema(d, ETDUMP_FLATCC_SCHEMA_NAME) _write_schema(d, SCALAR_TYPE_SCHEMA_NAME) schema_path = os.path.join(d, "{}.fbs".format(ETDUMP_FLATCC_SCHEMA_NAME)) bin_path = os.path.join(d, "schema.bin") with open(bin_path, "wb") as bin_file: bin_file.write(etdump_flatbuffer) additional_args = [] if size_prefixed: additional_args = ["--size-prefixed"] _flatc_decompile(d, schema_path, bin_path, additional_args) output_path = os.path.join(d, "schema.json") with open(output_path, "rb") as output_file: return output_file.read() def serialize_to_etdump_flatcc( etdump: ETDumpFlatCC, ) -> bytes: """ Given an ETdump python object this function will return a serialized object that can then be written to a file using the FlatCC schema. Args: etdump: ETDump python object that the user wants to serialize. Returns: Serialized etdump binary blob using the FlatCC schema """ return _convert_to_flatcc(_serialize_from_etdump_to_json(etdump)) def deserialize_from_etdump_flatcc( data: bytes, size_prefixed: bool = True ) -> ETDumpFlatCC: """ Given an etdump binary blob (constructed using the FlatCC schema) this function will deserialize it and return the FlatCC python object representation of etdump. Args: data: Serialized etdump binary blob. Returns: Deserialized ETDump python object. """ return _deserialize_from_json_to_etdump_flatcc( _convert_from_flatcc(data, size_prefixed) )