diff options
author | Gabe Black <gabeblack@google.com> | 2018-09-20 02:57:54 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-10-16 00:26:15 +0000 |
commit | 3d29513196e7d59e1b8f9da120089bac17e8771d (patch) | |
tree | 600c99d37f34fd7ec07b7221fb41f14848b4938c /src/systemc/core/scheduler.hh | |
parent | a503a24d97b29ef246330e95dab77669a0a4256c (diff) | |
download | gem5-3d29513196e7d59e1b8f9da120089bac17e8771d.tar.xz |
systemc: Implement general and VCD trace support.
This doesn't include WIF trace support, but does make allowances for
adding it in the future.
Change-Id: Ifb62f40a7d8a13e94463930a44ac4b1cf41e3009
Reviewed-on: https://gem5-review.googlesource.com/c/12826
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/core/scheduler.hh')
-rw-r--r-- | src/systemc/core/scheduler.hh | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/systemc/core/scheduler.hh b/src/systemc/core/scheduler.hh index 8015260a3..ebe15462c 100644 --- a/src/systemc/core/scheduler.hh +++ b/src/systemc/core/scheduler.hh @@ -48,6 +48,8 @@ class Fiber; namespace sc_gem5 { +class TraceFile; + typedef NodeList<Process> ProcessList; typedef NodeList<Channel> ChannelList; @@ -280,6 +282,7 @@ class Scheduler timeSlots.erase(timeSlots.begin()); if (!runToTime && starved()) scheduleStarvationEvent(); + scheduleTimeAdvancesEvent(); } // Pending activity ignores gem5 activity, much like how a systemc @@ -357,6 +360,9 @@ class Scheduler Status status() { return _status; } void status(Status s) { _status = s; } + void registerTraceFile(TraceFile *tf) { traceFiles.insert(tf); } + void unregisterTraceFile(TraceFile *tf) { traceFiles.erase(tf); } + private: typedef const EventBase::Priority Priority; static Priority DefaultPriority = EventBase::Default_Pri; @@ -366,6 +372,7 @@ class Scheduler static Priority MaxTickPriority = DefaultPriority + 2; static Priority ReadyPriority = DefaultPriority + 3; static Priority StarvationPriority = ReadyPriority; + static Priority TimeAdvancesPriority = EventBase::Maximum_Pri; EventQueue *eq; @@ -440,6 +447,15 @@ class Scheduler } EventWrapper<Scheduler, &Scheduler::maxTickFunc> maxTickEvent; + void timeAdvances() { trace(false); } + EventWrapper<Scheduler, &Scheduler::timeAdvances> timeAdvancesEvent; + void + scheduleTimeAdvancesEvent() + { + if (!traceFiles.empty() && !timeAdvancesEvent.scheduled()) + schedule(&timeAdvancesEvent); + } + uint64_t _numCycles; uint64_t _changeStamp; @@ -457,6 +473,10 @@ class Scheduler ChannelList updateList; std::map<::Event *, Tick> eventsToSchedule; + + std::set<TraceFile *> traceFiles; + + void trace(bool delta); }; extern Scheduler scheduler; |