ruby: Support for merging ALPHA_FS and ruby
[gem5.git] / configs / example / ruby_fs.py
1 # Copyright (c) 2009 Advanced Micro Devices, Inc.
2 # All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are
6 # met: redistributions of source code must retain the above copyright
7 # notice, this list of conditions and the following disclaimer;
8 # redistributions in binary form must reproduce the above copyright
9 # notice, this list of conditions and the following disclaimer in the
10 # documentation and/or other materials provided with the distribution;
11 # neither the name of the copyright holders nor the names of its
12 # contributors may be used to endorse or promote products derived from
13 # this software without specific prior written permission.
14 #
15 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #
27 # Authors: Brad Beckmann
28
29 #
30 # Full system configuraiton for ruby
31 #
32
33 import os
34 import optparse
35 import sys
36 from os.path import join as joinpath
37
38 import m5
39 from m5.defines import buildEnv
40 from m5.objects import *
41 from m5.util import addToPath, panic
42
43 if not buildEnv['FULL_SYSTEM']:
44 panic("This script requires full-system mode (*_FS).")
45
46 addToPath('../../tests/configs/')
47 addToPath('../common')
48
49 import ruby_config
50
51 from FSConfig import *
52 from SysPaths import *
53 from Benchmarks import *
54 import Simulation
55 from Caches import *
56
57 # Get paths we might need. It's expected this file is in m5/configs/example.
58 config_path = os.path.dirname(os.path.abspath(__file__))
59 config_root = os.path.dirname(config_path)
60 m5_root = os.path.dirname(config_root)
61
62 parser = optparse.OptionParser()
63
64 # Benchmark options
65 parser.add_option("-b", "--benchmark", action="store", type="string",
66 dest="benchmark",
67 help="Specify the benchmark to run. Available benchmarks: %s"\
68 % DefinedBenchmarks)
69 parser.add_option("-o", "--options", default="",
70 help='The options to pass to the binary, use " " around the entire string')
71 parser.add_option("-i", "--input", default="", help="Read stdin from a file.")
72 parser.add_option("--output", default="", help="Redirect stdout to a file.")
73 parser.add_option("--errout", default="", help="Redirect stderr to a file.")
74 parser.add_option("--ruby-debug", action="store_true")
75 parser.add_option("--ruby-debug-file", default="", help="Ruby debug out file (stdout if blank)")
76
77 # ruby host memory experimentation
78 parser.add_option("--cache_size", type="int")
79 parser.add_option("--cache_assoc", type="int")
80 parser.add_option("--map_levels", type="int")
81
82 execfile(os.path.join(config_root, "common", "Options.py"))
83
84 (options, args) = parser.parse_args()
85
86 if args:
87 print "Error: script doesn't take any positional arguments"
88 sys.exit(1)
89
90 if options.benchmark:
91 try:
92 bm = Benchmarks[options.benchmark]
93 except KeyError:
94 print "Error benchmark %s has not been defined." % options.benchmark
95 print "Valid benchmarks are: %s" % DefinedBenchmarks
96 sys.exit(1)
97 else:
98 bm = [SysConfig()]
99
100 #
101 # currently ruby fs only works in timing mode because ruby does not support
102 # atomic accesses by devices
103 #
104 assert(options.timing)
105
106 (CPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options)
107
108 CPUClass.clock = '1GHz'
109
110 #
111 # Since we are running in timing mode, set the number of M5 ticks to ruby ticks
112 # to the cpu clock frequency
113 #
114 M5_to_ruby_tick = '1000t'
115
116 np = options.num_cpus
117
118 # check for max instruction count
119 if options.max_inst:
120 max_inst = options.max_inst
121 else:
122 max_inst = 0
123
124 # set cache size
125 if options.cache_size:
126 cache_size = options.cache_size
127 else:
128 cache_size = 32768 # 32 kB is default
129
130 # set cache assoc
131 if options.cache_assoc:
132 cache_assoc = options.cache_assoc
133 else:
134 cache_assoc = 8 # 8 is default
135
136 # set map levels
137 if options.map_levels:
138 map_levels = options.map_levels
139 else:
140 map_levels = 4 # 4 levels is the default
141
142 #
143 # Currently, since ruby configuraiton is separate from m5, we need to manually
144 # tell ruby that two dma ports are created by makeLinuxAlphaRubySystem().
145 # Eventually, this will be fix with a unified configuration system.
146 #
147 rubymem = ruby_config.generate("MI_example-homogeneous.rb",
148 np,
149 np,
150 128,
151 False,
152 cache_size,
153 cache_assoc,
154 map_levels,
155 2,
156 M5_to_ruby_tick)
157
158 if options.ruby_debug == True:
159 rubymem.debug = True
160 rubymem.debug_file = options.ruby_debug_file
161
162 system = makeLinuxAlphaRubySystem(test_mem_mode, rubymem, bm[0])
163
164 system.cpu = [CPUClass(cpu_id=i) for i in xrange(np)]
165
166 if options.l2cache:
167 print "Error: -l2cache incompatible with ruby, must configure it ruby-style"
168 sys.exit(1)
169
170 if options.caches:
171 print "Error: -caches incompatible with ruby, must configure it ruby-style"
172 sys.exit(1)
173
174 for i in xrange(np):
175 system.cpu[i].connectMemPorts(system.physmem)
176
177 if options.fastmem:
178 system.cpu[i].physmem_port = system.physmem.port
179
180 root = Root(system = system)
181
182 Simulation.run(options, root, system, FutureClass)