SConscript revision 8335
13534Sgblack@eecs.umich.edu# -*- mode:python -*- 23534Sgblack@eecs.umich.edu 33534Sgblack@eecs.umich.edu# Copyright (c) 2009 The Hewlett-Packard Development Company 43534Sgblack@eecs.umich.edu# All rights reserved. 53534Sgblack@eecs.umich.edu# 63534Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 73534Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 83534Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 93534Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 103534Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 113534Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 123534Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 133534Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 143534Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 153534Sgblack@eecs.umich.edu# this software without specific prior written permission. 163534Sgblack@eecs.umich.edu# 173534Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 183534Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 193534Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 203534Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 213534Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 223534Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 233534Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 243534Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 253534Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 263534Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 273534Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 283534Sgblack@eecs.umich.edu# 293534Sgblack@eecs.umich.edu# Authors: Nathan Binkert 303534Sgblack@eecs.umich.edu 313534Sgblack@eecs.umich.eduimport os 324202Sbinkertn@umich.eduimport sys 333534Sgblack@eecs.umich.edu 3410069Sandreas.hansson@arm.comfrom os.path import isdir, isfile, join as joinpath 3510069Sandreas.hansson@arm.com 3610069Sandreas.hansson@arm.comImport('*') 3710069Sandreas.hansson@arm.com 3810069Sandreas.hansson@arm.comif not env['RUBY']: 399850Sandreas.hansson@arm.com Return() 407768SAli.Saidi@ARM.com 417768SAli.Saidi@ARM.comprotocol_dir = Dir('.') 428739Sgblack@eecs.umich.eduhtml_dir = Dir('html') 438739Sgblack@eecs.umich.eduslicc_dir = Dir('../slicc') 448739Sgblack@eecs.umich.edu 458739Sgblack@eecs.umich.edusys.path[1:1] = [ Dir('..').srcnode().abspath ] 4610800SPeter.Enns@arm.comfrom slicc.parser import SLICC 478739Sgblack@eecs.umich.edu 488739Sgblack@eecs.umich.eduslicc_depends = [] 498739Sgblack@eecs.umich.edufor root,dirs,files in os.walk(slicc_dir.srcnode().abspath): 508739Sgblack@eecs.umich.edu for f in files: 518739Sgblack@eecs.umich.edu if f.endswith('.py'): 528739Sgblack@eecs.umich.edu slicc_depends.append(File(joinpath(root, f))) 534486Sbinkertn@umich.edu 548739Sgblack@eecs.umich.edu# 558739Sgblack@eecs.umich.edu# Use SLICC 568739Sgblack@eecs.umich.edu# 579016Sandreas.hansson@arm.com 588739Sgblack@eecs.umich.edudef slicc_scanner(node, env, path): 598739Sgblack@eecs.umich.edu contents = node.get_contents() 608739Sgblack@eecs.umich.edu files = [ line.strip() for line in contents.splitlines() if line ] 618739Sgblack@eecs.umich.edu return files 628739Sgblack@eecs.umich.edu 6310923Sgabor.dozsa@arm.comenv.Append(SCANNERS=Scanner(function=slicc_scanner,skeys=['.slicc'])) 6410923Sgabor.dozsa@arm.com 6510923Sgabor.dozsa@arm.comdef slicc_emitter(target, source, env): 6610923Sgabor.dozsa@arm.com protocol = source[0].get_contents() 678739Sgblack@eecs.umich.edu files = [s.srcnode().abspath for s in source[1:]] 688739Sgblack@eecs.umich.edu slicc = SLICC(protocol, debug=True) 6910800SPeter.Enns@arm.com print "SLICC parsing..." 708739Sgblack@eecs.umich.edu for name in slicc.load(files, verbose=True): 718739Sgblack@eecs.umich.edu print " %s" % name 728739Sgblack@eecs.umich.edu 738739Sgblack@eecs.umich.edu target.extend(sorted(slicc.files())) 748739Sgblack@eecs.umich.edu pdir = str(protocol_dir) 758739Sgblack@eecs.umich.edu hdir = str(html_dir) 768739Sgblack@eecs.umich.edu 778739Sgblack@eecs.umich.edu if not isdir(pdir): 788739Sgblack@eecs.umich.edu os.mkdir(pdir) 798739Sgblack@eecs.umich.edu if not isdir(hdir): 808739Sgblack@eecs.umich.edu os.mkdir(hdir) 818739Sgblack@eecs.umich.edu 828739Sgblack@eecs.umich.edu print "SLICC Generator pass 1..." 838739Sgblack@eecs.umich.edu slicc.findMachines() 848739Sgblack@eecs.umich.edu 858739Sgblack@eecs.umich.edu print "SLICC Generator pass 2..." 865192Ssaidi@eecs.umich.edu slicc.generate() 878739Sgblack@eecs.umich.edu 888739Sgblack@eecs.umich.edu print "SLICC writing C++ files..." 898739Sgblack@eecs.umich.edu slicc.writeCodeFiles(pdir) 908739Sgblack@eecs.umich.edu 918739Sgblack@eecs.umich.edu if env['NO_HTML']: 9210923Sgabor.dozsa@arm.com print "skipping HTML file creation" 9310923Sgabor.dozsa@arm.com else: 948739Sgblack@eecs.umich.edu print "SLICC writing HTML files..." 958739Sgblack@eecs.umich.edu slicc.writeHTMLFiles(hdir) 968739Sgblack@eecs.umich.edu return target, source 978739Sgblack@eecs.umich.edu 988739Sgblack@eecs.umich.edudef slicc_action(target, source, env): 998739Sgblack@eecs.umich.edu protocol = source[0].get_contents() 1008739Sgblack@eecs.umich.edu pdir = str(protocol_dir) 1018739Sgblack@eecs.umich.edu hdir = str(html_dir) 1028739Sgblack@eecs.umich.edu 1038739Sgblack@eecs.umich.edu if not isdir(pdir): 1048739Sgblack@eecs.umich.edu os.mkdir(pdir) 1058739Sgblack@eecs.umich.edu if not isdir(hdir): 1068739Sgblack@eecs.umich.edu os.mkdir(hdir) 1078739Sgblack@eecs.umich.edu 1088739Sgblack@eecs.umich.edu slicc = SLICC(protocol, debug=True) 1098739Sgblack@eecs.umich.edu files = [str(s) for s in source[1:]] 1108739Sgblack@eecs.umich.edu slicc.load(files, verbose=False) 1118739Sgblack@eecs.umich.edu 1128739Sgblack@eecs.umich.edu print "SLICC Generator pass 1..." 1135192Ssaidi@eecs.umich.edu slicc.findMachines() 1148739Sgblack@eecs.umich.edu 1158739Sgblack@eecs.umich.edu print "SLICC Generator pass 2..." 1168739Sgblack@eecs.umich.edu slicc.generate() 1178739Sgblack@eecs.umich.edu 1188739Sgblack@eecs.umich.edu print "SLICC writing C++ files..." 1198739Sgblack@eecs.umich.edu slicc.writeCodeFiles(pdir) 1208739Sgblack@eecs.umich.edu 121 if env['NO_HTML']: 122 print "skipping HTML file creation" 123 else: 124 print "SLICC writing HTML files..." 125 slicc.writeHTMLFiles(hdir) 126 127slicc_builder = Builder(action=slicc_action, emitter=slicc_emitter) 128 129protocol = env['PROTOCOL'] 130sources = [ protocol_dir.File("RubySlicc_interfaces.slicc"), 131 protocol_dir.File("%s.slicc" % protocol) ] 132 133env.Append(BUILDERS={'SLICC' : slicc_builder}) 134nodes = env.SLICC([], [ Value(protocol) ] + sources) 135env.Depends(nodes, slicc_depends) 136 137for f in nodes: 138 s = str(f) 139 if s.endswith('.cc'): 140 Source(f) 141 elif s.endswith('.py'): 142 SimObject(f) 143 144