2 * Copyright (c) 2012-2014 ARM Limited
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include "cpu/simple/probes/simpoint.hh"
40 #include "base/output.hh"
42 SimPoint::SimPoint(const SimPointParams
&p
)
43 : ProbeListenerObject(p
),
44 intervalSize(p
.interval
),
49 currentBBVInstCount(0)
51 simpointStream
= simout
.create(p
.profile_file
, false);
53 fatal("unable to open SimPoint profile_file");
58 simout
.close(simpointStream
);
66 SimPoint::regProbeListeners()
68 typedef ProbeListenerArg
<SimPoint
, std::pair
<SimpleThread
*,StaticInstPtr
>>
70 listeners
.push_back(new SimPointListener(this, "Commit",
75 SimPoint::profile(const std::pair
<SimpleThread
*, StaticInstPtr
>& p
)
77 SimpleThread
* thread
= p
.first
;
78 const StaticInstPtr
&inst
= p
.second
;
80 if (inst
->isMicroop() && !inst
->isLastMicroop())
83 if (!currentBBVInstCount
)
84 currentBBV
.first
= thread
->pcState().instAddr();
87 ++currentBBVInstCount
;
89 // If inst is control inst, assume end of basic block.
90 if (inst
->isControl()) {
91 currentBBV
.second
= thread
->pcState().instAddr();
93 auto map_itr
= bbMap
.find(currentBBV
);
94 if (map_itr
== bbMap
.end()){
95 // If a new (previously unseen) basic block is found,
96 // add a new unique id, record num of insts and insert
99 info
.id
= bbMap
.size() + 1;
100 info
.insts
= currentBBVInstCount
;
101 info
.count
= currentBBVInstCount
;
102 bbMap
.insert(std::make_pair(currentBBV
, info
));
104 // If basic block is seen before, just increment the count by the
105 // number of insts in basic block.
106 BBInfo
& info
= map_itr
->second
;
107 info
.count
+= currentBBVInstCount
;
109 currentBBVInstCount
= 0;
111 // Reached end of interval if the sum of the current inst count
112 // (intervalCount) and the excessive inst count from the previous
113 // interval (intervalDrift) is greater than/equal to the interval size.
114 if (intervalCount
+ intervalDrift
>= intervalSize
) {
115 // summarize interval and display BBV info
116 std::vector
<std::pair
<uint64_t, uint64_t> > counts
;
117 for (auto map_itr
= bbMap
.begin(); map_itr
!= bbMap
.end();
119 BBInfo
& info
= map_itr
->second
;
120 if (info
.count
!= 0) {
121 counts
.push_back(std::make_pair(info
.id
, info
.count
));
125 std::sort(counts
.begin(), counts
.end());
127 // Print output BBV info
128 *simpointStream
->stream() << "T";
129 for (auto cnt_itr
= counts
.begin(); cnt_itr
!= counts
.end();
131 *simpointStream
->stream() << ":" << cnt_itr
->first
132 << ":" << cnt_itr
->second
<< " ";
134 *simpointStream
->stream() << "\n";
136 intervalDrift
= (intervalCount
+ intervalDrift
) - intervalSize
;