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