summaryrefslogtreecommitdiff
path: root/src/mem/ruby/recorder/TraceRecord.cc
diff options
context:
space:
mode:
authorBrad Beckmann <Brad.Beckmann@amd.com>2010-01-29 20:29:20 -0800
committerBrad Beckmann <Brad.Beckmann@amd.com>2010-01-29 20:29:20 -0800
commit0f6535dba1e94d97118023adb6df811af58b752f (patch)
tree5fffc96bff9bcb55c1aa71b6e27b3c9ebf6c8329 /src/mem/ruby/recorder/TraceRecord.cc
parent2c9ca672dfe4a204ebe21c73b344d2939c0e0eff (diff)
downloadgem5-0f6535dba1e94d97118023adb6df811af58b752f.tar.xz
ruby: Convered ruby tracing support usage of sequencer
Modified ruby's tracing support to no longer rely on the RubySystem map to convert a sequencer string name to a sequencer pointer. As a temporary solution, the code uses the sim_object find function. Eventually, we should develop a better fix.
Diffstat (limited to 'src/mem/ruby/recorder/TraceRecord.cc')
-rw-r--r--src/mem/ruby/recorder/TraceRecord.cc46
1 files changed, 32 insertions, 14 deletions
diff --git a/src/mem/ruby/recorder/TraceRecord.cc b/src/mem/ruby/recorder/TraceRecord.cc
index 8f426d690..e700687d6 100644
--- a/src/mem/ruby/recorder/TraceRecord.cc
+++ b/src/mem/ruby/recorder/TraceRecord.cc
@@ -36,10 +36,15 @@
#include "mem/ruby/system/Sequencer.hh"
#include "mem/ruby/system/System.hh"
#include "mem/protocol/CacheMsg.hh"
+#include "sim/sim_object.hh"
-TraceRecord::TraceRecord(const string & sequencer_name, const Address& data_addr, const Address& pc_addr, RubyRequestType type, Time time)
+TraceRecord::TraceRecord(Sequencer* _sequencer,
+ const Address& data_addr,
+ const Address& pc_addr,
+ RubyRequestType type,
+ Time time)
{
- m_sequencer_name = sequencer_name;
+ m_sequencer_ptr = _sequencer;
m_data_address = data_addr;
m_pc_address = pc_addr;
m_time = time;
@@ -63,7 +68,7 @@ TraceRecord::TraceRecord(const TraceRecord& obj)
TraceRecord& TraceRecord::operator=(const TraceRecord& obj)
{
- m_sequencer_name = obj.m_sequencer_name;
+ m_sequencer_ptr = obj.m_sequencer_ptr;
m_time = obj.m_time;
m_data_address = obj.m_data_address;
m_pc_address = obj.m_pc_address;
@@ -73,34 +78,38 @@ TraceRecord& TraceRecord::operator=(const TraceRecord& obj)
void TraceRecord::issueRequest() const
{
- // Lookup sequencer pointer from system
- // Note that the chip index also needs to take into account SMT configurations
- Sequencer* sequencer_ptr = RubySystem::getSequencer(m_sequencer_name);
- assert(sequencer_ptr != NULL);
+ assert(m_sequencer_ptr != NULL);
- RubyRequest request(m_data_address.getAddress(), NULL, RubySystem::getBlockSizeBytes(), m_pc_address.getAddress(), m_type, RubyAccessMode_User);
+ RubyRequest request(m_data_address.getAddress(),
+ NULL,
+ RubySystem::getBlockSizeBytes(),
+ m_pc_address.getAddress(),
+ m_type,
+ RubyAccessMode_User);
// Clear out the sequencer
- while (!sequencer_ptr->empty()) {
+ while (!m_sequencer_ptr->empty()) {
g_eventQueue_ptr->triggerEvents(g_eventQueue_ptr->getTime() + 100);
}
- sequencer_ptr->makeRequest(request);
+ m_sequencer_ptr->makeRequest(request);
// Clear out the sequencer
- while (!sequencer_ptr->empty()) {
+ while (!m_sequencer_ptr->empty()) {
g_eventQueue_ptr->triggerEvents(g_eventQueue_ptr->getTime() + 100);
}
}
void TraceRecord::print(ostream& out) const
{
- out << "[TraceRecord: Node, " << m_sequencer_name << ", " << m_data_address << ", " << m_pc_address << ", " << m_type << ", Time: " << m_time << "]";
+ out << "[TraceRecord: Node, " << m_sequencer_ptr->name() << ", "
+ << m_data_address << ", " << m_pc_address << ", "
+ << m_type << ", Time: " << m_time << "]";
}
void TraceRecord::output(ostream& out) const
{
- out << m_sequencer_name << " ";
+ out << m_sequencer_ptr->name() << " ";
m_data_address.output(out);
out << " ";
m_pc_address.output(out);
@@ -111,7 +120,16 @@ void TraceRecord::output(ostream& out) const
bool TraceRecord::input(istream& in)
{
- in >> m_sequencer_name;
+ string sequencer_name;
+ in >> sequencer_name;
+
+ //
+ // The SimObject find function is slow and iterates through the
+ // simObjectList to find the sequencer pointer. Therefore, expect trace
+ // playback to be slow.
+ //
+ m_sequencer_ptr = (Sequencer*)SimObject::find(sequencer_name.c_str());
+
m_data_address.input(in);
m_pc_address.input(in);
string type;