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 §ion, 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 §ion, 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 §ion, 6411800Sbrandon.potter@amd.com const std::string &name, Serializeable * ¶m); 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 §ion) {} 12611076SCurtis.Dunham@arm.com 12711076SCurtis.Dunham@arm.com static Serializeable *create(Checkpoint *cp, 12811076SCurtis.Dunham@arm.com const std::string §ion); 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 §ion); 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 §ion); 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 §ion, const std::string &entry, 24310905Sandreas.sandberg@arm.com std::string &value); 24410905Sandreas.sandberg@arm.com 24510905Sandreas.sandberg@arm.com bool findObj(const std::string §ion, const std::string &entry, 24610905Sandreas.sandberg@arm.com Serializeable *&value); 24710905Sandreas.sandberg@arm.com 2489342SAndreas.Sandberg@arm.com bool sectionExists(const std::string §ion); 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