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