slicc: Consolidated the protocol stats printing

Created a separate ProfileDumper that consolidates the generated stats for
each controller of a certain type.
This commit is contained in:
Brad Beckmann
2010-08-20 11:46:12 -07:00
parent 10e25cb1d0
commit d694cc1384
2 changed files with 133 additions and 35 deletions

View File

@@ -46,6 +46,8 @@ class MachineAST(DeclAST):
'%s_Controller.py' % self.ident,
'%s_Profiler.cc' % self.ident,
'%s_Profiler.hh' % self.ident,
'%s_ProfileDumper.cc' % self.ident,
'%s_ProfileDumper.hh' % self.ident,
'%s_Transitions.cc' % self.ident,
'%s_Wakeup.cc' % self.ident))

View File

@@ -145,6 +145,8 @@ class StateMachine(Symbol):
self.printCWakeup(path)
self.printProfilerCC(path)
self.printProfilerHH(path)
self.printProfileDumperCC(path)
self.printProfileDumperHH(path)
for func in self.functions:
func.writeCodeFiles(path)
@@ -208,6 +210,7 @@ class $py_ident(RubyController):
#include "mem/protocol/TransitionResult.hh"
#include "mem/protocol/Types.hh"
#include "mem/protocol/${ident}_Profiler.hh"
#include "mem/protocol/${ident}_ProfileDumper.hh"
''')
seen_types = set()
@@ -277,7 +280,8 @@ Network* m_net_ptr;
MachineID m_machineID;
bool m_is_blocking;
std::map<Address, MessageBuffer*> m_block_map;
${ident}_Profiler s_profiler;
static ${ident}_ProfileDumper s_profileDumper;
${ident}_Profiler m_profiler;
static int m_num_controllers;
// Internal functions
@@ -357,6 +361,7 @@ ${c_ident}Params::create()
}
int $c_ident::m_num_controllers = 0;
${ident}_ProfileDumper $c_ident::s_profileDumper;
// for adding information to the protocol debug trace
stringstream ${ident}_transitionComment;
@@ -434,7 +439,8 @@ $c_ident::init()
m_machineID.num = m_version;
// initialize objects
s_profiler.setVersion(m_version);
m_profiler.setVersion(m_version);
s_profileDumper.registerProfiler(&m_profiler);
''')
@@ -554,7 +560,7 @@ $vid->setDescription("[Version " + to_string(m_version) + ", ${ident}, name=${{v
if not stall:
state = "%s_State_%s" % (self.ident, trans.state.ident)
event = "%s_Event_%s" % (self.ident, trans.event.ident)
code('s_profiler.possibleTransition($state, $event);')
code('m_profiler.possibleTransition($state, $event);')
# added by SS to initialize recycle_latency of message buffers
for buf in self.message_buffer_names:
@@ -658,7 +664,9 @@ $c_ident::printStats(ostream& out) const
code(' m_${{param.ident}}_ptr->printStats(out);')
code('''
s_profiler.dumpStats(out);
if (m_version == 0) {
s_profileDumper.dumpStats(out);
}
}
void $c_ident::clearStats() {
@@ -674,7 +682,7 @@ void $c_ident::clearStats() {
code(' m_${{param.ident}}_ptr->clearStats();')
code('''
s_profiler.clearStats();
m_profiler.clearStats();
}
// Actions
@@ -804,7 +812,7 @@ ${ident}_Controller::doTransition(${ident}_Event event,
if (result == TransitionResult_Valid) {
DEBUG_EXPR(GENERATED_COMP, MedPrio, next_state);
DEBUG_NEWLINE(GENERATED_COMP, MedPrio);
s_profiler.countTransition(state, event);
m_profiler.countTransition(state, event);
if (Debug::getProtocolTrace()) {
g_system_ptr->getProfiler()->profileTransition("${ident}",
m_version, addr,
@@ -928,6 +936,101 @@ if (!%s.areNSlotsAvailable(%s))
''')
code.write(path, "%s_Transitions.cc" % self.ident)
def printProfileDumperHH(self, path):
code = self.symtab.codeFormatter()
ident = self.ident
code('''
// Auto generated C++ code started by $__file__:$__line__
// ${ident}: ${{self.short}}
#ifndef __${ident}_PROFILE_DUMPER_HH__
#define __${ident}_PROFILE_DUMPER_HH__
#include <iostream>
#include <vector>
#include "${ident}_Profiler.hh"
#include "${ident}_Event.hh"
typedef std::vector<${ident}_Profiler *> ${ident}_profilers;
class ${ident}_ProfileDumper
{
public:
${ident}_ProfileDumper();
void registerProfiler(${ident}_Profiler* profiler);
void dumpStats(std::ostream& out) const;
private:
${ident}_profilers m_profilers;
};
#endif // __${ident}_PROFILE_DUMPER_HH__
''')
code.write(path, "%s_ProfileDumper.hh" % self.ident)
def printProfileDumperCC(self, path):
code = self.symtab.codeFormatter()
ident = self.ident
code('''
// Auto generated C++ code started by $__file__:$__line__
// ${ident}: ${{self.short}}
#include "mem/protocol/${ident}_ProfileDumper.hh"
${ident}_ProfileDumper::${ident}_ProfileDumper()
{
}
void
${ident}_ProfileDumper::registerProfiler(${ident}_Profiler* profiler)
{
m_profilers.push_back(profiler);
}
void
${ident}_ProfileDumper::dumpStats(std::ostream& out) const
{
out << " --- ${ident} ---\\n";
out << " - Event Counts -\\n";
for (${ident}_Event event = ${ident}_Event_FIRST;
event < ${ident}_Event_NUM;
++event) {
out << (${ident}_Event) event << " [";
uint64 total = 0;
for (int i = 0; i < m_profilers.size(); i++) {
out << m_profilers[i]->getEventCount(event) << " ";
total += m_profilers[i]->getEventCount(event);
}
out << "] " << total << "\\n";
}
out << "\\n";
out << " - Transitions -\\n";
for (${ident}_State state = ${ident}_State_FIRST;
state < ${ident}_State_NUM;
++state) {
for (${ident}_Event event = ${ident}_Event_FIRST;
event < ${ident}_Event_NUM;
++event) {
if (m_profilers[0]->isPossible(state, event)) {
out << (${ident}_State) state << " "
<< (${ident}_Event) event << " [";
uint64 total = 0;
for (int i = 0; i < m_profilers.size(); i++) {
out << m_profilers[i]->getTransitionCount(state, event) << " ";
total += m_profilers[i]->getTransitionCount(state, event);
}
out << "] " << total << "\\n";
}
}
out << "\\n";
}
}
''')
code.write(path, "%s_ProfileDumper.cc" % self.ident)
def printProfilerHH(self, path):
code = self.symtab.codeFormatter()
ident = self.ident
@@ -936,8 +1039,8 @@ if (!%s.areNSlotsAvailable(%s))
// Auto generated C++ code started by $__file__:$__line__
// ${ident}: ${{self.short}}
#ifndef __${ident}_PROFILER_HH_
#define __${ident}_PROFILER_HH_
#ifndef __${ident}_PROFILER_HH__
#define __${ident}_PROFILER_HH__
#include <iostream>
@@ -952,7 +1055,9 @@ class ${ident}_Profiler
void setVersion(int version);
void countTransition(${ident}_State state, ${ident}_Event event);
void possibleTransition(${ident}_State state, ${ident}_Event event);
void dumpStats(std::ostream& out) const;
uint64 getEventCount(${ident}_Event event);
bool isPossible(${ident}_State state, ${ident}_Event event);
uint64 getTransitionCount(${ident}_State state, ${ident}_Event event);
void clearStats();
private:
@@ -1022,34 +1127,25 @@ ${ident}_Profiler::possibleTransition(${ident}_State state,
m_possible[state][event] = true;
}
void
${ident}_Profiler::dumpStats(std::ostream& out) const
uint64
${ident}_Profiler::getEventCount(${ident}_Event event)
{
using namespace std;
out << " --- ${ident} " << m_version << " ---" << endl;
out << " - Event Counts -" << endl;
for (int event = 0; event < ${ident}_Event_NUM; event++) {
int count = m_event_counters[event];
out << (${ident}_Event) event << " " << count << endl;
}
out << endl;
out << " - Transitions -" << endl;
for (int state = 0; state < ${ident}_State_NUM; state++) {
for (int event = 0; event < ${ident}_Event_NUM; event++) {
if (m_possible[state][event]) {
int count = m_counters[state][event];
out << (${ident}_State) state << " "
<< (${ident}_Event) event << " " << count;
if (count == 0) {
out << " <-- ";
}
out << endl;
}
}
out << endl;
}
return m_event_counters[event];
}
bool
${ident}_Profiler::isPossible(${ident}_State state, ${ident}_Event event)
{
return m_possible[state][event];
}
uint64
${ident}_Profiler::getTransitionCount(${ident}_State state,
${ident}_Event event)
{
return m_counters[state][event];
}
''')
code.write(path, "%s_Profiler.cc" % self.ident)