| /* | |
| * Copyright (c) 2011 Advanced Micro Devices, Inc. | |
| * All rights reserved. | |
| * | |
| * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are | |
| * met: redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer; | |
| * redistributions in binary form must reproduce the above copyright | |
| * notice, this list of conditions and the following disclaimer in the | |
| * documentation and/or other materials provided with the distribution; | |
| * neither the name of the copyright holders nor the names of its | |
| * contributors may be used to endorse or promote products derived from | |
| * this software without specific prior written permission. | |
| * | |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * | |
| * Authors: Gabe Black | |
| */ | |
| /** | |
| * @file This file defines the Root simobject and the methods used to control | |
| * the time syncing mechanism provided through it. | |
| * | |
| * Time syncing prevents simulated time from passing faster than real time. It | |
| * works by scheduling a periodic event that checks to see if its simulated | |
| * period is shorter than its real period. If it is, it stalls the simulation | |
| * until they're equal. | |
| */ | |
| #ifndef __SIM_ROOT_HH__ | |
| #define __SIM_ROOT_HH__ | |
| #include "base/time.hh" | |
| #include "params/Root.hh" | |
| #include "sim/eventq.hh" | |
| #include "sim/sim_object.hh" | |
| class Root : public SimObject | |
| { | |
| private: | |
| static Root *_root; | |
| protected: | |
| bool _enabled; | |
| Time _period; | |
| Tick _periodTick; | |
| Time _spinThreshold; | |
| Time lastTime; | |
| void timeSync(); | |
| EventFunctionWrapper syncEvent; | |
| public: | |
| /** | |
| * Use this function to get a pointer to the single Root object in the | |
| * simulation. This function asserts that such an object has actual been | |
| * constructed to avoid having to perform that check everywhere the root | |
| * is used. This is to allow calling the functions below. | |
| * | |
| * @return Pointer to the single root object. | |
| */ | |
| static Root * | |
| root() | |
| { | |
| assert(_root); | |
| return _root; | |
| } | |
| public: | |
| /// Check whether time syncing is enabled. | |
| bool timeSyncEnabled() const { return _enabled; } | |
| /// Retrieve the period for the sync event. | |
| const Time timeSyncPeriod() const { return _period; } | |
| /// Retrieve the threshold for time remaining to spin wait. | |
| const Time timeSyncSpinThreshold() const { return _spinThreshold; } | |
| /// Enable or disable time syncing. | |
| void timeSyncEnable(bool en); | |
| /// Configure the period for time sync events. | |
| void timeSyncPeriod(Time newPeriod); | |
| /// Set the threshold for time remaining to spin wait. | |
| void timeSyncSpinThreshold(Time newThreshold); | |
| typedef RootParams Params; | |
| const Params * | |
| params() const | |
| { | |
| return dynamic_cast<const Params *>(_params); | |
| } | |
| Root(Params *p); | |
| /** Schedule the timesync event at startup(). | |
| */ | |
| void startup() override; | |
| void serialize(CheckpointOut &cp) const override; | |
| }; | |
| #endif // __SIM_ROOT_HH__ |