voltage_domain.hh (10022:db307bac42fc) voltage_domain.hh (10249:6bbb7ae309ac)
1/*
2 * Copyright (c) 2012 ARM Limited
3 * All rights reserved
4 *
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

--- 27 unchanged lines hidden (view full) ---

36 *
37 * Authors: Vasileios Spiliopoulos
38 * Akash Bagdia
39 */
40
41#ifndef __SIM_VOLTAGE_DOMAIN_HH__
42#define __SIM_VOLTAGE_DOMAIN_HH__
43
1/*
2 * Copyright (c) 2012 ARM Limited
3 * All rights reserved
4 *
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

--- 27 unchanged lines hidden (view full) ---

36 *
37 * Authors: Vasileios Spiliopoulos
38 * Akash Bagdia
39 */
40
41#ifndef __SIM_VOLTAGE_DOMAIN_HH__
42#define __SIM_VOLTAGE_DOMAIN_HH__
43
44#include <vector>
45
44#include "base/statistics.hh"
45#include "params/VoltageDomain.hh"
46#include "base/statistics.hh"
47#include "params/VoltageDomain.hh"
48#include "sim/clock_domain.hh"
46#include "sim/sim_object.hh"
47
48/**
49 * A VoltageDomain is used to group clock domains that operate under
50 * the same voltage. The class provides methods for setting and
51 * getting the voltage.
52 */
53class VoltageDomain : public SimObject
54{
49#include "sim/sim_object.hh"
50
51/**
52 * A VoltageDomain is used to group clock domains that operate under
53 * the same voltage. The class provides methods for setting and
54 * getting the voltage.
55 */
56class VoltageDomain : public SimObject
57{
58 public:
55
59
56 private:
60 typedef VoltageDomainParams Params;
61 VoltageDomain(const Params *p);
57
58 /**
62
63 /**
59 * The voltage of the domain expressed in Volts
64 * Get the current voltage.
65 *
66 * @return Voltage of the domain
60 */
67 */
61 double _voltage;
68 double voltage() const { return voltageOpPoints[_perfLevel]; }
62
69
70 uint32_t numVoltages() const { return (uint32_t)voltageOpPoints.size(); }
71
72 typedef SrcClockDomain::PerfLevel PerfLevel;
73
63 /**
74 /**
64 * Stat for reporting voltage of the domain
75 * Set the voltage point of the domain.
76 * @param Voltage value to be set
65 */
77 */
66 Stats::Value currentVoltage;
78 void perfLevel(PerfLevel perf_level);
67
79
68 public:
80 /**
81 * Get the voltage point of the domain.
82 * @param Voltage value to be set
83 */
84 PerfLevel perfLevel() const { return _perfLevel; }
69
85
70 typedef VoltageDomainParams Params;
71 VoltageDomain(const Params *p);
86 /**
87 * Register a SrcClockDomain with this voltage domain.
88 * @param src_clock_domain The SrcClockDomain to register.
89 */
90 void registerSrcClockDom(SrcClockDomain *src_clock_dom) {
91 assert(src_clock_dom->voltageDomain() == this);
92 srcClockChildren.push_back(src_clock_dom);
93 }
72
73 /**
94
95 /**
74 * Get the current volate.
75 *
76 * @return Voltage of the domain
96 * Startup has all SrcClockDomains registered with this voltage domain, so
97 * try to make sure that all perf level requests from them are met.
77 */
98 */
78 inline double voltage() const { return _voltage; }
99 void startup();
79
80 /**
100
101 /**
81 * Set the voltage of the domain.
102 * Recomputes the highest (fastest, i.e., numerically lowest) requested
103 * performance level of all associated clock domains, and updates the
104 * performance level of this voltage domain to match. This means that for
105 * two connected clock domains, one fast and one slow, the voltage domain
106 * will provide the voltage associated with the fast DVFS operation point.
107 * Must be called whenever a clock domain decides to swtich its performance
108 * level.
82 *
109 *
83 * @param Voltage value to be set
110 * @return True, if the voltage was actually changed.
84 */
111 */
85 void voltage(double voltage);
112 bool sanitiseVoltages();
86
87 void regStats();
88
113
114 void regStats();
115
116 void serialize(std::ostream &os);
117 void unserialize(Checkpoint *cp, const std::string &section);
118 private:
119 typedef std::vector<double> Voltages;
120 /**
121 * List of possible minimum voltage at each of the frequency operational
122 * points, should be in descending order and same size as freqOpPoints.
123 * An empty list corresponds to default voltage specified for the voltage
124 * domain its clock domain belongs. The same voltage is applied for each
125 * freqOpPoints, overall implying NO DVS
126 */
127 const Voltages voltageOpPoints;
128 PerfLevel _perfLevel;
129
130 /**
131 * Stat for reporting voltage of the domain
132 */
133 Stats::Value currentVoltage;
134
135 /**
136 * List of associated SrcClockDomains that are connected to this voltage
137 * domain.
138 */
139 typedef std::vector<SrcClockDomain *> SrcClockChildren;
140 SrcClockChildren srcClockChildren;
89};
90
91#endif
141};
142
143#endif