clocked_object.hh revision 9157
12810Srdreslin@umich.edu/* 211375Sandreas.hansson@arm.com * Copyright (c) 2012 ARM Limited 311051Sandreas.hansson@arm.com * All rights reserved 411051Sandreas.hansson@arm.com * 511051Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 611051Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 711051Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 811051Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 911051Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 1011051Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 1111051Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 1211051Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 1311051Sandreas.hansson@arm.com * 1411051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 1511051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 162810Srdreslin@umich.edu * met: redistributions of source code must retain the above copyright 172810Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer; 182810Srdreslin@umich.edu * redistributions in binary form must reproduce the above copyright 192810Srdreslin@umich.edu * notice, this list of conditions and the following disclaimer in the 202810Srdreslin@umich.edu * documentation and/or other materials provided with the distribution; 212810Srdreslin@umich.edu * neither the name of the copyright holders nor the names of its 222810Srdreslin@umich.edu * contributors may be used to endorse or promote products derived from 232810Srdreslin@umich.edu * this software without specific prior written permission. 242810Srdreslin@umich.edu * 252810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 262810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 272810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 282810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 292810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 302810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 312810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 322810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 332810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 342810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 352810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 362810Srdreslin@umich.edu * 372810Srdreslin@umich.edu * Authors: Andreas Hansson 382810Srdreslin@umich.edu */ 392810Srdreslin@umich.edu 402810Srdreslin@umich.edu/** 412810Srdreslin@umich.edu * @file 4211051Sandreas.hansson@arm.com * ClockedObject declaration and implementation. 4311051Sandreas.hansson@arm.com */ 442810Srdreslin@umich.edu 4511051Sandreas.hansson@arm.com#ifndef __SIM_CLOCKED_OBJECT_HH__ 4611051Sandreas.hansson@arm.com#define __SIM_CLOCKED_OBJECT_HH__ 472810Srdreslin@umich.edu 482810Srdreslin@umich.edu#include "base/intmath.hh" 492810Srdreslin@umich.edu#include "params/ClockedObject.hh" 502810Srdreslin@umich.edu#include "sim/sim_object.hh" 5111051Sandreas.hansson@arm.com 522810Srdreslin@umich.edu/** 532810Srdreslin@umich.edu * The ClockedObject class extends the SimObject with a clock and 5411051Sandreas.hansson@arm.com * accessor functions to relate ticks to the cycles of the object. 552810Srdreslin@umich.edu */ 5611051Sandreas.hansson@arm.comclass ClockedObject : public SimObject 5711051Sandreas.hansson@arm.com{ 5811051Sandreas.hansson@arm.com 5911051Sandreas.hansson@arm.com private: 6011051Sandreas.hansson@arm.com 6111288Ssteve.reinhardt@amd.com /** 6211051Sandreas.hansson@arm.com * Prevent inadvertent use of the copy constructor and assignment 6311051Sandreas.hansson@arm.com * operator by making them private. 6411051Sandreas.hansson@arm.com */ 6511051Sandreas.hansson@arm.com ClockedObject(ClockedObject&); 6611051Sandreas.hansson@arm.com ClockedObject& operator=(ClockedObject&); 6711053Sandreas.hansson@arm.com 6811053Sandreas.hansson@arm.com protected: 6911051Sandreas.hansson@arm.com 7011051Sandreas.hansson@arm.com // Clock period in ticks 7111051Sandreas.hansson@arm.com Tick clock; 7211197Sandreas.hansson@arm.com 7311197Sandreas.hansson@arm.com /** 7411199Sandreas.hansson@arm.com * Create a clocked object and set the clock based on the 7511197Sandreas.hansson@arm.com * parameters. 7611197Sandreas.hansson@arm.com */ 7711197Sandreas.hansson@arm.com ClockedObject(const ClockedObjectParams* p) : SimObject(p), clock(p->clock) 7811051Sandreas.hansson@arm.com { } 7911051Sandreas.hansson@arm.com 8011051Sandreas.hansson@arm.com /** 8111051Sandreas.hansson@arm.com * Virtual destructor due to inheritance. 8211051Sandreas.hansson@arm.com */ 8311051Sandreas.hansson@arm.com virtual ~ClockedObject() { } 8411051Sandreas.hansson@arm.com 8511051Sandreas.hansson@arm.com public: 8611051Sandreas.hansson@arm.com 8711051Sandreas.hansson@arm.com /** 8811051Sandreas.hansson@arm.com * Based on the clock of the object, determine the tick when the 8911051Sandreas.hansson@arm.com * next cycle begins, in other words, round the curTick() to the 9011051Sandreas.hansson@arm.com * next tick that is a multiple of the clock. 9111051Sandreas.hansson@arm.com * 9211051Sandreas.hansson@arm.com * @return The tick when the next cycle starts 9311051Sandreas.hansson@arm.com */ 9411051Sandreas.hansson@arm.com Tick nextCycle() const 9511051Sandreas.hansson@arm.com { return divCeil(curTick(), clock) * clock; } 9611051Sandreas.hansson@arm.com 9711051Sandreas.hansson@arm.com /** 9811051Sandreas.hansson@arm.com * Determine the next cycle starting from a given tick instead of 9911051Sandreas.hansson@arm.com * curTick(). 10011051Sandreas.hansson@arm.com * 10111051Sandreas.hansson@arm.com * @param begin_tick The tick to round to a clock edge 10211051Sandreas.hansson@arm.com * 10311051Sandreas.hansson@arm.com * @return The tick when the cycle after or on begin_tick starts 10411051Sandreas.hansson@arm.com */ 10511051Sandreas.hansson@arm.com Tick nextCycle(Tick begin_tick) const 10611051Sandreas.hansson@arm.com { return divCeil(begin_tick, clock) * clock; } 10711051Sandreas.hansson@arm.com 10811051Sandreas.hansson@arm.com inline Tick frequency() const { return SimClock::Frequency / clock; } 10911051Sandreas.hansson@arm.com 11011051Sandreas.hansson@arm.com inline Tick ticks(int numCycles) const { return clock * numCycles; } 11111051Sandreas.hansson@arm.com 11211051Sandreas.hansson@arm.com inline Tick curCycle() const { return curTick() / clock; } 11311051Sandreas.hansson@arm.com 11411051Sandreas.hansson@arm.com inline Tick tickToCycles(Tick val) const { return val / clock; } 11511051Sandreas.hansson@arm.com 11611051Sandreas.hansson@arm.com}; 11711051Sandreas.hansson@arm.com 11811051Sandreas.hansson@arm.com#endif //__SIM_CLOCKED_OBJECT_HH__ 11911051Sandreas.hansson@arm.com