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