sim_object.hh revision 10905
13101Sstever@eecs.umich.edu/*
23101Sstever@eecs.umich.edu * Copyright (c) 2001-2005 The Regents of The University of Michigan
33101Sstever@eecs.umich.edu * Copyright (c) 2010 Advanced Micro Devices, Inc.
43101Sstever@eecs.umich.edu * All rights reserved.
53101Sstever@eecs.umich.edu *
63101Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
73101Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are
83101Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright
93101Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
103101Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
113101Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
123101Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution;
133101Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its
143101Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from
153101Sstever@eecs.umich.edu * this software without specific prior written permission.
163101Sstever@eecs.umich.edu *
173101Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
183101Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
193101Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
203101Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
213101Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
223101Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
233101Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
243101Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
253101Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
263101Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
273101Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
283101Sstever@eecs.umich.edu *
293101Sstever@eecs.umich.edu * Authors: Steve Reinhardt
303101Sstever@eecs.umich.edu *          Nathan Binkert
313101Sstever@eecs.umich.edu */
323101Sstever@eecs.umich.edu
333101Sstever@eecs.umich.edu/* @file
343101Sstever@eecs.umich.edu * User Console Definitions
353101Sstever@eecs.umich.edu */
363101Sstever@eecs.umich.edu
373101Sstever@eecs.umich.edu#ifndef __SIM_OBJECT_HH__
383101Sstever@eecs.umich.edu#define __SIM_OBJECT_HH__
393101Sstever@eecs.umich.edu
403101Sstever@eecs.umich.edu#include <iostream>
413101Sstever@eecs.umich.edu#include <list>
423101Sstever@eecs.umich.edu#include <map>
433101Sstever@eecs.umich.edu#include <string>
443101Sstever@eecs.umich.edu#include <vector>
453101Sstever@eecs.umich.edu
463101Sstever@eecs.umich.edu#include "enums/MemoryMode.hh"
473101Sstever@eecs.umich.edu#include "params/SimObject.hh"
483101Sstever@eecs.umich.edu#include "sim/drain.hh"
493102Sstever@eecs.umich.edu#include "sim/eventq_impl.hh"
503101Sstever@eecs.umich.edu#include "sim/serialize.hh"
513101Sstever@eecs.umich.edu
523101Sstever@eecs.umich.educlass BaseCPU;
533101Sstever@eecs.umich.educlass Event;
543101Sstever@eecs.umich.educlass ProbeManager;
553101Sstever@eecs.umich.edu/**
563101Sstever@eecs.umich.edu * Abstract superclass for simulation objects.  Represents things that
573101Sstever@eecs.umich.edu * correspond to physical components and can be specified via the
583101Sstever@eecs.umich.edu * config file (CPUs, caches, etc.).
593101Sstever@eecs.umich.edu *
603101Sstever@eecs.umich.edu * SimObject initialization is controlled by the instantiate method in
613101Sstever@eecs.umich.edu * src/python/m5/simulate.py. There are slightly different
623101Sstever@eecs.umich.edu * initialization paths when starting the simulation afresh and when
633101Sstever@eecs.umich.edu * loading from a checkpoint.  After instantiation and connecting
643101Sstever@eecs.umich.edu * ports, simulate.py initializes the object using the following call
653101Sstever@eecs.umich.edu * sequence:
663101Sstever@eecs.umich.edu *
673101Sstever@eecs.umich.edu * <ol>
683101Sstever@eecs.umich.edu * <li>SimObject::init()
693101Sstever@eecs.umich.edu * <li>SimObject::regStats()
703101Sstever@eecs.umich.edu * <li><ul>
713101Sstever@eecs.umich.edu *     <li>SimObject::initState() if starting afresh.
723101Sstever@eecs.umich.edu *     <li>SimObject::loadState() if restoring from a checkpoint.
733101Sstever@eecs.umich.edu *     </ul>
743101Sstever@eecs.umich.edu * <li>SimObject::resetStats()
753101Sstever@eecs.umich.edu * <li>SimObject::startup()
763101Sstever@eecs.umich.edu * <li>Drainable::drainResume() if resuming from a checkpoint.
773101Sstever@eecs.umich.edu * </ol>
783101Sstever@eecs.umich.edu *
793101Sstever@eecs.umich.edu * @note Whenever a method is called on all objects in the simulator's
803101Sstever@eecs.umich.edu * object tree (e.g., init(), startup(), or loadState()), a pre-order
813101Sstever@eecs.umich.edu * depth-first traversal is performed (see descendants() in
823101Sstever@eecs.umich.edu * SimObject.py). This has the effect of calling the method on the
833101Sstever@eecs.umich.edu * parent node <i>before</i> its children.
843101Sstever@eecs.umich.edu */
853101Sstever@eecs.umich.educlass SimObject : public EventManager, public Serializable, public Drainable
863101Sstever@eecs.umich.edu{
873101Sstever@eecs.umich.edu  private:
883101Sstever@eecs.umich.edu    typedef std::vector<SimObject *> SimObjectList;
893101Sstever@eecs.umich.edu
903101Sstever@eecs.umich.edu    /** List of all instantiated simulation objects. */
913101Sstever@eecs.umich.edu    static SimObjectList simObjectList;
923101Sstever@eecs.umich.edu
933101Sstever@eecs.umich.edu    /** Manager coordinates hooking up probe points with listeners. */
943101Sstever@eecs.umich.edu    ProbeManager *probeManager;
953101Sstever@eecs.umich.edu
963101Sstever@eecs.umich.edu  protected:
973101Sstever@eecs.umich.edu    /** Cached copy of the object parameters. */
983101Sstever@eecs.umich.edu    const SimObjectParams *_params;
993101Sstever@eecs.umich.edu
1003101Sstever@eecs.umich.edu  public:
1013101Sstever@eecs.umich.edu    typedef SimObjectParams Params;
1023101Sstever@eecs.umich.edu    const Params *params() const { return _params; }
1033101Sstever@eecs.umich.edu    SimObject(const Params *_params);
1043102Sstever@eecs.umich.edu    virtual ~SimObject();
1053101Sstever@eecs.umich.edu
1063102Sstever@eecs.umich.edu  public:
1073101Sstever@eecs.umich.edu
1083101Sstever@eecs.umich.edu    virtual const std::string name() const { return params()->name; }
1093101Sstever@eecs.umich.edu
1103102Sstever@eecs.umich.edu    /**
1113102Sstever@eecs.umich.edu     * init() is called after all C++ SimObjects have been created and
1123101Sstever@eecs.umich.edu     * all ports are connected.  Initializations that are independent
1133101Sstever@eecs.umich.edu     * of unserialization but rely on a fully instantiated and
1143101Sstever@eecs.umich.edu     * connected SimObject graph should be done here.
1153101Sstever@eecs.umich.edu     */
1163101Sstever@eecs.umich.edu    virtual void init();
1173101Sstever@eecs.umich.edu
1183101Sstever@eecs.umich.edu    /**
1193101Sstever@eecs.umich.edu     * loadState() is called on each SimObject when restoring from a
1203101Sstever@eecs.umich.edu     * checkpoint.  The default implementation simply calls
1213101Sstever@eecs.umich.edu     * unserialize() if there is a corresponding section in the
1223101Sstever@eecs.umich.edu     * checkpoint.  However, objects can override loadState() to get
1233101Sstever@eecs.umich.edu     * other behaviors, e.g., doing other programmed initializations
1243101Sstever@eecs.umich.edu     * after unserialize(), or complaining if no checkpoint section is
1253102Sstever@eecs.umich.edu     * found.
1263101Sstever@eecs.umich.edu     *
1273101Sstever@eecs.umich.edu     * @param cp Checkpoint to restore the state from.
1283101Sstever@eecs.umich.edu     */
1293101Sstever@eecs.umich.edu    virtual void loadState(CheckpointIn &cp);
1303101Sstever@eecs.umich.edu
1313101Sstever@eecs.umich.edu    /**
1323101Sstever@eecs.umich.edu     * initState() is called on each SimObject when *not* restoring
1333101Sstever@eecs.umich.edu     * from a checkpoint.  This provides a hook for state
1343101Sstever@eecs.umich.edu     * initializations that are only required for a "cold start".
1353101Sstever@eecs.umich.edu     */
1363101Sstever@eecs.umich.edu    virtual void initState();
1373101Sstever@eecs.umich.edu
1383101Sstever@eecs.umich.edu    /**
1393101Sstever@eecs.umich.edu     * Register statistics for this object.
1403101Sstever@eecs.umich.edu     */
1413101Sstever@eecs.umich.edu    virtual void regStats();
1423101Sstever@eecs.umich.edu
1433101Sstever@eecs.umich.edu    /**
1443101Sstever@eecs.umich.edu     * Reset statistics associated with this object.
1453101Sstever@eecs.umich.edu     */
1463101Sstever@eecs.umich.edu    virtual void resetStats();
1473101Sstever@eecs.umich.edu
1483101Sstever@eecs.umich.edu    /**
1493101Sstever@eecs.umich.edu     * Register probe points for this object.
1503101Sstever@eecs.umich.edu     */
1513101Sstever@eecs.umich.edu    virtual void regProbePoints();
1523101Sstever@eecs.umich.edu
1533101Sstever@eecs.umich.edu    /**
1543101Sstever@eecs.umich.edu     * Register probe listeners for this object.
1553101Sstever@eecs.umich.edu     */
1563101Sstever@eecs.umich.edu    virtual void regProbeListeners();
1573101Sstever@eecs.umich.edu
1583101Sstever@eecs.umich.edu    /**
1593101Sstever@eecs.umich.edu     * Get the probe manager for this object.
1603101Sstever@eecs.umich.edu     */
1613101Sstever@eecs.umich.edu    ProbeManager *getProbeManager();
1623101Sstever@eecs.umich.edu
1633101Sstever@eecs.umich.edu    /**
1643101Sstever@eecs.umich.edu     * startup() is the final initialization call before simulation.
1653101Sstever@eecs.umich.edu     * All state is initialized (including unserialized state, if any,
1663101Sstever@eecs.umich.edu     * such as the curTick() value), so this is the appropriate place to
1673101Sstever@eecs.umich.edu     * schedule initial event(s) for objects that need them.
1683101Sstever@eecs.umich.edu     */
1693101Sstever@eecs.umich.edu    virtual void startup();
1703101Sstever@eecs.umich.edu
1713101Sstever@eecs.umich.edu    /**
1723101Sstever@eecs.umich.edu     * Provide a default implementation of the drain interface that
1733101Sstever@eecs.umich.edu     * simply returns 0 (draining completed) and sets the drain state
1743101Sstever@eecs.umich.edu     * to Drained.
1753101Sstever@eecs.umich.edu     */
1763101Sstever@eecs.umich.edu    unsigned int drain(DrainManager *drainManger);
1773101Sstever@eecs.umich.edu
1783101Sstever@eecs.umich.edu
1793101Sstever@eecs.umich.edu    void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE {};
1803101Sstever@eecs.umich.edu    void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE {};
1813101Sstever@eecs.umich.edu
1823101Sstever@eecs.umich.edu    /**
1833101Sstever@eecs.umich.edu     * Serialize all SimObjects in the system.
1843101Sstever@eecs.umich.edu     */
1853101Sstever@eecs.umich.edu    static void serializeAll(CheckpointOut &cp);
1863101Sstever@eecs.umich.edu
1873101Sstever@eecs.umich.edu#ifdef DEBUG
1883101Sstever@eecs.umich.edu  public:
1893101Sstever@eecs.umich.edu    bool doDebugBreak;
1903101Sstever@eecs.umich.edu    static void debugObjectBreak(const std::string &objs);
1913101Sstever@eecs.umich.edu#endif
1923101Sstever@eecs.umich.edu
1933101Sstever@eecs.umich.edu    /**
1943101Sstever@eecs.umich.edu     * Find the SimObject with the given name and return a pointer to
1953101Sstever@eecs.umich.edu     * it.  Primarily used for interactive debugging.  Argument is
1963101Sstever@eecs.umich.edu     * char* rather than std::string to make it callable from gdb.
1973101Sstever@eecs.umich.edu     */
1983101Sstever@eecs.umich.edu    static SimObject *find(const char *name);
1993101Sstever@eecs.umich.edu};
2003101Sstever@eecs.umich.edu
2013101Sstever@eecs.umich.edu#ifdef DEBUG
2023101Sstever@eecs.umich.eduvoid debugObjectBreak(const char *objs);
2033101Sstever@eecs.umich.edu#endif
2043101Sstever@eecs.umich.edu
2053101Sstever@eecs.umich.edu#endif // __SIM_OBJECT_HH__
2063101Sstever@eecs.umich.edu