xref: /aosp_15_r20/external/XNNPACK/tools/generate-enum-strings.py (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker#!/usr/bin/env python
2*4bdc9457SAndroid Build Coastguard Worker# Copyright 2022 Google LLC
3*4bdc9457SAndroid Build Coastguard Worker#
4*4bdc9457SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the
5*4bdc9457SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree.
6*4bdc9457SAndroid Build Coastguard Worker
7*4bdc9457SAndroid Build Coastguard Workerimport argparse
8*4bdc9457SAndroid Build Coastguard Workerimport codecs
9*4bdc9457SAndroid Build Coastguard Workerimport math
10*4bdc9457SAndroid Build Coastguard Workerimport os
11*4bdc9457SAndroid Build Coastguard Workerimport re
12*4bdc9457SAndroid Build Coastguard Workerimport sys
13*4bdc9457SAndroid Build Coastguard Workerimport yaml
14*4bdc9457SAndroid Build Coastguard Worker
15*4bdc9457SAndroid Build Coastguard Workersys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
16*4bdc9457SAndroid Build Coastguard Workerimport xngen
17*4bdc9457SAndroid Build Coastguard Workerimport xnncommon
18*4bdc9457SAndroid Build Coastguard Worker
19*4bdc9457SAndroid Build Coastguard Workerparser = argparse.ArgumentParser(
20*4bdc9457SAndroid Build Coastguard Worker    description="Generates operator-strings code.")
21*4bdc9457SAndroid Build Coastguard Workerparser.add_argument(
22*4bdc9457SAndroid Build Coastguard Worker    "-s",
23*4bdc9457SAndroid Build Coastguard Worker    "--spec",
24*4bdc9457SAndroid Build Coastguard Worker    metavar="FILE",
25*4bdc9457SAndroid Build Coastguard Worker    required=True,
26*4bdc9457SAndroid Build Coastguard Worker    help="Specification (YAML) file")
27*4bdc9457SAndroid Build Coastguard Workerparser.add_argument(
28*4bdc9457SAndroid Build Coastguard Worker    "-o",
29*4bdc9457SAndroid Build Coastguard Worker    "--output",
30*4bdc9457SAndroid Build Coastguard Worker    metavar="FILE",
31*4bdc9457SAndroid Build Coastguard Worker    required=True,
32*4bdc9457SAndroid Build Coastguard Worker    help="Output (C source) file")
33*4bdc9457SAndroid Build Coastguard Workerparser.add_argument(
34*4bdc9457SAndroid Build Coastguard Worker    "-e",
35*4bdc9457SAndroid Build Coastguard Worker    "--enum",
36*4bdc9457SAndroid Build Coastguard Worker    metavar="FILE",
37*4bdc9457SAndroid Build Coastguard Worker    required=True,
38*4bdc9457SAndroid Build Coastguard Worker    help="Enum to generate")
39*4bdc9457SAndroid Build Coastguard Workerparser.set_defaults(defines=list())
40*4bdc9457SAndroid Build Coastguard Worker
41*4bdc9457SAndroid Build Coastguard Worker
42*4bdc9457SAndroid Build Coastguard Workerdef main(args):
43*4bdc9457SAndroid Build Coastguard Worker  options = parser.parse_args(args)
44*4bdc9457SAndroid Build Coastguard Worker
45*4bdc9457SAndroid Build Coastguard Worker  with codecs.open(options.spec, "r", encoding="utf-8") as spec_file:
46*4bdc9457SAndroid Build Coastguard Worker    spec_yaml = yaml.safe_load(spec_file)
47*4bdc9457SAndroid Build Coastguard Worker    if not isinstance(spec_yaml, list):
48*4bdc9457SAndroid Build Coastguard Worker      raise ValueError("expected a list of operators in the spec")
49*4bdc9457SAndroid Build Coastguard Worker
50*4bdc9457SAndroid Build Coastguard Worker    output = """\
51*4bdc9457SAndroid Build Coastguard Worker// Copyright 2022 Google LLC
52*4bdc9457SAndroid Build Coastguard Worker//
53*4bdc9457SAndroid Build Coastguard Worker// This source code is licensed under the BSD-style license found in the
54*4bdc9457SAndroid Build Coastguard Worker// LICENSE file in the root directory of this source tree.
55*4bdc9457SAndroid Build Coastguard Worker//
56*4bdc9457SAndroid Build Coastguard Worker// Auto-generated file. Do not edit!
57*4bdc9457SAndroid Build Coastguard Worker//   Specification: {specification}
58*4bdc9457SAndroid Build Coastguard Worker//   Generator: {generator}
59*4bdc9457SAndroid Build Coastguard Worker
60*4bdc9457SAndroid Build Coastguard Worker
61*4bdc9457SAndroid Build Coastguard Worker#include <assert.h>
62*4bdc9457SAndroid Build Coastguard Worker#include <stdint.h>
63*4bdc9457SAndroid Build Coastguard Worker
64*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/{enum}-type.h>
65*4bdc9457SAndroid Build Coastguard Worker
66*4bdc9457SAndroid Build Coastguard Worker""".format(
67*4bdc9457SAndroid Build Coastguard Worker    specification=options.spec, generator=sys.argv[0], enum=options.enum)
68*4bdc9457SAndroid Build Coastguard Worker
69*4bdc9457SAndroid Build Coastguard Worker    all_strings = ''
70*4bdc9457SAndroid Build Coastguard Worker    pos = 0
71*4bdc9457SAndroid Build Coastguard Worker    offset = "static const uint16_t offset[] = {";
72*4bdc9457SAndroid Build Coastguard Worker    last_member = ""
73*4bdc9457SAndroid Build Coastguard Worker    for ukernel_spec in spec_yaml:
74*4bdc9457SAndroid Build Coastguard Worker      name = ukernel_spec["name"]
75*4bdc9457SAndroid Build Coastguard Worker      string = ukernel_spec["string"]
76*4bdc9457SAndroid Build Coastguard Worker
77*4bdc9457SAndroid Build Coastguard Worker      all_strings +=  '    "' + string + '\\0"\n'
78*4bdc9457SAndroid Build Coastguard Worker
79*4bdc9457SAndroid Build Coastguard Worker      offset += str(pos) + ","
80*4bdc9457SAndroid Build Coastguard Worker      pos += len(string) + 1
81*4bdc9457SAndroid Build Coastguard Worker      last_member = name
82*4bdc9457SAndroid Build Coastguard Worker
83*4bdc9457SAndroid Build Coastguard Worker    offset = offset[:-1] + "};"
84*4bdc9457SAndroid Build Coastguard Worker    output += offset + '\n\n';
85*4bdc9457SAndroid Build Coastguard Worker    output += """static const char *data =
86*4bdc9457SAndroid Build Coastguard Worker{all_strings};
87*4bdc9457SAndroid Build Coastguard Worker""".format(all_strings=all_strings)
88*4bdc9457SAndroid Build Coastguard Worker
89*4bdc9457SAndroid Build Coastguard Worker    output += """
90*4bdc9457SAndroid Build Coastguard Workerconst char* xnn_{enum}_type_to_string(enum xnn_{enum}_type type) {{
91*4bdc9457SAndroid Build Coastguard Worker  assert(type <= {last_member});
92*4bdc9457SAndroid Build Coastguard Worker  return &data[offset[type]];
93*4bdc9457SAndroid Build Coastguard Worker}}""".format(last_member=last_member, enum=options.enum)
94*4bdc9457SAndroid Build Coastguard Worker
95*4bdc9457SAndroid Build Coastguard Worker    txt_changed = True
96*4bdc9457SAndroid Build Coastguard Worker    if os.path.exists(options.output):
97*4bdc9457SAndroid Build Coastguard Worker      with codecs.open(options.output, "r", encoding="utf-8") as output_file:
98*4bdc9457SAndroid Build Coastguard Worker        txt_changed = output_file.read() != output
99*4bdc9457SAndroid Build Coastguard Worker
100*4bdc9457SAndroid Build Coastguard Worker    if txt_changed:
101*4bdc9457SAndroid Build Coastguard Worker      with codecs.open(options.output, "w", encoding="utf-8") as output_file:
102*4bdc9457SAndroid Build Coastguard Worker        output_file.write(output)
103*4bdc9457SAndroid Build Coastguard Worker
104*4bdc9457SAndroid Build Coastguard Worker
105*4bdc9457SAndroid Build Coastguard Workerif __name__ == "__main__":
106*4bdc9457SAndroid Build Coastguard Worker  main(sys.argv[1:])
107