Add .m5 configuration directory
[gem5.git] / src / python / m5 / main.py
1 # Copyright (c) 2005 The Regents of The University of Michigan
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: Nathan Binkert
28
29 import code
30 import datetime
31 import os
32 import socket
33 import sys
34
35 from util import attrdict
36 import config
37 import defines
38 from options import OptionParser
39 import traceflags
40
41 __all__ = [ 'options', 'arguments', 'main' ]
42
43 def print_list(items, indent=4):
44 line = ' ' * indent
45 for i,item in enumerate(items):
46 if len(line) + len(item) > 76:
47 print line
48 line = ' ' * indent
49
50 if i < len(items) - 1:
51 line += '%s, ' % item
52 else:
53 line += item
54 print line
55
56 usage="%prog [m5 options] script.py [script options]"
57 version="%prog 2.0"
58 brief_copyright='''
59 Copyright (c) 2001-2008
60 The Regents of The University of Michigan
61 All Rights Reserved
62 '''
63
64 options = OptionParser(usage=usage, version=version,
65 description=brief_copyright)
66 add_option = options.add_option
67 set_group = options.set_group
68 usage = options.usage
69
70 # Help options
71 add_option('-A', "--authors", action="store_true", default=False,
72 help="Show author information")
73 add_option('-B', "--build-info", action="store_true", default=False,
74 help="Show build information")
75 add_option('-C', "--copyright", action="store_true", default=False,
76 help="Show full copyright information")
77 add_option('-R', "--readme", action="store_true", default=False,
78 help="Show the readme")
79 add_option('-N', "--release-notes", action="store_true", default=False,
80 help="Show the release notes")
81
82 # Options for configuring the base simulator
83 add_option('-d', "--outdir", metavar="DIR", default=".",
84 help="Set the output directory to DIR [Default: %default]")
85 add_option('-i', "--interactive", action="store_true", default=False,
86 help="Invoke the interactive interpreter after running the script")
87 add_option("--pdb", action="store_true", default=False,
88 help="Invoke the python debugger before running the script")
89 add_option('-p', "--path", metavar="PATH[:PATH]", action='append', split=':',
90 help="Prepend PATH to the system path when invoking the script")
91 add_option('-q', "--quiet", action="count", default=0,
92 help="Reduce verbosity")
93 add_option('-v', "--verbose", action="count", default=0,
94 help="Increase verbosity")
95
96 # Statistics options
97 set_group("Statistics Options")
98 add_option("--stats-file", metavar="FILE", default="m5stats.txt",
99 help="Sets the output file for statistics [Default: %default]")
100
101 # Debugging options
102 set_group("Debugging Options")
103 add_option("--debug-break", metavar="TIME[,TIME]", action='append', split=',',
104 help="Cycle to create a breakpoint")
105
106 # Tracing options
107 set_group("Trace Options")
108 add_option("--trace-help", action='store_true',
109 help="Print help on trace flags")
110 add_option("--trace-flags", metavar="FLAG[,FLAG]", action='append', split=',',
111 help="Sets the flags for tracing (-FLAG disables a flag)")
112 add_option("--trace-start", metavar="TIME", type='int',
113 help="Start tracing at TIME (must be in ticks)")
114 add_option("--trace-file", metavar="FILE", default="cout",
115 help="Sets the output file for tracing [Default: %default]")
116 add_option("--trace-ignore", metavar="EXPR", action='append', split=':',
117 help="Ignore EXPR sim objects")
118
119 def main():
120 import defines
121 import event
122 import info
123 import internal
124
125 arguments = options.parse_args()
126
127 done = False
128
129 if options.build_info:
130 done = True
131 print 'Build information:'
132 print
133 print 'compiled %s' % internal.core.cvar.compileDate;
134 print 'started %s' % datetime.datetime.now().ctime()
135 print 'executing on %s' % socket.gethostname()
136 print 'build options:'
137 keys = defines.m5_build_env.keys()
138 keys.sort()
139 for key in keys:
140 val = defines.m5_build_env[key]
141 print ' %s = %s' % (key, val)
142 print
143
144 if options.copyright:
145 done = True
146 print info.LICENSE
147 print
148
149 if options.authors:
150 done = True
151 print 'Author information:'
152 print
153 print info.AUTHORS
154 print
155
156 if options.readme:
157 done = True
158 print 'Readme:'
159 print
160 print info.README
161 print
162
163 if options.release_notes:
164 done = True
165 print 'Release Notes:'
166 print
167 print info.RELEASE_NOTES
168 print
169
170 if options.trace_help:
171 done = True
172 print "Base Flags:"
173 print_list(traceflags.baseFlags, indent=4)
174 print
175 print "Compound Flags:"
176 for flag in traceflags.compoundFlags:
177 if flag == 'All':
178 continue
179 print " %s:" % flag
180 print_list(traceflags.compoundFlagMap[flag], indent=8)
181 print
182
183 if done:
184 sys.exit(0)
185
186 # setting verbose and quiet at the same time doesn't make sense
187 if options.verbose > 0 and options.quiet > 0:
188 options.usage(2)
189
190 verbose = options.verbose - options.quiet
191 if options.verbose >= 0:
192 print "M5 Simulator System"
193 print brief_copyright
194 print
195 print "M5 compiled %s" % internal.core.cvar.compileDate;
196 print "M5 started %s" % datetime.datetime.now().ctime()
197 print "M5 executing on %s" % socket.gethostname()
198
199 print "M5 revision %s" % internal.core.cvar.hgRev
200 print "M5 commit date %s" % internal.core.cvar.hgDate
201
202 print "command line:",
203 for argv in sys.argv:
204 print argv,
205 print
206
207 # check to make sure we can find the listed script
208 if not arguments or not os.path.isfile(arguments[0]):
209 if arguments and not os.path.isfile(arguments[0]):
210 print "Script %s not found" % arguments[0]
211
212 options.usage(2)
213
214 # tell C++ about output directory
215 internal.core.setOutputDir(options.outdir)
216
217 # update the system path with elements from the -p option
218 sys.path[0:0] = options.path
219
220 import objects
221
222 # set stats options
223 internal.stats.initText(options.stats_file)
224
225 # set debugging options
226 for when in options.debug_break:
227 internal.debug.schedBreakCycle(int(when))
228
229 on_flags = []
230 off_flags = []
231 for flag in options.trace_flags:
232 off = False
233 if flag.startswith('-'):
234 flag = flag[1:]
235 off = True
236 if flag not in traceflags.allFlags:
237 print >>sys.stderr, "invalid trace flag '%s'" % flag
238 sys.exit(1)
239
240 if off:
241 off_flags.append(flag)
242 else:
243 on_flags.append(flag)
244
245 for flag in on_flags:
246 internal.trace.set(flag)
247
248 for flag in off_flags:
249 internal.trace.clear(flag)
250
251 if options.trace_start:
252 def enable_trace():
253 internal.trace.cvar.enabled = True
254 event.create(enable_trace, int(options.trace_start))
255 else:
256 internal.trace.cvar.enabled = True
257
258 internal.trace.output(options.trace_file)
259
260 for ignore in options.trace_ignore:
261 internal.trace.ignore(ignore)
262
263 sys.argv = arguments
264 sys.path = [ os.path.dirname(sys.argv[0]) ] + sys.path
265
266 scope = { '__file__' : sys.argv[0],
267 '__name__' : '__m5_main__' }
268
269 # we want readline if we're doing anything interactive
270 if options.interactive or options.pdb:
271 exec "import readline" in scope
272
273 # if pdb was requested, execfile the thing under pdb, otherwise,
274 # just do the execfile normally
275 if options.pdb:
276 from pdb import Pdb
277 debugger = Pdb()
278 debugger.run('execfile("%s")' % sys.argv[0], scope)
279 else:
280 execfile(sys.argv[0], scope)
281
282 # once the script is done
283 if options.interactive:
284 interact = code.InteractiveConsole(scope)
285 interact.interact("M5 Interactive Console")
286
287 if __name__ == '__main__':
288 from pprint import pprint
289
290 parse_args()
291
292 print 'opts:'
293 pprint(options, indent=4)
294 print
295
296 print 'args:'
297 pprint(arguments, indent=4)