110381Sdam.sunwoo@arm.com/*
210381Sdam.sunwoo@arm.com * Copyright (c) 2012-2014 ARM Limited
310381Sdam.sunwoo@arm.com * All rights reserved.
410381Sdam.sunwoo@arm.com *
510381Sdam.sunwoo@arm.com * The license below extends only to copyright in the software and shall
610381Sdam.sunwoo@arm.com * not be construed as granting a license to any other intellectual
710381Sdam.sunwoo@arm.com * property including but not limited to intellectual property relating
810381Sdam.sunwoo@arm.com * to a hardware implementation of the functionality of the software
910381Sdam.sunwoo@arm.com * licensed hereunder.  You may use the software subject to the license
1010381Sdam.sunwoo@arm.com * terms below provided that you ensure that this notice is replicated
1110381Sdam.sunwoo@arm.com * unmodified and in its entirety in all distributions of the software,
1210381Sdam.sunwoo@arm.com * modified or unmodified, in source code or in binary form.
1310381Sdam.sunwoo@arm.com *
1410381Sdam.sunwoo@arm.com * Redistribution and use in source and binary forms, with or without
1510381Sdam.sunwoo@arm.com * modification, are permitted provided that the following conditions are
1610381Sdam.sunwoo@arm.com * met: redistributions of source code must retain the above copyright
1710381Sdam.sunwoo@arm.com * notice, this list of conditions and the following disclaimer;
1810381Sdam.sunwoo@arm.com * redistributions in binary form must reproduce the above copyright
1910381Sdam.sunwoo@arm.com * notice, this list of conditions and the following disclaimer in the
2010381Sdam.sunwoo@arm.com * documentation and/or other materials provided with the distribution;
2110381Sdam.sunwoo@arm.com * neither the name of the copyright holders nor the names of its
2210381Sdam.sunwoo@arm.com * contributors may be used to endorse or promote products derived from
2310381Sdam.sunwoo@arm.com * this software without specific prior written permission.
2410381Sdam.sunwoo@arm.com *
2510381Sdam.sunwoo@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610381Sdam.sunwoo@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710381Sdam.sunwoo@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810381Sdam.sunwoo@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910381Sdam.sunwoo@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010381Sdam.sunwoo@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110381Sdam.sunwoo@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210381Sdam.sunwoo@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310381Sdam.sunwoo@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410381Sdam.sunwoo@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510381Sdam.sunwoo@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610381Sdam.sunwoo@arm.com *
3710381Sdam.sunwoo@arm.com * Authors: Dam Sunwoo
3810381Sdam.sunwoo@arm.com *          Curtis Dunham
3910381Sdam.sunwoo@arm.com */
4010381Sdam.sunwoo@arm.com
4110381Sdam.sunwoo@arm.com#ifndef __CPU_SIMPLE_PROBES_SIMPOINT_HH__
4210381Sdam.sunwoo@arm.com#define __CPU_SIMPLE_PROBES_SIMPOINT_HH__
4310381Sdam.sunwoo@arm.com
4411168Sandreas.hansson@arm.com#include <unordered_map>
4511168Sandreas.hansson@arm.com
4611359Sandreas@sandberg.pp.se#include "base/output.hh"
4710381Sdam.sunwoo@arm.com#include "cpu/simple_thread.hh"
4810381Sdam.sunwoo@arm.com#include "params/SimPoint.hh"
4910381Sdam.sunwoo@arm.com#include "sim/probe/probe.hh"
5010381Sdam.sunwoo@arm.com
5110381Sdam.sunwoo@arm.com/**
5210381Sdam.sunwoo@arm.com * Probe for SimPoints BBV generation
5310381Sdam.sunwoo@arm.com */
5410381Sdam.sunwoo@arm.com
5510381Sdam.sunwoo@arm.com/**
5610381Sdam.sunwoo@arm.com *  Start and end address of basic block for SimPoint profiling.
5710381Sdam.sunwoo@arm.com *  This structure is used to look up the hash table of BBVs.
5810381Sdam.sunwoo@arm.com *  - first: PC of first inst in basic block
5910381Sdam.sunwoo@arm.com *  - second: PC of last inst in basic block
6010381Sdam.sunwoo@arm.com */
6110381Sdam.sunwoo@arm.comtypedef std::pair<Addr, Addr> BasicBlockRange;
6210381Sdam.sunwoo@arm.com
6310381Sdam.sunwoo@arm.com/** Overload hash function for BasicBlockRange type */
6411168Sandreas.hansson@arm.comnamespace std {
6510381Sdam.sunwoo@arm.comtemplate <>
6610381Sdam.sunwoo@arm.comstruct hash<BasicBlockRange>
6710381Sdam.sunwoo@arm.com{
6810381Sdam.sunwoo@arm.com  public:
6910381Sdam.sunwoo@arm.com    size_t operator()(const BasicBlockRange &bb) const {
7010381Sdam.sunwoo@arm.com        return hash<Addr>()(bb.first + bb.second);
7110381Sdam.sunwoo@arm.com    }
7210381Sdam.sunwoo@arm.com};
7311168Sandreas.hansson@arm.com}
7410381Sdam.sunwoo@arm.com
7510381Sdam.sunwoo@arm.comclass SimPoint : public ProbeListenerObject
7610381Sdam.sunwoo@arm.com{
7710381Sdam.sunwoo@arm.com  public:
7810381Sdam.sunwoo@arm.com    SimPoint(const SimPointParams *params);
7910381Sdam.sunwoo@arm.com    virtual ~SimPoint();
8010381Sdam.sunwoo@arm.com
8110381Sdam.sunwoo@arm.com    virtual void init();
8210381Sdam.sunwoo@arm.com
8310381Sdam.sunwoo@arm.com    virtual void regProbeListeners();
8410381Sdam.sunwoo@arm.com
8510381Sdam.sunwoo@arm.com    /**
8610381Sdam.sunwoo@arm.com     * Profile basic blocks for SimPoints.
8710381Sdam.sunwoo@arm.com     * Called at every macro inst to increment basic block inst counts and
8810381Sdam.sunwoo@arm.com     * to profile block if end of block.
8910381Sdam.sunwoo@arm.com     */
9010381Sdam.sunwoo@arm.com    void profile(const std::pair<SimpleThread*, StaticInstPtr>&);
9110381Sdam.sunwoo@arm.com
9210381Sdam.sunwoo@arm.com  private:
9310381Sdam.sunwoo@arm.com    /** SimPoint profiling interval size in instructions */
9410381Sdam.sunwoo@arm.com    const uint64_t intervalSize;
9510381Sdam.sunwoo@arm.com
9610381Sdam.sunwoo@arm.com    /** Inst count in current basic block */
9710381Sdam.sunwoo@arm.com    uint64_t intervalCount;
9810381Sdam.sunwoo@arm.com    /** Excess inst count from previous interval*/
9910381Sdam.sunwoo@arm.com    uint64_t intervalDrift;
10010381Sdam.sunwoo@arm.com    /** Pointer to SimPoint BBV output stream */
10111359Sandreas@sandberg.pp.se    OutputStream *simpointStream;
10210381Sdam.sunwoo@arm.com
10310381Sdam.sunwoo@arm.com    /** Basic Block information */
10410381Sdam.sunwoo@arm.com    struct BBInfo {
10510381Sdam.sunwoo@arm.com        /** Unique ID */
10610381Sdam.sunwoo@arm.com        uint64_t id;
10710381Sdam.sunwoo@arm.com        /** Num of static insts in BB */
10810381Sdam.sunwoo@arm.com        uint64_t insts;
10910381Sdam.sunwoo@arm.com        /** Accumulated dynamic inst count executed by BB */
11010381Sdam.sunwoo@arm.com        uint64_t count;
11110381Sdam.sunwoo@arm.com    };
11210381Sdam.sunwoo@arm.com
11310381Sdam.sunwoo@arm.com    /** Hash table containing all previously seen basic blocks */
11411168Sandreas.hansson@arm.com    std::unordered_map<BasicBlockRange, BBInfo> bbMap;
11510381Sdam.sunwoo@arm.com    /** Currently executing basic block */
11610381Sdam.sunwoo@arm.com    BasicBlockRange currentBBV;
11710381Sdam.sunwoo@arm.com    /** inst count in current basic block */
11810381Sdam.sunwoo@arm.com    uint64_t currentBBVInstCount;
11910381Sdam.sunwoo@arm.com};
12010381Sdam.sunwoo@arm.com
12110381Sdam.sunwoo@arm.com#endif // __CPU_SIMPLE_PROBES_SIMPOINT_HH__
122