SConscript revision 2623
17119Sgblack@eecs.umich.edu# -*- mode:python -*- 27119Sgblack@eecs.umich.edu 37120Sgblack@eecs.umich.edu# Copyright (c) 2006 The Regents of The University of Michigan 47120Sgblack@eecs.umich.edu# All rights reserved. 57120Sgblack@eecs.umich.edu# 67120Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 77120Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 87120Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 97120Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 107120Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 117120Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 127120Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 137120Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 147120Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 157119Sgblack@eecs.umich.edu# this software without specific prior written permission. 167119Sgblack@eecs.umich.edu# 177119Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 187119Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 197119Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 207119Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 217119Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 227119Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 237119Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 247119Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 257119Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 267119Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 277119Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 287119Sgblack@eecs.umich.edu 297119Sgblack@eecs.umich.eduimport os.path 307119Sgblack@eecs.umich.edu 317119Sgblack@eecs.umich.edu# Import build environment variable from SConstruct. 327119Sgblack@eecs.umich.eduImport('env') 337119Sgblack@eecs.umich.edu 347119Sgblack@eecs.umich.edu# Right now there are no source files immediately in this directory 357119Sgblack@eecs.umich.edusources = [] 367119Sgblack@eecs.umich.edu 377119Sgblack@eecs.umich.edu################################################################# 387119Sgblack@eecs.umich.edu# 397119Sgblack@eecs.umich.edu# ISA "switch header" generation. 407119Sgblack@eecs.umich.edu# 417119Sgblack@eecs.umich.edu# Auto-generate arch headers that include the right ISA-specific 427119Sgblack@eecs.umich.edu# header based on the setting of THE_ISA preprocessor variable. 437119Sgblack@eecs.umich.edu# 447205Sgblack@eecs.umich.edu################################################################# 457205Sgblack@eecs.umich.edu 467205Sgblack@eecs.umich.edu# List of headers to generate 477205Sgblack@eecs.umich.eduisa_switch_hdrs = Split(''' 487205Sgblack@eecs.umich.edu arguments.hh 497205Sgblack@eecs.umich.edu constants.hh 507205Sgblack@eecs.umich.edu faults.hh 517205Sgblack@eecs.umich.edu isa_traits.hh 527205Sgblack@eecs.umich.edu process.hh 537205Sgblack@eecs.umich.edu regfile.hh 547205Sgblack@eecs.umich.edu stacktrace.hh 557205Sgblack@eecs.umich.edu tlb.hh 567205Sgblack@eecs.umich.edu types.hh 577205Sgblack@eecs.umich.edu utility.hh 587205Sgblack@eecs.umich.edu vtophys.hh 597205Sgblack@eecs.umich.edu ''') 607205Sgblack@eecs.umich.edu 617205Sgblack@eecs.umich.edu# Generate the header. target[0] is the full path of the output 627205Sgblack@eecs.umich.edu# header to generate. 'source' is a dummy variable, since we get the 637205Sgblack@eecs.umich.edu# list of ISAs from env['ALL_ISA_LIST']. 647205Sgblack@eecs.umich.edudef gen_switch_hdr(target, source, env): 657205Sgblack@eecs.umich.edu fname = str(target[0]) 667205Sgblack@eecs.umich.edu basename = os.path.basename(fname) 677205Sgblack@eecs.umich.edu f = open(fname, 'w') 687205Sgblack@eecs.umich.edu f.write('#include "arch/isa_specific.hh"\n') 697205Sgblack@eecs.umich.edu cond = '#if' 707205Sgblack@eecs.umich.edu for isa in env['ALL_ISA_LIST']: 717205Sgblack@eecs.umich.edu f.write('%s THE_ISA == %s_ISA\n#include "arch/%s/%s"\n' 727597Sminkyu.jeong@arm.com % (cond, isa.upper(), isa, basename)) 737597Sminkyu.jeong@arm.com cond = '#elif' 747205Sgblack@eecs.umich.edu f.write('#else\n#error "THE_ISA not set"\n#endif\n') 757205Sgblack@eecs.umich.edu f.close() 767408Sgblack@eecs.umich.edu return 0 777408Sgblack@eecs.umich.edu 787408Sgblack@eecs.umich.edu# String to print when generating header 797408Sgblack@eecs.umich.edudef gen_switch_hdr_string(target, source, env): 807205Sgblack@eecs.umich.edu return "Generating ISA switch header " + str(target[0]) 817205Sgblack@eecs.umich.edu 827205Sgblack@eecs.umich.edu# Build SCons Action object. 'varlist' specifies env vars that this 837205Sgblack@eecs.umich.edu# action depends on; when env['ALL_ISA_LIST'] changes these actions 847205Sgblack@eecs.umich.edu# should get re-executed. 857205Sgblack@eecs.umich.eduswitch_hdr_action = Action(gen_switch_hdr, gen_switch_hdr_string, 867205Sgblack@eecs.umich.edu varlist=['ALL_ISA_LIST']) 877205Sgblack@eecs.umich.edu 887205Sgblack@eecs.umich.edu# Instantiate actions for each header 897205Sgblack@eecs.umich.edufor hdr in isa_switch_hdrs: 907205Sgblack@eecs.umich.edu env.Command(hdr, [], switch_hdr_action) 917205Sgblack@eecs.umich.edu 927205Sgblack@eecs.umich.edu################################################################# 937205Sgblack@eecs.umich.edu# 947205Sgblack@eecs.umich.edu# Include architecture-specific files. 957205Sgblack@eecs.umich.edu# 967205Sgblack@eecs.umich.edu################################################################# 977205Sgblack@eecs.umich.edu 987205Sgblack@eecs.umich.edu# 997205Sgblack@eecs.umich.edu# Build a SCons scanner for ISA files 1007205Sgblack@eecs.umich.edu# 1017205Sgblack@eecs.umich.eduimport SCons.Scanner 1027205Sgblack@eecs.umich.edu 1037205Sgblack@eecs.umich.eduisa_scanner = SCons.Scanner.Classic("ISAScan", 1047205Sgblack@eecs.umich.edu [".isa", ".ISA"], 1057205Sgblack@eecs.umich.edu "SRCDIR", 1067205Sgblack@eecs.umich.edu r'^\s*##include\s+"([\w/.-]*)"') 1077205Sgblack@eecs.umich.edu 1087597Sminkyu.jeong@arm.comenv.Append(SCANNERS = isa_scanner) 1097597Sminkyu.jeong@arm.com 1107205Sgblack@eecs.umich.edu# 1117205Sgblack@eecs.umich.edu# Now create a Builder object that uses isa_parser.py to generate C++ 1127408Sgblack@eecs.umich.edu# output from the ISA description (*.isa) files. 1137408Sgblack@eecs.umich.edu# 1147408Sgblack@eecs.umich.edu 1157408Sgblack@eecs.umich.edu# Convert to File node to fix path 1167205Sgblack@eecs.umich.eduisa_parser = File('isa_parser.py') 1177205Sgblack@eecs.umich.educpu_models_file = File('#m5/cpu/cpu_models.py') 1187205Sgblack@eecs.umich.edu 1197205Sgblack@eecs.umich.edu# This sucks in the defintions of the CpuModel objects. 1207205Sgblack@eecs.umich.eduexecfile(cpu_models_file.srcnode().abspath) 1217205Sgblack@eecs.umich.edu 1227205Sgblack@eecs.umich.edu# Several files are generated from the ISA description. 1237205Sgblack@eecs.umich.edu# We always get the basic decoder and header file. 1247205Sgblack@eecs.umich.eduisa_desc_gen_files = Split('decoder.cc decoder.hh') 1257205Sgblack@eecs.umich.edu# We also get an execute file for each selected CPU model. 1267205Sgblack@eecs.umich.eduisa_desc_gen_files += [CpuModel.dict[cpu].filename 1277205Sgblack@eecs.umich.edu for cpu in env['CPU_MODELS']] 1287205Sgblack@eecs.umich.edu 1297205Sgblack@eecs.umich.edu# The emitter patches up the sources & targets to include the 1307205Sgblack@eecs.umich.edu# autogenerated files as targets and isa parser itself as a source. 1317205Sgblack@eecs.umich.edudef isa_desc_emitter(target, source, env): 1327205Sgblack@eecs.umich.edu return (isa_desc_gen_files, [isa_parser, cpu_models_file] + source) 1337205Sgblack@eecs.umich.edu 1347205Sgblack@eecs.umich.edu# Pieces are in place, so create the builder. 1357205Sgblack@eecs.umich.eduisa_desc_builder = Builder(action='python $SOURCES $TARGET.dir $CPU_MODELS', 1367205Sgblack@eecs.umich.edu emitter = isa_desc_emitter) 1377205Sgblack@eecs.umich.edu 1387205Sgblack@eecs.umich.eduenv.Append(BUILDERS = { 'ISADesc' : isa_desc_builder }) 1397205Sgblack@eecs.umich.edu 1407205Sgblack@eecs.umich.edu# 1417205Sgblack@eecs.umich.edu# Now include other ISA-specific sources from the ISA subdirectories. 1427408Sgblack@eecs.umich.edu# 1437408Sgblack@eecs.umich.edu 1447408Sgblack@eecs.umich.eduisa = env['TARGET_ISA'] # someday this may be a list of ISAs 1457408Sgblack@eecs.umich.edu 1467205Sgblack@eecs.umich.edu# Let the target architecture define what additional sources it needs 1477205Sgblack@eecs.umich.edusources += SConscript(os.path.join(isa, 'SConscript'), 1487205Sgblack@eecs.umich.edu exports = 'env', duplicate = False) 1497205Sgblack@eecs.umich.edu 1507119Sgblack@eecs.umich.eduReturn('sources') 1517119Sgblack@eecs.umich.edu