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