1# Copyright 2018 Google, Inc. 2# 3# Redistribution and use in source and binary forms, with or without 4# modification, are permitted provided that the following conditions are 5# met: redistributions of source code must retain the above copyright 6# notice, this list of conditions and the following disclaimer; 7# redistributions in binary form must reproduce the above copyright 8# notice, this list of conditions and the following disclaimer in the 9# documentation and/or other materials provided with the distribution; 10# neither the name of the copyright holders nor the names of its 11# contributors may be used to endorse or promote products derived from 12# this software without specific prior written permission. 13# 14# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 15# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 17# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 18# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 19# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 20# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25# 26# Authors: Gabe Black 27 28import argparse 29import m5 30import sys 31 32from m5.objects import SystemC_Kernel, Root 33 34# pylint:disable=unused-variable 35 36# The python version of the systemc kernel acts as an interface to sc_main. The 37# c++ version of the kernel object has a lot of important jobs supporting 38# systemc objects and needs to exist in simulations using systemc. 39kernel = SystemC_Kernel() 40root = Root(full_system=True, systemc_kernel=kernel) 41 42parser = argparse.ArgumentParser() 43parser.add_argument('--word', action="append", default=[], 44 help='Add a word to the list of words to print. Can be repeated.') 45 46args = parser.parse_args() 47 48# Tell gem5 to run the c++ sc_main function. If one isn't defined, gem5 will 49# detect that and report an error. If gem5 isn't finding your sc_main, make 50# sure its signature matches exactly so your compiler doesn't think it's a 51# different function. 52# 53# The arguements passed to this function will be treated as the argv values 54# passed to the c++ sc_main, with the argc value set appropriately. 55m5.systemc.sc_main(*args.word); 56 57# Construct the SimObject hierarchy. Anything sc_main built has already been 58# constructed. 59m5.instantiate(None) 60 61# Run the simulation until something kicks us back to the config file. sc_main 62# will be at the point it first called sc_start and may keep executing as the 63# simulation runs, or it may be completed if it never called sc_start. 64cause = m5.simulate(m5.MaxTick).getCause() 65 66# If sc_main finished, extract what it returned and do something with it. 67result = m5.systemc.sc_main_result() 68if result.code != 0: 69 sys.exit(int(result.code)) 70