misc: Separate stats file for SystemC-gem5 co-simulation

In previous versions of systemC-gem5 coupling statistics were not updated
for the systemc-gem5 simulation. systemC-gem5 simulation only need the
previously built config.ini file and normal gem5 simulation has to be run
once to generate config.ini file. Thus stats.txt inside the m5out folder is
redundant for systemC-gem5 simulation. A new stats file is now generated
with the all the statistics for systemC-gem5 simulation. This will also
resolve the stats issue in tlm-sysmtemC simulation.

Committed by Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Abdul Mutaal Ahmad 2016-07-01 09:30:15 -05:00
parent 50e9d0df51
commit 1051223318
4 changed files with 83 additions and 20 deletions

View file

@ -74,6 +74,9 @@
#include "sc_module.hh"
#include "stats.hh"
// Defining global string variable decalred in stats.hh
std::string filename;
void
usage(const std::string &prog_name)
{
@ -383,7 +386,11 @@ sc_main(int argc, char **argv)
{
SimControl sim_control("gem5", argc, argv);
filename = "m5out/stats-systemc.txt";
sc_core::sc_start();
CxxConfig::statsDump();
return EXIT_SUCCESS;
}

View file

@ -35,6 +35,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Andrew Bardsley
* Matthias Jung
* Abdul Mutaal Ahmad
*/
/**
@ -45,7 +47,9 @@
* Register with: Stats::registerHandlers(statsReset, statsDump)
*/
#include "base/output.hh"
#include "base/statistics.hh"
#include "base/stats/text.hh"
#include "stats.hh"
namespace CxxConfig
@ -56,45 +60,76 @@ void statsPrepare()
std::list<Stats::Info *> stats = Stats::statsList();
/* gather_stats -> prepare */
for (auto i = stats.begin(); i != stats.end(); ++i)
(*i)->prepare();
for (auto i = stats.begin(); i != stats.end(); ++i){
Stats::Info *stat = *i;
Stats::VectorInfo *vector = dynamic_cast<Stats::VectorInfo *>(stat);
if (vector){
(dynamic_cast<Stats::VectorInfo *>(*i))->prepare();
}
else {
(*i)->prepare();
}
}
}
void statsDump()
{
std::cerr << "Stats dump\n";
bool desc = true;
Stats::Output *output = Stats::initText(filename, desc);
Stats::processDumpQueue();
std::list<Stats::Info *> stats = Stats::statsList();
statsEnable();
statsPrepare();
output->begin();
/* gather_stats -> convert_value */
for (auto i = stats.begin(); i != stats.end(); ++i) {
Stats::Info *stat = *i;
Stats::ScalarInfo *scalar = dynamic_cast<Stats::ScalarInfo *>(stat);
const Stats::ScalarInfo *scalar = dynamic_cast<Stats::ScalarInfo
*>(stat);
Stats::VectorInfo *vector = dynamic_cast<Stats::VectorInfo *>(stat);
const Stats::Vector2dInfo *vector2d = dynamic_cast<Stats::Vector2dInfo
*>(vector);
const Stats::DistInfo *dist = dynamic_cast<Stats::DistInfo *>(stat);
const Stats::VectorDistInfo *vectordist =
dynamic_cast<Stats::VectorDistInfo *>(stat);
const Stats::SparseHistInfo *sparse =
dynamic_cast<Stats::SparseHistInfo *>(stat);
const Stats::InfoProxy <Stats::Vector2d,Stats::Vector2dInfo> *info =
dynamic_cast<Stats::InfoProxy
<Stats::Vector2d,Stats::Vector2dInfo>*>(stat);
if (scalar) {
std::cerr << "SCALAR " << stat->name << ' '
<< scalar->value() << '\n';
} else if (vector) {
Stats::VResult results = vector->value();
unsigned int index = 0;
for (auto e = results.begin(); e != results.end(); ++e) {
std::cerr << "VECTOR " << stat->name << '[' << index
<< "] " << (*e) << '\n';
index++;
if (vector) {
const Stats::FormulaInfo *formula = dynamic_cast<Stats::FormulaInfo
*>(vector);
if (formula){
output->visit(*formula);
} else {
const Stats::VectorInfo *vector1 = vector;
output->visit(*vector1);
}
std::cerr << "VTOTAL " << stat->name << ' '
<< vector->total() << '\n';
} else if (vector2d) {
output->visit(*vector2d);
} else if (info){
output->visit(*info);
} else if (vectordist){
output->visit(*vectordist);
} else if (dist) {
output->visit(*dist);
} else if (sparse) {
output->visit(*sparse);
} else if (scalar) {
output->visit(*scalar);
} else {
std::cerr << "?????? " << stat->name << '\n';
warn("Stat not dumped: %s\n", stat->name);
}
}
output->end();
}
void statsReset()
@ -108,8 +143,17 @@ void statsEnable()
{
std::list<Stats::Info *> stats = Stats::statsList();
for (auto i = stats.begin(); i != stats.end(); ++i)
(*i)->enable();
for (auto i = stats.begin(); i != stats.end(); ++i){
Stats::Info *stat = *i;
Stats::VectorInfo *vector = dynamic_cast<Stats::VectorInfo *>(stat);
if (vector){
(dynamic_cast<Stats::VectorInfo *>(*i))->enable();
}
else {
(*i)->enable();
}
}
}
}

View file

@ -35,6 +35,8 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Andrew Bardsley
* Matthias Jung
* Abdul Mutaal Ahmad
*/
/**
@ -48,6 +50,8 @@
#ifndef __UTIL_CXX_CONFIG_STATS_H__
#define __UTIL_CXX_CONFIG_STATS_H__
extern std::string filename;
namespace CxxConfig
{

View file

@ -30,6 +30,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Authors: Matthias Jung
* Abdul Mutaal Ahmad
*/
/**
@ -67,6 +68,9 @@
#include "sim/system.hh"
#include "stats.hh"
// Defining global string variable decalred in stats.hh
std::string filename;
void usage(const std::string &prog_name)
{
std::cerr << "Usage: " << prog_name << (
@ -296,6 +300,8 @@ sc_main(int argc, char **argv)
SimControl sim_control("gem5", argc, argv);
Target *memory;
filename = "m5out/stats-tlm.txt";
tlm::tlm_initiator_socket <> *mem_port =
dynamic_cast<tlm::tlm_initiator_socket<> *>(
sc_core::sc_find_object("gem5.memory")
@ -319,5 +325,7 @@ sc_main(int argc, char **argv)
SC_REPORT_INFO("sc_main", "End of Simulation");
CxxConfig::statsDump();
return EXIT_SUCCESS;
}