gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
clock_domain.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2014 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  * Authors: Vasileios Spiliopoulos
39  * Akash Bagdia
40  * Christopher Torng
41  * Stephan Diestelhorst
42  */
43 
49 #ifndef __SIM_CLOCK_DOMAIN_HH__
50 #define __SIM_CLOCK_DOMAIN_HH__
51 
52 #include <algorithm>
53 
54 #include "base/statistics.hh"
55 #include "params/ClockDomain.hh"
56 #include "params/DerivedClockDomain.hh"
57 #include "params/SrcClockDomain.hh"
58 #include "sim/sim_object.hh"
59 
63 class DerivedClockDomain;
64 class VoltageDomain;
65 class Clocked;
66 
73 class ClockDomain : public SimObject
74 {
75 
76  private:
77 
82 
83  protected:
84 
90 
95 
101 
107 
108  public:
109 
110  typedef ClockDomainParams Params;
111  ClockDomain(const Params *p, VoltageDomain *voltage_domain) :
112  SimObject(p),
113  _clockPeriod(0),
114  _voltageDomain(voltage_domain) {}
115 
116  void regStats();
117 
123  Tick clockPeriod() const { return _clockPeriod; }
124 
131  {
132  assert(c != NULL);
133  assert(std::find(members.begin(), members.end(), c) == members.end());
134  members.push_back(c);
135  }
136 
142  inline VoltageDomain *voltageDomain() const { return _voltageDomain; }
143 
144 
150  double voltage() const;
151 
158  { children.push_back(clock_domain); }
159 
160 };
161 
172 {
173 
174  public:
175 
176  typedef SrcClockDomainParams Params;
177  SrcClockDomain(const Params *p);
178 
183  void clockPeriod(Tick clock_period);
184 
185  // Explicitly import the otherwise hidden clockPeriod
187 
188  typedef int32_t DomainID;
189  static const DomainID emptyDomainID = -1;
190 
194  uint32_t domainID() const { return _domainID; }
195 
196  typedef uint32_t PerfLevel;
205  bool validPerfLevel(PerfLevel perf_level) const {
206  return perf_level < numPerfLevels();
207  }
208 
214  void perfLevel(PerfLevel perf_level);
215 
219  PerfLevel perfLevel() const { return _perfLevel; }
220 
226  PerfLevel numPerfLevels() const {return freqOpPoints.size();}
227 
233 
235  {
236  assert(validPerfLevel(perf_level));
237  return freqOpPoints[perf_level];
238  }
239 
240  void startup() override;
241 
242  void serialize(CheckpointOut &cp) const override;
243  void unserialize(CheckpointIn &cp) override;
244 
245  private:
249  void signalPerfLevelUpdate();
250 
258 
263  const uint32_t _domainID;
264 
272 };
273 
281 {
282 
283  public:
284 
285  typedef DerivedClockDomainParams Params;
286  DerivedClockDomain(const Params *p);
287 
293  void updateClockPeriod();
294 
295  private:
296 
302 
306  const uint64_t clockDivider;
307 };
308 
309 #endif
uint32_t domainID() const
void addDerivedDomain(DerivedClockDomain *clock_domain)
Add a derived domain.
void startup() override
startup() is the final initialization call before simulation.
void signalPerfLevelUpdate()
Inform other components about the changed performance level.
double voltage() const
Get the current voltage this clock domain operates at.
Definition: clock_domain.cc:75
DerivedClockDomainParams Params
const uint64_t clockDivider
Local clock divider of the domain.
VoltageDomain * _voltageDomain
Voltage domain this clock domain belongs to.
Definition: clock_domain.hh:94
ClockDomainParams Params
VoltageDomain * voltageDomain() const
Get the voltage domain.
Declaration of Statistics objects.
const uint32_t _domainID
Software recognizable id number for the domain, should be unique for each domain. ...
bool validPerfLevel(PerfLevel perf_level) const
Checks whether the performance level requested exists in the current domain configuration.
uint32_t PerfLevel
The derived clock domains provides the notion of a clock domain that is connected to a parent clock d...
PerfLevel numPerfLevels() const
Get the number of available performance levels for this clock domain.
const std::vector< Tick > freqOpPoints
List of possible frequency operational points, should be in descending order An empty list correspond...
uint64_t Tick
Tick count type.
Definition: types.hh:63
ClockDomain & parent
Reference to the parent clock domain this clock domain derives its clock period from.
Stats::Value currentClock
Stat to report clock period of clock domain.
Definition: clock_domain.hh:81
Helper class for objects that need to be clocked.
void updateClockPeriod()
Called by the parent clock domain to propagate changes.
void serialize(CheckpointOut &cp) const override
Serialize an object.
A VoltageDomain is used to group clock domains that operate under the same voltage.
SrcClockDomain(const Params *p)
Definition: clock_domain.cc:80
The source clock domains provides the notion of a clock domain that is connected to a tunable clock s...
Tick clkPeriodAtPerfLevel(PerfLevel perf_level) const
static const DomainID emptyDomainID
Bitfield< 29 > c
Definition: miscregs.hh:1365
std::vector< DerivedClockDomain * > children
Pointers to potential derived clock domains so we can propagate changes.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
The ClockDomain provides clock to group of clocked objects bundled under the same clock domain...
Definition: clock_domain.hh:73
std::vector< Clocked * > members
Pointers to members of this clock domain, so that when the clock period changes, we can update each m...
std::ostream CheckpointOut
Definition: serialize.hh:67
PerfLevel perfLevel() const
ClockDomain(const Params *p, VoltageDomain *voltage_domain)
void registerWithClockDomain(Clocked *c)
Register a Clocked object with this ClockDomain.
Tick clkPeriodAtPerfLevel() const
DerivedClockDomain(const Params *p)
Tick _clockPeriod
Pre-computed clock period in ticks.
Definition: clock_domain.hh:89
Bitfield< 0 > p
void regStats()
Register statistics for this object.
Definition: clock_domain.cc:59
SrcClockDomainParams Params
PerfLevel _perfLevel
Current performance level the domain is set to.
Abstract superclass for simulation objects.
Definition: sim_object.hh:94
Tick clockPeriod() const
Get the clock period.

Generated on Fri Jun 9 2017 13:03:51 for gem5 by doxygen 1.8.6