sim_object.hh revision 7823
12SN/A/* 21762SN/A * Copyright (c) 2001-2005 The Regents of The University of Michigan 37534Ssteve.reinhardt@amd.com * Copyright (c) 2010 Advanced Micro Devices, Inc. 42SN/A * All rights reserved. 52SN/A * 62SN/A * Redistribution and use in source and binary forms, with or without 72SN/A * modification, are permitted provided that the following conditions are 82SN/A * met: redistributions of source code must retain the above copyright 92SN/A * notice, this list of conditions and the following disclaimer; 102SN/A * redistributions in binary form must reproduce the above copyright 112SN/A * notice, this list of conditions and the following disclaimer in the 122SN/A * documentation and/or other materials provided with the distribution; 132SN/A * neither the name of the copyright holders nor the names of its 142SN/A * contributors may be used to endorse or promote products derived from 152SN/A * this software without specific prior written permission. 162SN/A * 172SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 182SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 192SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 202SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 212SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 222SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 232SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 242SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 252SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 262SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 272SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 282665Ssaidi@eecs.umich.edu * 292665Ssaidi@eecs.umich.edu * Authors: Steve Reinhardt 302665Ssaidi@eecs.umich.edu * Nathan Binkert 312SN/A */ 322SN/A 332SN/A/* @file 342SN/A * User Console Definitions 352SN/A */ 362SN/A 372SN/A#ifndef __SIM_OBJECT_HH__ 382SN/A#define __SIM_OBJECT_HH__ 392SN/A 405491Sgblack@eecs.umich.edu#include <iostream> 415491Sgblack@eecs.umich.edu#include <list> 422SN/A#include <map> 435491Sgblack@eecs.umich.edu#include <string> 442SN/A#include <vector> 452SN/A 464762Snate@binkert.org#include "params/SimObject.hh" 475605Snate@binkert.org#include "sim/eventq.hh" 4856SN/A#include "sim/serialize.hh" 492SN/A 502797Sktlim@umich.educlass BaseCPU; 512797Sktlim@umich.educlass Event; 522609SN/A 532SN/A/* 542SN/A * Abstract superclass for simulation objects. Represents things that 552SN/A * correspond to physical components and can be specified via the 562SN/A * config file (CPUs, caches, etc.). 572SN/A */ 587492Ssteve.reinhardt@amd.comclass SimObject : public EventManager, public Serializable 592SN/A{ 601553SN/A public: 612797Sktlim@umich.edu enum State { 622901Ssaidi@eecs.umich.edu Running, 632839Sktlim@umich.edu Draining, 642901Ssaidi@eecs.umich.edu Drained 652797Sktlim@umich.edu }; 663202Shsul@eecs.umich.edu 672901Ssaidi@eecs.umich.edu private: 682901Ssaidi@eecs.umich.edu State state; 692797Sktlim@umich.edu 70265SN/A protected: 712797Sktlim@umich.edu void changeState(State new_state) { state = new_state; } 721553SN/A 731553SN/A public: 742797Sktlim@umich.edu State getState() { return state; } 752797Sktlim@umich.edu 762SN/A private: 772SN/A typedef std::vector<SimObject *> SimObjectList; 782SN/A 792SN/A // list of all instantiated simulation objects 802SN/A static SimObjectList simObjectList; 812SN/A 824762Snate@binkert.org protected: 834762Snate@binkert.org const SimObjectParams *_params; 844762Snate@binkert.org 852SN/A public: 864762Snate@binkert.org typedef SimObjectParams Params; 874762Snate@binkert.org const Params *params() const { return _params; } 884762Snate@binkert.org SimObject(const Params *_params); 892SN/A virtual ~SimObject() {} 902SN/A 915034Smilesck@eecs.umich.edu public: 925034Smilesck@eecs.umich.edu 931553SN/A virtual const std::string name() const { return params()->name; } 94265SN/A 957532Ssteve.reinhardt@amd.com // The following SimObject initialization methods are called from 967532Ssteve.reinhardt@amd.com // the instantiate() method in src/python/m5/simulate.py. See 977532Ssteve.reinhardt@amd.com // that function for details on how/when these methods are 987532Ssteve.reinhardt@amd.com // invoked. 997532Ssteve.reinhardt@amd.com 1007532Ssteve.reinhardt@amd.com /** 1017532Ssteve.reinhardt@amd.com * init() is called after all C++ SimObjects have been created and 1027532Ssteve.reinhardt@amd.com * all ports are connected. Initializations that are independent 1037532Ssteve.reinhardt@amd.com * of unserialization but rely on a fully instantiated and 1047532Ssteve.reinhardt@amd.com * connected SimObject graph should be done here. 1057532Ssteve.reinhardt@amd.com */ 106465SN/A virtual void init(); 107465SN/A 1087532Ssteve.reinhardt@amd.com /** 1097532Ssteve.reinhardt@amd.com * loadState() is called on each SimObject when restoring from a 1107532Ssteve.reinhardt@amd.com * checkpoint. The default implementation simply calls 1117532Ssteve.reinhardt@amd.com * unserialize() if there is a corresponding section in the 1127532Ssteve.reinhardt@amd.com * checkpoint. However, objects can override loadState() to get 1137532Ssteve.reinhardt@amd.com * other behaviors, e.g., doing other programmed initializations 1147532Ssteve.reinhardt@amd.com * after unserialize(), or complaining if no checkpoint section is 1157532Ssteve.reinhardt@amd.com * found. 1167532Ssteve.reinhardt@amd.com */ 1177532Ssteve.reinhardt@amd.com virtual void loadState(Checkpoint *cp); 1187532Ssteve.reinhardt@amd.com 1197532Ssteve.reinhardt@amd.com /** 1207532Ssteve.reinhardt@amd.com * initState() is called on each SimObject when *not* restoring 1217532Ssteve.reinhardt@amd.com * from a checkpoint. This provides a hook for state 1227532Ssteve.reinhardt@amd.com * initializations that are only required for a "cold start". 1237532Ssteve.reinhardt@amd.com */ 1247532Ssteve.reinhardt@amd.com virtual void initState(); 1257532Ssteve.reinhardt@amd.com 1262SN/A // register statistics for this object 1272SN/A virtual void regStats(); 1282SN/A virtual void regFormulas(); 129330SN/A virtual void resetStats(); 1302SN/A 1317532Ssteve.reinhardt@amd.com /** 1327532Ssteve.reinhardt@amd.com * startup() is the final initialization call before simulation. 1337532Ssteve.reinhardt@amd.com * All state is initialized (including unserialized state, if any, 1347823Ssteve.reinhardt@amd.com * such as the curTick() value), so this is the appropriate place to 1357532Ssteve.reinhardt@amd.com * schedule initial event(s) for objects that need them. 1367532Ssteve.reinhardt@amd.com */ 1377492Ssteve.reinhardt@amd.com virtual void startup(); 138330SN/A 139395SN/A // static: call nameOut() & serialize() on all SimObjects 140395SN/A static void serializeAll(std::ostream &); 1412797Sktlim@umich.edu static void unserializeAll(Checkpoint *cp); 142938SN/A 1432609SN/A // Methods to drain objects in order to take checkpoints 1442609SN/A // Or switch from timing -> atomic memory model 1452901Ssaidi@eecs.umich.edu // Drain returns 0 if the simobject can drain immediately or 1462901Ssaidi@eecs.umich.edu // the number of times the drain_event's process function will be called 1472901Ssaidi@eecs.umich.edu // before the object will be done draining. Normally this should be 1 1482901Ssaidi@eecs.umich.edu virtual unsigned int drain(Event *drain_event); 1492797Sktlim@umich.edu virtual void resume(); 1502797Sktlim@umich.edu virtual void setMemoryMode(State new_mode); 1512797Sktlim@umich.edu virtual void switchOut(); 1522797Sktlim@umich.edu virtual void takeOverFrom(BaseCPU *cpu); 1532609SN/A 1541031SN/A#ifdef DEBUG 1551031SN/A public: 1561031SN/A bool doDebugBreak; 1571031SN/A static void debugObjectBreak(const std::string &objs); 1581031SN/A#endif 1591031SN/A 1605314Sstever@gmail.com /** 1615314Sstever@gmail.com * Find the SimObject with the given name and return a pointer to 1625315Sstever@gmail.com * it. Primarily used for interactive debugging. Argument is 1635314Sstever@gmail.com * char* rather than std::string to make it callable from gdb. 1645314Sstever@gmail.com */ 1655314Sstever@gmail.com static SimObject *find(const char *name); 1662SN/A}; 1672SN/A 1682SN/A#endif // __SIM_OBJECT_HH__ 169