SConscript revision 8454
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 re
333534Sgblack@eecs.umich.eduimport sys
347768SAli.Saidi@ARM.com
357768SAli.Saidi@ARM.comfrom os.path import isdir, isfile, join as joinpath
367768SAli.Saidi@ARM.com
374202Sbinkertn@umich.edufrom SCons.Scanner import Classic
384486Sbinkertn@umich.edu
395794Ssaidi@eecs.umich.eduImport('*')
404486Sbinkertn@umich.edu
414486Sbinkertn@umich.eduif not env['RUBY']:
424486Sbinkertn@umich.edu    Return()
434486Sbinkertn@umich.edu
444486Sbinkertn@umich.eduprotocol_dir = Dir('.')
454486Sbinkertn@umich.eduhtml_dir = Dir('html')
464486Sbinkertn@umich.eduslicc_dir = Dir('../slicc')
475478Snate@binkert.org
484486Sbinkertn@umich.edusys.path[1:1] = [ Dir('..').srcnode().abspath ]
494486Sbinkertn@umich.edufrom slicc.parser import SLICC
504202Sbinkertn@umich.edu
515794Ssaidi@eecs.umich.eduslicc_depends = []
524202Sbinkertn@umich.edufor root,dirs,files in os.walk(slicc_dir.srcnode().abspath):
534202Sbinkertn@umich.edu    for f in files:
545485Snate@binkert.org        if f.endswith('.py'):
554202Sbinkertn@umich.edu            slicc_depends.append(File(joinpath(root, f)))
564202Sbinkertn@umich.edu
574202Sbinkertn@umich.edu#
584202Sbinkertn@umich.edu# Use SLICC
594762Snate@binkert.org#
604218Ssaidi@eecs.umich.eduenv['SLICC_PATH'] = str(protocol_dir)
614202Sbinkertn@umich.eduslicc_scanner = Classic("SliccScanner", ['.sm', '.slicc'], "SLICC_PATH",
624202Sbinkertn@umich.edu                        r'''include[ \t]["'](.*)["'];''')
635443Sgblack@eecs.umich.eduenv.Append(SCANNERS=slicc_scanner)
644202Sbinkertn@umich.edu
654202Sbinkertn@umich.edudef slicc_emitter(target, source, env):
665392Sgblack@eecs.umich.edu    assert len(source) == 1
674202Sbinkertn@umich.edu    filepath = source[0].srcnode().abspath
684202Sbinkertn@umich.edu
694202Sbinkertn@umich.edu    slicc = SLICC(filepath, verbose=False)
704202Sbinkertn@umich.edu    slicc.process()
714202Sbinkertn@umich.edu    slicc.writeCodeFiles(protocol_dir.abspath)
724202Sbinkertn@umich.edu    if not env['NO_HTML']:
734762Snate@binkert.org        slicc.writeHTMLFiles(html_dir.abspath)
745478Snate@binkert.org
754202Sbinkertn@umich.edu    target.extend([protocol_dir.File(f) for f in sorted(slicc.files())])
764202Sbinkertn@umich.edu    return target, source
775192Ssaidi@eecs.umich.edu
785192Ssaidi@eecs.umich.edudef slicc_action(target, source, env):
795192Ssaidi@eecs.umich.edu    assert len(source) == 1
805192Ssaidi@eecs.umich.edu    filepath = source[0].srcnode().abspath
815794Ssaidi@eecs.umich.edu
825192Ssaidi@eecs.umich.edu    slicc = SLICC(filepath, verbose=True)
835192Ssaidi@eecs.umich.edu    slicc.process()
845192Ssaidi@eecs.umich.edu    slicc.writeCodeFiles(protocol_dir.abspath)
855192Ssaidi@eecs.umich.edu    if not env['NO_HTML']:
865192Ssaidi@eecs.umich.edu        slicc.writeHTMLFiles(html_dir.abspath)
875192Ssaidi@eecs.umich.edu
885192Ssaidi@eecs.umich.eduslicc_builder = Builder(action=MakeAction(slicc_action, Transform("SLICC")),
895192Ssaidi@eecs.umich.edu                        emitter=slicc_emitter)
905192Ssaidi@eecs.umich.edu
915192Ssaidi@eecs.umich.eduprotocol = env['PROTOCOL']
925192Ssaidi@eecs.umich.edusources = [ protocol_dir.File("%s.slicc" % protocol) ]
935443Sgblack@eecs.umich.edu
945192Ssaidi@eecs.umich.eduenv.Append(BUILDERS={'SLICC' : slicc_builder})
955392Sgblack@eecs.umich.edunodes = env.SLICC([], sources)
965192Ssaidi@eecs.umich.eduenv.Depends(nodes, slicc_depends)
975192Ssaidi@eecs.umich.edu
985192Ssaidi@eecs.umich.edufor f in nodes:
995192Ssaidi@eecs.umich.edu    s = str(f)
1005478Snate@binkert.org    if s.endswith('.cc'):
1015478Snate@binkert.org        Source(f)
1025192Ssaidi@eecs.umich.edu    elif s.endswith('.py'):
1035192Ssaidi@eecs.umich.edu        SimObject(f)
1045192Ssaidi@eecs.umich.edu
1055192Ssaidi@eecs.umich.edu