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