1# -*- mode:python -*- 2 3# Copyright (c) 2009 The Hewlett-Packard Development Company 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are 8# met: redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer; 10# redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution; 13# neither the name of the copyright holders nor the names of its 14# contributors may be used to endorse or promote products derived from 15# this software without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28# 29# Authors: Nathan Binkert 30 31import os 32import re 33import sys 34 35from os.path import isdir, isfile, join as joinpath 36 37from SCons.Scanner import Classic 38 39from gem5_scons import Transform 40 41Import('*') 42 43if env['PROTOCOL'] == 'None': 44 Return() 45 46output_dir = Dir('.') 47html_dir = Dir('html') 48slicc_dir = Dir('../slicc') 49 50sys.path[1:1] = [ Dir('..').Dir('..').srcnode().abspath ] 51from slicc.parser import SLICC 52 53slicc_depends = [] 54for root,dirs,files in os.walk(slicc_dir.srcnode().abspath): 55 for f in files: 56 if f.endswith('.py'): 57 slicc_depends.append(File(joinpath(root, f))) 58 59# 60# Use SLICC 61# 62env["SLICC_PATH"] = protocol_dirs 63slicc_scanner = Classic("SliccScanner", ['.sm', '.slicc'], "SLICC_PATH", 64 r'''include[ \t]["'](.*)["'];''') 65env.Append(SCANNERS=slicc_scanner) 66 67def slicc_emitter(target, source, env): 68 assert len(source) == 1 69 filepath = source[0].srcnode().abspath 70 71 slicc = SLICC(filepath, protocol_base.abspath, verbose=False) 72 slicc.process() 73 slicc.writeCodeFiles(output_dir.abspath, slicc_includes) 74 if env['SLICC_HTML']: 75 slicc.writeHTMLFiles(html_dir.abspath) 76 77 target.extend([output_dir.File(f) for f in sorted(slicc.files())]) 78 return target, source 79 80def slicc_action(target, source, env): 81 assert len(source) == 1 82 filepath = source[0].srcnode().abspath 83 84 slicc = SLICC(filepath, protocol_base.abspath, verbose=True) 85 slicc.process() 86 slicc.writeCodeFiles(output_dir.abspath, slicc_includes) 87 if env['SLICC_HTML']: 88 slicc.writeHTMLFiles(html_dir.abspath) 89 90slicc_builder = Builder(action=MakeAction(slicc_action, Transform("SLICC")), 91 emitter=slicc_emitter) 92 93protocol = env['PROTOCOL'] 94protocol_dir = None 95for path in protocol_dirs: 96 if os.path.exists(os.path.join(path, "%s.slicc" % protocol)): 97 protocol_dir = Dir(path) 98 break 99 100if not protocol_dir: 101 raise ValueError, "Could not find %s.slicc in protocol_dirs" % protocol 102 103sources = [ protocol_dir.File("%s.slicc" % protocol) ] 104 105env.Append(BUILDERS={'SLICC' : slicc_builder}) 106nodes = env.SLICC([], sources) 107env.Depends(nodes, slicc_depends) 108 109for f in nodes: 110 s = str(f) 111 if s.endswith('.cc'): 112 Source(f) 113 elif s.endswith('.py'): 114 SimObject(f) 115 116