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