info.hh revision 8666
15086Sgblack@eecs.umich.edu/*
25086Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
35086Sgblack@eecs.umich.edu * All rights reserved.
45086Sgblack@eecs.umich.edu *
55086Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65086Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75086Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95086Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115086Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125086Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135086Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145086Sgblack@eecs.umich.edu * this software without specific prior written permission.
155086Sgblack@eecs.umich.edu *
165086Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175086Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185086Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195086Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205086Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215086Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235086Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245086Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255086Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265086Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275086Sgblack@eecs.umich.edu *
285086Sgblack@eecs.umich.edu * Authors: Nathan Binkert
295086Sgblack@eecs.umich.edu */
305086Sgblack@eecs.umich.edu
315086Sgblack@eecs.umich.edu#ifndef __BASE_STATS_INFO_HH__
325086Sgblack@eecs.umich.edu#define __BASE_STATS_INFO_HH__
335086Sgblack@eecs.umich.edu
345086Sgblack@eecs.umich.edu#include "base/stats/types.hh"
355086Sgblack@eecs.umich.edu#include "base/flags.hh"
365086Sgblack@eecs.umich.edu
375086Sgblack@eecs.umich.edunamespace Stats {
385086Sgblack@eecs.umich.edu
395086Sgblack@eecs.umich.edutypedef uint16_t FlagsType;
405086Sgblack@eecs.umich.edutypedef ::Flags<FlagsType> Flags;
415086Sgblack@eecs.umich.edu
425086Sgblack@eecs.umich.edu/** Nothing extra to print. */
435086Sgblack@eecs.umich.educonst FlagsType none =          0x0000;
445086Sgblack@eecs.umich.edu/** This Stat is Initialized */
455086Sgblack@eecs.umich.educonst FlagsType init =          0x0001;
465086Sgblack@eecs.umich.edu/** Print this stat. */
475086Sgblack@eecs.umich.educonst FlagsType display =       0x0002;
485086Sgblack@eecs.umich.edu/** Print the total. */
495086Sgblack@eecs.umich.educonst FlagsType total =         0x0010;
505086Sgblack@eecs.umich.edu/** Print the percent of the total that this entry represents. */
515086Sgblack@eecs.umich.educonst FlagsType pdf =           0x0020;
525086Sgblack@eecs.umich.edu/** Print the cumulative percentage of total upto this entry. */
535086Sgblack@eecs.umich.educonst FlagsType cdf =           0x0040;
545086Sgblack@eecs.umich.edu/** Print the distribution. */
555086Sgblack@eecs.umich.educonst FlagsType dist =          0x0080;
565086Sgblack@eecs.umich.edu/** Don't print if this is zero. */
575086Sgblack@eecs.umich.educonst FlagsType nozero =        0x0100;
585647Sgblack@eecs.umich.edu/** Don't print if this is NAN */
595647Sgblack@eecs.umich.educonst FlagsType nonan =         0x0200;
605647Sgblack@eecs.umich.edu
615647Sgblack@eecs.umich.edu/** Mask of flags that can't be set directly */
625647Sgblack@eecs.umich.educonst FlagsType __reserved =    init | display;
635135Sgblack@eecs.umich.edu
645135Sgblack@eecs.umich.edustruct StorageParams;
655135Sgblack@eecs.umich.edustruct Output;
665086Sgblack@eecs.umich.edu
675135Sgblack@eecs.umich.educlass Info
685647Sgblack@eecs.umich.edu{
695234Sgblack@eecs.umich.edu  public:
705086Sgblack@eecs.umich.edu    /** The name of the stat. */
715086Sgblack@eecs.umich.edu    std::string name;
725086Sgblack@eecs.umich.edu    /** The separator string used for vectors, dist, etc. */
735086Sgblack@eecs.umich.edu    static std::string separatorString;
745086Sgblack@eecs.umich.edu    /** The description of the stat. */
755086Sgblack@eecs.umich.edu    std::string desc;
765086Sgblack@eecs.umich.edu    /** The formatting flags. */
775086Sgblack@eecs.umich.edu    Flags flags;
785086Sgblack@eecs.umich.edu    /** The display precision. */
795086Sgblack@eecs.umich.edu    int precision;
805086Sgblack@eecs.umich.edu    /** A pointer to a prerequisite Stat. */
815135Sgblack@eecs.umich.edu    const Info *prereq;
825135Sgblack@eecs.umich.edu    /**
835135Sgblack@eecs.umich.edu     * A unique stat ID for each stat in the simulator.
845135Sgblack@eecs.umich.edu     * Can be used externally for lookups as well as for debugging.
855135Sgblack@eecs.umich.edu     */
865135Sgblack@eecs.umich.edu    static int id_count;
875135Sgblack@eecs.umich.edu    int id;
885135Sgblack@eecs.umich.edu
895135Sgblack@eecs.umich.edu  public:
905135Sgblack@eecs.umich.edu    const StorageParams *storageParams;
915135Sgblack@eecs.umich.edu
925135Sgblack@eecs.umich.edu  public:
935135Sgblack@eecs.umich.edu    Info();
945135Sgblack@eecs.umich.edu    virtual ~Info();
955135Sgblack@eecs.umich.edu
965135Sgblack@eecs.umich.edu    /** Set the name of this statistic */
975135Sgblack@eecs.umich.edu    void setName(const std::string &name);
985135Sgblack@eecs.umich.edu    void setSeparator(std::string _sep) { separatorString = _sep;}
995135Sgblack@eecs.umich.edu
1005135Sgblack@eecs.umich.edu    /**
1015135Sgblack@eecs.umich.edu     * Check that this stat has been set up properly and is ready for
1025135Sgblack@eecs.umich.edu     * use
1035135Sgblack@eecs.umich.edu     * @return true for success
1045135Sgblack@eecs.umich.edu     */
1055135Sgblack@eecs.umich.edu    virtual bool check() const = 0;
1065135Sgblack@eecs.umich.edu    bool baseCheck() const;
1075264Sgblack@eecs.umich.edu
1085135Sgblack@eecs.umich.edu    /**
1095135Sgblack@eecs.umich.edu     * Enable the stat for use
1105135Sgblack@eecs.umich.edu     */
1115135Sgblack@eecs.umich.edu    virtual void enable();
1125135Sgblack@eecs.umich.edu
1135264Sgblack@eecs.umich.edu    /**
1145135Sgblack@eecs.umich.edu     * Prepare the stat for dumping.
1155135Sgblack@eecs.umich.edu     */
1165135Sgblack@eecs.umich.edu    virtual void prepare() = 0;
1175141Sgblack@eecs.umich.edu
1185141Sgblack@eecs.umich.edu    /**
1195141Sgblack@eecs.umich.edu     * Reset the stat to the default state.
1205141Sgblack@eecs.umich.edu     */
1215141Sgblack@eecs.umich.edu    virtual void reset() = 0;
1225141Sgblack@eecs.umich.edu
1235141Sgblack@eecs.umich.edu    /**
1245135Sgblack@eecs.umich.edu     * @return true if this stat has a value and satisfies its
1255135Sgblack@eecs.umich.edu     * requirement as a prereq
1265135Sgblack@eecs.umich.edu     */
1275289Sgblack@eecs.umich.edu    virtual bool zero() const = 0;
1285135Sgblack@eecs.umich.edu
1295141Sgblack@eecs.umich.edu    /**
1305135Sgblack@eecs.umich.edu     * Visitor entry for outputing statistics data
1315135Sgblack@eecs.umich.edu     */
1325141Sgblack@eecs.umich.edu    virtual void visit(Output &visitor) = 0;
1335141Sgblack@eecs.umich.edu
1345141Sgblack@eecs.umich.edu    /**
1355141Sgblack@eecs.umich.edu     * Checks if the first stat's name is alphabetically less than the second.
1365141Sgblack@eecs.umich.edu     * This function breaks names up at periods and considers each subname
1375141Sgblack@eecs.umich.edu     * separately.
1385141Sgblack@eecs.umich.edu     * @param stat1 The first stat.
1395135Sgblack@eecs.umich.edu     * @param stat2 The second stat.
1405289Sgblack@eecs.umich.edu     * @return stat1's name is alphabetically before stat2's
1415289Sgblack@eecs.umich.edu     */
1425289Sgblack@eecs.umich.edu    static bool less(Info *stat1, Info *stat2);
1435289Sgblack@eecs.umich.edu};
1445135Sgblack@eecs.umich.edu
1455135Sgblack@eecs.umich.educlass ScalarInfo : public Info
1465141Sgblack@eecs.umich.edu{
1475135Sgblack@eecs.umich.edu  public:
1485264Sgblack@eecs.umich.edu    virtual Counter value() const = 0;
1495135Sgblack@eecs.umich.edu    virtual Result result() const = 0;
1505135Sgblack@eecs.umich.edu    virtual Result total() const = 0;
1515135Sgblack@eecs.umich.edu};
1525294Sgblack@eecs.umich.edu
1535294Sgblack@eecs.umich.educlass VectorInfo : public Info
1545135Sgblack@eecs.umich.edu{
1555135Sgblack@eecs.umich.edu  public:
1565135Sgblack@eecs.umich.edu    /** Names and descriptions of subfields. */
1575135Sgblack@eecs.umich.edu    std::vector<std::string> subnames;
1585294Sgblack@eecs.umich.edu    std::vector<std::string> subdescs;
1595294Sgblack@eecs.umich.edu
1605294Sgblack@eecs.umich.edu  public:
1615294Sgblack@eecs.umich.edu    void enable();
1625135Sgblack@eecs.umich.edu
1635135Sgblack@eecs.umich.edu  public:
1645135Sgblack@eecs.umich.edu    virtual size_type size() const = 0;
1655135Sgblack@eecs.umich.edu    virtual const VCounter &value() const = 0;
1665135Sgblack@eecs.umich.edu    virtual const VResult &result() const = 0;
1675135Sgblack@eecs.umich.edu    virtual Result total() const = 0;
1685135Sgblack@eecs.umich.edu};
1695135Sgblack@eecs.umich.edu
1705135Sgblack@eecs.umich.eduenum DistType { Deviation, Dist, Hist };
1715135Sgblack@eecs.umich.edu
1725135Sgblack@eecs.umich.edustruct DistData
1735135Sgblack@eecs.umich.edu{
1745135Sgblack@eecs.umich.edu    DistType type;
1755141Sgblack@eecs.umich.edu    Counter min;
1765141Sgblack@eecs.umich.edu    Counter max;
1775141Sgblack@eecs.umich.edu    Counter bucket_size;
1785141Sgblack@eecs.umich.edu
1795141Sgblack@eecs.umich.edu    Counter min_val;
1805141Sgblack@eecs.umich.edu    Counter max_val;
1815141Sgblack@eecs.umich.edu    Counter underflow;
1825141Sgblack@eecs.umich.edu    Counter overflow;
1835141Sgblack@eecs.umich.edu    VCounter cvec;
1845182Sgblack@eecs.umich.edu    Counter sum;
1855141Sgblack@eecs.umich.edu    Counter squares;
1865141Sgblack@eecs.umich.edu    Counter logs;
1875141Sgblack@eecs.umich.edu    Counter samples;
1885141Sgblack@eecs.umich.edu};
1895141Sgblack@eecs.umich.edu
1905141Sgblack@eecs.umich.educlass DistInfo : public Info
1915135Sgblack@eecs.umich.edu{
1925141Sgblack@eecs.umich.edu  public:
1935141Sgblack@eecs.umich.edu    /** Local storage for the entry values, used for printing. */
1945141Sgblack@eecs.umich.edu    DistData data;
1955141Sgblack@eecs.umich.edu};
1965141Sgblack@eecs.umich.edu
1975141Sgblack@eecs.umich.educlass VectorDistInfo : public Info
1985141Sgblack@eecs.umich.edu{
1995141Sgblack@eecs.umich.edu  public:
2005141Sgblack@eecs.umich.edu    std::vector<DistData> data;
2015141Sgblack@eecs.umich.edu
2025141Sgblack@eecs.umich.edu    /** Names and descriptions of subfields. */
2035141Sgblack@eecs.umich.edu    std::vector<std::string> subnames;
2045135Sgblack@eecs.umich.edu    std::vector<std::string> subdescs;
2055135Sgblack@eecs.umich.edu    void enable();
2065135Sgblack@eecs.umich.edu
2075135Sgblack@eecs.umich.edu  protected:
2085135Sgblack@eecs.umich.edu    /** Local storage for the entry values, used for printing. */
2095135Sgblack@eecs.umich.edu    mutable VResult rvec;
2105264Sgblack@eecs.umich.edu
2115264Sgblack@eecs.umich.edu  public:
2125135Sgblack@eecs.umich.edu    virtual size_type size() const = 0;
2135141Sgblack@eecs.umich.edu};
2145141Sgblack@eecs.umich.edu
2155135Sgblack@eecs.umich.educlass Vector2dInfo : public Info
2165141Sgblack@eecs.umich.edu{
2175141Sgblack@eecs.umich.edu  public:
2185141Sgblack@eecs.umich.edu    /** Names and descriptions of subfields. */
2195141Sgblack@eecs.umich.edu    std::vector<std::string> subnames;
2205135Sgblack@eecs.umich.edu    std::vector<std::string> subdescs;
2215141Sgblack@eecs.umich.edu    std::vector<std::string> y_subnames;
2225141Sgblack@eecs.umich.edu
2235141Sgblack@eecs.umich.edu    size_type x;
2245141Sgblack@eecs.umich.edu    size_type y;
2255141Sgblack@eecs.umich.edu
2265141Sgblack@eecs.umich.edu    /** Local storage for the entry values, used for printing. */
2275141Sgblack@eecs.umich.edu    mutable VCounter cvec;
2285141Sgblack@eecs.umich.edu
2295141Sgblack@eecs.umich.edu    void enable();
2305141Sgblack@eecs.umich.edu};
2315141Sgblack@eecs.umich.edu
2325141Sgblack@eecs.umich.educlass FormulaInfo : public VectorInfo
2335264Sgblack@eecs.umich.edu{
2345141Sgblack@eecs.umich.edu  public:
2355141Sgblack@eecs.umich.edu    virtual std::string str() const = 0;
2365141Sgblack@eecs.umich.edu};
2375141Sgblack@eecs.umich.edu
2385141Sgblack@eecs.umich.edu/** Data structure of sparse histogram */
2395141Sgblack@eecs.umich.edustruct SparseHistData
2405141Sgblack@eecs.umich.edu{
2415141Sgblack@eecs.umich.edu    MCounter cmap;
2425141Sgblack@eecs.umich.edu    Counter samples;
2435141Sgblack@eecs.umich.edu};
2445141Sgblack@eecs.umich.edu
2455141Sgblack@eecs.umich.edu
2465141Sgblack@eecs.umich.educlass SparseHistInfo : public Info
2475141Sgblack@eecs.umich.edu{
2485141Sgblack@eecs.umich.edu  public:
2495141Sgblack@eecs.umich.edu    /** Local storage for the entry values, used for printing. */
2505141Sgblack@eecs.umich.edu    SparseHistData data;
2515135Sgblack@eecs.umich.edu};
2525135Sgblack@eecs.umich.edu
2535135Sgblack@eecs.umich.edu} // namespace Stats
2545135Sgblack@eecs.umich.edu
2555135Sgblack@eecs.umich.edu#endif // __BASE_STATS_INFO_HH__
2565135Sgblack@eecs.umich.edu