clock_domain.hh revision 10000
17019SBrad.Beckmann@amd.com/*
27019SBrad.Beckmann@amd.com * Copyright (c) 2013 ARM Limited
37019SBrad.Beckmann@amd.com * Copyright (c) 2013 Cornell University
47019SBrad.Beckmann@amd.com * All rights reserved
57019SBrad.Beckmann@amd.com *
67019SBrad.Beckmann@amd.com * The license below extends only to copyright in the software and shall
77019SBrad.Beckmann@amd.com * not be construed as granting a license to any other intellectual
87019SBrad.Beckmann@amd.com * property including but not limited to intellectual property relating
97019SBrad.Beckmann@amd.com * to a hardware implementation of the functionality of the software
107019SBrad.Beckmann@amd.com * licensed hereunder.  You may use the software subject to the license
117019SBrad.Beckmann@amd.com * terms below provided that you ensure that this notice is replicated
127019SBrad.Beckmann@amd.com * unmodified and in its entirety in all distributions of the software,
137019SBrad.Beckmann@amd.com * modified or unmodified, in source code or in binary form.
147019SBrad.Beckmann@amd.com *
157019SBrad.Beckmann@amd.com * Redistribution and use in source and binary forms, with or without
167019SBrad.Beckmann@amd.com * modification, are permitted provided that the following conditions are
177019SBrad.Beckmann@amd.com * met: redistributions of source code must retain the above copyright
187019SBrad.Beckmann@amd.com * notice, this list of conditions and the following disclaimer;
197019SBrad.Beckmann@amd.com * redistributions in binary form must reproduce the above copyright
207019SBrad.Beckmann@amd.com * notice, this list of conditions and the following disclaimer in the
217019SBrad.Beckmann@amd.com * documentation and/or other materials provided with the distribution;
227019SBrad.Beckmann@amd.com * neither the name of the copyright holders nor the names of its
237019SBrad.Beckmann@amd.com * contributors may be used to endorse or promote products derived from
247019SBrad.Beckmann@amd.com * this software without specific prior written permission.
257019SBrad.Beckmann@amd.com *
267019SBrad.Beckmann@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
277019SBrad.Beckmann@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287019SBrad.Beckmann@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297019SBrad.Beckmann@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
306876Ssteve.reinhardt@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
316882SBrad.Beckmann@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3213892Sgabeblack@google.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
336876Ssteve.reinhardt@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3413892Sgabeblack@google.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3711308Santhony.gutierrez@amd.com *
3811308Santhony.gutierrez@amd.com * Authors: Vasileios Spiliopoulos
3910090Snilay@cs.wisc.edu *          Akash Bagdia
4011308Santhony.gutierrez@amd.com *          Christopher Torng
4111308Santhony.gutierrez@amd.com */
4211308Santhony.gutierrez@amd.com
4311308Santhony.gutierrez@amd.com/**
4411308Santhony.gutierrez@amd.com * @file
4511308Santhony.gutierrez@amd.com * ClockDomain declarations.
4610090Snilay@cs.wisc.edu */
4711308Santhony.gutierrez@amd.com
4811308Santhony.gutierrez@amd.com#ifndef __SIM_CLOCK_DOMAIN_HH__
4911308Santhony.gutierrez@amd.com#define __SIM_CLOCK_DOMAIN_HH__
5011308Santhony.gutierrez@amd.com
5111308Santhony.gutierrez@amd.com#include <algorithm>
5211308Santhony.gutierrez@amd.com
5311308Santhony.gutierrez@amd.com#include "base/statistics.hh"
548932SBrad.Beckmann@amd.com#include "params/ClockDomain.hh"
558706Sandreas.hansson@arm.com#include "params/DerivedClockDomain.hh"
5611308Santhony.gutierrez@amd.com#include "params/SrcClockDomain.hh"
5711308Santhony.gutierrez@amd.com#include "sim/sim_object.hh"
5810919Sbrandon.potter@amd.com
596876Ssteve.reinhardt@amd.com/**
6011308Santhony.gutierrez@amd.com * Forward declaration
6111308Santhony.gutierrez@amd.com */
6211308Santhony.gutierrez@amd.comclass DerivedClockDomain;
6310090Snilay@cs.wisc.educlass VoltageDomain;
6411308Santhony.gutierrez@amd.comclass ClockedObject;
6511308Santhony.gutierrez@amd.com
6611308Santhony.gutierrez@amd.com/**
6711308Santhony.gutierrez@amd.com * The ClockDomain provides clock to group of clocked objects bundled
6811308Santhony.gutierrez@amd.com * under the same clock domain. The clock domains, in turn, are
6911308Santhony.gutierrez@amd.com * grouped into voltage domains. The clock domains provide support for
7011308Santhony.gutierrez@amd.com * a hierarchial structure with source and derived domains.
7111308Santhony.gutierrez@amd.com */
7211308Santhony.gutierrez@amd.comclass ClockDomain : public SimObject
7311308Santhony.gutierrez@amd.com{
7411308Santhony.gutierrez@amd.com
7511308Santhony.gutierrez@amd.com  protected:
7611660Stushar@ece.gatech.edu
7711308Santhony.gutierrez@amd.com    /**
7811308Santhony.gutierrez@amd.com     * Pre-computed clock period in ticks. This is populated by the
7911308Santhony.gutierrez@amd.com     * inheriting classes based on how their period is determined.
806876Ssteve.reinhardt@amd.com     */
8111339SMichael.Lebeane@amd.com    Tick _clockPeriod;
8211308Santhony.gutierrez@amd.com
8311308Santhony.gutierrez@amd.com    /**
8411702Smichael.lebeane@amd.com     * Voltage domain this clock domain belongs to
85     */
86    VoltageDomain *_voltageDomain;
87
88    /**
89     * Pointers to potential derived clock domains so we can propagate
90     * changes.
91     */
92    std::vector<DerivedClockDomain*> children;
93
94    /**
95     * Pointers to members of this clock domain, so that when the clock
96     * period changes, we can update each member's tick.
97     */
98    std::vector<ClockedObject*> members;
99
100  public:
101
102    typedef ClockDomainParams Params;
103    ClockDomain(const Params *p, VoltageDomain *voltage_domain) :
104        SimObject(p),
105        _clockPeriod(0),
106        _voltageDomain(voltage_domain) {}
107
108    /**
109     * Get the clock period.
110     *
111     * @return Clock period in ticks
112     */
113    inline Tick clockPeriod() const { return _clockPeriod; }
114
115    /**
116     * Register a ClockedObject to this ClockDomain.
117     *
118     * @param ClockedObject to add as a member
119     */
120    void registerWithClockDomain(ClockedObject *c)
121    {
122        assert(c != NULL);
123        assert(std::find(members.begin(), members.end(), c) == members.end());
124        members.push_back(c);
125    }
126
127    /**
128     * Get the voltage domain.
129     *
130     * @return Voltage domain this clock domain belongs to
131     */
132    inline VoltageDomain *voltageDomain() const { return _voltageDomain; }
133
134
135    /**
136     * Get the current voltage this clock domain operates at.
137     *
138     * @return Voltage applied to the clock domain
139     */
140    inline double voltage() const;
141
142    /**
143     * Add a derived domain.
144     *
145     * @param Derived domain to add as a child
146     */
147    void addDerivedDomain(DerivedClockDomain *clock_domain)
148    { children.push_back(clock_domain); }
149
150};
151
152/**
153 * The source clock domains provides the notion of a clock domain that is
154 * connected to a tunable clock source. It maintains the clock period and
155 * provides methods for setting/getting the clock.
156 */
157class SrcClockDomain : public ClockDomain
158{
159
160  public:
161
162    typedef SrcClockDomainParams Params;
163    SrcClockDomain(const Params *p);
164
165    /**
166     * Set new clock value
167     * @param clock The new clock period in ticks
168     */
169    void clockPeriod(Tick clock_period);
170
171    // Explicitly import the otherwise hidden clockPeriod
172    using ClockDomain::clockPeriod;
173};
174
175/**
176 * The derived clock domains provides the notion of a clock domain
177 * that is connected to a parent clock domain that can either be a
178 * source clock domain or a derived clock domain. It maintains the
179 * clock divider and provides methods for getting the clock.
180 */
181class DerivedClockDomain: public ClockDomain
182{
183
184  public:
185
186    typedef DerivedClockDomainParams Params;
187    DerivedClockDomain(const Params *p);
188
189    /**
190     * Called by the parent clock domain to propagate changes. This
191     * also involves propagating the change further to any children of
192     * the derived domain itself.
193     */
194    void updateClockPeriod();
195
196  private:
197
198    /**
199     * Reference to the parent clock domain this clock domain derives
200     * its clock period from
201     */
202    ClockDomain &parent;
203
204    /**
205     * Local clock divider of the domain
206     */
207    const uint64_t clockDivider;
208};
209
210#endif
211