main.py revision 14184
17732SAli.Saidi@ARM.com# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 27732SAli.Saidi@ARM.com# Copyright (c) 2009 The Hewlett-Packard Development Company 37732SAli.Saidi@ARM.com# All rights reserved. 47732SAli.Saidi@ARM.com# 57732SAli.Saidi@ARM.com# Redistribution and use in source and binary forms, with or without 67732SAli.Saidi@ARM.com# modification, are permitted provided that the following conditions are 77732SAli.Saidi@ARM.com# met: redistributions of source code must retain the above copyright 87732SAli.Saidi@ARM.com# notice, this list of conditions and the following disclaimer; 97732SAli.Saidi@ARM.com# redistributions in binary form must reproduce the above copyright 107732SAli.Saidi@ARM.com# notice, this list of conditions and the following disclaimer in the 117732SAli.Saidi@ARM.com# documentation and/or other materials provided with the distribution; 127732SAli.Saidi@ARM.com# neither the name of the copyright holders nor the names of its 137732SAli.Saidi@ARM.com# contributors may be used to endorse or promote products derived from 147732SAli.Saidi@ARM.com# this software without specific prior written permission. 157732SAli.Saidi@ARM.com# 167732SAli.Saidi@ARM.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177732SAli.Saidi@ARM.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187732SAli.Saidi@ARM.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197732SAli.Saidi@ARM.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207732SAli.Saidi@ARM.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217732SAli.Saidi@ARM.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 227732SAli.Saidi@ARM.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237732SAli.Saidi@ARM.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 247732SAli.Saidi@ARM.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 257732SAli.Saidi@ARM.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 267732SAli.Saidi@ARM.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277732SAli.Saidi@ARM.com 287732SAli.Saidi@ARM.comfrom __future__ import print_function 297732SAli.Saidi@ARM.com 307732SAli.Saidi@ARM.comimport os 317732SAli.Saidi@ARM.comimport sys 327732SAli.Saidi@ARM.com 337732SAli.Saidi@ARM.comfrom slicc.parser import SLICC 347732SAli.Saidi@ARM.com 357732SAli.Saidi@ARM.comusage="%prog [options] <slicc file> ... " 367732SAli.Saidi@ARM.comversion="%prog v0.4" 377732SAli.Saidi@ARM.combrief_copyright=''' 387732SAli.Saidi@ARM.comCopyright (c) 1999-2008 Mark D. Hill and David A. Wood 397732SAli.Saidi@ARM.comCopyright (c) 2009 The Hewlett-Packard Development Company 407732SAli.Saidi@ARM.comAll Rights Reserved. 417732SAli.Saidi@ARM.com''' 427732SAli.Saidi@ARM.comhelp_details = '''This is intended to be used to process slicc files as a 439660SAndreas.Sandberg@ARM.comstandalone script. This script assumes that it is running in a directory under 447732SAli.Saidi@ARM.comgem5/ (e.g., gem5/temp). It takes a single argument: The path to a *.slicc 458987SAli.Saidi@ARM.comfile. By default it generates the C++ code in the directory generated/. This 468987SAli.Saidi@ARM.comscript can also generate the html SLICC output. See src/mem/slicc/main.py for 478987SAli.Saidi@ARM.commore details.''' 488987SAli.Saidi@ARM.com 497732SAli.Saidi@ARM.comdef nprint(format, *args): 507732SAli.Saidi@ARM.com pass 517732SAli.Saidi@ARM.com 527732SAli.Saidi@ARM.comdef eprint(format, *args): 537732SAli.Saidi@ARM.com if args: 549660SAndreas.Sandberg@ARM.com format = format % args 559686Sandreas@sandberg.pp.se 569660SAndreas.Sandberg@ARM.com print(format, file=sys.stderr) 579660SAndreas.Sandberg@ARM.com 589660SAndreas.Sandberg@ARM.comdef main(args=None): 599660SAndreas.Sandberg@ARM.com import optparse 609660SAndreas.Sandberg@ARM.com 619660SAndreas.Sandberg@ARM.com parser = optparse.OptionParser(usage=usage, version=version, 629660SAndreas.Sandberg@ARM.com epilog=help_details, 639686Sandreas@sandberg.pp.se description=brief_copyright) 649686Sandreas@sandberg.pp.se parser.add_option("-d", "--debug", default=False, action="store_true", 659686Sandreas@sandberg.pp.se help="Turn on PLY debugging") 669686Sandreas@sandberg.pp.se parser.add_option("-C", "--code-path", default="generated", 679686Sandreas@sandberg.pp.se help="Path where C++ code output code goes") 689660SAndreas.Sandberg@ARM.com parser.add_option("-H", "--html-path", 699660SAndreas.Sandberg@ARM.com help="Path where html output goes") 709660SAndreas.Sandberg@ARM.com parser.add_option("-F", "--print-files", action='store_true', 717732SAli.Saidi@ARM.com help="Print files that SLICC will generate") 729660SAndreas.Sandberg@ARM.com parser.add_option("--tb", "--traceback", action='store_true', 739660SAndreas.Sandberg@ARM.com help="print traceback on error") 749660SAndreas.Sandberg@ARM.com parser.add_option("-q", "--quiet", 759660SAndreas.Sandberg@ARM.com help="don't print messages") 769660SAndreas.Sandberg@ARM.com opts,files = parser.parse_args(args=args) 779660SAndreas.Sandberg@ARM.com 789686Sandreas@sandberg.pp.se if len(files) != 1: 799660SAndreas.Sandberg@ARM.com parser.print_help() 809660SAndreas.Sandberg@ARM.com sys.exit(2) 819660SAndreas.Sandberg@ARM.com 827732SAli.Saidi@ARM.com slicc_file = files[0] 839660SAndreas.Sandberg@ARM.com if not slicc_file.endswith('.slicc'): 849660SAndreas.Sandberg@ARM.com print("Must specify a .slicc file with a list of state machine files") 859660SAndreas.Sandberg@ARM.com parser.print_help() 869660SAndreas.Sandberg@ARM.com sys.exit(2) 879660SAndreas.Sandberg@ARM.com 889660SAndreas.Sandberg@ARM.com output = nprint if opts.quiet else eprint 899660SAndreas.Sandberg@ARM.com 909660SAndreas.Sandberg@ARM.com output("SLICC v0.4") 919660SAndreas.Sandberg@ARM.com output("Parsing...") 929660SAndreas.Sandberg@ARM.com 939687Sandreas@sandberg.pp.se protocol_base = os.path.join(os.path.dirname(__file__), 949660SAndreas.Sandberg@ARM.com '..', 'ruby', 'protocol') 959660SAndreas.Sandberg@ARM.com slicc = SLICC(slicc_file, protocol_base, verbose=True, debug=opts.debug, 969660SAndreas.Sandberg@ARM.com traceback=opts.tb) 979660SAndreas.Sandberg@ARM.com 989660SAndreas.Sandberg@ARM.com 999660SAndreas.Sandberg@ARM.com if opts.print_files: 1009660SAndreas.Sandberg@ARM.com for i in sorted(slicc.files()): 1019660SAndreas.Sandberg@ARM.com print(' %s' % i) 1029660SAndreas.Sandberg@ARM.com else: 1039660SAndreas.Sandberg@ARM.com output("Processing AST...") 1049660SAndreas.Sandberg@ARM.com slicc.process() 1059660SAndreas.Sandberg@ARM.com 1069660SAndreas.Sandberg@ARM.com if opts.html_path: 1079660SAndreas.Sandberg@ARM.com output("Writing HTML files...") 1089660SAndreas.Sandberg@ARM.com slicc.writeHTMLFiles(opts.html_path) 1099660SAndreas.Sandberg@ARM.com 1109660SAndreas.Sandberg@ARM.com output("Writing C++ files...") 1119660SAndreas.Sandberg@ARM.com slicc.writeCodeFiles(opts.code_path, []) 1129660SAndreas.Sandberg@ARM.com 1139660SAndreas.Sandberg@ARM.com 1149660SAndreas.Sandberg@ARM.com output("SLICC is Done.") 1159660SAndreas.Sandberg@ARM.com 1169660SAndreas.Sandberg@ARM.comif __name__ == "__main__": 1179660SAndreas.Sandberg@ARM.com main() 1189660SAndreas.Sandberg@ARM.com