Several tweaks to make binning work in any simulation

configuration so that we can always have binning on.

base/statistics.cc:
    If we're binning, and there is no bin active at the time
    we check all stats stuff, create a bin.
base/statistics.hh:
    FS_MEASURE doesn't exist anymore
base/stats/text.cc:
    don't print out bin names if there is only one bin
sim/process.cc:
    don't zero stats.  It happens automatically.
    Don't activate the context at the time it is registered,
    instead activate the first context in a startup callback.
sim/process.hh:
    Add startup callback to initialize the first exec context

--HG--
extra : convert_revision : bcb23cdb184b0abf7cecd79902f8a59b50f71fe4
This commit is contained in:
Nathan Binkert 2005-02-17 02:48:56 -05:00
parent 2e4bb0fc0c
commit a24016c731
5 changed files with 25 additions and 11 deletions

View file

@ -286,6 +286,13 @@ check()
Database::stats().sort(StatData::less); Database::stats().sort(StatData::less);
#if defined(STATS_BINNING)
if (MainBin::curBin() == NULL) {
static MainBin mainBin("main bin");
mainBin.activate();
}
#endif
if (i == end) if (i == end)
return; return;

View file

@ -2184,7 +2184,7 @@ class SumNode : public Node
* binned. If the typedef is NoBin, nothing is binned. If it is * binned. If the typedef is NoBin, nothing is binned. If it is
* MainBin, then all stats are binned under that Bin. * MainBin, then all stats are binned under that Bin.
*/ */
#if defined(FS_MEASURE) || defined(STATS_BINNING) #if defined(STATS_BINNING)
typedef MainBin DefaultBin; typedef MainBin DefaultBin;
#else #else
typedef NoBin DefaultBin; typedef NoBin DefaultBin;

View file

@ -126,7 +126,7 @@ Text::output()
using namespace Database; using namespace Database;
ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n"); ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
if (bins().empty()) { if (bins().empty() || bins().size() == 1) {
stat_list_t::const_iterator i, end = stats().end(); stat_list_t::const_iterator i, end = stats().end();
for (i = stats().begin(); i != end; ++i) for (i = stats().begin(); i != end; ++i)
(*i)->visit(*this); (*i)->visit(*this);

View file

@ -88,8 +88,6 @@ Process::Process(const string &name,
fd_map[i] = -1; fd_map[i] = -1;
} }
num_syscalls = 0;
// other parameters will be initialized when the program is loaded // other parameters will be initialized when the program is loaded
} }
@ -145,21 +143,28 @@ Process::registerExecContext(ExecContext *xc)
execContexts.push_back(xc); execContexts.push_back(xc);
if (myIndex == 0) { if (myIndex == 0) {
// first exec context for this process... initialize & enable
// copy process's initial regs struct // copy process's initial regs struct
xc->regs = *init_regs; xc->regs = *init_regs;
// mark this context as active.
// activate with zero delay so that we start ticking right
// away on cycle 0
xc->activate(0);
} }
// return CPU number to caller and increment available CPU count // return CPU number to caller and increment available CPU count
return myIndex; return myIndex;
} }
void
Process::startup()
{
if (execContexts.empty())
return;
// first exec context for this process... initialize & enable
ExecContext *xc = execContexts[0];
// mark this context as active.
// activate with zero delay so that we start ticking right
// away on cycle 0
xc->activate(0);
}
void void
Process::replaceExecContext(ExecContext *xc, int xcIndex) Process::replaceExecContext(ExecContext *xc, int xcIndex)

View file

@ -108,6 +108,8 @@ class Process : public SimObject
int stdout_fd, int stdout_fd,
int stderr_fd); int stderr_fd);
// post initialization startup
virtual void startup();
protected: protected:
FunctionalMemory *memory; FunctionalMemory *memory;