SConscript revision 6999:f226c098c393
1955SN/A# -*- mode:python -*-
2955SN/A
31762SN/A# Copyright (c) 2009 The Hewlett-Packard Development Company
4955SN/A# All rights reserved.
5955SN/A#
6955SN/A# Redistribution and use in source and binary forms, with or without
7955SN/A# modification, are permitted provided that the following conditions are
8955SN/A# met: redistributions of source code must retain the above copyright
9955SN/A# notice, this list of conditions and the following disclaimer;
10955SN/A# redistributions in binary form must reproduce the above copyright
11955SN/A# notice, this list of conditions and the following disclaimer in the
12955SN/A# documentation and/or other materials provided with the distribution;
13955SN/A# neither the name of the copyright holders nor the names of its
14955SN/A# contributors may be used to endorse or promote products derived from
15955SN/A# this software without specific prior written permission.
16955SN/A#
17955SN/A# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18955SN/A# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19955SN/A# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20955SN/A# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21955SN/A# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22955SN/A# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23955SN/A# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24955SN/A# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25955SN/A# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26955SN/A# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27955SN/A# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282665Ssaidi@eecs.umich.edu#
292665Ssaidi@eecs.umich.edu# Authors: Nathan Binkert
30955SN/A
31955SN/Aimport os
32955SN/Aimport sys
33955SN/A
34955SN/Afrom os.path import isdir, isfile, join as joinpath
352632Sstever@eecs.umich.edu
362632Sstever@eecs.umich.eduImport('*')
372632Sstever@eecs.umich.edu
382632Sstever@eecs.umich.eduif not env['RUBY']:
39955SN/A    Return()
402632Sstever@eecs.umich.edu
412632Sstever@eecs.umich.eduprotocol_dir = Dir('.')
422761Sstever@eecs.umich.eduhtml_dir = Dir('html')
432632Sstever@eecs.umich.eduslicc_dir = Dir('../slicc')
442632Sstever@eecs.umich.edu
452632Sstever@eecs.umich.edusys.path[1:1] = [ Dir('..').srcnode().abspath ]
462761Sstever@eecs.umich.edufrom slicc.parser import SLICC
472761Sstever@eecs.umich.edu
482761Sstever@eecs.umich.eduslicc_depends = []
492632Sstever@eecs.umich.edufor root,dirs,files in os.walk(slicc_dir.srcnode().abspath):
502632Sstever@eecs.umich.edu    for f in files:
512761Sstever@eecs.umich.edu        if f.endswith('.py'):
522761Sstever@eecs.umich.edu            slicc_depends.append(File(joinpath(root, f)))
532761Sstever@eecs.umich.edu
542761Sstever@eecs.umich.edu#
552761Sstever@eecs.umich.edu# Use SLICC
562632Sstever@eecs.umich.edu#
572632Sstever@eecs.umich.edu
582632Sstever@eecs.umich.edudef slicc_scanner(node, env, path):
592632Sstever@eecs.umich.edu    contents = node.get_contents()
602632Sstever@eecs.umich.edu    files = [ line.strip() for line in contents.splitlines() if line ]
612632Sstever@eecs.umich.edu    return files
622632Sstever@eecs.umich.edu
63955SN/Aenv.Append(SCANNERS=Scanner(function=slicc_scanner,skeys=['.slicc']))
64955SN/A
65955SN/Adef slicc_emitter(target, source, env):
66955SN/A    protocol = source[0].get_contents()
67955SN/A    files = [s.srcnode().abspath for s in source[1:]]
68955SN/A    slicc = SLICC(protocol, debug=True)
69955SN/A    print "SLICC parsing..."
702656Sstever@eecs.umich.edu    for name in slicc.load(files, verbose=True):
712656Sstever@eecs.umich.edu        print "    %s" % name
722656Sstever@eecs.umich.edu
732656Sstever@eecs.umich.edu    target.extend(sorted(slicc.files()))
742656Sstever@eecs.umich.edu    pdir = str(protocol_dir)
752656Sstever@eecs.umich.edu    hdir = str(html_dir)
762656Sstever@eecs.umich.edu
772653Sstever@eecs.umich.edu    if not isdir(pdir):
782653Sstever@eecs.umich.edu        os.mkdir(pdir)
792653Sstever@eecs.umich.edu    if not isdir(hdir):
802653Sstever@eecs.umich.edu        os.mkdir(hdir)
812653Sstever@eecs.umich.edu
822653Sstever@eecs.umich.edu    print "SLICC Generator pass 1..."
832653Sstever@eecs.umich.edu    slicc.findMachines()
842653Sstever@eecs.umich.edu
852653Sstever@eecs.umich.edu    print "SLICC Generator pass 2..."
862653Sstever@eecs.umich.edu    slicc.generate()
872653Sstever@eecs.umich.edu
881852SN/A    print "SLICC writing C++ files..."
89955SN/A    slicc.writeCodeFiles(pdir)
90955SN/A
91955SN/A    if env['NO_HTML']:
922632Sstever@eecs.umich.edu        print "skipping HTML file creation"
932632Sstever@eecs.umich.edu    else:
94955SN/A        print "SLICC writing HTML files..."
951533SN/A        slicc.writeHTMLFiles(hdir)
962632Sstever@eecs.umich.edu    return target, source
971533SN/A
98955SN/Adef slicc_action(target, source, env):
99955SN/A    protocol = source[0].get_contents()
1002632Sstever@eecs.umich.edu    pdir = str(protocol_dir)
1012632Sstever@eecs.umich.edu    hdir = str(html_dir)
102955SN/A
103955SN/A    if not isdir(pdir):
104955SN/A        os.mkdir(pdir)
105955SN/A    if not isdir(hdir):
1062632Sstever@eecs.umich.edu        os.mkdir(hdir)
107955SN/A
1082632Sstever@eecs.umich.edu    slicc = SLICC(protocol, debug=True)
109955SN/A    files = [str(s) for s in source[1:]]
110955SN/A    slicc.load(files, verbose=False)
1112632Sstever@eecs.umich.edu
1122632Sstever@eecs.umich.edu    print "SLICC Generator pass 1..."
1132632Sstever@eecs.umich.edu    slicc.findMachines()
1142632Sstever@eecs.umich.edu
1152632Sstever@eecs.umich.edu    print "SLICC Generator pass 2..."
1162632Sstever@eecs.umich.edu    slicc.generate()
1172632Sstever@eecs.umich.edu
1182632Sstever@eecs.umich.edu    print "SLICC writing C++ files..."
1192632Sstever@eecs.umich.edu    slicc.writeCodeFiles(pdir)
1202632Sstever@eecs.umich.edu
1212632Sstever@eecs.umich.edu    if env['NO_HTML']:
1223053Sstever@eecs.umich.edu        print "skipping HTML file creation"
1233053Sstever@eecs.umich.edu    else:
1243053Sstever@eecs.umich.edu        print "SLICC writing HTML files..."
1253053Sstever@eecs.umich.edu        slicc.writeHTMLFiles(hdir)
1263053Sstever@eecs.umich.edu
1273053Sstever@eecs.umich.eduslicc_builder = Builder(action=slicc_action, emitter=slicc_emitter)
1283053Sstever@eecs.umich.edu
1293053Sstever@eecs.umich.eduprotocol = env['PROTOCOL']
1303053Sstever@eecs.umich.edusources = [ protocol_dir.File("RubySlicc_interfaces.slicc"),
1313053Sstever@eecs.umich.edu            protocol_dir.File("%s.slicc" % protocol) ]
1323053Sstever@eecs.umich.edu
1333053Sstever@eecs.umich.eduenv.Append(BUILDERS={'SLICC' : slicc_builder})
1343053Sstever@eecs.umich.edunodes = env.SLICC([], [ Value(protocol) ] + sources)
1353053Sstever@eecs.umich.eduenv.Depends(nodes, slicc_depends)
1363053Sstever@eecs.umich.edu
1373053Sstever@eecs.umich.edufor f in nodes:
1382632Sstever@eecs.umich.edu    s = str(f)
1392632Sstever@eecs.umich.edu    if s.endswith('.cc'):
1402632Sstever@eecs.umich.edu        Source(f)
1412632Sstever@eecs.umich.edu    elif s.endswith('.py'):
1422632Sstever@eecs.umich.edu        SimObject(f)
1432632Sstever@eecs.umich.edu
1442634Sstever@eecs.umich.edu