sim: Add an option to forward work items to Python

There are cases where we want the Python world to handle work items
instead of the C++ world. However, that's currently not possible. This
changeset adds the forward_work_items option to the System class. Then
it is set to True, work items will generate workbegin/workend
simulation exists with the work item ID as the exit code and the old
C++ handling is completely bypassed.

--HG--
extra : rebase_source : 8de637a744fc4b6ff2bc763f00cdf8ddf2bff885
This commit is contained in:
Andreas Sandberg 2015-12-14 17:10:36 +00:00
parent f5f04c3120
commit 08754488a3
2 changed files with 18 additions and 6 deletions

View file

@ -73,6 +73,8 @@ class System(MemObject):
cache_line_size = Param.Unsigned(64, "Cache line size in bytes")
exit_on_work_items = Param.Bool(True, "Exit from the simulation loop when "
"encountering work item annotations.")
work_item_id = Param.Int(-1, "specific work item id")
num_work_ids = Param.Int(16, "Number of distinct work item types")
work_begin_cpu_id_exit = Param.Int(-1,

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2012 ARM Limited
* Copyright (c) 2010-2012, 2015 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@ -616,13 +616,18 @@ void
workbegin(ThreadContext *tc, uint64_t workid, uint64_t threadid)
{
DPRINTF(PseudoInst, "PseudoInst::workbegin(%i, %i)\n", workid, threadid);
tc->getCpuPtr()->workItemBegin();
System *sys = tc->getSystemPtr();
const System::Params *params = sys->params();
sys->workItemBegin(threadid, workid);
DPRINTF(WorkItems, "Work Begin workid: %d, threadid %d\n", workid,
if (params->exit_on_work_items) {
exitSimLoop("workbegin", static_cast<int>(workid));
return;
}
DPRINTF(WorkItems, "Work Begin workid: %d, threadid %d\n", workid,
threadid);
tc->getCpuPtr()->workItemBegin();
sys->workItemBegin(threadid, workid);
//
// If specified, determine if this is the specific work item the user
@ -674,12 +679,17 @@ void
workend(ThreadContext *tc, uint64_t workid, uint64_t threadid)
{
DPRINTF(PseudoInst, "PseudoInst::workend(%i, %i)\n", workid, threadid);
tc->getCpuPtr()->workItemEnd();
System *sys = tc->getSystemPtr();
const System::Params *params = sys->params();
sys->workItemEnd(threadid, workid);
if (params->exit_on_work_items) {
exitSimLoop("workend", static_cast<int>(workid));
return;
}
DPRINTF(WorkItems, "Work End workid: %d, threadid %d\n", workid, threadid);
tc->getCpuPtr()->workItemEnd();
sys->workItemEnd(threadid, workid);
//
// If specified, determine if this is the specific work item the user