serialize.hh revision 304
12SN/A/*
213107Sgiacomo.travaglini@arm.com * Copyright (c) 2003 The Regents of The University of Michigan
310905Sandreas.sandberg@arm.com * All rights reserved.
410905Sandreas.sandberg@arm.com *
510905Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
610905Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
710905Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
810905Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
910905Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1010905Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
1110905Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
1210905Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
1310905Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
141762SN/A * this software without specific prior written permission.
152SN/A *
162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272SN/A */
282SN/A
292SN/A/* @file
302SN/A * Serialization Interface Declarations
312SN/A */
322SN/A
332SN/A#ifndef __SERIALIZE_HH__
342SN/A#define __SERIALIZE_HH__
352SN/A
362SN/A
372SN/A#include <list>
382SN/A#include <iostream>
392665Ssaidi@eecs.umich.edu#include <map>
402760Sbinkertn@umich.edu
412760Sbinkertn@umich.edu#include "sim/host.hh"
422665Ssaidi@eecs.umich.edu#include "sim/configfile.hh"
4310905Sandreas.sandberg@arm.com
442SN/Aclass Serializeable;
452SN/Aclass Checkpoint;
462SN/A
472SN/Atemplate <class T>
482SN/Avoid paramOut(std::ostream &os, const std::string &name, const T& param);
492SN/A
502SN/Atemplate <class T>
512SN/Avoid paramIn(Checkpoint *cp, const std::string &section,
522SN/A             const std::string &name, T& param);
532SN/A
5413107Sgiacomo.travaglini@arm.comtemplate <class T>
558229Snate@binkert.orgvoid arrayParamOut(std::ostream &os, const std::string &name,
562SN/A                   const T *param, int size);
578229Snate@binkert.org
5810905Sandreas.sandberg@arm.comtemplate <class T>
5911076SCurtis.Dunham@arm.comvoid arrayParamIn(Checkpoint *cp, const std::string &section,
604841Ssaidi@eecs.umich.edu                  const std::string &name, T *param, int size);
612SN/A
6210459SAndreas.Sandberg@ARM.comvoid
632SN/AobjParamIn(Checkpoint *cp, const std::string &section,
6411800Sbrandon.potter@amd.com           const std::string &name, Serializeable * &param);
652738Sstever@eecs.umich.edu
66395SN/A
674000Ssaidi@eecs.umich.edu//
6811067Sandreas.sandberg@arm.com// These macros are streamlined to use in serialize/unserialize
692SN/A// functions.  It's assumed that serialize() has a parameter 'os' for
7010905Sandreas.sandberg@arm.com// the ostream, and unserialize() has parameters 'cp' and 'section'.
7110905Sandreas.sandberg@arm.com#define SERIALIZE_SCALAR(scalar)	paramOut(os, #scalar, scalar)
7210905Sandreas.sandberg@arm.com
73217SN/A#define UNSERIALIZE_SCALAR(scalar)	paramIn(cp, section, #scalar, scalar)
7410905Sandreas.sandberg@arm.com
75217SN/A// ENUMs are like SCALARs, but we cast them to ints on the way out
7612452Sgabeblack@google.com#define SERIALIZE_ENUM(scalar)		paramOut(os, #scalar, (int)scalar)
7712452Sgabeblack@google.com
7812452Sgabeblack@google.com#define UNSERIALIZE_ENUM(scalar)		\
7910459SAndreas.Sandberg@ARM.com do {						\
8012452Sgabeblack@google.com    int tmp;					\
8110459SAndreas.Sandberg@ARM.com    paramIn(cp, section, #scalar, tmp);		\
8210459SAndreas.Sandberg@ARM.com    scalar = (typeof(scalar))tmp;		\
83217SN/A  } while (0)
8410905Sandreas.sandberg@arm.com
85217SN/A#define SERIALIZE_ARRAY(member, size)	\
8612452Sgabeblack@google.com        arrayParamOut(os, #member, member, size)
8712452Sgabeblack@google.com
8812452Sgabeblack@google.com#define UNSERIALIZE_ARRAY(member, size)	\
8910459SAndreas.Sandberg@ARM.com        arrayParamIn(cp, section, #member, member, size)
9012452Sgabeblack@google.com
9112452Sgabeblack@google.com#define SERIALIZE_OBJPTR(objptr)	paramOut(os, #objptr, (objptr)->name())
9212452Sgabeblack@google.com
9310459SAndreas.Sandberg@ARM.com#define UNSERIALIZE_OBJPTR(objptr)			\
9410459SAndreas.Sandberg@ARM.com  do {							\
95217SN/A    Serializeable *sptr;				\
9611075SCurtis.Dunham@arm.com    objParamIn(cp, section, #objptr, sptr);		\
9711075SCurtis.Dunham@arm.com    objptr = dynamic_cast<typeof(objptr)>(sptr);	\
986820SLisa.Hsu@amd.com  } while (0)
9912452Sgabeblack@google.com
10012452Sgabeblack@google.com/*
10112452Sgabeblack@google.com * Basic support for object serialization.
10212452Sgabeblack@google.com */
10310459SAndreas.Sandberg@ARM.comclass Serializeable
10412452Sgabeblack@google.com{
10512452Sgabeblack@google.com  public:
10612452Sgabeblack@google.com
10712452Sgabeblack@google.com    friend class Serializer;
10812452Sgabeblack@google.com
10912452Sgabeblack@google.com  protected:
11012452Sgabeblack@google.com    bool serialized;
11110459SAndreas.Sandberg@ARM.com    static Serializer *serializer;
11210459SAndreas.Sandberg@ARM.com
1136820SLisa.Hsu@amd.com    void mark();
11410905Sandreas.sandberg@arm.com    void nameOut(std::ostream& os);
1156227Snate@binkert.org    void nameOut(std::ostream& os, const std::string &_name);
116217SN/A
117217SN/A  public:
11810905Sandreas.sandberg@arm.com    Serializeable();
1194841Ssaidi@eecs.umich.edu    virtual ~Serializeable();
1204841Ssaidi@eecs.umich.edu
1214841Ssaidi@eecs.umich.edu    // manditory virtual function, so objects must provide names
12210905Sandreas.sandberg@arm.com    virtual std::string name() const = 0;
1237948SAli.Saidi@ARM.com
1247948SAli.Saidi@ARM.com    virtual void serialize(std::ostream& os) {}
1257948SAli.Saidi@ARM.com    virtual void unserialize(Checkpoint *cp, const std::string &section) {}
12611076SCurtis.Dunham@arm.com
12711076SCurtis.Dunham@arm.com    static Serializeable *create(Checkpoint *cp,
12811076SCurtis.Dunham@arm.com                                 const std::string &section);
12911076SCurtis.Dunham@arm.com};
13010905Sandreas.sandberg@arm.com
13110905Sandreas.sandberg@arm.comclass Serializer
132217SN/A{
1334841Ssaidi@eecs.umich.edu    friend class Serializeable;
13410905Sandreas.sandberg@arm.com
13510905Sandreas.sandberg@arm.com  protected:
1364841Ssaidi@eecs.umich.edu    typedef std::list<Serializeable *> serlist_t;
1377948SAli.Saidi@ARM.com    serlist_t objects;
13810905Sandreas.sandberg@arm.com    std::string file;
13910905Sandreas.sandberg@arm.com    std::ostream *output;
1407948SAli.Saidi@ARM.com    std::ostream &out() const;
14111076SCurtis.Dunham@arm.com
14211076SCurtis.Dunham@arm.com  public:
14311076SCurtis.Dunham@arm.com    Serializer();
14411076SCurtis.Dunham@arm.com    virtual ~Serializer();
145237SN/A
14610905Sandreas.sandberg@arm.com  private:
147237SN/A    void add_object(Serializeable *obj);
14813107Sgiacomo.travaglini@arm.com    void add_objects();
14913107Sgiacomo.travaglini@arm.com
15013107Sgiacomo.travaglini@arm.com  public:
15113107Sgiacomo.travaglini@arm.com    void serialize();
15213107Sgiacomo.travaglini@arm.com    const std::string &filename() const { return file; }
15313107Sgiacomo.travaglini@arm.com};
15413107Sgiacomo.travaglini@arm.com
15513107Sgiacomo.travaglini@arm.com//
15613107Sgiacomo.travaglini@arm.com// A SerializeableBuilder serves as an evaluation context for a set of
15713107Sgiacomo.travaglini@arm.com// parameters that describe a specific instance of a Serializeable.  This
15813107Sgiacomo.travaglini@arm.com// evaluation context corresponds to a section in the .ini file (as
15913107Sgiacomo.travaglini@arm.com// with the base ParamContext) plus an optional node in the
16013107Sgiacomo.travaglini@arm.com// configuration hierarchy (the configNode member) for resolving
16113107Sgiacomo.travaglini@arm.com// Serializeable references.  SerializeableBuilder is an abstract superclass;
16213107Sgiacomo.travaglini@arm.com// derived classes specialize the class for particular subclasses of
16313107Sgiacomo.travaglini@arm.com// Serializeable (e.g., BaseCache).
16413107Sgiacomo.travaglini@arm.com//
16513107Sgiacomo.travaglini@arm.com// For typical usage, see the definition of
16613107Sgiacomo.travaglini@arm.com// SerializeableClass::createObject().
16713107Sgiacomo.travaglini@arm.com//
16813107Sgiacomo.travaglini@arm.comclass SerializeableBuilder
16913107Sgiacomo.travaglini@arm.com{
17013107Sgiacomo.travaglini@arm.com  public:
17113107Sgiacomo.travaglini@arm.com
17213107Sgiacomo.travaglini@arm.com    SerializeableBuilder() {}
173217SN/A
174217SN/A    virtual ~SerializeableBuilder() {}
175217SN/A
176237SN/A    // Create the actual Serializeable corresponding to the parameter
17710905Sandreas.sandberg@arm.com    // values in this context.  This function is overridden in derived
178217SN/A    // classes to call a specific constructor for a particular
17910905Sandreas.sandberg@arm.com    // subclass of Serializeable.
18010905Sandreas.sandberg@arm.com    virtual Serializeable *create() = 0;
181217SN/A};
182223SN/A
18310905Sandreas.sandberg@arm.com//
184223SN/A// An instance of SerializeableClass corresponds to a class derived from
18511068Sandreas.sandberg@arm.com// Serializeable.  The SerializeableClass instance serves to bind the string
18611068Sandreas.sandberg@arm.com// name (found in the config file) to a function that creates an
18711068Sandreas.sandberg@arm.com// instance of the appropriate derived class.
18811068Sandreas.sandberg@arm.com//
18911068Sandreas.sandberg@arm.com// This would be much cleaner in Smalltalk or Objective-C, where types
19011068Sandreas.sandberg@arm.com// are first-class objects themselves.
191223SN/A//
1925543Ssaidi@eecs.umich.educlass SerializeableClass
19310905Sandreas.sandberg@arm.com{
194217SN/A  public:
1955543Ssaidi@eecs.umich.edu
19610905Sandreas.sandberg@arm.com    // Type CreateFunc is a pointer to a function that creates a new
197237SN/A    // simulation object builder based on a .ini-file parameter
19810903Sandreas.sandberg@arm.com    // section (specified by the first string argument), a unique name
19910905Sandreas.sandberg@arm.com    // for the object (specified by the second string argument), and
20010903Sandreas.sandberg@arm.com    // an optional config hierarchy node (specified by the third
20110903Sandreas.sandberg@arm.com    // argument).  A pointer to the new SerializeableBuilder is returned.
20210905Sandreas.sandberg@arm.com    typedef Serializeable *(*CreateFunc)(Checkpoint *cp,
20310903Sandreas.sandberg@arm.com                                         const std::string &section);
20410906Sandreas.sandberg@arm.com
20510906Sandreas.sandberg@arm.com    static std::map<std::string,CreateFunc> *classMap;
20610906Sandreas.sandberg@arm.com
20710906Sandreas.sandberg@arm.com    // Constructor.  For example:
20810906Sandreas.sandberg@arm.com    //
20910906Sandreas.sandberg@arm.com    // SerializeableClass baseCacheSerializeableClass("BaseCacheSerializeable",
21011321Ssteve.reinhardt@amd.com    //                         newBaseCacheSerializeableBuilder);
21110906Sandreas.sandberg@arm.com    //
21210908Sandreas.sandberg@arm.com    SerializeableClass(const std::string &className, CreateFunc createFunc);
21310908Sandreas.sandberg@arm.com
21410906Sandreas.sandberg@arm.com    // create Serializeable given name of class and pointer to
21510905Sandreas.sandberg@arm.com    // configuration hierarchy node
216237SN/A    static Serializeable *createObject(Checkpoint *cp,
2175543Ssaidi@eecs.umich.edu                                       const std::string &section);
21811068Sandreas.sandberg@arm.com};
21911068Sandreas.sandberg@arm.com
22011068Sandreas.sandberg@arm.com//
22111068Sandreas.sandberg@arm.com// Macros to encapsulate the magic of declaring & defining
22211068Sandreas.sandberg@arm.com// SerializeableBuilder and SerializeableClass objects
223217SN/A//
2249342SAndreas.Sandberg@arm.com
2252SN/A#define REGISTER_SERIALIZEABLE(CLASS_NAME, OBJ_CLASS)			   \
2269342SAndreas.Sandberg@arm.comSerializeableClass the##OBJ_CLASS##Class(CLASS_NAME,			   \
22710905Sandreas.sandberg@arm.com                                         OBJ_CLASS::createForUnserialize);
22810905Sandreas.sandberg@arm.com
22910905Sandreas.sandberg@arm.comclass Checkpoint
23010905Sandreas.sandberg@arm.com{
23110905Sandreas.sandberg@arm.com  private:
23210905Sandreas.sandberg@arm.com
23310905Sandreas.sandberg@arm.com    IniFile *db;
23410905Sandreas.sandberg@arm.com    const std::string basePath;
23510905Sandreas.sandberg@arm.com    const ConfigNode *configNode;
23610905Sandreas.sandberg@arm.com    std::map<std::string, Serializeable*> objMap;
23710905Sandreas.sandberg@arm.com
23810905Sandreas.sandberg@arm.com  public:
23910905Sandreas.sandberg@arm.com    Checkpoint(const std::string &filename, const std::string &path,
24010905Sandreas.sandberg@arm.com               const ConfigNode *_configNode);
24110905Sandreas.sandberg@arm.com
24210905Sandreas.sandberg@arm.com    bool find(const std::string &section, const std::string &entry,
24310905Sandreas.sandberg@arm.com              std::string &value);
24410905Sandreas.sandberg@arm.com
24510905Sandreas.sandberg@arm.com    bool findObj(const std::string &section, const std::string &entry,
24610905Sandreas.sandberg@arm.com                 Serializeable *&value);
24710905Sandreas.sandberg@arm.com
2489342SAndreas.Sandberg@arm.com    bool sectionExists(const std::string &section);
2499342SAndreas.Sandberg@arm.com};
2509342SAndreas.Sandberg@arm.com
2519342SAndreas.Sandberg@arm.com
2529342SAndreas.Sandberg@arm.com//
2532SN/A// Export checkpoint filename param so other objects can derive
254395SN/A// filenames from it (e.g., memory).
2552SN/A//
2562SN/Astd::string CheckpointFile();
25710905Sandreas.sandberg@arm.comvoid SetupCheckpoint(Tick when, Tick period = 0);
25810905Sandreas.sandberg@arm.com
25910905Sandreas.sandberg@arm.com#endif // __SERIALIZE_HH__
26010905Sandreas.sandberg@arm.com