SConscript revision 10319
19397Sandreas.hansson@arm.com# -*- mode:python -*-
29397Sandreas.hansson@arm.com
39397Sandreas.hansson@arm.com# Copyright (c) 2006 The Regents of The University of Michigan
49397Sandreas.hansson@arm.com# All rights reserved.
59397Sandreas.hansson@arm.com#
69397Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without
79397Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are
89397Sandreas.hansson@arm.com# met: redistributions of source code must retain the above copyright
99397Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer;
109397Sandreas.hansson@arm.com# redistributions in binary form must reproduce the above copyright
119397Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer in the
129397Sandreas.hansson@arm.com# documentation and/or other materials provided with the distribution;
139397Sandreas.hansson@arm.com# neither the name of the copyright holders nor the names of its
149397Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived from
159397Sandreas.hansson@arm.com# this software without specific prior written permission.
169397Sandreas.hansson@arm.com#
179397Sandreas.hansson@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
189397Sandreas.hansson@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
199397Sandreas.hansson@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
209397Sandreas.hansson@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
219397Sandreas.hansson@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
229397Sandreas.hansson@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
239397Sandreas.hansson@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
249397Sandreas.hansson@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
259397Sandreas.hansson@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
269397Sandreas.hansson@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
279397Sandreas.hansson@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
289397Sandreas.hansson@arm.com#
299397Sandreas.hansson@arm.com# Authors: Steve Reinhardt
309397Sandreas.hansson@arm.com
319397Sandreas.hansson@arm.comimport sys
329397Sandreas.hansson@arm.comimport os
339397Sandreas.hansson@arm.comimport re
349397Sandreas.hansson@arm.com
359397Sandreas.hansson@arm.comImport('*')
369397Sandreas.hansson@arm.com
379397Sandreas.hansson@arm.com#################################################################
389397Sandreas.hansson@arm.com#
399397Sandreas.hansson@arm.com# ISA "switch header" generation.
4011793Sbrandon.potter@amd.com#
4111793Sbrandon.potter@amd.com# Auto-generate arch headers that include the right ISA-specific
429397Sandreas.hansson@arm.com# header based on the setting of THE_ISA preprocessor variable.
439397Sandreas.hansson@arm.com#
449397Sandreas.hansson@arm.com#################################################################
459397Sandreas.hansson@arm.com
469397Sandreas.hansson@arm.com# List of headers to generate
479397Sandreas.hansson@arm.comisa_switch_hdrs = Split('''
489397Sandreas.hansson@arm.com        decoder.hh
499705Sandreas.hansson@arm.com        interrupts.hh
509397Sandreas.hansson@arm.com        isa.hh
519397Sandreas.hansson@arm.com        isa_traits.hh
529397Sandreas.hansson@arm.com        kernel_stats.hh
539397Sandreas.hansson@arm.com        locked_mem.hh
549397Sandreas.hansson@arm.com        microcode_rom.hh
559397Sandreas.hansson@arm.com        mmapped_ipr.hh
569397Sandreas.hansson@arm.com        mt.hh
579705Sandreas.hansson@arm.com        process.hh
589397Sandreas.hansson@arm.com        registers.hh
599397Sandreas.hansson@arm.com        remote_gdb.hh
609705Sandreas.hansson@arm.com        stacktrace.hh
619705Sandreas.hansson@arm.com        tlb.hh
629397Sandreas.hansson@arm.com        types.hh
639705Sandreas.hansson@arm.com        utility.hh
649397Sandreas.hansson@arm.com        vtophys.hh
659397Sandreas.hansson@arm.com        ''')
669399Sandreas.hansson@arm.com
679705Sandreas.hansson@arm.com# Set up this directory to support switching headers
689705Sandreas.hansson@arm.commake_switching_dir('arch', isa_switch_hdrs, env)
699397Sandreas.hansson@arm.com
709397Sandreas.hansson@arm.com#################################################################
719397Sandreas.hansson@arm.com#
729397Sandreas.hansson@arm.com# Include architecture-specific files.
739397Sandreas.hansson@arm.com#
749397Sandreas.hansson@arm.com#################################################################
759397Sandreas.hansson@arm.com
769397Sandreas.hansson@arm.com#
779397Sandreas.hansson@arm.com# Build a SCons scanner for ISA files
789397Sandreas.hansson@arm.com#
799705Sandreas.hansson@arm.comimport SCons.Scanner
809397Sandreas.hansson@arm.com
819397Sandreas.hansson@arm.comisa_scanner = SCons.Scanner.Classic("ISAScan",
829397Sandreas.hansson@arm.com                                    [".isa", ".ISA"],
839397Sandreas.hansson@arm.com                                    "SRCDIR",
849397Sandreas.hansson@arm.com                                    r'^\s*##include\s+"([\w/.-]*)"')
859397Sandreas.hansson@arm.com
869705Sandreas.hansson@arm.comenv.Append(SCANNERS = isa_scanner)
879705Sandreas.hansson@arm.com
889705Sandreas.hansson@arm.com#
899705Sandreas.hansson@arm.com# Now create a Builder object that uses isa_parser.py to generate C++
909705Sandreas.hansson@arm.com# output from the ISA description (*.isa) files.
919397Sandreas.hansson@arm.com#
929705Sandreas.hansson@arm.com
939397Sandreas.hansson@arm.comisa_parser = File('isa_parser.py')
949397Sandreas.hansson@arm.com
959705Sandreas.hansson@arm.com# The emitter patches up the sources & targets to include the
969397Sandreas.hansson@arm.com# autogenerated files as targets and isa parser itself as a source.
979399Sandreas.hansson@arm.comdef isa_desc_emitter(target, source, env):
989399Sandreas.hansson@arm.com    # List the isa parser as a source.
999464Sandreas.hansson@arm.com    source += [
1009399Sandreas.hansson@arm.com        isa_parser,
1019705Sandreas.hansson@arm.com        Value("ExecContext"),
1029399Sandreas.hansson@arm.com        ]
1039399Sandreas.hansson@arm.com
1049399Sandreas.hansson@arm.com    # Specify different targets depending on if we're running the ISA
1059399Sandreas.hansson@arm.com    # parser for its dependency information, or for the generated files.
1069399Sandreas.hansson@arm.com    # (As an optimization, the ISA parser detects the useless second run
1079399Sandreas.hansson@arm.com    # and skips doing any work, if the first run was performed, since it
1089399Sandreas.hansson@arm.com    # always generates all its files). The way we track this in SCons is the
1099399Sandreas.hansson@arm.com    # <arch>_isa_outputs value in the environment (env). If it's unset, we
1109399Sandreas.hansson@arm.com    # don't know what the dependencies are so we ask for generated/inc.d to
1119399Sandreas.hansson@arm.com    # be generated so they can be acquired. If we know what they are, then
1129399Sandreas.hansson@arm.com    # it's because we've already processed inc.d and then claim that our
1139399Sandreas.hansson@arm.com    # outputs (targets) will be thus.
1149399Sandreas.hansson@arm.com    isa = env['TARGET_ISA']
1159399Sandreas.hansson@arm.com    key = '%s_isa_outputs' % isa
1169399Sandreas.hansson@arm.com    if key in env:
1179399Sandreas.hansson@arm.com        targets = [ os.path.join('generated', f) for f in env[key] ]
1189399Sandreas.hansson@arm.com    else:
1199399Sandreas.hansson@arm.com        targets = [ os.path.join('generated','inc.d') ]
1209399Sandreas.hansson@arm.com
1219399Sandreas.hansson@arm.com    def prefix(s):
1229705Sandreas.hansson@arm.com        return os.path.join(target[0].dir.up().abspath, s)
1239705Sandreas.hansson@arm.com
1249399Sandreas.hansson@arm.com    return [ prefix(t) for t in targets ], source
1259399Sandreas.hansson@arm.com
1269399Sandreas.hansson@arm.comARCH_DIR = Dir('.')
1279399Sandreas.hansson@arm.com
1289705Sandreas.hansson@arm.com# import ply here because SCons screws with sys.path when performing actions.
1299399Sandreas.hansson@arm.comimport ply
1309705Sandreas.hansson@arm.com
1319705Sandreas.hansson@arm.comdef isa_desc_action_func(target, source, env):
1329399Sandreas.hansson@arm.com    # Add the current directory to the system path so we can import files
1339705Sandreas.hansson@arm.com    sys.path[0:0] = [ ARCH_DIR.srcnode().abspath ]
1349399Sandreas.hansson@arm.com    import isa_parser
1359399Sandreas.hansson@arm.com
1369399Sandreas.hansson@arm.com    # Skip over the ISA description itself and the parser to the CPU models.
1379705Sandreas.hansson@arm.com    models = [ s.get_contents() for s in source[2:] ]
1389705Sandreas.hansson@arm.com    parser = isa_parser.ISAParser(target[0].dir.abspath)
1399399Sandreas.hansson@arm.com    parser.parse_isa_desc(source[0].abspath)
1409399Sandreas.hansson@arm.comisa_desc_action = MakeAction(isa_desc_action_func, Transform("ISA DESC", 1))
1419399Sandreas.hansson@arm.com
1429399Sandreas.hansson@arm.com# Also include the CheckerCPU as one of the models if it is being
1439399Sandreas.hansson@arm.com# enabled via command line.
1449399Sandreas.hansson@arm.comisa_desc_builder = Builder(action=isa_desc_action, emitter=isa_desc_emitter)
1459399Sandreas.hansson@arm.com
1469399Sandreas.hansson@arm.comenv.Append(BUILDERS = { 'ISADesc' : isa_desc_builder })
1479399Sandreas.hansson@arm.com
1489399Sandreas.hansson@arm.com# The ISA is generated twice: the first time to find out what it generates,
1499399Sandreas.hansson@arm.com# and the second time to make scons happy by telling the ISADesc builder
1509399Sandreas.hansson@arm.com# what it will make before it builds it.
1519399Sandreas.hansson@arm.comdef scan_isa_deps(target, source, env):
1529705Sandreas.hansson@arm.com    # Process dependency file generated by the ISA parser --
1539705Sandreas.hansson@arm.com    # add the listed files to the dependency tree of the build.
1549705Sandreas.hansson@arm.com    source = source[0]
1559399Sandreas.hansson@arm.com    archbase = source.dir.up().path
1569399Sandreas.hansson@arm.com
1579399Sandreas.hansson@arm.com    try:
1589399Sandreas.hansson@arm.com        depfile = open(source.abspath, 'r')
1599399Sandreas.hansson@arm.com    except:
1609399Sandreas.hansson@arm.com        print "scan_isa_deps: Can't open ISA deps file '%s' in %s" % \
1619399Sandreas.hansson@arm.com              (source.path,os.getcwd())
1629399Sandreas.hansson@arm.com        raise
1639399Sandreas.hansson@arm.com
1649399Sandreas.hansson@arm.com    # Scan through the lines
1659399Sandreas.hansson@arm.com    targets = {}
1669399Sandreas.hansson@arm.com    for line in depfile:
1679399Sandreas.hansson@arm.com        # Read the dependency line with the format
1689399Sandreas.hansson@arm.com        # <target file>: [ <dependent file>* ]
1699399Sandreas.hansson@arm.com        m = re.match(r'^\s*([^:]+\.([^\.:]+))\s*:\s*(.*)', line)
1709399Sandreas.hansson@arm.com        assert(m)
1719399Sandreas.hansson@arm.com        targ, extn = m.group(1,2)
1729399Sandreas.hansson@arm.com        deps = m.group(3).split()
1739399Sandreas.hansson@arm.com
1749399Sandreas.hansson@arm.com        files = [ targ ] + deps
1759399Sandreas.hansson@arm.com        for f in files:
1769399Sandreas.hansson@arm.com            targets[f] = True
1779399Sandreas.hansson@arm.com            # Eliminate unnecessary re-generation if we already generated it
1789399Sandreas.hansson@arm.com            env.Precious(os.path.join(archbase, 'generated', f))
1799399Sandreas.hansson@arm.com
1809399Sandreas.hansson@arm.com        files = [ os.path.join(archbase, 'generated', f) for f in files ]
1819399Sandreas.hansson@arm.com
1829705Sandreas.hansson@arm.com        if extn == 'cc':
1839705Sandreas.hansson@arm.com            Source(os.path.join(archbase,'generated', targ))
1849705Sandreas.hansson@arm.com    depfile.close()
1859705Sandreas.hansson@arm.com    env[env['TARGET_ISA'] + '_isa_outputs'] = targets.keys()
1869705Sandreas.hansson@arm.com
1879705Sandreas.hansson@arm.com    isa = env.ISADesc(os.path.join(archbase,'isa','main.isa'))
1889705Sandreas.hansson@arm.com    for t in targets:
1899705Sandreas.hansson@arm.com        env.Depends('#all-isas', isa)
1909705Sandreas.hansson@arm.com
1919399Sandreas.hansson@arm.comenv.Append(BUILDERS = {'ScanISA' :
1929399Sandreas.hansson@arm.com                        Builder(action=MakeAction(scan_isa_deps,
1939399Sandreas.hansson@arm.com                                                  Transform("NEW DEPS", 1)))})
1949399Sandreas.hansson@arm.com
1959399Sandreas.hansson@arm.comDebugFlag('IntRegs')
1969399Sandreas.hansson@arm.comDebugFlag('FloatRegs')
1979399Sandreas.hansson@arm.comDebugFlag('CCRegs')
1989399Sandreas.hansson@arm.comDebugFlag('MiscRegs')
1999399Sandreas.hansson@arm.comCompoundFlag('Registers', [ 'IntRegs', 'FloatRegs', 'CCRegs', 'MiscRegs' ])
2009399Sandreas.hansson@arm.com