gem5  v21.1.0.2
clock_domain.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2014, 2019 ARM Limited
3  * Copyright (c) 2013 Cornell University
4  * All rights reserved
5  *
6  * The license below extends only to copyright in the software and shall
7  * not be construed as granting a license to any other intellectual
8  * property including but not limited to intellectual property relating
9  * to a hardware implementation of the functionality of the software
10  * licensed hereunder. You may use the software subject to the license
11  * terms below provided that you ensure that this notice is replicated
12  * unmodified and in its entirety in all distributions of the software,
13  * modified or unmodified, in source code or in binary form.
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions are
17  * met: redistributions of source code must retain the above copyright
18  * notice, this list of conditions and the following disclaimer;
19  * redistributions in binary form must reproduce the above copyright
20  * notice, this list of conditions and the following disclaimer in the
21  * documentation and/or other materials provided with the distribution;
22  * neither the name of the copyright holders nor the names of its
23  * contributors may be used to endorse or promote products derived from
24  * this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37  */
38 
44 #ifndef __SIM_CLOCK_DOMAIN_HH__
45 #define __SIM_CLOCK_DOMAIN_HH__
46 
47 #include <algorithm>
48 
49 #include "base/statistics.hh"
50 #include "params/ClockDomain.hh"
51 #include "params/DerivedClockDomain.hh"
52 #include "params/SrcClockDomain.hh"
53 #include "sim/sim_object.hh"
54 
55 namespace gem5
56 {
57 
61 class DerivedClockDomain;
62 class VoltageDomain;
63 class Clocked;
64 
71 class ClockDomain : public SimObject
72 {
73  protected:
74 
80 
85 
91 
97 
98  public:
99 
100  typedef ClockDomainParams Params;
101  ClockDomain(const Params &p, VoltageDomain *voltage_domain);
102 
108  Tick clockPeriod() const { return _clockPeriod; }
109 
116  {
117  assert(c != NULL);
118  assert(std::find(members.begin(), members.end(), c) == members.end());
119  members.push_back(c);
120  }
121 
127  inline VoltageDomain *voltageDomain() const { return _voltageDomain; }
128 
129 
135  double voltage() const;
136 
143  { children.push_back(clock_domain); }
144 
145  private:
147  {
149 
154  } stats;
155 };
156 
167 {
168 
169  public:
170 
171  typedef SrcClockDomainParams Params;
172  SrcClockDomain(const Params &p);
173 
178  void clockPeriod(Tick clock_period);
179 
180  // Explicitly import the otherwise hidden clockPeriod
182 
183  typedef int32_t DomainID;
184  static const DomainID emptyDomainID = -1;
185 
189  uint32_t domainID() const { return _domainID; }
190 
191  typedef uint32_t PerfLevel;
200  bool validPerfLevel(PerfLevel perf_level) const {
201  return perf_level < numPerfLevels();
202  }
203 
209  void perfLevel(PerfLevel perf_level);
210 
214  PerfLevel perfLevel() const { return _perfLevel; }
215 
221  PerfLevel numPerfLevels() const {return freqOpPoints.size();}
222 
228 
230  {
231  assert(validPerfLevel(perf_level));
232  return freqOpPoints[perf_level];
233  }
234 
235  void startup() override;
236 
237  void serialize(CheckpointOut &cp) const override;
238  void unserialize(CheckpointIn &cp) override;
239 
240  private:
244  void signalPerfLevelUpdate();
245 
253 
258  const uint32_t _domainID;
259 
267 };
268 
276 {
277 
278  public:
279 
280  typedef DerivedClockDomainParams Params;
281  DerivedClockDomain(const Params &p);
282 
288  void updateClockPeriod();
289 
290  private:
291 
297 
301  const uint64_t clockDivider;
302 };
303 
304 } // namespace gem5
305 
306 #endif
gem5::ClockDomain::members
std::vector< Clocked * > members
Pointers to members of this clock domain, so that when the clock period changes, we can update each m...
Definition: clock_domain.hh:96
gem5::ClockDomain::ClockDomainStats::ClockDomainStats
ClockDomainStats(ClockDomain &cd)
Definition: clock_domain.cc:57
gem5::SrcClockDomain::SrcClockDomain
SrcClockDomain(const Params &p)
Definition: clock_domain.cc:80
gem5::ClockDomain::voltageDomain
VoltageDomain * voltageDomain() const
Get the voltage domain.
Definition: clock_domain.hh:127
gem5::SrcClockDomain::startup
void startup() override
startup() is the final initialization call before simulation.
Definition: clock_domain.cc:182
gem5::SrcClockDomain::domainID
uint32_t domainID() const
Definition: clock_domain.hh:189
gem5::ClockDomain::addDerivedDomain
void addDerivedDomain(DerivedClockDomain *clock_domain)
Add a derived domain.
Definition: clock_domain.hh:142
gem5::SrcClockDomain::numPerfLevels
PerfLevel numPerfLevels() const
Get the number of available performance levels for this clock domain.
Definition: clock_domain.hh:221
gem5::SrcClockDomain::_domainID
const uint32_t _domainID
Software recognizable id number for the domain, should be unique for each domain.
Definition: clock_domain.hh:258
gem5::CheckpointIn
Definition: serialize.hh:68
gem5::SrcClockDomain::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: clock_domain.cc:175
gem5::SrcClockDomain::validPerfLevel
bool validPerfLevel(PerfLevel perf_level) const
Checks whether the performance level requested exists in the current domain configuration.
Definition: clock_domain.hh:200
gem5::SrcClockDomain::Params
SrcClockDomainParams Params
Definition: clock_domain.hh:171
std::vector
STL vector class.
Definition: stl.hh:37
gem5::ClockDomain::registerWithClockDomain
void registerWithClockDomain(Clocked *c)
Register a Clocked object with this ClockDomain.
Definition: clock_domain.hh:115
gem5::ClockDomain::ClockDomainStats::clock
statistics::Value clock
Stat to report clock period of clock domain.
Definition: clock_domain.hh:153
gem5::ClockDomain::ClockDomainStats
Definition: clock_domain.hh:146
gem5::SrcClockDomain::signalPerfLevelUpdate
void signalPerfLevelUpdate()
Inform other components about the changed performance level.
Definition: clock_domain.cc:157
gem5::ClockDomain::Params
ClockDomainParams Params
Definition: clock_domain.hh:100
gem5::Clocked
Helper class for objects that need to be clocked.
Definition: clocked_object.hh:62
gem5::DerivedClockDomain::updateClockPeriod
void updateClockPeriod()
Called by the parent clock domain to propagate changes.
Definition: clock_domain.cc:209
gem5::DerivedClockDomain
The derived clock domains provides the notion of a clock domain that is connected to a parent clock d...
Definition: clock_domain.hh:275
gem5::ClockDomain
The ClockDomain provides clock to group of clocked objects bundled under the same clock domain.
Definition: clock_domain.hh:71
sim_object.hh
gem5::SrcClockDomain::emptyDomainID
static const DomainID emptyDomainID
Definition: clock_domain.hh:184
gem5::MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:326
statistics.hh
gem5::Tick
uint64_t Tick
Tick count type.
Definition: types.hh:58
gem5::ClockDomain::stats
gem5::ClockDomain::ClockDomainStats stats
gem5::SrcClockDomain::DomainID
int32_t DomainID
Definition: clock_domain.hh:183
gem5::ArmISA::cd
Bitfield< 32 > cd
Definition: misc_types.hh:251
gem5::SrcClockDomain
The source clock domains provides the notion of a clock domain that is connected to a tunable clock s...
Definition: clock_domain.hh:166
gem5::SimObject
Abstract superclass for simulation objects.
Definition: sim_object.hh:146
gem5::ArmISA::c
Bitfield< 29 > c
Definition: misc_types.hh:53
gem5::ClockDomain::voltage
double voltage() const
Get the current voltage this clock domain operates at.
Definition: clock_domain.cc:75
gem5::DerivedClockDomain::DerivedClockDomain
DerivedClockDomain(const Params &p)
Definition: clock_domain.cc:189
gem5::SrcClockDomain::_perfLevel
PerfLevel _perfLevel
Current performance level the domain is set to.
Definition: clock_domain.hh:266
gem5::SrcClockDomain::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: clock_domain.cc:168
gem5::SrcClockDomain::perfLevel
PerfLevel perfLevel() const
Definition: clock_domain.hh:214
gem5::DerivedClockDomain::Params
DerivedClockDomainParams Params
Definition: clock_domain.hh:280
gem5::ClockDomain::_clockPeriod
Tick _clockPeriod
Pre-computed clock period in ticks.
Definition: clock_domain.hh:79
gem5::SrcClockDomain::PerfLevel
uint32_t PerfLevel
Definition: clock_domain.hh:191
gem5::statistics::Value
Definition: statistics.hh:1979
gem5::SrcClockDomain::clkPeriodAtPerfLevel
Tick clkPeriodAtPerfLevel(PerfLevel perf_level) const
Definition: clock_domain.hh:229
gem5::statistics::Group
Statistics container.
Definition: group.hh:93
gem5::DerivedClockDomain::clockDivider
const uint64_t clockDivider
Local clock divider of the domain.
Definition: clock_domain.hh:301
gem5::CheckpointOut
std::ostream CheckpointOut
Definition: serialize.hh:66
gem5::VoltageDomain
A VoltageDomain is used to group clock domains that operate under the same voltage.
Definition: voltage_domain.hh:56
gem5::ClockDomain::ClockDomain
ClockDomain(const Params &p, VoltageDomain *voltage_domain)
Definition: clock_domain.cc:66
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: decoder.cc:40
gem5::SrcClockDomain::freqOpPoints
const std::vector< Tick > freqOpPoints
List of possible frequency operational points, should be in descending order An empty list correspond...
Definition: clock_domain.hh:252
gem5::ClockDomain::clockPeriod
Tick clockPeriod() const
Get the clock period.
Definition: clock_domain.hh:108
gem5::ClockDomain::_voltageDomain
VoltageDomain * _voltageDomain
Voltage domain this clock domain belongs to.
Definition: clock_domain.hh:84
gem5::ClockDomain::children
std::vector< DerivedClockDomain * > children
Pointers to potential derived clock domains so we can propagate changes.
Definition: clock_domain.hh:90
gem5::DerivedClockDomain::parent
ClockDomain & parent
Reference to the parent clock domain this clock domain derives its clock period from.
Definition: clock_domain.hh:296
gem5::SrcClockDomain::clkPeriodAtPerfLevel
Tick clkPeriodAtPerfLevel() const
Definition: clock_domain.hh:227

Generated on Tue Sep 21 2021 12:25:47 for gem5 by doxygen 1.8.17