sim_object.hh revision 10023:91faf6649de0
17090SN/A/*
27090SN/A * Copyright (c) 2001-2005 The Regents of The University of Michigan
37090SN/A * Copyright (c) 2010 Advanced Micro Devices, Inc.
47090SN/A * All rights reserved.
57090SN/A *
67090SN/A * Redistribution and use in source and binary forms, with or without
77090SN/A * modification, are permitted provided that the following conditions are
87090SN/A * met: redistributions of source code must retain the above copyright
97090SN/A * notice, this list of conditions and the following disclaimer;
107090SN/A * redistributions in binary form must reproduce the above copyright
117090SN/A * notice, this list of conditions and the following disclaimer in the
127090SN/A * documentation and/or other materials provided with the distribution;
134486SN/A * neither the name of the copyright holders nor the names of its
144486SN/A * contributors may be used to endorse or promote products derived from
154486SN/A * this software without specific prior written permission.
164486SN/A *
174486SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
184486SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
194486SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
204486SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
214486SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
224486SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
234486SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
244486SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
254486SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
264486SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
274486SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284486SN/A *
294486SN/A * Authors: Steve Reinhardt
304486SN/A *          Nathan Binkert
314486SN/A */
324486SN/A
334486SN/A/* @file
344486SN/A * User Console Definitions
354486SN/A */
364486SN/A
374486SN/A#ifndef __SIM_OBJECT_HH__
384486SN/A#define __SIM_OBJECT_HH__
397584SAli.Saidi@arm.com
407584SAli.Saidi@arm.com#include <iostream>
417754SWilliam.Wang@arm.com#include <list>
424486SN/A#include <map>
433630SN/A#include <string>
443630SN/A#include <vector>
457587SAli.Saidi@arm.com
468212SAli.Saidi@ARM.com#include "enums/MemoryMode.hh"
475478SN/A#include "params/SimObject.hh"
485478SN/A#include "sim/drain.hh"
497584SAli.Saidi@arm.com#include "sim/eventq_impl.hh"
503630SN/A#include "sim/serialize.hh"
517584SAli.Saidi@arm.com
527584SAli.Saidi@arm.comclass BaseCPU;
537584SAli.Saidi@arm.comclass Event;
547584SAli.Saidi@arm.comclass ProbeManager;
553898SN/A/**
567950SAli.Saidi@ARM.com * Abstract superclass for simulation objects.  Represents things that
577950SAli.Saidi@ARM.com * correspond to physical components and can be specified via the
587950SAli.Saidi@ARM.com * config file (CPUs, caches, etc.).
597950SAli.Saidi@ARM.com *
607950SAli.Saidi@ARM.com * SimObject initialization is controlled by the instantiate method in
617950SAli.Saidi@ARM.com * src/python/m5/simulate.py. There are slightly different
627950SAli.Saidi@ARM.com * initialization paths when starting the simulation afresh and when
637950SAli.Saidi@ARM.com * loading from a checkpoint.  After instantiation and connecting
647587SAli.Saidi@arm.com * ports, simulate.py initializes the object using the following call
657587SAli.Saidi@arm.com * sequence:
667587SAli.Saidi@arm.com *
677753SWilliam.Wang@arm.com * <ol>
687753SWilliam.Wang@arm.com * <li>SimObject::init()
697753SWilliam.Wang@arm.com * <li>SimObject::regStats()
707753SWilliam.Wang@arm.com * <li><ul>
717587SAli.Saidi@arm.com *     <li>SimObject::initState() if starting afresh.
727587SAli.Saidi@arm.com *     <li>SimObject::loadState() if restoring from a checkpoint.
738282SAli.Saidi@ARM.com *     </ul>
748282SAli.Saidi@ARM.com * <li>SimObject::resetStats()
758282SAli.Saidi@ARM.com * <li>SimObject::startup()
767584SAli.Saidi@arm.com * <li>Drainable::drainResume() if resuming from a checkpoint.
777584SAli.Saidi@arm.com * </ol>
788524SAli.Saidi@ARM.com *
798524SAli.Saidi@ARM.com * @note Whenever a method is called on all objects in the simulator's
808299Schander.sudanthi@arm.com * object tree (e.g., init(), startup(), or loadState()), a pre-order
817584SAli.Saidi@arm.com * depth-first traversal is performed (see descendants() in
827584SAli.Saidi@arm.com * SimObject.py). This has the effect of calling the method on the
837584SAli.Saidi@arm.com * parent node <i>before</i> its children.
847584SAli.Saidi@arm.com */
857584SAli.Saidi@arm.comclass SimObject : public EventManager, public Serializable, public Drainable
867584SAli.Saidi@arm.com{
878283SPrakash.Ramrakhyani@arm.com  private:
888283SPrakash.Ramrakhyani@arm.com    typedef std::vector<SimObject *> SimObjectList;
897584SAli.Saidi@arm.com
907584SAli.Saidi@arm.com    /** List of all instantiated simulation objects. */
917584SAli.Saidi@arm.com    static SimObjectList simObjectList;
927584SAli.Saidi@arm.com
937584SAli.Saidi@arm.com    /** Manager coordinates hooking up probe points with listeners. */
947584SAli.Saidi@arm.com    ProbeManager *probeManager;
957584SAli.Saidi@arm.com
967584SAli.Saidi@arm.com  protected:
977584SAli.Saidi@arm.com    /** Cached copy of the object parameters. */
987584SAli.Saidi@arm.com    const SimObjectParams *_params;
997584SAli.Saidi@arm.com
1007584SAli.Saidi@arm.com  public:
1017584SAli.Saidi@arm.com    typedef SimObjectParams Params;
1027584SAli.Saidi@arm.com    const Params *params() const { return _params; }
1037584SAli.Saidi@arm.com    SimObject(const Params *_params);
1047584SAli.Saidi@arm.com    virtual ~SimObject() {}
1057584SAli.Saidi@arm.com
1067584SAli.Saidi@arm.com  public:
1077584SAli.Saidi@arm.com
1087584SAli.Saidi@arm.com    virtual const std::string name() const { return params()->name; }
1097584SAli.Saidi@arm.com
1107584SAli.Saidi@arm.com    /**
1117584SAli.Saidi@arm.com     * init() is called after all C++ SimObjects have been created and
1128512Sgeoffrey.blake@arm.com     * all ports are connected.  Initializations that are independent
1138512Sgeoffrey.blake@arm.com     * of unserialization but rely on a fully instantiated and
1148512Sgeoffrey.blake@arm.com     * connected SimObject graph should be done here.
1158512Sgeoffrey.blake@arm.com     */
1168512Sgeoffrey.blake@arm.com    virtual void init();
1178512Sgeoffrey.blake@arm.com
1188512Sgeoffrey.blake@arm.com    /**
1197950SAli.Saidi@ARM.com     * loadState() is called on each SimObject when restoring from a
1207754SWilliam.Wang@arm.com     * checkpoint.  The default implementation simply calls
1217950SAli.Saidi@ARM.com     * unserialize() if there is a corresponding section in the
1227950SAli.Saidi@ARM.com     * checkpoint.  However, objects can override loadState() to get
1237950SAli.Saidi@ARM.com     * other behaviors, e.g., doing other programmed initializations
1247754SWilliam.Wang@arm.com     * after unserialize(), or complaining if no checkpoint section is
1257754SWilliam.Wang@arm.com     * found.
1267753SWilliam.Wang@arm.com     *
1277753SWilliam.Wang@arm.com     * @param cp Checkpoint to restore the state from.
1287753SWilliam.Wang@arm.com     */
1297950SAli.Saidi@ARM.com    virtual void loadState(Checkpoint *cp);
1307753SWilliam.Wang@arm.com
1317753SWilliam.Wang@arm.com    /**
1327584SAli.Saidi@arm.com     * initState() is called on each SimObject when *not* restoring
1337584SAli.Saidi@arm.com     * from a checkpoint.  This provides a hook for state
1343630SN/A     * initializations that are only required for a "cold start".
1353630SN/A     */
1367753SWilliam.Wang@arm.com    virtual void initState();
1377753SWilliam.Wang@arm.com
1387753SWilliam.Wang@arm.com    /**
1397584SAli.Saidi@arm.com     * Register statistics for this object.
1407584SAli.Saidi@arm.com     */
1417584SAli.Saidi@arm.com    virtual void regStats();
1427584SAli.Saidi@arm.com
1437584SAli.Saidi@arm.com    /**
1447584SAli.Saidi@arm.com     * Reset statistics associated with this object.
1458512Sgeoffrey.blake@arm.com     */
1467753SWilliam.Wang@arm.com    virtual void resetStats();
1477754SWilliam.Wang@arm.com
1487950SAli.Saidi@ARM.com    /**
1498282SAli.Saidi@ARM.com     * Register probe points for this object.
1508212SAli.Saidi@ARM.com     */
1518212SAli.Saidi@ARM.com    virtual void regProbePoints();
1528212SAli.Saidi@ARM.com
1538212SAli.Saidi@ARM.com    /**
1548212SAli.Saidi@ARM.com     * Register probe listeners for this object.
1558212SAli.Saidi@ARM.com     */
1567584SAli.Saidi@arm.com    virtual void regProbeListeners();
1577731SAli.Saidi@ARM.com
1588461SAli.Saidi@ARM.com    /**
1598461SAli.Saidi@ARM.com     * Get the probe manager for this object.
1607696SAli.Saidi@ARM.com     */
1617696SAli.Saidi@ARM.com    ProbeManager *getProbeManager();
1627696SAli.Saidi@ARM.com
1637696SAli.Saidi@ARM.com    /**
1647696SAli.Saidi@ARM.com     * startup() is the final initialization call before simulation.
1657696SAli.Saidi@ARM.com     * All state is initialized (including unserialized state, if any,
1667696SAli.Saidi@ARM.com     * such as the curTick() value), so this is the appropriate place to
1677696SAli.Saidi@ARM.com     * schedule initial event(s) for objects that need them.
1687696SAli.Saidi@ARM.com     */
1697696SAli.Saidi@ARM.com    virtual void startup();
1707696SAli.Saidi@ARM.com
1717696SAli.Saidi@ARM.com    /**
1727696SAli.Saidi@ARM.com     * Provide a default implementation of the drain interface that
1737696SAli.Saidi@ARM.com     * simply returns 0 (draining completed) and sets the drain state
1747696SAli.Saidi@ARM.com     * to Drained.
1757696SAli.Saidi@ARM.com     */
1767696SAli.Saidi@ARM.com    unsigned int drain(DrainManager *drainManger);
1777696SAli.Saidi@ARM.com
1787696SAli.Saidi@ARM.com    /**
1797696SAli.Saidi@ARM.com     * Serialize all SimObjects in the system.
1807696SAli.Saidi@ARM.com     */
1818282SAli.Saidi@ARM.com    static void serializeAll(std::ostream &os);
1828512Sgeoffrey.blake@arm.com
1837696SAli.Saidi@ARM.com#ifdef DEBUG
1847696SAli.Saidi@ARM.com  public:
1857696SAli.Saidi@ARM.com    bool doDebugBreak;
1867696SAli.Saidi@ARM.com    static void debugObjectBreak(const std::string &objs);
1877696SAli.Saidi@ARM.com#endif
1887696SAli.Saidi@ARM.com
1897696SAli.Saidi@ARM.com    /**
1907696SAli.Saidi@ARM.com     * Find the SimObject with the given name and return a pointer to
1917696SAli.Saidi@ARM.com     * it.  Primarily used for interactive debugging.  Argument is
1927753SWilliam.Wang@arm.com     * char* rather than std::string to make it callable from gdb.
1937754SWilliam.Wang@arm.com     */
1947754SWilliam.Wang@arm.com    static SimObject *find(const char *name);
1958212SAli.Saidi@ARM.com};
1967696SAli.Saidi@ARM.com
1977696SAli.Saidi@ARM.com#ifdef DEBUG
1987696SAli.Saidi@ARM.comvoid debugObjectBreak(const char *objs);
1997696SAli.Saidi@ARM.com#endif
2007696SAli.Saidi@ARM.com
2017696SAli.Saidi@ARM.com#endif // __SIM_OBJECT_HH__
2027696SAli.Saidi@ARM.com