stat_control.cc revision 695
15083Sgblack@eecs.umich.edu/*
25083Sgblack@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan
35083Sgblack@eecs.umich.edu * All rights reserved.
45083Sgblack@eecs.umich.edu *
55083Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65083Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75083Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85083Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95083Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105083Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115083Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125083Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135083Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145083Sgblack@eecs.umich.edu * this software without specific prior written permission.
155083Sgblack@eecs.umich.edu *
165083Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175083Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185083Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195083Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205083Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215083Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225083Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235083Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245083Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255083Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265083Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275083Sgblack@eecs.umich.edu */
285083Sgblack@eecs.umich.edu
295083Sgblack@eecs.umich.edu// This file will contain default statistics for the simulator that
305083Sgblack@eecs.umich.edu// don't really belong to a specific simulator object
315083Sgblack@eecs.umich.edu
325083Sgblack@eecs.umich.edu#include <fstream>
335083Sgblack@eecs.umich.edu#include <iostream>
345083Sgblack@eecs.umich.edu#include <list>
355083Sgblack@eecs.umich.edu
365083Sgblack@eecs.umich.edu#include "base/callback.hh"
375083Sgblack@eecs.umich.edu#include "base/hostinfo.hh"
385083Sgblack@eecs.umich.edu#include "base/statistics.hh"
395083Sgblack@eecs.umich.edu#include "base/str.hh"
405083Sgblack@eecs.umich.edu#include "base/time.hh"
415083Sgblack@eecs.umich.edu#include "base/stats/output.hh"
425083Sgblack@eecs.umich.edu#include "sim/eventq.hh"
435083Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
445083Sgblack@eecs.umich.edu#include "sim/stat_control.hh"
455083Sgblack@eecs.umich.edu#include "sim/universe.hh"
465083Sgblack@eecs.umich.edu
475083Sgblack@eecs.umich.eduusing namespace std;
485083Sgblack@eecs.umich.edu
495083Sgblack@eecs.umich.eduStatistics::Formula hostInstRate;
505083Sgblack@eecs.umich.eduStatistics::Formula hostMemory;
515083Sgblack@eecs.umich.eduStatistics::Formula hostSeconds;
525083Sgblack@eecs.umich.eduStatistics::Formula hostTickRate;
535083Sgblack@eecs.umich.edu
545083Sgblack@eecs.umich.eduStatistics::Formula simInsts;
555083Sgblack@eecs.umich.eduStatistics::Formula simSeconds;
565083Sgblack@eecs.umich.eduStatistics::Formula simTicks;
575083Sgblack@eecs.umich.edu
585083Sgblack@eecs.umich.edunamespace Statistics {
595083Sgblack@eecs.umich.edu
605083Sgblack@eecs.umich.eduTime statTime(true);
615083Sgblack@eecs.umich.eduTick startTick;
625083Sgblack@eecs.umich.edu
635083Sgblack@eecs.umich.educlass SimTicksReset : public Callback
645083Sgblack@eecs.umich.edu{
655083Sgblack@eecs.umich.edu  public:
665083Sgblack@eecs.umich.edu    void process()
675083Sgblack@eecs.umich.edu    {
685083Sgblack@eecs.umich.edu        statTime.set();
695083Sgblack@eecs.umich.edu        startTick = curTick;
705083Sgblack@eecs.umich.edu    }
715083Sgblack@eecs.umich.edu};
725083Sgblack@eecs.umich.edu
735083Sgblack@eecs.umich.edudouble
745083Sgblack@eecs.umich.edustatElapsedTime()
755083Sgblack@eecs.umich.edu{
765083Sgblack@eecs.umich.edu    Time now(true);
775083Sgblack@eecs.umich.edu    Time elapsed = now - statTime;
785083Sgblack@eecs.umich.edu    return elapsed();
795083Sgblack@eecs.umich.edu}
805083Sgblack@eecs.umich.edu
815083Sgblack@eecs.umich.eduSimTicksReset simTicksReset;
825083Sgblack@eecs.umich.edu
835083Sgblack@eecs.umich.eduvoid
845083Sgblack@eecs.umich.eduInitSimStats()
855083Sgblack@eecs.umich.edu{
865083Sgblack@eecs.umich.edu    simInsts
875083Sgblack@eecs.umich.edu        .name("sim_insts")
885083Sgblack@eecs.umich.edu        .desc("Number of instructions simulated")
895083Sgblack@eecs.umich.edu        .precision(0)
905083Sgblack@eecs.umich.edu        .prereq(simInsts)
915083Sgblack@eecs.umich.edu        ;
925083Sgblack@eecs.umich.edu
935083Sgblack@eecs.umich.edu    simSeconds
945083Sgblack@eecs.umich.edu        .name("sim_seconds")
955083Sgblack@eecs.umich.edu        .desc("Number of seconds simulated")
965083Sgblack@eecs.umich.edu        ;
975083Sgblack@eecs.umich.edu
985083Sgblack@eecs.umich.edu    simTicks
995083Sgblack@eecs.umich.edu        .name("sim_ticks")
1005083Sgblack@eecs.umich.edu        .desc("Number of ticks simulated")
1015083Sgblack@eecs.umich.edu        ;
1026345Sgblack@eecs.umich.edu
1035083Sgblack@eecs.umich.edu    hostInstRate
1045083Sgblack@eecs.umich.edu        .name("host_inst_rate")
1055083Sgblack@eecs.umich.edu        .desc("Simulator instruction rate (inst/s)")
1065083Sgblack@eecs.umich.edu        .precision(0)
1076345Sgblack@eecs.umich.edu        .prereq(simInsts)
1085083Sgblack@eecs.umich.edu        ;
1095083Sgblack@eecs.umich.edu
1105083Sgblack@eecs.umich.edu    hostMemory
1115083Sgblack@eecs.umich.edu        .name("host_mem_usage")
1125083Sgblack@eecs.umich.edu        .desc("Number of bytes of host memory used")
1135083Sgblack@eecs.umich.edu        .prereq(hostMemory)
1145083Sgblack@eecs.umich.edu        ;
1155083Sgblack@eecs.umich.edu
1165083Sgblack@eecs.umich.edu    hostSeconds
1175083Sgblack@eecs.umich.edu        .name("host_seconds")
1185083Sgblack@eecs.umich.edu        .desc("Real time elapsed on the host")
1195083Sgblack@eecs.umich.edu        .precision(2)
1205083Sgblack@eecs.umich.edu        ;
1215083Sgblack@eecs.umich.edu
1225083Sgblack@eecs.umich.edu    hostTickRate
1236345Sgblack@eecs.umich.edu        .name("host_tick_rate")
1245083Sgblack@eecs.umich.edu        .desc("Simulator tick rate (ticks/s)")
1255083Sgblack@eecs.umich.edu        .precision(0)
1265083Sgblack@eecs.umich.edu        ;
1275083Sgblack@eecs.umich.edu
1285083Sgblack@eecs.umich.edu    simInsts = constant(0);
1295083Sgblack@eecs.umich.edu    simTicks = scalar(curTick) - scalar(startTick);
1305083Sgblack@eecs.umich.edu    simSeconds = simTicks / scalar(ticksPerSecond);
1315083Sgblack@eecs.umich.edu    hostMemory = functor(memUsage);
1325083Sgblack@eecs.umich.edu    hostSeconds = functor(statElapsedTime);
1335083Sgblack@eecs.umich.edu    hostInstRate = simInsts / hostSeconds;
1345083Sgblack@eecs.umich.edu    hostTickRate = simTicks / hostSeconds;
1355083Sgblack@eecs.umich.edu
1366345Sgblack@eecs.umich.edu    registerResetCallback(&simTicksReset);
1375083Sgblack@eecs.umich.edu}
1385083Sgblack@eecs.umich.edu
1395083Sgblack@eecs.umich.educlass StatEvent : public Event
1405083Sgblack@eecs.umich.edu{
1415083Sgblack@eecs.umich.edu  protected:
1425083Sgblack@eecs.umich.edu    int flags;
1435083Sgblack@eecs.umich.edu    Tick repeat;
1445083Sgblack@eecs.umich.edu
1455083Sgblack@eecs.umich.edu  public:
1465083Sgblack@eecs.umich.edu    StatEvent(int _flags, Tick _when, Tick _repeat);
1475083Sgblack@eecs.umich.edu    virtual void process();
1485083Sgblack@eecs.umich.edu    virtual const char *description();
1495083Sgblack@eecs.umich.edu};
1505083Sgblack@eecs.umich.edu
1515083Sgblack@eecs.umich.eduStatEvent::StatEvent(int _flags, Tick _when, Tick _repeat)
1525083Sgblack@eecs.umich.edu    : Event(&mainEventQueue, Stat_Event_Pri),
1535083Sgblack@eecs.umich.edu      flags(_flags), repeat(_repeat)
1545083Sgblack@eecs.umich.edu{
1555083Sgblack@eecs.umich.edu    setFlags(AutoDelete);
1565083Sgblack@eecs.umich.edu    schedule(_when);
1575083Sgblack@eecs.umich.edu}
1585083Sgblack@eecs.umich.edu
1595083Sgblack@eecs.umich.educonst char *
1605083Sgblack@eecs.umich.eduStatEvent::description()
1615083Sgblack@eecs.umich.edu{
1625083Sgblack@eecs.umich.edu    return "Statistics dump and/or reset";
1635083Sgblack@eecs.umich.edu}
1645083Sgblack@eecs.umich.edu
1655083Sgblack@eecs.umich.eduvoid
1665083Sgblack@eecs.umich.eduStatEvent::process()
1675083Sgblack@eecs.umich.edu{
1685083Sgblack@eecs.umich.edu    if (flags & Statistics::Dump)
1695083Sgblack@eecs.umich.edu        DumpNow();
1705083Sgblack@eecs.umich.edu
1715083Sgblack@eecs.umich.edu    if (flags & Statistics::Reset)
1725083Sgblack@eecs.umich.edu        reset();
1735083Sgblack@eecs.umich.edu
1745083Sgblack@eecs.umich.edu    if (repeat)
1755083Sgblack@eecs.umich.edu        schedule(curTick + repeat);
1765083Sgblack@eecs.umich.edu}
1775083Sgblack@eecs.umich.edu
1785083Sgblack@eecs.umich.edulist<Output *> OutputList;
1795083Sgblack@eecs.umich.edu
1805083Sgblack@eecs.umich.eduvoid
1815083Sgblack@eecs.umich.eduDumpNow()
1825083Sgblack@eecs.umich.edu{
1835083Sgblack@eecs.umich.edu    list<Output *>::iterator i = OutputList.begin();
1845083Sgblack@eecs.umich.edu    list<Output *>::iterator end = OutputList.end();
1855083Sgblack@eecs.umich.edu    for (; i != end; ++i) {
1865083Sgblack@eecs.umich.edu        Output *output = *i;
1875083Sgblack@eecs.umich.edu        if (!output->valid())
1885083Sgblack@eecs.umich.edu            continue;
1895083Sgblack@eecs.umich.edu
1905083Sgblack@eecs.umich.edu        output->output();
1915083Sgblack@eecs.umich.edu    }
1925083Sgblack@eecs.umich.edu}
1935083Sgblack@eecs.umich.edu
1945083Sgblack@eecs.umich.eduvoid
1955083Sgblack@eecs.umich.eduSetupEvent(int flags, Tick when, Tick repeat)
1965083Sgblack@eecs.umich.edu{
1975083Sgblack@eecs.umich.edu    new StatEvent(flags, when, repeat);
1985083Sgblack@eecs.umich.edu}
1995083Sgblack@eecs.umich.edu
2005083Sgblack@eecs.umich.edu/* namespace Statistics */ }
2015083Sgblack@eecs.umich.edu
2025083Sgblack@eecs.umich.eduextern "C" void
2035083Sgblack@eecs.umich.edudebugDumpStats()
2045083Sgblack@eecs.umich.edu{
2055083Sgblack@eecs.umich.edu    Statistics::DumpNow();
2065083Sgblack@eecs.umich.edu}
2075083Sgblack@eecs.umich.edu
2085083Sgblack@eecs.umich.edu