1cb93a386Sopenharmony_ci#!/usr/bin/env python 2cb93a386Sopenharmony_ci# Copyright (c) 2018 The Chromium Authors. All rights reserved. 3cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be 4cb93a386Sopenharmony_ci# found in the LICENSE file. 5cb93a386Sopenharmony_ci"""code generator for gpu workaround definitions""" 6cb93a386Sopenharmony_ci 7cb93a386Sopenharmony_ciimport os 8cb93a386Sopenharmony_ciimport os.path 9cb93a386Sopenharmony_ciimport sys 10cb93a386Sopenharmony_cifrom optparse import OptionParser 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ci_LICENSE = """// Copyright 2018 The Chromium Authors. All rights reserved. 13cb93a386Sopenharmony_ci// Use of this source code is governed by a BSD-style license that can be 14cb93a386Sopenharmony_ci// found in the LICENSE file. 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci""" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci_DO_NOT_EDIT_WARNING = ("// This file is auto-generated from " + 19cb93a386Sopenharmony_ci os.path.basename(__file__) + "\n" + 20cb93a386Sopenharmony_ci "// DO NOT EDIT!\n\n") 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cidef merge_files_into_workarounds(files): 23cb93a386Sopenharmony_ci workarounds = set() 24cb93a386Sopenharmony_ci for filename in files: 25cb93a386Sopenharmony_ci with open(filename, 'r') as f: 26cb93a386Sopenharmony_ci workarounds.update([workaround.strip() for workaround in f]) 27cb93a386Sopenharmony_ci return sorted(list(workarounds)) 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_cidef write_header(filename, workarounds): 31cb93a386Sopenharmony_ci max_workaround_len = len(max(workarounds, key=len)) 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci with open(filename, 'w') as f: 34cb93a386Sopenharmony_ci f.write(_LICENSE) 35cb93a386Sopenharmony_ci f.write(_DO_NOT_EDIT_WARNING) 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci indent = ' ' 38cb93a386Sopenharmony_ci macro = 'GPU_OP' 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci # length of max string passed to write + 1 41cb93a386Sopenharmony_ci max_len = len(indent) + len(macro) + 1 + max_workaround_len + 1 + 1 42cb93a386Sopenharmony_ci write = lambda line: f.write(line + ' ' * (max_len - len(line)) + '\\\n') 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci write('#define GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)') 45cb93a386Sopenharmony_ci for w in workarounds: 46cb93a386Sopenharmony_ci write(indent + macro + '(' + w.upper() + ',') 47cb93a386Sopenharmony_ci write(indent + ' ' * (len(macro) + 1) + w + ')') 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci # one extra line to put 'The End' comment. 50cb93a386Sopenharmony_ci f.write('// The End\n') 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_cidef main(argv): 54cb93a386Sopenharmony_ci usage = "usage: %prog [options] file1 file2 file3 etc" 55cb93a386Sopenharmony_ci parser = OptionParser(usage=usage) 56cb93a386Sopenharmony_ci parser.add_option( 57cb93a386Sopenharmony_ci "--output-file", 58cb93a386Sopenharmony_ci dest="output_file", 59cb93a386Sopenharmony_ci default="gpu_driver_bug_workaround_autogen.h", 60cb93a386Sopenharmony_ci help="the name of the header file to write") 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci (options, _) = parser.parse_args(args=argv) 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci workarounds = merge_files_into_workarounds(parser.largs) 65cb93a386Sopenharmony_ci write_header(options.output_file, workarounds) 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ciif __name__ == '__main__': 69cb93a386Sopenharmony_ci sys.exit(main(sys.argv[1:])) 70