main.py revision 12765:8c15915ba978
1# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 2# Copyright (c) 2009 The Hewlett-Packard Development Company 3# All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions are 7# met: redistributions of source code must retain the above copyright 8# notice, this list of conditions and the following disclaimer; 9# redistributions in binary form must reproduce the above copyright 10# notice, this list of conditions and the following disclaimer in the 11# documentation and/or other materials provided with the distribution; 12# neither the name of the copyright holders nor the names of its 13# contributors may be used to endorse or promote products derived from 14# this software without specific prior written permission. 15# 16# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28from __future__ import print_function 29 30import os 31import sys 32 33from slicc.parser import SLICC 34 35usage="%prog [options] <slicc file> ... " 36version="%prog v0.4" 37brief_copyright=''' 38Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 39Copyright (c) 2009 The Hewlett-Packard Development Company 40All Rights Reserved. 41''' 42help_details = '''This is intended to be used to process slicc files as a 43standalone script. This script assumes that it is running in a directory under 44gem5/ (e.g., gem5/temp). It takes a single argument: The path to a *.slicc 45file. By default it generates the C++ code in the directory generated/. This 46script can also generate the html SLICC output. See src/mem/slicc/main.py for 47more details.''' 48 49def nprint(format, *args): 50 pass 51 52def eprint(format, *args): 53 if args: 54 format = format % args 55 56 print(format, file=sys.stderr) 57 58def main(args=None): 59 import optparse 60 61 parser = optparse.OptionParser(usage=usage, version=version, 62 epilog=help_details, 63 description=brief_copyright) 64 parser.add_option("-d", "--debug", default=False, action="store_true", 65 help="Turn on PLY debugging") 66 parser.add_option("-C", "--code-path", default="generated", 67 help="Path where C++ code output code goes") 68 parser.add_option("-H", "--html-path", 69 help="Path where html output goes") 70 parser.add_option("-F", "--print-files", action='store_true', 71 help="Print files that SLICC will generate") 72 parser.add_option("--tb", "--traceback", action='store_true', 73 help="print traceback on error") 74 parser.add_option("-q", "--quiet", 75 help="don't print messages") 76 opts,files = parser.parse_args(args=args) 77 78 if len(files) != 1: 79 parser.print_help() 80 sys.exit(2) 81 82 slicc_file = files[0] 83 if not slicc_file.endswith('.slicc'): 84 print("Must specify a .slicc file with a list of state machine files") 85 parser.print_help() 86 sys.exit(2) 87 88 output = nprint if opts.quiet else eprint 89 90 output("SLICC v0.4") 91 output("Parsing...") 92 93 protocol_base = os.path.join(os.path.dirname(__file__), '..', 'protocol') 94 slicc = SLICC(slicc_file, protocol_base, verbose=True, debug=opts.debug, 95 traceback=opts.tb) 96 97 98 if opts.print_files: 99 for i in sorted(slicc.files()): 100 print(' %s' % i) 101 else: 102 output("Processing AST...") 103 slicc.process() 104 105 if opts.html_path: 106 output("Writing HTML files...") 107 slicc.writeHTMLFiles(opts.html_path) 108 109 output("Writing C++ files...") 110 slicc.writeCodeFiles(opts.code_path, []) 111 112 113 output("SLICC is Done.") 114 115if __name__ == "__main__": 116 main() 117