xref: /aosp_15_r20/external/executorch/devtools/etdump/serialize.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 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