# HG changeset patch
# User Brad Beckmann <[email protected]>
# Date 1260657436 28800
# Node ID 1e80abe5cdd5f3b768f040ed5b8f91bd65acf95e
# Parent 9bc2d1989135d514762556074847b27e503eda04
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.
diff -r 9bc2d1989135 -r 1e80abe5cdd5 src/mem/ruby/recorder/CacheRecorder.cc
--- a/src/mem/ruby/recorder/CacheRecorder.cc Sat Dec 12 14:37:16 2009 -0800
+++ b/src/mem/ruby/recorder/CacheRecorder.cc Sat Dec 12 14:37:16 2009 -0800
@@ -48,9 +48,13 @@
delete m_records_ptr;
}
-void CacheRecorder::addRecord(const string & sequencer_name, const Address&
data_addr, const Address& pc_addr, RubyRequestType type, Time time)
+void CacheRecorder::addRecord(Sequencer* sequencer,
+ const Address& data_addr,
+ const Address& pc_addr,
+ RubyRequestType type,
+ Time time)
{
- m_records_ptr->insert(TraceRecord(sequencer_name, data_addr, pc_addr, type,
time));
+ m_records_ptr->insert(TraceRecord(sequencer, data_addr, pc_addr, type,
time));
}
int CacheRecorder::dumpRecords(string filename)
diff -r 9bc2d1989135 -r 1e80abe5cdd5 src/mem/ruby/recorder/CacheRecorder.hh
--- a/src/mem/ruby/recorder/CacheRecorder.hh Sat Dec 12 14:37:16 2009 -0800
+++ b/src/mem/ruby/recorder/CacheRecorder.hh Sat Dec 12 14:37:16 2009 -0800
@@ -47,6 +47,7 @@
template <class TYPE> class PrioHeap;
class Address;
class TraceRecord;
+class Sequencer;
class CacheRecorder {
public:
@@ -57,7 +58,11 @@
~CacheRecorder();
// Public Methods
- void addRecord(const string & sequencer_name, const Address& data_addr,
const Address& pc_addr, RubyRequestType type, Time time);
+ void addRecord(Sequencer* sequencer,
+ const Address& data_addr,
+ const Address& pc_addr,
+ RubyRequestType type,
+ Time time);
int dumpRecords(string filename);
void print(ostream& out) const;
diff -r 9bc2d1989135 -r 1e80abe5cdd5 src/mem/ruby/recorder/TraceRecord.cc
--- a/src/mem/ruby/recorder/TraceRecord.cc Sat Dec 12 14:37:16 2009 -0800
+++ b/src/mem/ruby/recorder/TraceRecord.cc Sat Dec 12 14:37:16 2009 -0800
@@ -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::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 @@
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 @@
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;
diff -r 9bc2d1989135 -r 1e80abe5cdd5 src/mem/ruby/recorder/TraceRecord.hh
--- a/src/mem/ruby/recorder/TraceRecord.hh Sat Dec 12 14:37:16 2009 -0800
+++ b/src/mem/ruby/recorder/TraceRecord.hh Sat Dec 12 14:37:16 2009 -0800
@@ -49,8 +49,17 @@
class TraceRecord {
public:
// Constructors
- TraceRecord(const string & sequencer_name, const Address& data_addr, const
Address& pc_addr, RubyRequestType type, Time time);
- TraceRecord() { m_sequencer_name = ""; m_time = 0; m_type =
RubyRequestType_NULL; }
+ TraceRecord(Sequencer* _sequencer,
+ const Address& data_addr,
+ const Address& pc_addr,
+ RubyRequestType type,
+ Time time);
+
+ TraceRecord() {
+ m_sequencer_ptr = NULL;
+ m_time = 0;
+ m_type = RubyRequestType_NULL;
+ }
// Destructor
// ~TraceRecord();
@@ -70,7 +79,7 @@
// Private Methods
// Data Members (m_ prefix)
- string m_sequencer_name;
+ Sequencer* m_sequencer_ptr;
Time m_time;
Address m_data_address;
Address m_pc_address;
diff -r 9bc2d1989135 -r 1e80abe5cdd5 src/mem/ruby/recorder/Tracer.cc
--- a/src/mem/ruby/recorder/Tracer.cc Sat Dec 12 14:37:16 2009 -0800
+++ b/src/mem/ruby/recorder/Tracer.cc Sat Dec 12 14:37:16 2009 -0800
@@ -89,10 +89,14 @@
}
}
-void Tracer::traceRequest(const string & sequencer_name, const Address&
data_addr, const Address& pc_addr, RubyRequestType type, Time time)
+void Tracer::traceRequest(Sequencer* sequencer,
+ const Address& data_addr,
+ const Address& pc_addr,
+ RubyRequestType type,
+ Time time)
{
assert(m_enabled == true);
- TraceRecord tr(sequencer_name, data_addr, pc_addr, type, time);
+ TraceRecord tr(sequencer, data_addr, pc_addr, type, time);
tr.output(m_trace_file);
}
diff -r 9bc2d1989135 -r 1e80abe5cdd5 src/mem/ruby/recorder/Tracer.hh
--- a/src/mem/ruby/recorder/Tracer.hh Sat Dec 12 14:37:16 2009 -0800
+++ b/src/mem/ruby/recorder/Tracer.hh Sat Dec 12 14:37:16 2009 -0800
@@ -52,6 +52,7 @@
template <class TYPE> class PrioHeap;
class Address;
class TraceRecord;
+class Sequencer;
class Tracer : public SimObject {
public:
@@ -67,7 +68,11 @@
void startTrace(string filename);
void stopTrace();
bool traceEnabled() { return m_enabled; }
- void traceRequest(const string & sequencer_name, const Address& data_addr,
const Address& pc_addr, RubyRequestType type, Time time);
+ void traceRequest(Sequencer* sequencer,
+ const Address& data_addr,
+ const Address& pc_addr,
+ RubyRequestType type,
+ Time time);
void print(ostream& out) const;
diff -r 9bc2d1989135 -r 1e80abe5cdd5 src/mem/ruby/system/Sequencer.cc
--- a/src/mem/ruby/system/Sequencer.cc Sat Dec 12 14:37:16 2009 -0800
+++ b/src/mem/ruby/system/Sequencer.cc Sat Dec 12 14:37:16 2009 -0800
@@ -472,7 +472,7 @@
}
if (g_system_ptr->getTracer()->traceEnabled()) {
- g_system_ptr->getTracer()->traceRequest(m_name, line_addr,
Address(request.pc),
+ g_system_ptr->getTracer()->traceRequest(this, line_addr,
Address(request.pc),
request.type,
g_eventQueue_ptr->getTime());
}
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev