comm_monitor.hh revision 8981
110461SAndreas.Sandberg@ARM.com/*
213637Sruben.ayrapetyan@arm.com * Copyright (c) 2012 ARM Limited
310461SAndreas.Sandberg@ARM.com * All rights reserved
410461SAndreas.Sandberg@ARM.com *
510461SAndreas.Sandberg@ARM.com * The license below extends only to copyright in the software and shall
610461SAndreas.Sandberg@ARM.com * not be construed as granting a license to any other intellectual
710461SAndreas.Sandberg@ARM.com * property including but not limited to intellectual property relating
810461SAndreas.Sandberg@ARM.com * to a hardware implementation of the functionality of the software
910461SAndreas.Sandberg@ARM.com * licensed hereunder.  You may use the software subject to the license
1010461SAndreas.Sandberg@ARM.com * terms below provided that you ensure that this notice is replicated
1110461SAndreas.Sandberg@ARM.com * unmodified and in its entirety in all distributions of the software,
1210461SAndreas.Sandberg@ARM.com * modified or unmodified, in source code or in binary form.
1310461SAndreas.Sandberg@ARM.com *
1410461SAndreas.Sandberg@ARM.com * Redistribution and use in source and binary forms, with or without
1510461SAndreas.Sandberg@ARM.com * modification, are permitted provided that the following conditions are
1610461SAndreas.Sandberg@ARM.com * met: redistributions of source code must retain the above copyright
1710461SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer;
1810461SAndreas.Sandberg@ARM.com * redistributions in binary form must reproduce the above copyright
1910461SAndreas.Sandberg@ARM.com * notice, this list of conditions and the following disclaimer in the
2010461SAndreas.Sandberg@ARM.com * documentation and/or other materials provided with the distribution;
2110461SAndreas.Sandberg@ARM.com * neither the name of the copyright holders nor the names of its
2210461SAndreas.Sandberg@ARM.com * contributors may be used to endorse or promote products derived from
2310461SAndreas.Sandberg@ARM.com * this software without specific prior written permission.
2410461SAndreas.Sandberg@ARM.com *
2510461SAndreas.Sandberg@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610461SAndreas.Sandberg@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710461SAndreas.Sandberg@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810461SAndreas.Sandberg@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910461SAndreas.Sandberg@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010461SAndreas.Sandberg@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110461SAndreas.Sandberg@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210461SAndreas.Sandberg@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310461SAndreas.Sandberg@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410461SAndreas.Sandberg@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510461SAndreas.Sandberg@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610461SAndreas.Sandberg@ARM.com *
3710461SAndreas.Sandberg@ARM.com * Authors: Thomas Grass
3810461SAndreas.Sandberg@ARM.com *          Andreas Hansson
3910461SAndreas.Sandberg@ARM.com */
4012286Sjose.marinho@arm.com
4110461SAndreas.Sandberg@ARM.com#ifndef __MEM_COMM_MONITOR_HH__
4210461SAndreas.Sandberg@ARM.com#define __MEM_COMM_MONITOR_HH__
4310461SAndreas.Sandberg@ARM.com
4410461SAndreas.Sandberg@ARM.com#include "base/statistics.hh"
4510609Sandreas.sandberg@arm.com#include "base/time.hh"
4610609Sandreas.sandberg@arm.com#include "mem/mem_object.hh"
4710461SAndreas.Sandberg@ARM.com#include "params/CommMonitor.hh"
4810461SAndreas.Sandberg@ARM.com
4910461SAndreas.Sandberg@ARM.com/**
5010461SAndreas.Sandberg@ARM.com * The communication monitor is a MemObject which can monitor statistics of
5110461SAndreas.Sandberg@ARM.com * the communication happening between two ports in the memory system.
5212286Sjose.marinho@arm.com *
5310461SAndreas.Sandberg@ARM.com * Currently the following stats are implemented: Histograms of read/write
5410461SAndreas.Sandberg@ARM.com * transactions, read/write burst lengths, read/write bandwidth,
5510461SAndreas.Sandberg@ARM.com * outstanding read/write requests, read latency and inter transaction time
5610461SAndreas.Sandberg@ARM.com * (read-read, write-write, read/write-read/write). Furthermore it allows
5713581Sgabeblack@google.com * to capture the number of accesses to an address over time ("heat map").
5810461SAndreas.Sandberg@ARM.com * All stats can be disabled from Python.
5910461SAndreas.Sandberg@ARM.com */
6010461SAndreas.Sandberg@ARM.comclass CommMonitor : public MemObject
6110461SAndreas.Sandberg@ARM.com{
6210461SAndreas.Sandberg@ARM.com
6312117Sjose.marinho@arm.com  public:
6410461SAndreas.Sandberg@ARM.com
6512286Sjose.marinho@arm.com    /** Parameters of communication monitor */
6612286Sjose.marinho@arm.com    typedef CommMonitorParams Params;
6712286Sjose.marinho@arm.com    const Params* params() const
6812286Sjose.marinho@arm.com    { return reinterpret_cast<const Params*>(_params); }
6910461SAndreas.Sandberg@ARM.com
7012974Sgiacomo.travaglini@arm.com    /**
7110461SAndreas.Sandberg@ARM.com     * Constructor based on the Python params
7210461SAndreas.Sandberg@ARM.com     *
7310461SAndreas.Sandberg@ARM.com     * @param params Python parameters
7412286Sjose.marinho@arm.com     */
7510461SAndreas.Sandberg@ARM.com    CommMonitor(Params* params);
7612286Sjose.marinho@arm.com
7710461SAndreas.Sandberg@ARM.com    /** Destructor */
7810461SAndreas.Sandberg@ARM.com    ~CommMonitor() { }
7912973Sandreas.sandberg@arm.com
8012973Sandreas.sandberg@arm.com    virtual MasterPort& getMasterPort(const std::string& if_name,
8112973Sandreas.sandberg@arm.com                                      int idx = -1);
8210461SAndreas.Sandberg@ARM.com
8310461SAndreas.Sandberg@ARM.com    virtual SlavePort& getSlavePort(const std::string& if_name,
8410461SAndreas.Sandberg@ARM.com                                    int idx = -1);
8510461SAndreas.Sandberg@ARM.com
8610461SAndreas.Sandberg@ARM.com    virtual void init();
8710461SAndreas.Sandberg@ARM.com
8810461SAndreas.Sandberg@ARM.com    /** Register statistics */
8910461SAndreas.Sandberg@ARM.com    void regStats();
9010461SAndreas.Sandberg@ARM.com
9110461SAndreas.Sandberg@ARM.com  private:
9210461SAndreas.Sandberg@ARM.com
9310461SAndreas.Sandberg@ARM.com    /**
9410461SAndreas.Sandberg@ARM.com     * Sender state class for the monitor so that we can annotate
9510461SAndreas.Sandberg@ARM.com     * packets with a transmit time and receive time.
9610461SAndreas.Sandberg@ARM.com     */
9712973Sandreas.sandberg@arm.com    class CommMonitorSenderState : public Packet::SenderState
9812973Sandreas.sandberg@arm.com    {
9912973Sandreas.sandberg@arm.com
10012973Sandreas.sandberg@arm.com      public:
10112973Sandreas.sandberg@arm.com
10212973Sandreas.sandberg@arm.com        /**
10312973Sandreas.sandberg@arm.com         * Construct a new sender state and remember the original one
10412973Sandreas.sandberg@arm.com         * so that we can implement a stack.
10512286Sjose.marinho@arm.com         *
10612286Sjose.marinho@arm.com         * @param _origSenderState Sender state to remember
10712286Sjose.marinho@arm.com         * @param _transmitTime Time of packet transmission
10812286Sjose.marinho@arm.com         */
10912286Sjose.marinho@arm.com        CommMonitorSenderState(SenderState* _origSenderState,
11012286Sjose.marinho@arm.com                               Tick _transmitTime)
11112286Sjose.marinho@arm.com            : origSenderState(_origSenderState), transmitTime(_transmitTime)
11212286Sjose.marinho@arm.com        { }
11312286Sjose.marinho@arm.com
11412286Sjose.marinho@arm.com        /** Destructor */
11512286Sjose.marinho@arm.com        ~CommMonitorSenderState() { }
11612286Sjose.marinho@arm.com
11712286Sjose.marinho@arm.com        /** Pointer to old sender state of packet */
11812286Sjose.marinho@arm.com        SenderState* origSenderState;
11912286Sjose.marinho@arm.com
12012286Sjose.marinho@arm.com        /** Tick when request is transmitted */
12112286Sjose.marinho@arm.com        Tick transmitTime;
12212286Sjose.marinho@arm.com
12312286Sjose.marinho@arm.com    };
12412286Sjose.marinho@arm.com
12512286Sjose.marinho@arm.com    /**
12612286Sjose.marinho@arm.com     * This is the master port of the communication monitor. All recv
12710461SAndreas.Sandberg@ARM.com     * functions call a function in CommMonitor, where the
12810461SAndreas.Sandberg@ARM.com     * send function of the slave port is called. Besides this, these
12910461SAndreas.Sandberg@ARM.com     * functions can also perform actions for capturing statistics.
13012286Sjose.marinho@arm.com     */
13112286Sjose.marinho@arm.com    class MonitorMasterPort : public MasterPort
13212286Sjose.marinho@arm.com    {
13312286Sjose.marinho@arm.com
13412286Sjose.marinho@arm.com      public:
13512286Sjose.marinho@arm.com
13612286Sjose.marinho@arm.com        MonitorMasterPort(const std::string& _name, CommMonitor& _mon)
13712286Sjose.marinho@arm.com            : MasterPort(_name, &_mon), mon(_mon)
13812286Sjose.marinho@arm.com        { }
13912286Sjose.marinho@arm.com
14012286Sjose.marinho@arm.com      protected:
14112286Sjose.marinho@arm.com
14212286Sjose.marinho@arm.com        void recvFunctionalSnoop(PacketPtr pkt)
14312286Sjose.marinho@arm.com        {
14412286Sjose.marinho@arm.com            mon.recvFunctionalSnoop(pkt);
14512286Sjose.marinho@arm.com        }
14612286Sjose.marinho@arm.com
14712286Sjose.marinho@arm.com        Tick recvAtomicSnoop(PacketPtr pkt)
14812286Sjose.marinho@arm.com        {
14912286Sjose.marinho@arm.com            return mon.recvAtomicSnoop(pkt);
15012286Sjose.marinho@arm.com        }
15112286Sjose.marinho@arm.com
15212286Sjose.marinho@arm.com        bool recvTimingResp(PacketPtr pkt)
15312286Sjose.marinho@arm.com        {
15412286Sjose.marinho@arm.com            return mon.recvTimingResp(pkt);
15512117Sjose.marinho@arm.com        }
15612117Sjose.marinho@arm.com
15712117Sjose.marinho@arm.com        void recvTimingSnoopReq(PacketPtr pkt)
15812117Sjose.marinho@arm.com        {
15912117Sjose.marinho@arm.com            mon.recvTimingSnoopReq(pkt);
16012117Sjose.marinho@arm.com        }
16112117Sjose.marinho@arm.com
16212117Sjose.marinho@arm.com        void recvRangeChange()
16312117Sjose.marinho@arm.com        {
16412117Sjose.marinho@arm.com            mon.recvRangeChange();
16512117Sjose.marinho@arm.com        }
16610461SAndreas.Sandberg@ARM.com
16710461SAndreas.Sandberg@ARM.com        bool isSnooping() const
16810461SAndreas.Sandberg@ARM.com        {
16910461SAndreas.Sandberg@ARM.com            return mon.isSnooping();
17010461SAndreas.Sandberg@ARM.com        }
17110461SAndreas.Sandberg@ARM.com
17210461SAndreas.Sandberg@ARM.com        unsigned deviceBlockSize() const
17310461SAndreas.Sandberg@ARM.com        {
17410461SAndreas.Sandberg@ARM.com            return mon.deviceBlockSizeMaster();
17510461SAndreas.Sandberg@ARM.com        }
17612286Sjose.marinho@arm.com
17712286Sjose.marinho@arm.com        void recvRetry()
17812286Sjose.marinho@arm.com        {
17912286Sjose.marinho@arm.com            mon.recvRetryMaster();
18012286Sjose.marinho@arm.com        }
18112286Sjose.marinho@arm.com
18212286Sjose.marinho@arm.com      private:
18312286Sjose.marinho@arm.com
18412286Sjose.marinho@arm.com        CommMonitor& mon;
18512286Sjose.marinho@arm.com
18612286Sjose.marinho@arm.com    };
18712286Sjose.marinho@arm.com
18812286Sjose.marinho@arm.com    /** Instance of master port, facing the memory side */
18912286Sjose.marinho@arm.com    MonitorMasterPort masterPort;
19012286Sjose.marinho@arm.com
19112286Sjose.marinho@arm.com    /**
19213581Sgabeblack@google.com     * This is the slave port of the communication monitor. All recv
19310461SAndreas.Sandberg@ARM.com     * functions call a function in CommMonitor, where the
19410461SAndreas.Sandberg@ARM.com     * send function of the master port is called. Besides this, these
19510461SAndreas.Sandberg@ARM.com     * functions can also perform actions for capturing statistics.
19610461SAndreas.Sandberg@ARM.com     */
19710461SAndreas.Sandberg@ARM.com    class MonitorSlavePort : public SlavePort
19810461SAndreas.Sandberg@ARM.com    {
19910461SAndreas.Sandberg@ARM.com
20010461SAndreas.Sandberg@ARM.com      public:
20110461SAndreas.Sandberg@ARM.com
20210461SAndreas.Sandberg@ARM.com        MonitorSlavePort(const std::string& _name, CommMonitor& _mon)
20310461SAndreas.Sandberg@ARM.com            : SlavePort(_name, &_mon), mon(_mon)
20410461SAndreas.Sandberg@ARM.com        { }
20510461SAndreas.Sandberg@ARM.com
20610461SAndreas.Sandberg@ARM.com      protected:
20710461SAndreas.Sandberg@ARM.com
20810461SAndreas.Sandberg@ARM.com        void recvFunctional(PacketPtr pkt)
20910461SAndreas.Sandberg@ARM.com        {
21010461SAndreas.Sandberg@ARM.com            mon.recvFunctional(pkt);
21110461SAndreas.Sandberg@ARM.com        }
21210461SAndreas.Sandberg@ARM.com
21310461SAndreas.Sandberg@ARM.com        Tick recvAtomic(PacketPtr pkt)
21410461SAndreas.Sandberg@ARM.com        {
21510461SAndreas.Sandberg@ARM.com            return mon.recvAtomic(pkt);
21610461SAndreas.Sandberg@ARM.com        }
21713104Sgiacomo.travaglini@arm.com
21810461SAndreas.Sandberg@ARM.com        bool recvTimingReq(PacketPtr pkt)
21910461SAndreas.Sandberg@ARM.com        {
22010461SAndreas.Sandberg@ARM.com            return mon.recvTimingReq(pkt);
22110461SAndreas.Sandberg@ARM.com        }
22212286Sjose.marinho@arm.com
22312286Sjose.marinho@arm.com        bool recvTimingSnoopResp(PacketPtr pkt)
22410461SAndreas.Sandberg@ARM.com        {
22512286Sjose.marinho@arm.com            return mon.recvTimingSnoopResp(pkt);
22610461SAndreas.Sandberg@ARM.com        }
22710461SAndreas.Sandberg@ARM.com
22810461SAndreas.Sandberg@ARM.com        unsigned deviceBlockSize() const
22912286Sjose.marinho@arm.com        {
23010461SAndreas.Sandberg@ARM.com            return mon.deviceBlockSizeSlave();
23110461SAndreas.Sandberg@ARM.com        }
23210461SAndreas.Sandberg@ARM.com
23310461SAndreas.Sandberg@ARM.com        AddrRangeList getAddrRanges()
23410461SAndreas.Sandberg@ARM.com        {
23510461SAndreas.Sandberg@ARM.com            return mon.getAddrRanges();
23612117Sjose.marinho@arm.com        }
23710461SAndreas.Sandberg@ARM.com
23810461SAndreas.Sandberg@ARM.com        void recvRetry()
23910461SAndreas.Sandberg@ARM.com        {
24010461SAndreas.Sandberg@ARM.com            mon.recvRetrySlave();
24110461SAndreas.Sandberg@ARM.com        }
24210461SAndreas.Sandberg@ARM.com
24310461SAndreas.Sandberg@ARM.com      private:
24410461SAndreas.Sandberg@ARM.com
24512042Sandreas.sandberg@arm.com        CommMonitor& mon;
24610461SAndreas.Sandberg@ARM.com
24710461SAndreas.Sandberg@ARM.com    };
24810461SAndreas.Sandberg@ARM.com
24910461SAndreas.Sandberg@ARM.com    /** Instance of slave port, i.e. on the CPU side */
25010461SAndreas.Sandberg@ARM.com    MonitorSlavePort slavePort;
25110461SAndreas.Sandberg@ARM.com
25210461SAndreas.Sandberg@ARM.com    void recvFunctional(PacketPtr pkt);
25310461SAndreas.Sandberg@ARM.com
25410461SAndreas.Sandberg@ARM.com    void recvFunctionalSnoop(PacketPtr pkt);
25510461SAndreas.Sandberg@ARM.com
25610461SAndreas.Sandberg@ARM.com    Tick recvAtomic(PacketPtr pkt);
25710461SAndreas.Sandberg@ARM.com
25810461SAndreas.Sandberg@ARM.com    Tick recvAtomicSnoop(PacketPtr pkt);
25910461SAndreas.Sandberg@ARM.com
26010461SAndreas.Sandberg@ARM.com    bool recvTimingReq(PacketPtr pkt);
26110461SAndreas.Sandberg@ARM.com
26210461SAndreas.Sandberg@ARM.com    bool recvTimingResp(PacketPtr pkt);
26310461SAndreas.Sandberg@ARM.com
26410461SAndreas.Sandberg@ARM.com    void recvTimingSnoopReq(PacketPtr pkt);
26510461SAndreas.Sandberg@ARM.com
26610461SAndreas.Sandberg@ARM.com    bool recvTimingSnoopResp(PacketPtr pkt);
26710461SAndreas.Sandberg@ARM.com
26810461SAndreas.Sandberg@ARM.com    unsigned deviceBlockSizeMaster();
26910461SAndreas.Sandberg@ARM.com
27010461SAndreas.Sandberg@ARM.com    unsigned deviceBlockSizeSlave();
27110461SAndreas.Sandberg@ARM.com
27210461SAndreas.Sandberg@ARM.com    AddrRangeList getAddrRanges();
27310461SAndreas.Sandberg@ARM.com
27410461SAndreas.Sandberg@ARM.com    bool isSnooping() const;
27510461SAndreas.Sandberg@ARM.com
27610461SAndreas.Sandberg@ARM.com    void recvRetryMaster();
27710461SAndreas.Sandberg@ARM.com
27810461SAndreas.Sandberg@ARM.com    void recvRetrySlave();
27910461SAndreas.Sandberg@ARM.com
28010461SAndreas.Sandberg@ARM.com    void recvRangeChange();
28110461SAndreas.Sandberg@ARM.com
28210461SAndreas.Sandberg@ARM.com    void periodicTraceDump();
28310461SAndreas.Sandberg@ARM.com
28410461SAndreas.Sandberg@ARM.com    /** Stats declarations, all in a struct for convenience. */
28510461SAndreas.Sandberg@ARM.com    struct MonitorStats
28610461SAndreas.Sandberg@ARM.com    {
28710461SAndreas.Sandberg@ARM.com
28810461SAndreas.Sandberg@ARM.com        /** Disable flag for burst length historgrams **/
28913104Sgiacomo.travaglini@arm.com        bool disableBurstLengthHists;
29010461SAndreas.Sandberg@ARM.com
29110461SAndreas.Sandberg@ARM.com        /** Histogram of read burst lengths */
29210461SAndreas.Sandberg@ARM.com        Stats::Histogram readBurstLengthHist;
29310461SAndreas.Sandberg@ARM.com
29410461SAndreas.Sandberg@ARM.com        /** Histogram of write burst lengths */
29510461SAndreas.Sandberg@ARM.com        Stats::Histogram writeBurstLengthHist;
29610461SAndreas.Sandberg@ARM.com
29710461SAndreas.Sandberg@ARM.com        /** Disable flag for the bandwidth histograms */
29810461SAndreas.Sandberg@ARM.com        bool disableBandwidthHists;
29910461SAndreas.Sandberg@ARM.com
30013581Sgabeblack@google.com        /**
30110461SAndreas.Sandberg@ARM.com         * Histogram for read bandwidth per sample window. The
30210461SAndreas.Sandberg@ARM.com         * internal counter is an unsigned int rather than a stat.
30313581Sgabeblack@google.com         */
30410461SAndreas.Sandberg@ARM.com        unsigned int readBytes;
30510461SAndreas.Sandberg@ARM.com        Stats::Histogram readBandwidthHist;
30610461SAndreas.Sandberg@ARM.com        Stats::Formula averageReadBW;
30710461SAndreas.Sandberg@ARM.com        Stats::Scalar totalReadBytes;
30810461SAndreas.Sandberg@ARM.com
30913581Sgabeblack@google.com        /**
31010461SAndreas.Sandberg@ARM.com         * Histogram for write bandwidth per sample window. The
31110461SAndreas.Sandberg@ARM.com         * internal counter is an unsigned int rather than a stat.
31210461SAndreas.Sandberg@ARM.com         */
31310461SAndreas.Sandberg@ARM.com        unsigned int writtenBytes;
31410461SAndreas.Sandberg@ARM.com        Stats::Histogram writeBandwidthHist;
31510461SAndreas.Sandberg@ARM.com        Stats::Formula averageWriteBW;
31610461SAndreas.Sandberg@ARM.com        Stats::Scalar totalWrittenBytes;
31710461SAndreas.Sandberg@ARM.com
31810461SAndreas.Sandberg@ARM.com        /** Disable flag for latency histograms. */
31910461SAndreas.Sandberg@ARM.com        bool disableLatencyHists;
32010461SAndreas.Sandberg@ARM.com
32110461SAndreas.Sandberg@ARM.com        /** Histogram of read request-to-response latencies */
32210461SAndreas.Sandberg@ARM.com        Stats::Histogram readLatencyHist;
32310461SAndreas.Sandberg@ARM.com
32410461SAndreas.Sandberg@ARM.com        /** Histogram of write request-to-response latencies */
32510461SAndreas.Sandberg@ARM.com        Stats::Histogram writeLatencyHist;
32610461SAndreas.Sandberg@ARM.com
32710461SAndreas.Sandberg@ARM.com        /** Disable flag for ITT distributions. */
32810461SAndreas.Sandberg@ARM.com        bool disableITTDists;
32910461SAndreas.Sandberg@ARM.com
33010461SAndreas.Sandberg@ARM.com        /**
33110461SAndreas.Sandberg@ARM.com         * Inter transaction time (ITT) distributions. There are
33210461SAndreas.Sandberg@ARM.com         * histograms of the time between two read, write or arbitrary
33310461SAndreas.Sandberg@ARM.com         * accesses. The time of a request is the tick at which the
33410461SAndreas.Sandberg@ARM.com         * request is forwarded by the monitor.
33510461SAndreas.Sandberg@ARM.com         */
33610461SAndreas.Sandberg@ARM.com        Stats::Distribution ittReadRead;
33710461SAndreas.Sandberg@ARM.com        Stats::Distribution ittWriteWrite;
33812117Sjose.marinho@arm.com        Stats::Distribution ittReqReq;
33910461SAndreas.Sandberg@ARM.com        Tick timeOfLastRead;
34010461SAndreas.Sandberg@ARM.com        Tick timeOfLastWrite;
34112117Sjose.marinho@arm.com        Tick timeOfLastReq;
34212117Sjose.marinho@arm.com
34312117Sjose.marinho@arm.com        /** Disable flag for outstanding histograms. */
34412117Sjose.marinho@arm.com        bool disableOutstandingHists;
34512117Sjose.marinho@arm.com
34612117Sjose.marinho@arm.com        /**
34710461SAndreas.Sandberg@ARM.com         * Histogram of outstanding read requests. Counter for
34812117Sjose.marinho@arm.com         * outstanding read requests is an unsigned integer because
34910461SAndreas.Sandberg@ARM.com         * it should not be reset when stats are reset.
35010461SAndreas.Sandberg@ARM.com         */
35112286Sjose.marinho@arm.com        Stats::Histogram outstandingReadsHist;
35210461SAndreas.Sandberg@ARM.com        unsigned int outstandingReadReqs;
35310461SAndreas.Sandberg@ARM.com
35412286Sjose.marinho@arm.com        /**
35510461SAndreas.Sandberg@ARM.com         * Histogram of outstanding write requests. Counter for
35610461SAndreas.Sandberg@ARM.com         * outstanding write requests is an unsigned integer because
35710461SAndreas.Sandberg@ARM.com         * it should not be reset when stats are reset.
35810461SAndreas.Sandberg@ARM.com         */
35910461SAndreas.Sandberg@ARM.com        Stats::Histogram outstandingWritesHist;
36010461SAndreas.Sandberg@ARM.com        unsigned int outstandingWriteReqs;
36110461SAndreas.Sandberg@ARM.com
36210461SAndreas.Sandberg@ARM.com        /** Disable flag for transaction histograms. */
36310461SAndreas.Sandberg@ARM.com        bool disableTransactionHists;
36410461SAndreas.Sandberg@ARM.com
36510461SAndreas.Sandberg@ARM.com        /** Histogram of number of read transactions per time bin */
36610461SAndreas.Sandberg@ARM.com        Stats::Histogram readTransHist;
36710461SAndreas.Sandberg@ARM.com        unsigned int readTrans;
36812286Sjose.marinho@arm.com
36912286Sjose.marinho@arm.com        /** Histogram of number of timing write transactions per time bin */
37012286Sjose.marinho@arm.com        Stats::Histogram writeTransHist;
37112286Sjose.marinho@arm.com        unsigned int writeTrans;
37212286Sjose.marinho@arm.com
37310461SAndreas.Sandberg@ARM.com        /** Disable flag for address distributions. */
37410461SAndreas.Sandberg@ARM.com        bool disableAddrDists;
37510461SAndreas.Sandberg@ARM.com
37610461SAndreas.Sandberg@ARM.com        /**
37710461SAndreas.Sandberg@ARM.com         * Histogram of number of read accesses to addresses over
37810461SAndreas.Sandberg@ARM.com         * time.
37910461SAndreas.Sandberg@ARM.com         */
38010461SAndreas.Sandberg@ARM.com        Stats::SparseHistogram readAddrDist;
38110461SAndreas.Sandberg@ARM.com
38210461SAndreas.Sandberg@ARM.com        /**
38310461SAndreas.Sandberg@ARM.com         * Histogram of number of write accesses to addresses over
38410461SAndreas.Sandberg@ARM.com         * time.
38510461SAndreas.Sandberg@ARM.com         */
38610461SAndreas.Sandberg@ARM.com        Stats::SparseHistogram writeAddrDist;
38710461SAndreas.Sandberg@ARM.com
38810461SAndreas.Sandberg@ARM.com        /**
38910461SAndreas.Sandberg@ARM.com         * Create the monitor stats and initialise all the members
39010461SAndreas.Sandberg@ARM.com         * that are not statistics themselves, but used to control the
39110461SAndreas.Sandberg@ARM.com         * stats or track values during a sample period.
39210461SAndreas.Sandberg@ARM.com         */
39310461SAndreas.Sandberg@ARM.com        MonitorStats(const CommMonitorParams* params) :
39410461SAndreas.Sandberg@ARM.com            disableBurstLengthHists(params->disable_burst_length_hists),
39510461SAndreas.Sandberg@ARM.com            disableBandwidthHists(params->disable_bandwidth_hists),
39610461SAndreas.Sandberg@ARM.com            readBytes(0), writtenBytes(0),
39710461SAndreas.Sandberg@ARM.com            disableLatencyHists(params->disable_latency_hists),
39810461SAndreas.Sandberg@ARM.com            disableITTDists(params->disable_itt_dists),
39910461SAndreas.Sandberg@ARM.com            timeOfLastRead(0), timeOfLastWrite(0), timeOfLastReq(0),
40010461SAndreas.Sandberg@ARM.com            disableOutstandingHists(params->disable_outstanding_hists),
40110461SAndreas.Sandberg@ARM.com            outstandingReadReqs(0), outstandingWriteReqs(0),
40210461SAndreas.Sandberg@ARM.com            disableTransactionHists(params->disable_transaction_hists),
40310461SAndreas.Sandberg@ARM.com            readTrans(0), writeTrans(0),
40410461SAndreas.Sandberg@ARM.com            disableAddrDists(params->disable_addr_dists)
40510461SAndreas.Sandberg@ARM.com        { }
40610461SAndreas.Sandberg@ARM.com
40710461SAndreas.Sandberg@ARM.com    };
40810461SAndreas.Sandberg@ARM.com
40910461SAndreas.Sandberg@ARM.com    /** This function is called periodically at the end of each time bin */
41012286Sjose.marinho@arm.com    void samplePeriodic();
41110461SAndreas.Sandberg@ARM.com
41210461SAndreas.Sandberg@ARM.com    /** Schedule the first periodic event */
41310461SAndreas.Sandberg@ARM.com    void startup();
41410461SAndreas.Sandberg@ARM.com
41510461SAndreas.Sandberg@ARM.com    /** Periodic event called at the end of each simulation time bin */
41610461SAndreas.Sandberg@ARM.com    EventWrapper<CommMonitor, &CommMonitor::samplePeriodic> samplePeriodicEvent;
41710461SAndreas.Sandberg@ARM.com
41810461SAndreas.Sandberg@ARM.com    /** Length of simulation time bin*/
41910461SAndreas.Sandberg@ARM.com    Tick samplePeriodTicks;
42010461SAndreas.Sandberg@ARM.com    Time samplePeriod;
42110461SAndreas.Sandberg@ARM.com
42210461SAndreas.Sandberg@ARM.com    /** Address mask for sources of read accesses to be captured */
42310461SAndreas.Sandberg@ARM.com    Addr readAddrMask;
42410461SAndreas.Sandberg@ARM.com
42510461SAndreas.Sandberg@ARM.com    /** Address mask for sources of write accesses to be captured */
42610461SAndreas.Sandberg@ARM.com    Addr writeAddrMask;
42710461SAndreas.Sandberg@ARM.com
42810461SAndreas.Sandberg@ARM.com    /** Instantiate stats */
42910461SAndreas.Sandberg@ARM.com    MonitorStats stats;
43010461SAndreas.Sandberg@ARM.com};
43112286Sjose.marinho@arm.com
43210461SAndreas.Sandberg@ARM.com#endif //__MEM_COMM_MONITOR_HH__
43310461SAndreas.Sandberg@ARM.com