diff options
author | Andreas Hansson <andreas.hansson@arm.com> | 2013-01-07 13:05:37 -0500 |
---|---|---|
committer | Andreas Hansson <andreas.hansson@arm.com> | 2013-01-07 13:05:37 -0500 |
commit | 1da209140cd7bf267315b10698bf14c21a76b1b8 (patch) | |
tree | fdfc048fe02cdd6862a21361484e75c97fca4366 /src/cpu/testers | |
parent | 9c5ef235cc595d0f51b0810786c2b512bef7c69f (diff) | |
download | gem5-1da209140cd7bf267315b10698bf14c21a76b1b8.tar.xz |
cpu: Add support for protobuf input for the trace generator
This patch adds support for reading input traces encoded using
protobuf according to what is done in the CommMonitor.
A follow-up patch adds a Python script that can be used to convert the
previously used ASCII traces to protobuf equivalents. The appropriate
regression input is updated as part of this patch.
Diffstat (limited to 'src/cpu/testers')
-rw-r--r-- | src/cpu/testers/traffic_gen/SConscript | 9 | ||||
-rw-r--r-- | src/cpu/testers/traffic_gen/traffic_gen.cc | 65 | ||||
-rw-r--r-- | src/cpu/testers/traffic_gen/traffic_gen.hh | 14 |
3 files changed, 27 insertions, 61 deletions
diff --git a/src/cpu/testers/traffic_gen/SConscript b/src/cpu/testers/traffic_gen/SConscript index 63ce20984..09a06fe04 100644 --- a/src/cpu/testers/traffic_gen/SConscript +++ b/src/cpu/testers/traffic_gen/SConscript @@ -39,8 +39,11 @@ Import('*') -SimObject('TrafficGen.py') +# Only build the traffic generator if we have support for protobuf as the +# tracing relies on it +if env['HAVE_PROTOBUF']: + SimObject('TrafficGen.py') -Source('traffic_gen.cc') + Source('traffic_gen.cc') -DebugFlag('TrafficGen') + DebugFlag('TrafficGen') diff --git a/src/cpu/testers/traffic_gen/traffic_gen.cc b/src/cpu/testers/traffic_gen/traffic_gen.cc index 4617f5c81..05e5d0d3b 100644 --- a/src/cpu/testers/traffic_gen/traffic_gen.cc +++ b/src/cpu/testers/traffic_gen/traffic_gen.cc @@ -45,6 +45,7 @@ #include "cpu/testers/traffic_gen/traffic_gen.hh" #include "debug/Checkpoint.hh" #include "debug/TrafficGen.hh" +#include "proto/packet.pb.h" #include "sim/stats.hh" #include "sim/system.hh" @@ -497,65 +498,35 @@ TrafficGen::StateGraph::RandomGen::nextExecuteTick() TrafficGen::StateGraph::TraceGen::InputStream::InputStream(const string& filename) + : trace(filename) { - trace.rdbuf()->pubsetbuf(readBuffer, 4 * 1024 * 1024); - trace.open(filename.c_str(), ifstream::in); - - if (!trace.is_open()) { - fatal("Traffic generator trace file could not be" - " opened: %s\n", filename); + // Create a protobuf message for the header and read it from the stream + Message::PacketHeader header_msg; + if (!trace.read(header_msg)) { + panic("Failed to read packet header from %s\n", filename); + + if (header_msg.tick_freq() != SimClock::Frequency) { + panic("Trace %s was recorded with a different tick frequency %d\n", + header_msg.tick_freq()); + } } } void TrafficGen::StateGraph::TraceGen::InputStream::reset() { - // seek to the start of the input trace file - trace.seekg(0, ifstream::beg); - trace.clear(); + trace.reset(); } bool TrafficGen::StateGraph::TraceGen::InputStream::read(TraceElement& element) { - string buffer; - bool format_error = false; - assert(trace.good()); - getline(trace, buffer); - - // Check that we have something to process. This assumes no EOF at - // the end of the line. - if (buffer.size() > 0 && !trace.eof()) { - std::istringstream iss(buffer); - - char rOrW, ch; - iss >> rOrW; - if (rOrW == 'r') { - element.cmd = MemCmd::ReadReq; - } else if (rOrW == 'w') { - element.cmd = MemCmd::WriteReq; - } else { - format_error = true; - } - - // eat a comma, then get the address - iss >> ch; - format_error |= ch != ','; - iss >> element.addr; - - // eat a comma, then get the blocksize - iss >> ch; - format_error |= ch != ','; - iss >> element.blocksize; - - // eat a comma, then get the tick - iss >> ch; - format_error |= ch != ','; - iss >> element.tick; - - if (format_error) - fatal("Trace format error in %s\n", buffer); - + Message::Packet pkt_msg; + if (trace.read(pkt_msg)) { + element.cmd = pkt_msg.cmd(); + element.addr = pkt_msg.addr(); + element.blocksize = pkt_msg.size(); + element.tick = pkt_msg.tick(); return true; } diff --git a/src/cpu/testers/traffic_gen/traffic_gen.hh b/src/cpu/testers/traffic_gen/traffic_gen.hh index be1cc0550..4fca8a384 100644 --- a/src/cpu/testers/traffic_gen/traffic_gen.hh +++ b/src/cpu/testers/traffic_gen/traffic_gen.hh @@ -41,12 +41,11 @@ #ifndef __MEM_TRAFFIC_GEN_HH__ #define __MEM_TRAFFIC_GEN_HH__ -#include <fstream> - #include "base/hashmap.hh" #include "mem/mem_object.hh" #include "mem/qport.hh" #include "params/TrafficGen.hh" +#include "proto/protoio.hh" /** * The traffic generator is a master module that generates stimuli for @@ -449,15 +448,8 @@ class TrafficGen : public MemObject private: - /// Input file stream for the ASCII trace - std::ifstream trace; - - /** - * Create a 4MB read buffer for the input trace - * file. This is to reduce the number of disk accesses - * and thereby speed up the execution. - */ - char readBuffer[4 * 1024 * 1024]; + /// Input file stream for the protobuf trace + ProtoInputStream trace; public: |