| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/python | |
| 2 # | |
| 3 # Copyright 2012 The Native Client Authors. All rights reserved. | |
| 4 # Use of this source code is governed by a BSD-style license that can | |
| 5 # be found in the LICENSE file. | |
| 6 # | |
| 7 | |
| 8 """Decoder Generator script. | |
| 9 | |
| 10 Usage: generate-decoder.py <table-file> <output-cc-file> <decoder-name> | |
| 11 | |
| 12 Note: If the file ends with named.{h,cc}, it is assumed that one should | |
| 13 build the corresponding source file for named classes, so that testing | |
| 14 is easier to perform. In either case, the .h file will declare a decoder | |
| 15 state (with the given decoder name) to decode instructions, while the | |
| 16 .cc file will define the methods for the declared decoder state. | |
| 17 """ | |
| 18 | |
| 19 import re | |
| 20 import sys | |
| 21 import dgen_input | |
| 22 import dgen_decoder_output | |
| 23 import dgen_test_output | |
| 24 | |
| 25 def _localize_filename(filename): | |
| 26 """ Strips off directories above 'native_client', returning | |
| 27 a location neutral name for the file | |
| 28 """ | |
| 29 m = re.match(r'.*/(native_client/.*)', filename) | |
| 30 if m: | |
| 31 return m.group(1) | |
| 32 else: | |
| 33 # Don't know localized | |
| 34 return filename | |
| 35 | |
| 36 def main(argv): | |
| 37 table_filename = argv[1] | |
| 38 output_filename = argv[2] | |
| 39 decoder_name = argv[3] | |
| 40 | |
| 41 print "Decoder Generator reading ", table_filename | |
| 42 f = open(table_filename, 'r') | |
| 43 decoder = dgen_input.parse_tables(f) | |
| 44 f.close() | |
| 45 | |
| 46 print "Successful - got %d tables." % len(decoder.tables()) | |
| 47 | |
| 48 print "Generating %s..." % output_filename | |
| 49 f = open(output_filename, 'w') | |
| 50 | |
| 51 if output_filename.endswith('tests.cc'): | |
| 52 dgen_test_output.generate_tests_cc(decoder, | |
| 53 decoder_name, | |
| 54 f) | |
| 55 elif output_filename.endswith('named_classes.h'): | |
| 56 dgen_test_output.generate_named_classes_h( | |
| 57 decoder, decoder_name, _localize_filename(output_filename), | |
| 58 f) | |
| 59 elif output_filename.endswith('named_decoder.h'): | |
| 60 dgen_test_output.generate_named_decoder_h( | |
| 61 decoder, decoder_name, _localize_filename(output_filename), f) | |
| 62 elif output_filename.endswith('.h'): | |
| 63 dgen_decoder_output.generate_h( | |
| 64 decoder, decoder_name, _localize_filename(output_filename), f) | |
| 65 elif output_filename.endswith('named.cc'): | |
| 66 dgen_test_output.generate_named_cc( | |
| 67 decoder, decoder_name, _localize_filename(output_filename), f) | |
| 68 elif output_filename.endswith('.cc'): | |
| 69 dgen_decoder_output.generate_cc( | |
| 70 decoder, decoder_name, _localize_filename(output_filename), f) | |
| 71 else: | |
| 72 print 'Error: output filename not of form "*.{h,cc}"' | |
| 73 f.close() | |
| 74 print "Completed." | |
| 75 | |
| 76 return 0 | |
| 77 | |
| 78 if __name__ == '__main__': | |
| 79 sys.exit(main(sys.argv)) | |
| OLD | NEW |