176,179d175
< self.printProfilerCC(path)
< self.printProfilerHH(path)
< self.printProfileDumperCC(path)
< self.printProfileDumperHH(path)
231,232d226
< #include "mem/protocol/${ident}_ProfileDumper.hh"
< #include "mem/protocol/${ident}_Profiler.hh"
265a260
>
269a265,267
> void regStats();
> void collateStats();
>
277a276,281
> void countTransition(${ident}_State state, ${ident}_Event event);
> void possibleTransition(${ident}_State state, ${ident}_Event event);
> uint64 getEventCount(${ident}_Event event);
> bool isPossible(${ident}_State state, ${ident}_Event event);
> uint64 getTransitionCount(${ident}_State state, ${ident}_Event event);
>
322,323c326,331
< static ${ident}_ProfileDumper s_profileDumper;
< ${ident}_Profiler m_profiler;
---
> int m_counters[${ident}_State_NUM][${ident}_Event_NUM];
> int m_event_counters[${ident}_Event_NUM];
> bool m_possible[${ident}_State_NUM][${ident}_Event_NUM];
>
> static std::vector<Stats::Vector *> eventVec;
> static std::vector<std::vector<Stats::Vector *> > transVec;
443c451,452
< ${ident}_ProfileDumper $c_ident::s_profileDumper;
---
> std::vector<Stats::Vector *> $c_ident::eventVec;
> std::vector<std::vector<Stats::Vector *> > $c_ident::transVec;
522a532,541
>
> for (int state = 0; state < ${ident}_State_NUM; state++) {
> for (int event = 0; event < ${ident}_Event_NUM; event++) {
> m_possible[state][event] = false;
> m_counters[state][event] = 0;
> }
> }
> for (int event = 0; event < ${ident}_Event_NUM; event++) {
> m_event_counters[event] = 0;
> }
531,534c550,551
< MachineType machine_type;
< int base;
< machine_type = string_to_MachineType("${{var.machine.ident}}");
< base = MachineType_base_number(machine_type);
---
> MachineType machine_type = string_to_MachineType("${{var.machine.ident}}");
> int base = MachineType_base_number(machine_type);
540,541d556
< m_profiler.setVersion(m_version);
< s_profileDumper.registerProfiler(&m_profiler);
678c693
< code('m_profiler.possibleTransition($state, $event);')
---
> code('possibleTransition($state, $event);')
703a719,819
>
> void
> $c_ident::regStats()
> {
> if (m_version == 0) {
> for (${ident}_Event event = ${ident}_Event_FIRST;
> event < ${ident}_Event_NUM; ++event) {
> Stats::Vector *t = new Stats::Vector();
> t->init(m_num_controllers);
> t->name(name() + "." + ${ident}_Event_to_string(event));
> t->flags(Stats::pdf | Stats::total | Stats::oneline |
> Stats::nozero);
>
> eventVec.push_back(t);
> }
>
> for (${ident}_State state = ${ident}_State_FIRST;
> state < ${ident}_State_NUM; ++state) {
>
> transVec.push_back(std::vector<Stats::Vector *>());
>
> for (${ident}_Event event = ${ident}_Event_FIRST;
> event < ${ident}_Event_NUM; ++event) {
>
> Stats::Vector *t = new Stats::Vector();
> t->init(m_num_controllers);
> t->name(name() + "." + ${ident}_State_to_string(state) +
> "." + ${ident}_Event_to_string(event));
>
> t->flags(Stats::pdf | Stats::total | Stats::oneline |
> Stats::nozero);
> transVec[state].push_back(t);
> }
> }
> }
> }
>
> void
> $c_ident::collateStats()
> {
> for (${ident}_Event event = ${ident}_Event_FIRST;
> event < ${ident}_Event_NUM; ++event) {
> for (unsigned int i = 0; i < m_num_controllers; ++i) {
> std::map<uint32_t, AbstractController *>::iterator it =
> g_abs_controls[MachineType_${ident}].find(i);
> assert(it != g_abs_controls[MachineType_${ident}].end());
> (*eventVec[event])[i] =
> (($c_ident *)(*it).second)->getEventCount(event);
> }
> }
>
> for (${ident}_State state = ${ident}_State_FIRST;
> state < ${ident}_State_NUM; ++state) {
>
> for (${ident}_Event event = ${ident}_Event_FIRST;
> event < ${ident}_Event_NUM; ++event) {
>
> for (unsigned int i = 0; i < m_num_controllers; ++i) {
> std::map<uint32_t, AbstractController *>::iterator it =
> g_abs_controls[MachineType_${ident}].find(i);
> assert(it != g_abs_controls[MachineType_${ident}].end());
> (*transVec[state][event])[i] =
> (($c_ident *)(*it).second)->getTransitionCount(state, event);
> }
> }
> }
> }
>
> void
> $c_ident::countTransition(${ident}_State state, ${ident}_Event event)
> {
> assert(m_possible[state][event]);
> m_counters[state][event]++;
> m_event_counters[event]++;
> }
> void
> $c_ident::possibleTransition(${ident}_State state,
> ${ident}_Event event)
> {
> m_possible[state][event] = true;
> }
>
> uint64
> $c_ident::getEventCount(${ident}_Event event)
> {
> return m_event_counters[event];
> }
>
> bool
> $c_ident::isPossible(${ident}_State state, ${ident}_Event event)
> {
> return m_possible[state][event];
> }
>
> uint64
> $c_ident::getTransitionCount(${ident}_State state,
> ${ident}_Event event)
> {
> return m_counters[state][event];
> }
>
771,772c887
< if param.type_ast.type.ident == "DirectoryMemory" or \
< param.type_ast.type.ident == "MemoryControl":
---
> if param.type_ast.type.ident == "DirectoryMemory":
777,779d891
< if (m_version == 0) {
< s_profileDumper.dumpStats(out);
< }
782,791c894,900
< void $c_ident::clearStats() {
< ''')
< #
< # Cache and Memory Controllers have specific profilers associated with
< # them. These stats must be cleared too.
< #
< for param in self.config_parameters:
< if param.type_ast.type.ident == "MemoryControl":
< assert(param.pointer)
< code(' m_${{param.ident}}_ptr->clearStats();')
---
> void $c_ident::clearStats()
> {
> for (int state = 0; state < ${ident}_State_NUM; state++) {
> for (int event = 0; event < ${ident}_Event_NUM; event++) {
> m_counters[state][event] = 0;
> }
> }
793,794c902,905
< code('''
< m_profiler.clearStats();
---
> for (int event = 0; event < ${ident}_Event_NUM; event++) {
> m_event_counters[event] = 0;
> }
>
1133c1244
< m_profiler.countTransition(state, event);
---
> countTransition(state, event);
1295,1297d1405
< def printProfileDumperHH(self, path):
< code = self.symtab.codeFormatter()
< ident = self.ident
1299,1520d1406
< code('''
< // Auto generated C++ code started by $__file__:$__line__
< // ${ident}: ${{self.short}}
<
< #ifndef __${ident}_PROFILE_DUMPER_HH__
< #define __${ident}_PROFILE_DUMPER_HH__
<
< #include <cassert>
< #include <iostream>
< #include <vector>
<
< #include "${ident}_Event.hh"
< #include "${ident}_Profiler.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)
< {
< if (profiler->getVersion() >= m_profilers.size())
< m_profilers.resize(profiler->getVersion() + 1);
< m_profilers[profiler->getVersion()] = 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
<
< code('''
< // Auto generated C++ code started by $__file__:$__line__
< // ${ident}: ${{self.short}}
<
< #ifndef __${ident}_PROFILER_HH__
< #define __${ident}_PROFILER_HH__
<
< #include <cassert>
< #include <iostream>
<
< #include "mem/protocol/${ident}_Event.hh"
< #include "mem/protocol/${ident}_State.hh"
< #include "mem/ruby/common/TypeDefines.hh"
<
< class ${ident}_Profiler
< {
< public:
< ${ident}_Profiler();
< void setVersion(int version);
< int getVersion();
< void countTransition(${ident}_State state, ${ident}_Event event);
< void possibleTransition(${ident}_State state, ${ident}_Event event);
< uint64 getEventCount(${ident}_Event event);
< bool isPossible(${ident}_State state, ${ident}_Event event);
< uint64 getTransitionCount(${ident}_State state, ${ident}_Event event);
< void clearStats();
<
< private:
< int m_counters[${ident}_State_NUM][${ident}_Event_NUM];
< int m_event_counters[${ident}_Event_NUM];
< bool m_possible[${ident}_State_NUM][${ident}_Event_NUM];
< int m_version;
< };
<
< #endif // __${ident}_PROFILER_HH__
< ''')
< code.write(path, "%s_Profiler.hh" % self.ident)
<
< def printProfilerCC(self, path):
< code = self.symtab.codeFormatter()
< ident = self.ident
<
< code('''
< // Auto generated C++ code started by $__file__:$__line__
< // ${ident}: ${{self.short}}
<
< #include <cassert>
<
< #include "mem/protocol/${ident}_Profiler.hh"
<
< ${ident}_Profiler::${ident}_Profiler()
< {
< for (int state = 0; state < ${ident}_State_NUM; state++) {
< for (int event = 0; event < ${ident}_Event_NUM; event++) {
< m_possible[state][event] = false;
< m_counters[state][event] = 0;
< }
< }
< for (int event = 0; event < ${ident}_Event_NUM; event++) {
< m_event_counters[event] = 0;
< }
< }
<
< void
< ${ident}_Profiler::setVersion(int version)
< {
< m_version = version;
< }
<
< int
< ${ident}_Profiler::getVersion()
< {
< return m_version;
< }
<
< void
< ${ident}_Profiler::clearStats()
< {
< for (int state = 0; state < ${ident}_State_NUM; state++) {
< for (int event = 0; event < ${ident}_Event_NUM; event++) {
< m_counters[state][event] = 0;
< }
< }
<
< for (int event = 0; event < ${ident}_Event_NUM; event++) {
< m_event_counters[event] = 0;
< }
< }
< void
< ${ident}_Profiler::countTransition(${ident}_State state, ${ident}_Event event)
< {
< assert(m_possible[state][event]);
< m_counters[state][event]++;
< m_event_counters[event]++;
< }
< void
< ${ident}_Profiler::possibleTransition(${ident}_State state,
< ${ident}_Event event)
< {
< m_possible[state][event] = true;
< }
<
< uint64
< ${ident}_Profiler::getEventCount(${ident}_Event event)
< {
< 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)
<