summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-09-07 18:54:49 -0700
committerGabe Black <gabeblack@google.com>2018-10-09 21:44:17 +0000
commit110907bae1699e61455334bab40c161ddfc4141d (patch)
tree1bee1d2604c2b2cad5490000aee45bde76d4eccf
parenta4b82a86115649cbe403315bf04231d5c9512015 (diff)
downloadgem5-110907bae1699e61455334bab40c161ddfc4141d.tar.xz
systemc: Mostly implememt sc_simcontext.
Since we don't track the current process using the sc_curr_proc_handle structure, we keep one around just to return from the appropriate accessor, and set its values when it's requested. If the object is kept around, those values won't change to track changing processes. From what I see, none of the tests rely on the value tracking the process beyond the callsight. Change-Id: I1ad3b7a7b15aa0bc4d218f986ffbe7c51501b296 Reviewed-on: https://gem5-review.googlesource.com/c/12611 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
-rw-r--r--src/systemc/core/sc_simcontext.cc46
1 files changed, 28 insertions, 18 deletions
diff --git a/src/systemc/core/sc_simcontext.cc b/src/systemc/core/sc_simcontext.cc
index 647cb16db..3a085e5ab 100644
--- a/src/systemc/core/sc_simcontext.cc
+++ b/src/systemc/core/sc_simcontext.cc
@@ -28,50 +28,60 @@
*/
#include "base/logging.hh"
+#include "systemc/core/object.hh"
+#include "systemc/core/scheduler.hh"
+#include "systemc/ext/core/sc_main.hh"
#include "systemc/ext/core/sc_simcontext.hh"
namespace sc_core
{
-sc_dt::uint64
-sc_simcontext::delta_count() const
+namespace
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
- return 0;
-}
-void
-sc_simcontext::reset()
-{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
-}
+size_t objIndex = 0;
+sc_simcontext currContext;
+
+sc_curr_proc_info currProcInfo;
+
+} // anonymous namespace
+
+sc_dt::uint64 sc_simcontext::delta_count() const { return sc_delta_count(); }
+void sc_simcontext::reset() { objIndex = 0; }
sc_curr_proc_handle
sc_simcontext::get_curr_proc_info()
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
- return nullptr;
+ ::sc_gem5::Process *p = ::sc_gem5::scheduler.current();
+ currProcInfo.process_handle = p;
+ currProcInfo.kind = p ? p->procKind() : SC_NO_PROC_;
+ return &currProcInfo;
}
sc_object *
sc_simcontext::first_object()
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
- return nullptr;
+ objIndex = 0;
+ if (!::sc_gem5::allObjects.empty())
+ return ::sc_gem5::allObjects[0];
+ else
+ return nullptr;
}
sc_object *
sc_simcontext::next_object()
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
- return nullptr;
+ objIndex++;
+ if (::sc_gem5::allObjects.size() > objIndex)
+ return ::sc_gem5::allObjects[objIndex];
+ else
+ return nullptr;
}
sc_simcontext *
sc_get_curr_simcontext()
{
- warn("%s not implemented.\n", __PRETTY_FUNCTION__);
- return nullptr;
+ return &currContext;
}
} // namespace sc_core