sim_object.hh revision 8320:c03e683e83fe
12330SN/A/* 22330SN/A * Copyright (c) 2001-2005 The Regents of The University of Michigan 32330SN/A * Copyright (c) 2010 Advanced Micro Devices, Inc. 42330SN/A * All rights reserved. 52330SN/A * 62330SN/A * Redistribution and use in source and binary forms, with or without 72330SN/A * modification, are permitted provided that the following conditions are 82330SN/A * met: redistributions of source code must retain the above copyright 92330SN/A * notice, this list of conditions and the following disclaimer; 102330SN/A * redistributions in binary form must reproduce the above copyright 112330SN/A * notice, this list of conditions and the following disclaimer in the 122330SN/A * documentation and/or other materials provided with the distribution; 132330SN/A * neither the name of the copyright holders nor the names of its 142330SN/A * contributors may be used to endorse or promote products derived from 152330SN/A * this software without specific prior written permission. 162330SN/A * 172330SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 182330SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 192330SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 202330SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 212330SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 222330SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 232330SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 242330SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 252330SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 262330SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 272689Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282689Sktlim@umich.edu * 292330SN/A * Authors: Steve Reinhardt 302292SN/A * Nathan Binkert 312292SN/A */ 322292SN/A 332292SN/A/* @file 342980Sgblack@eecs.umich.edu * User Console Definitions 352362SN/A */ 362680Sktlim@umich.edu 375712Shsul@eecs.umich.edu#ifndef __SIM_OBJECT_HH__ 382292SN/A#define __SIM_OBJECT_HH__ 392678Sktlim@umich.edu 402683Sktlim@umich.edu#include <iostream> 412683Sktlim@umich.edu#include <list> 422678Sktlim@umich.edu#include <map> 432678Sktlim@umich.edu#include <string> 442292SN/A#include <vector> 452292SN/A 462292SN/A#include "params/SimObject.hh" 472292SN/A#include "sim/eventq.hh" 483548Sgblack@eecs.umich.edu#include "sim/serialize.hh" 493548Sgblack@eecs.umich.edu 503548Sgblack@eecs.umich.educlass BaseCPU; 513548Sgblack@eecs.umich.educlass Event; 522330SN/A 532292SN/A/* 542292SN/A * Abstract superclass for simulation objects. Represents things that 552862Sktlim@umich.edu * correspond to physical components and can be specified via the 563486Sktlim@umich.edu * config file (CPUs, caches, etc.). 573402Sktlim@umich.edu */ 582862Sktlim@umich.educlass SimObject : public EventManager, public Serializable 592330SN/A{ 602330SN/A public: 612330SN/A enum State { 622330SN/A Running, 632330SN/A Draining, 642330SN/A Drained 652292SN/A }; 662683Sktlim@umich.edu 672683Sktlim@umich.edu private: 682292SN/A State state; 696221Snate@binkert.org 702292SN/A protected: 716221Snate@binkert.org void changeState(State new_state) { state = new_state; } 722292SN/A 732683Sktlim@umich.edu public: 743486Sktlim@umich.edu State getState() { return state; } 753486Sktlim@umich.edu 762862Sktlim@umich.edu private: 772862Sktlim@umich.edu typedef std::vector<SimObject *> SimObjectList; 782862Sktlim@umich.edu 792862Sktlim@umich.edu // list of all instantiated simulation objects 805712Shsul@eecs.umich.edu static SimObjectList simObjectList; 812683Sktlim@umich.edu 825714Shsul@eecs.umich.edu protected: 835714Shsul@eecs.umich.edu const SimObjectParams *_params; 845714Shsul@eecs.umich.edu 855714Shsul@eecs.umich.edu public: 866221Snate@binkert.org typedef SimObjectParams Params; 872683Sktlim@umich.edu const Params *params() const { return _params; } 886221Snate@binkert.org SimObject(const Params *_params); 892683Sktlim@umich.edu virtual ~SimObject() {} 902683Sktlim@umich.edu 912683Sktlim@umich.edu public: 922683Sktlim@umich.edu 932683Sktlim@umich.edu virtual const std::string name() const { return params()->name; } 942683Sktlim@umich.edu 955497Ssaidi@eecs.umich.edu // The following SimObject initialization methods are called from 963675Sktlim@umich.edu // the instantiate() method in src/python/m5/simulate.py. See 973686Sktlim@umich.edu // that function for details on how/when these methods are 983675Sktlim@umich.edu // invoked. 995497Ssaidi@eecs.umich.edu 1003675Sktlim@umich.edu /** 1012683Sktlim@umich.edu * init() is called after all C++ SimObjects have been created and 1022683Sktlim@umich.edu * all ports are connected. Initializations that are independent 1032683Sktlim@umich.edu * of unserialization but rely on a fully instantiated and 1042683Sktlim@umich.edu * connected SimObject graph should be done here. 1052683Sktlim@umich.edu */ 1062683Sktlim@umich.edu virtual void init(); 1072683Sktlim@umich.edu 1082683Sktlim@umich.edu /** 1093548Sgblack@eecs.umich.edu * loadState() is called on each SimObject when restoring from a 1102683Sktlim@umich.edu * checkpoint. The default implementation simply calls 1112690Sktlim@umich.edu * unserialize() if there is a corresponding section in the 1122690Sktlim@umich.edu * checkpoint. However, objects can override loadState() to get 1132683Sktlim@umich.edu * other behaviors, e.g., doing other programmed initializations 1142683Sktlim@umich.edu * after unserialize(), or complaining if no checkpoint section is 1155499Ssaidi@eecs.umich.edu * found. 1162683Sktlim@umich.edu */ 1172683Sktlim@umich.edu virtual void loadState(Checkpoint *cp); 1182683Sktlim@umich.edu 1193402Sktlim@umich.edu /** 1202683Sktlim@umich.edu * initState() is called on each SimObject when *not* restoring 1212683Sktlim@umich.edu * from a checkpoint. This provides a hook for state 1222683Sktlim@umich.edu * initializations that are only required for a "cold start". 1232683Sktlim@umich.edu */ 1242683Sktlim@umich.edu virtual void initState(); 1252678Sktlim@umich.edu 1262292SN/A // register statistics for this object 1272683Sktlim@umich.edu virtual void regStats(); 1282683Sktlim@umich.edu virtual void regFormulas(); 1292292SN/A virtual void resetStats(); 1302683Sktlim@umich.edu 1312683Sktlim@umich.edu /** 1322683Sktlim@umich.edu * startup() is the final initialization call before simulation. 1332683Sktlim@umich.edu * All state is initialized (including unserialized state, if any, 1342683Sktlim@umich.edu * such as the curTick() value), so this is the appropriate place to 1352683Sktlim@umich.edu * schedule initial event(s) for objects that need them. 1362683Sktlim@umich.edu */ 1372683Sktlim@umich.edu virtual void startup(); 1382683Sktlim@umich.edu 1392683Sktlim@umich.edu // static: call nameOut() & serialize() on all SimObjects 1402683Sktlim@umich.edu static void serializeAll(std::ostream &); 1412683Sktlim@umich.edu 1422683Sktlim@umich.edu // Methods to drain objects in order to take checkpoints 1432683Sktlim@umich.edu // Or switch from timing -> atomic memory model 1442683Sktlim@umich.edu // Drain returns 0 if the simobject can drain immediately or 1452683Sktlim@umich.edu // the number of times the drain_event's process function will be called 1462683Sktlim@umich.edu // before the object will be done draining. Normally this should be 1 1472683Sktlim@umich.edu virtual unsigned int drain(Event *drain_event); 1482683Sktlim@umich.edu virtual void resume(); 1493673Srdreslin@umich.edu virtual void setMemoryMode(State new_mode); 1503675Sktlim@umich.edu virtual void switchOut(); 1513675Sktlim@umich.edu virtual void takeOverFrom(BaseCPU *cpu); 1523675Sktlim@umich.edu 1533486Sktlim@umich.edu#ifdef DEBUG 1542683Sktlim@umich.edu public: 1552683Sktlim@umich.edu bool doDebugBreak; 1562683Sktlim@umich.edu static void debugObjectBreak(const std::string &objs); 1575999Snate@binkert.org#endif 1582683Sktlim@umich.edu 1595999Snate@binkert.org /** 1602683Sktlim@umich.edu * Find the SimObject with the given name and return a pointer to 1612683Sktlim@umich.edu * it. Primarily used for interactive debugging. Argument is 1622683Sktlim@umich.edu * char* rather than std::string to make it callable from gdb. 1632683Sktlim@umich.edu */ 1642683Sktlim@umich.edu static SimObject *find(const char *name); 1652683Sktlim@umich.edu}; 1662683Sktlim@umich.edu 1672683Sktlim@umich.edu#endif // __SIM_OBJECT_HH__ 1682683Sktlim@umich.edu