clock_domain.hh revision 10000
19793Sakash.bagdia@arm.com/*
29793Sakash.bagdia@arm.com * Copyright (c) 2013 ARM Limited
310000Sclt67@cornell.edu * Copyright (c) 2013 Cornell University
49793Sakash.bagdia@arm.com * All rights reserved
59793Sakash.bagdia@arm.com *
69793Sakash.bagdia@arm.com * The license below extends only to copyright in the software and shall
79793Sakash.bagdia@arm.com * not be construed as granting a license to any other intellectual
89793Sakash.bagdia@arm.com * property including but not limited to intellectual property relating
99793Sakash.bagdia@arm.com * to a hardware implementation of the functionality of the software
109793Sakash.bagdia@arm.com * licensed hereunder.  You may use the software subject to the license
119793Sakash.bagdia@arm.com * terms below provided that you ensure that this notice is replicated
129793Sakash.bagdia@arm.com * unmodified and in its entirety in all distributions of the software,
139793Sakash.bagdia@arm.com * modified or unmodified, in source code or in binary form.
149793Sakash.bagdia@arm.com *
159793Sakash.bagdia@arm.com * Redistribution and use in source and binary forms, with or without
169793Sakash.bagdia@arm.com * modification, are permitted provided that the following conditions are
179793Sakash.bagdia@arm.com * met: redistributions of source code must retain the above copyright
189793Sakash.bagdia@arm.com * notice, this list of conditions and the following disclaimer;
199793Sakash.bagdia@arm.com * redistributions in binary form must reproduce the above copyright
209793Sakash.bagdia@arm.com * notice, this list of conditions and the following disclaimer in the
219793Sakash.bagdia@arm.com * documentation and/or other materials provided with the distribution;
229793Sakash.bagdia@arm.com * neither the name of the copyright holders nor the names of its
239793Sakash.bagdia@arm.com * contributors may be used to endorse or promote products derived from
249793Sakash.bagdia@arm.com * this software without specific prior written permission.
259793Sakash.bagdia@arm.com *
269793Sakash.bagdia@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
279793Sakash.bagdia@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
289793Sakash.bagdia@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
299793Sakash.bagdia@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
309793Sakash.bagdia@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
319793Sakash.bagdia@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
329793Sakash.bagdia@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
339793Sakash.bagdia@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
349793Sakash.bagdia@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
359793Sakash.bagdia@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
369793Sakash.bagdia@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
379793Sakash.bagdia@arm.com *
389793Sakash.bagdia@arm.com * Authors: Vasileios Spiliopoulos
399793Sakash.bagdia@arm.com *          Akash Bagdia
4010000Sclt67@cornell.edu *          Christopher Torng
419793Sakash.bagdia@arm.com */
429793Sakash.bagdia@arm.com
439793Sakash.bagdia@arm.com/**
449793Sakash.bagdia@arm.com * @file
459793Sakash.bagdia@arm.com * ClockDomain declarations.
469793Sakash.bagdia@arm.com */
479793Sakash.bagdia@arm.com
489793Sakash.bagdia@arm.com#ifndef __SIM_CLOCK_DOMAIN_HH__
499793Sakash.bagdia@arm.com#define __SIM_CLOCK_DOMAIN_HH__
509793Sakash.bagdia@arm.com
5110000Sclt67@cornell.edu#include <algorithm>
5210000Sclt67@cornell.edu
539793Sakash.bagdia@arm.com#include "base/statistics.hh"
549793Sakash.bagdia@arm.com#include "params/ClockDomain.hh"
559793Sakash.bagdia@arm.com#include "params/DerivedClockDomain.hh"
569793Sakash.bagdia@arm.com#include "params/SrcClockDomain.hh"
579793Sakash.bagdia@arm.com#include "sim/sim_object.hh"
589793Sakash.bagdia@arm.com
599793Sakash.bagdia@arm.com/**
609793Sakash.bagdia@arm.com * Forward declaration
619793Sakash.bagdia@arm.com */
629793Sakash.bagdia@arm.comclass DerivedClockDomain;
639827Sakash.bagdia@arm.comclass VoltageDomain;
6410000Sclt67@cornell.educlass ClockedObject;
659793Sakash.bagdia@arm.com
669793Sakash.bagdia@arm.com/**
679793Sakash.bagdia@arm.com * The ClockDomain provides clock to group of clocked objects bundled
689827Sakash.bagdia@arm.com * under the same clock domain. The clock domains, in turn, are
699827Sakash.bagdia@arm.com * grouped into voltage domains. The clock domains provide support for
709793Sakash.bagdia@arm.com * a hierarchial structure with source and derived domains.
719793Sakash.bagdia@arm.com */
729793Sakash.bagdia@arm.comclass ClockDomain : public SimObject
739793Sakash.bagdia@arm.com{
749793Sakash.bagdia@arm.com
759793Sakash.bagdia@arm.com  protected:
769793Sakash.bagdia@arm.com
779793Sakash.bagdia@arm.com    /**
789793Sakash.bagdia@arm.com     * Pre-computed clock period in ticks. This is populated by the
799793Sakash.bagdia@arm.com     * inheriting classes based on how their period is determined.
809793Sakash.bagdia@arm.com     */
819793Sakash.bagdia@arm.com    Tick _clockPeriod;
829793Sakash.bagdia@arm.com
839793Sakash.bagdia@arm.com    /**
849827Sakash.bagdia@arm.com     * Voltage domain this clock domain belongs to
859827Sakash.bagdia@arm.com     */
869827Sakash.bagdia@arm.com    VoltageDomain *_voltageDomain;
879827Sakash.bagdia@arm.com
889827Sakash.bagdia@arm.com    /**
899793Sakash.bagdia@arm.com     * Pointers to potential derived clock domains so we can propagate
909793Sakash.bagdia@arm.com     * changes.
919793Sakash.bagdia@arm.com     */
929793Sakash.bagdia@arm.com    std::vector<DerivedClockDomain*> children;
939793Sakash.bagdia@arm.com
9410000Sclt67@cornell.edu    /**
9510000Sclt67@cornell.edu     * Pointers to members of this clock domain, so that when the clock
9610000Sclt67@cornell.edu     * period changes, we can update each member's tick.
9710000Sclt67@cornell.edu     */
9810000Sclt67@cornell.edu    std::vector<ClockedObject*> members;
9910000Sclt67@cornell.edu
1009793Sakash.bagdia@arm.com  public:
1019793Sakash.bagdia@arm.com
1029793Sakash.bagdia@arm.com    typedef ClockDomainParams Params;
1039827Sakash.bagdia@arm.com    ClockDomain(const Params *p, VoltageDomain *voltage_domain) :
1049827Sakash.bagdia@arm.com        SimObject(p),
1059827Sakash.bagdia@arm.com        _clockPeriod(0),
1069827Sakash.bagdia@arm.com        _voltageDomain(voltage_domain) {}
1079793Sakash.bagdia@arm.com
1089793Sakash.bagdia@arm.com    /**
1099793Sakash.bagdia@arm.com     * Get the clock period.
1109793Sakash.bagdia@arm.com     *
1119793Sakash.bagdia@arm.com     * @return Clock period in ticks
1129793Sakash.bagdia@arm.com     */
1139793Sakash.bagdia@arm.com    inline Tick clockPeriod() const { return _clockPeriod; }
1149793Sakash.bagdia@arm.com
1159793Sakash.bagdia@arm.com    /**
11610000Sclt67@cornell.edu     * Register a ClockedObject to this ClockDomain.
11710000Sclt67@cornell.edu     *
11810000Sclt67@cornell.edu     * @param ClockedObject to add as a member
11910000Sclt67@cornell.edu     */
12010000Sclt67@cornell.edu    void registerWithClockDomain(ClockedObject *c)
12110000Sclt67@cornell.edu    {
12210000Sclt67@cornell.edu        assert(c != NULL);
12310000Sclt67@cornell.edu        assert(std::find(members.begin(), members.end(), c) == members.end());
12410000Sclt67@cornell.edu        members.push_back(c);
12510000Sclt67@cornell.edu    }
12610000Sclt67@cornell.edu
12710000Sclt67@cornell.edu    /**
1289827Sakash.bagdia@arm.com     * Get the voltage domain.
1299827Sakash.bagdia@arm.com     *
1309827Sakash.bagdia@arm.com     * @return Voltage domain this clock domain belongs to
1319827Sakash.bagdia@arm.com     */
1329827Sakash.bagdia@arm.com    inline VoltageDomain *voltageDomain() const { return _voltageDomain; }
1339827Sakash.bagdia@arm.com
1349827Sakash.bagdia@arm.com
1359827Sakash.bagdia@arm.com    /**
1369827Sakash.bagdia@arm.com     * Get the current voltage this clock domain operates at.
1379827Sakash.bagdia@arm.com     *
1389827Sakash.bagdia@arm.com     * @return Voltage applied to the clock domain
1399827Sakash.bagdia@arm.com     */
1409827Sakash.bagdia@arm.com    inline double voltage() const;
1419827Sakash.bagdia@arm.com
1429827Sakash.bagdia@arm.com    /**
1439793Sakash.bagdia@arm.com     * Add a derived domain.
1449793Sakash.bagdia@arm.com     *
1459793Sakash.bagdia@arm.com     * @param Derived domain to add as a child
1469793Sakash.bagdia@arm.com     */
1479793Sakash.bagdia@arm.com    void addDerivedDomain(DerivedClockDomain *clock_domain)
1489793Sakash.bagdia@arm.com    { children.push_back(clock_domain); }
1499793Sakash.bagdia@arm.com
1509793Sakash.bagdia@arm.com};
1519793Sakash.bagdia@arm.com
1529793Sakash.bagdia@arm.com/**
1539793Sakash.bagdia@arm.com * The source clock domains provides the notion of a clock domain that is
1549793Sakash.bagdia@arm.com * connected to a tunable clock source. It maintains the clock period and
1559793Sakash.bagdia@arm.com * provides methods for setting/getting the clock.
1569793Sakash.bagdia@arm.com */
1579793Sakash.bagdia@arm.comclass SrcClockDomain : public ClockDomain
1589793Sakash.bagdia@arm.com{
1599793Sakash.bagdia@arm.com
1609793Sakash.bagdia@arm.com  public:
1619793Sakash.bagdia@arm.com
1629793Sakash.bagdia@arm.com    typedef SrcClockDomainParams Params;
1639793Sakash.bagdia@arm.com    SrcClockDomain(const Params *p);
1649793Sakash.bagdia@arm.com
1659793Sakash.bagdia@arm.com    /**
1669793Sakash.bagdia@arm.com     * Set new clock value
1679793Sakash.bagdia@arm.com     * @param clock The new clock period in ticks
1689793Sakash.bagdia@arm.com     */
1699793Sakash.bagdia@arm.com    void clockPeriod(Tick clock_period);
1709793Sakash.bagdia@arm.com
17110000Sclt67@cornell.edu    // Explicitly import the otherwise hidden clockPeriod
17210000Sclt67@cornell.edu    using ClockDomain::clockPeriod;
1739793Sakash.bagdia@arm.com};
1749793Sakash.bagdia@arm.com
1759793Sakash.bagdia@arm.com/**
1769793Sakash.bagdia@arm.com * The derived clock domains provides the notion of a clock domain
1779793Sakash.bagdia@arm.com * that is connected to a parent clock domain that can either be a
1789793Sakash.bagdia@arm.com * source clock domain or a derived clock domain. It maintains the
1799793Sakash.bagdia@arm.com * clock divider and provides methods for getting the clock.
1809793Sakash.bagdia@arm.com */
1819793Sakash.bagdia@arm.comclass DerivedClockDomain: public ClockDomain
1829793Sakash.bagdia@arm.com{
1839793Sakash.bagdia@arm.com
1849793Sakash.bagdia@arm.com  public:
1859793Sakash.bagdia@arm.com
1869793Sakash.bagdia@arm.com    typedef DerivedClockDomainParams Params;
1879793Sakash.bagdia@arm.com    DerivedClockDomain(const Params *p);
1889793Sakash.bagdia@arm.com
1899793Sakash.bagdia@arm.com    /**
1909793Sakash.bagdia@arm.com     * Called by the parent clock domain to propagate changes. This
1919793Sakash.bagdia@arm.com     * also involves propagating the change further to any children of
1929793Sakash.bagdia@arm.com     * the derived domain itself.
1939793Sakash.bagdia@arm.com     */
1949793Sakash.bagdia@arm.com    void updateClockPeriod();
1959793Sakash.bagdia@arm.com
1969793Sakash.bagdia@arm.com  private:
1979793Sakash.bagdia@arm.com
1989793Sakash.bagdia@arm.com    /**
1999793Sakash.bagdia@arm.com     * Reference to the parent clock domain this clock domain derives
2009793Sakash.bagdia@arm.com     * its clock period from
2019793Sakash.bagdia@arm.com     */
2029793Sakash.bagdia@arm.com    ClockDomain &parent;
2039793Sakash.bagdia@arm.com
2049793Sakash.bagdia@arm.com    /**
2059793Sakash.bagdia@arm.com     * Local clock divider of the domain
2069793Sakash.bagdia@arm.com     */
2079793Sakash.bagdia@arm.com    const uint64_t clockDivider;
2089793Sakash.bagdia@arm.com};
2099793Sakash.bagdia@arm.com
2109793Sakash.bagdia@arm.com#endif
211