stat_control.cc revision 1696
16242Sgblack@eecs.umich.edu/*
27093Sgblack@eecs.umich.edu * Copyright (c) 2004 The Regents of The University of Michigan
37093Sgblack@eecs.umich.edu * All rights reserved.
47093Sgblack@eecs.umich.edu *
57093Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67093Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77093Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97093Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107093Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117093Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127093Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137093Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
146242Sgblack@eecs.umich.edu * this software without specific prior written permission.
156242Sgblack@eecs.umich.edu *
166242Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176242Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186242Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196242Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206242Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216242Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226242Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236242Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246242Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256242Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266242Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276242Sgblack@eecs.umich.edu */
286242Sgblack@eecs.umich.edu
296242Sgblack@eecs.umich.edu// This file will contain default statistics for the simulator that
306242Sgblack@eecs.umich.edu// don't really belong to a specific simulator object
316242Sgblack@eecs.umich.edu
326242Sgblack@eecs.umich.edu#include <fstream>
336242Sgblack@eecs.umich.edu#include <iostream>
346242Sgblack@eecs.umich.edu#include <list>
356242Sgblack@eecs.umich.edu
366242Sgblack@eecs.umich.edu#include "base/callback.hh"
376242Sgblack@eecs.umich.edu#include "base/hostinfo.hh"
386242Sgblack@eecs.umich.edu#include "base/statistics.hh"
396242Sgblack@eecs.umich.edu#include "base/str.hh"
406242Sgblack@eecs.umich.edu#include "base/time.hh"
416242Sgblack@eecs.umich.edu#include "base/stats/output.hh"
426242Sgblack@eecs.umich.edu#include "cpu/base_cpu.hh"
436242Sgblack@eecs.umich.edu#include "sim/eventq.hh"
446242Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
456242Sgblack@eecs.umich.edu#include "sim/stat_control.hh"
466242Sgblack@eecs.umich.edu#include "sim/root.hh"
476242Sgblack@eecs.umich.edu
486242Sgblack@eecs.umich.eduusing namespace std;
496242Sgblack@eecs.umich.edu
506242Sgblack@eecs.umich.eduStats::Formula hostInstRate;
516242Sgblack@eecs.umich.eduStats::Formula hostTickRate;
526242Sgblack@eecs.umich.eduStats::Value hostMemory;
536242Sgblack@eecs.umich.eduStats::Value hostSeconds;
546242Sgblack@eecs.umich.edu
556242Sgblack@eecs.umich.eduStats::Value simTicks;
566242Sgblack@eecs.umich.eduStats::Value simInsts;
576242Sgblack@eecs.umich.eduStats::Value simFreq;
586242Sgblack@eecs.umich.eduStats::Formula simSeconds;
596242Sgblack@eecs.umich.edu
606242Sgblack@eecs.umich.edunamespace Stats {
616242Sgblack@eecs.umich.edu
626242Sgblack@eecs.umich.eduTime statTime(true);
636242Sgblack@eecs.umich.eduTick startTick;
646242Sgblack@eecs.umich.edu
657111Sgblack@eecs.umich.educlass SimTicksReset : public Callback
666242Sgblack@eecs.umich.edu{
676242Sgblack@eecs.umich.edu  public:
686242Sgblack@eecs.umich.edu    void process()
696242Sgblack@eecs.umich.edu    {
706735Sgblack@eecs.umich.edu        statTime.set();
716242Sgblack@eecs.umich.edu        startTick = curTick;
726242Sgblack@eecs.umich.edu    }
736242Sgblack@eecs.umich.edu};
746723Sgblack@eecs.umich.edu
756242Sgblack@eecs.umich.edudouble
766242Sgblack@eecs.umich.edustatElapsedTime()
776261Sgblack@eecs.umich.edu{
786403Sgblack@eecs.umich.edu    Time now(true);
796403Sgblack@eecs.umich.edu    Time elapsed = now - statTime;
806403Sgblack@eecs.umich.edu    return elapsed();
817259Sgblack@eecs.umich.edu}
827259Sgblack@eecs.umich.edu
837259Sgblack@eecs.umich.eduTick
847259Sgblack@eecs.umich.edustatElapsedTicks()
857264Sgblack@eecs.umich.edu{
867259Sgblack@eecs.umich.edu    return curTick - startTick;
877259Sgblack@eecs.umich.edu}
887259Sgblack@eecs.umich.edu
897259Sgblack@eecs.umich.eduSimTicksReset simTicksReset;
907259Sgblack@eecs.umich.edu
917259Sgblack@eecs.umich.eduvoid
927259Sgblack@eecs.umich.eduInitSimStats()
937259Sgblack@eecs.umich.edu{
947259Sgblack@eecs.umich.edu    simInsts
957259Sgblack@eecs.umich.edu        .functor(BaseCPU::numSimulatedInstructions)
967259Sgblack@eecs.umich.edu        .name("sim_insts")
977259Sgblack@eecs.umich.edu        .desc("Number of instructions simulated")
987259Sgblack@eecs.umich.edu        .precision(0)
997259Sgblack@eecs.umich.edu        .prereq(simInsts)
1007259Sgblack@eecs.umich.edu        ;
1017259Sgblack@eecs.umich.edu
1027259Sgblack@eecs.umich.edu    simSeconds
1037259Sgblack@eecs.umich.edu        .name("sim_seconds")
1047259Sgblack@eecs.umich.edu        .desc("Number of seconds simulated")
1057259Sgblack@eecs.umich.edu        ;
1067259Sgblack@eecs.umich.edu
1077259Sgblack@eecs.umich.edu    simFreq
1087259Sgblack@eecs.umich.edu        .scalar(Clock::Frequency)
1097259Sgblack@eecs.umich.edu        .name("sim_freq")
1107259Sgblack@eecs.umich.edu        .desc("Frequency of simulated ticks")
1117259Sgblack@eecs.umich.edu        ;
1127259Sgblack@eecs.umich.edu
1137259Sgblack@eecs.umich.edu    simTicks
1147259Sgblack@eecs.umich.edu        .functor(statElapsedTicks)
1157259Sgblack@eecs.umich.edu        .name("sim_ticks")
1167259Sgblack@eecs.umich.edu        .desc("Number of ticks simulated")
1177259Sgblack@eecs.umich.edu        ;
1187259Sgblack@eecs.umich.edu
1197259Sgblack@eecs.umich.edu    hostInstRate
1207259Sgblack@eecs.umich.edu        .name("host_inst_rate")
1217259Sgblack@eecs.umich.edu        .desc("Simulator instruction rate (inst/s)")
1227259Sgblack@eecs.umich.edu        .precision(0)
1237259Sgblack@eecs.umich.edu        .prereq(simInsts)
1247259Sgblack@eecs.umich.edu        ;
1257259Sgblack@eecs.umich.edu
1267259Sgblack@eecs.umich.edu    hostMemory
1277259Sgblack@eecs.umich.edu        .functor(memUsage)
1287259Sgblack@eecs.umich.edu        .name("host_mem_usage")
1297259Sgblack@eecs.umich.edu        .desc("Number of bytes of host memory used")
1307259Sgblack@eecs.umich.edu        .prereq(hostMemory)
1317259Sgblack@eecs.umich.edu        ;
1327259Sgblack@eecs.umich.edu
1337259Sgblack@eecs.umich.edu    hostSeconds
1347259Sgblack@eecs.umich.edu        .functor(statElapsedTime)
1357259Sgblack@eecs.umich.edu        .name("host_seconds")
1367259Sgblack@eecs.umich.edu        .desc("Real time elapsed on the host")
1377259Sgblack@eecs.umich.edu        .precision(2)
1387259Sgblack@eecs.umich.edu        ;
1397259Sgblack@eecs.umich.edu
1407259Sgblack@eecs.umich.edu    hostTickRate
1417259Sgblack@eecs.umich.edu        .name("host_tick_rate")
1427259Sgblack@eecs.umich.edu        .desc("Simulator tick rate (ticks/s)")
1437259Sgblack@eecs.umich.edu        .precision(0)
1447259Sgblack@eecs.umich.edu        ;
1457259Sgblack@eecs.umich.edu
1467259Sgblack@eecs.umich.edu    simSeconds = simTicks / simFreq;
1477259Sgblack@eecs.umich.edu    hostInstRate = simInsts / hostSeconds;
1487259Sgblack@eecs.umich.edu    hostTickRate = simTicks / hostSeconds;
1497259Sgblack@eecs.umich.edu
1507259Sgblack@eecs.umich.edu    registerResetCallback(&simTicksReset);
1516735Sgblack@eecs.umich.edu}
1526261Sgblack@eecs.umich.edu
1536261Sgblack@eecs.umich.educlass StatEvent : public Event
1547259Sgblack@eecs.umich.edu{
1557259Sgblack@eecs.umich.edu  protected:
1567259Sgblack@eecs.umich.edu    int flags;
1576261Sgblack@eecs.umich.edu    Tick repeat;
1587259Sgblack@eecs.umich.edu
1597259Sgblack@eecs.umich.edu  public:
1607259Sgblack@eecs.umich.edu    StatEvent(int _flags, Tick _when, Tick _repeat);
1617264Sgblack@eecs.umich.edu    virtual void process();
1627259Sgblack@eecs.umich.edu    virtual const char *description();
1637259Sgblack@eecs.umich.edu};
1647259Sgblack@eecs.umich.edu
1657259Sgblack@eecs.umich.eduStatEvent::StatEvent(int _flags, Tick _when, Tick _repeat)
1667259Sgblack@eecs.umich.edu    : Event(&mainEventQueue, Stat_Event_Pri),
1677259Sgblack@eecs.umich.edu      flags(_flags), repeat(_repeat)
1687259Sgblack@eecs.umich.edu{
1697259Sgblack@eecs.umich.edu    setFlags(AutoDelete);
1707264Sgblack@eecs.umich.edu    schedule(_when);
1717259Sgblack@eecs.umich.edu}
1727259Sgblack@eecs.umich.edu
1736242Sgblack@eecs.umich.educonst char *
1746242Sgblack@eecs.umich.eduStatEvent::description()
1756242Sgblack@eecs.umich.edu{
1766242Sgblack@eecs.umich.edu    return "Statistics dump and/or reset";
1776242Sgblack@eecs.umich.edu}
1786242Sgblack@eecs.umich.edu
1796242Sgblack@eecs.umich.eduvoid
1806242Sgblack@eecs.umich.eduStatEvent::process()
1816735Sgblack@eecs.umich.edu{
1826242Sgblack@eecs.umich.edu    if (flags & Stats::Dump)
1836242Sgblack@eecs.umich.edu        DumpNow();
1846735Sgblack@eecs.umich.edu
1856242Sgblack@eecs.umich.edu    if (flags & Stats::Reset)
1866242Sgblack@eecs.umich.edu        reset();
1876242Sgblack@eecs.umich.edu
1886242Sgblack@eecs.umich.edu    if (repeat)
1896242Sgblack@eecs.umich.edu        schedule(curTick + repeat);
1906242Sgblack@eecs.umich.edu}
1916242Sgblack@eecs.umich.edu
1926735Sgblack@eecs.umich.edulist<Output *> OutputList;
1936750Sgblack@eecs.umich.edu
1946750Sgblack@eecs.umich.eduvoid
1956750Sgblack@eecs.umich.eduDumpNow()
1966750Sgblack@eecs.umich.edu{
1977093Sgblack@eecs.umich.edu    list<Output *>::iterator i = OutputList.begin();
1987093Sgblack@eecs.umich.edu    list<Output *>::iterator end = OutputList.end();
1997093Sgblack@eecs.umich.edu    for (; i != end; ++i) {
2007093Sgblack@eecs.umich.edu        Output *output = *i;
2017093Sgblack@eecs.umich.edu        if (!output->valid())
2027093Sgblack@eecs.umich.edu            continue;
2037093Sgblack@eecs.umich.edu
2046735Sgblack@eecs.umich.edu        output->output();
2056735Sgblack@eecs.umich.edu    }
2066735Sgblack@eecs.umich.edu}
2076735Sgblack@eecs.umich.edu
2086735Sgblack@eecs.umich.eduvoid
2096735Sgblack@eecs.umich.eduSetupEvent(int flags, Tick when, Tick repeat)
2106735Sgblack@eecs.umich.edu{
2116735Sgblack@eecs.umich.edu    new StatEvent(flags, when, repeat);
2126735Sgblack@eecs.umich.edu}
2136735Sgblack@eecs.umich.edu
2146735Sgblack@eecs.umich.edu/* namespace Stats */ }
2156735Sgblack@eecs.umich.edu
2166735Sgblack@eecs.umich.eduextern "C" void
2176735Sgblack@eecs.umich.edudebugDumpStats()
2186735Sgblack@eecs.umich.edu{
2196735Sgblack@eecs.umich.edu    Stats::DumpNow();
2206735Sgblack@eecs.umich.edu}
2216735Sgblack@eecs.umich.edu
2226735Sgblack@eecs.umich.edu