serialize.cc revision 294
13900Ssaidi@eecs.umich.edu/* 22632Sstever@eecs.umich.edu * Copyright (c) 2003 The Regents of The University of Michigan 32632Sstever@eecs.umich.edu * All rights reserved. 42632Sstever@eecs.umich.edu * 52632Sstever@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 62632Sstever@eecs.umich.edu * modification, are permitted provided that the following conditions are 72632Sstever@eecs.umich.edu * met: redistributions of source code must retain the above copyright 82632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 92632Sstever@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 102632Sstever@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 112632Sstever@eecs.umich.edu * documentation and/or other materials provided with the distribution; 122632Sstever@eecs.umich.edu * neither the name of the copyright holders nor the names of its 132632Sstever@eecs.umich.edu * contributors may be used to endorse or promote products derived from 142632Sstever@eecs.umich.edu * this software without specific prior written permission. 152632Sstever@eecs.umich.edu * 162632Sstever@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172632Sstever@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182632Sstever@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192632Sstever@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202632Sstever@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212632Sstever@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222632Sstever@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232632Sstever@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242632Sstever@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252632Sstever@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262632Sstever@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272632Sstever@eecs.umich.edu */ 282632Sstever@eecs.umich.edu 292632Sstever@eecs.umich.edu#include <sys/time.h> 302632Sstever@eecs.umich.edu 312022SN/A#include <fstream> 322022SN/A#include <list> 332022SN/A#include <string> 342022SN/A#include <vector> 352022SN/A 362469SN/A#include "base/misc.hh" 372469SN/A#include "base/str.hh" 382469SN/A 392469SN/A#include "sim/eventq.hh" 407741Sgblack@eecs.umich.edu#include "sim/param.hh" 4110474Sandreas.hansson@arm.com#include "sim/serialize.hh" 422944Sgblack@eecs.umich.edu#include "base/inifile.hh" 432482SN/A#include "sim/sim_events.hh" 447741Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 453056Sgblack@eecs.umich.edu#include "base/trace.hh" 462469SN/A#include "sim/config_node.hh" 477741Sgblack@eecs.umich.edu 485091Sgblack@eecs.umich.eduusing namespace std; 497790Sgblack@eecs.umich.edu 507790Sgblack@eecs.umich.eduSerializer *Serializeable::serializer = NULL; 515091Sgblack@eecs.umich.edu 527741Sgblack@eecs.umich.eduSerializeable::Serializeable() 535091Sgblack@eecs.umich.edu : serialized(false) 545091Sgblack@eecs.umich.edu{ } 557790Sgblack@eecs.umich.edu 567790Sgblack@eecs.umich.eduSerializeable::~Serializeable() 575091Sgblack@eecs.umich.edu{ } 583056Sgblack@eecs.umich.edu 593056Sgblack@eecs.umich.eduvoid 605091Sgblack@eecs.umich.eduSerializeable::mark() 615091Sgblack@eecs.umich.edu{ 623056Sgblack@eecs.umich.edu if (!serialized) 632482SN/A serializer->add_object(this); 647741Sgblack@eecs.umich.edu 653598Sgblack@eecs.umich.edu serialized = true; 663598Sgblack@eecs.umich.edu} 677741Sgblack@eecs.umich.edu 685091Sgblack@eecs.umich.eduvoid 697790Sgblack@eecs.umich.eduSerializeable::nameOut(ostream &os) 707790Sgblack@eecs.umich.edu{ 715091Sgblack@eecs.umich.edu os << "\n[" << name() << "]\n"; 727741Sgblack@eecs.umich.edu} 735091Sgblack@eecs.umich.edu 745091Sgblack@eecs.umich.eduvoid 757790Sgblack@eecs.umich.eduSerializeable::nameOut(ostream &os, const string &_name) 767790Sgblack@eecs.umich.edu{ 775091Sgblack@eecs.umich.edu os << "\n[" << _name << "]\n"; 785091Sgblack@eecs.umich.edu} 793598Sgblack@eecs.umich.edu 802516SN/Atemplate <class T> 812516SN/Avoid 822516SN/AparamOut(ostream &os, const std::string &name, const T& param) 832516SN/A{ 842482SN/A os << name << "="; 858588Sgblack@eecs.umich.edu showParam(os, param); 868588Sgblack@eecs.umich.edu os << "\n"; 878588Sgblack@eecs.umich.edu} 888588Sgblack@eecs.umich.edu 898588Sgblack@eecs.umich.edu 908588Sgblack@eecs.umich.edutemplate <class T> 912469SN/Avoid 922482SN/AparamIn(Checkpoint *cp, const std::string §ion, 937741Sgblack@eecs.umich.edu const std::string &name, T& param) 948588Sgblack@eecs.umich.edu{ 957741Sgblack@eecs.umich.edu std::string str; 964004Sgblack@eecs.umich.edu if (!cp->find(section, name, str) || !parseParam(str, param)) { 974004Sgblack@eecs.umich.edu fatal("Can't unserialize '%s:%s'\n", section, name); 987741Sgblack@eecs.umich.edu } 995091Sgblack@eecs.umich.edu} 1007790Sgblack@eecs.umich.edu 1017790Sgblack@eecs.umich.edu 1025091Sgblack@eecs.umich.edutemplate <class T> 1037741Sgblack@eecs.umich.eduvoid 1045091Sgblack@eecs.umich.eduarrayParamOut(ostream &os, const std::string &name, 1055091Sgblack@eecs.umich.edu const T *param, int size) 1067790Sgblack@eecs.umich.edu{ 1077790Sgblack@eecs.umich.edu os << name << "="; 1085091Sgblack@eecs.umich.edu if (size > 0) 1094004Sgblack@eecs.umich.edu showParam(os, param[0]); 1105091Sgblack@eecs.umich.edu for (int i = 1; i < size; ++i) { 1115091Sgblack@eecs.umich.edu os << " "; 1125091Sgblack@eecs.umich.edu showParam(os, param[i]); 1135091Sgblack@eecs.umich.edu } 1145091Sgblack@eecs.umich.edu os << "\n"; 1155091Sgblack@eecs.umich.edu} 1165091Sgblack@eecs.umich.edu 1175091Sgblack@eecs.umich.edu 1184004Sgblack@eecs.umich.edutemplate <class T> 1194004Sgblack@eecs.umich.eduvoid 1204004Sgblack@eecs.umich.eduarrayParamIn(Checkpoint *cp, const std::string §ion, 1217741Sgblack@eecs.umich.edu const std::string &name, T *param, int size) 1224004Sgblack@eecs.umich.edu{ 1234004Sgblack@eecs.umich.edu std::string str; 1247741Sgblack@eecs.umich.edu if (!cp->find(section, name, str)) { 1255091Sgblack@eecs.umich.edu fatal("Can't unserialize '%s:%s'\n", section, name); 1267790Sgblack@eecs.umich.edu } 1277790Sgblack@eecs.umich.edu 1285091Sgblack@eecs.umich.edu // code below stolen from VectorParam<T>::parse(). 1297741Sgblack@eecs.umich.edu // it would be nice to unify these somehow... 1305091Sgblack@eecs.umich.edu 1315091Sgblack@eecs.umich.edu vector<string> tokens; 1327790Sgblack@eecs.umich.edu 1337790Sgblack@eecs.umich.edu tokenize(tokens, str, ' '); 1345091Sgblack@eecs.umich.edu 1355091Sgblack@eecs.umich.edu // Need this if we were doing a vector 1365091Sgblack@eecs.umich.edu // value.resize(tokens.size()); 1374004Sgblack@eecs.umich.edu 1384004Sgblack@eecs.umich.edu if (tokens.size() != size) { 1392469SN/A fatal("Array size mismatch on %s:%s'\n", section, name); 1402944Sgblack@eecs.umich.edu } 1417837Sgblack@eecs.umich.edu 1428829Sgblack@eecs.umich.edu for (int i = 0; i < tokens.size(); i++) { 1437837Sgblack@eecs.umich.edu // need to parse into local variable to handle vector<bool>, 1448342Sksewell@umich.edu // for which operator[] returns a special reference class 1452469SN/A // that's not the same as 'bool&', (since it's a packed 1462482SN/A // vector) 1478588Sgblack@eecs.umich.edu T scalar_value; 1488588Sgblack@eecs.umich.edu if (!parseParam(tokens[i], scalar_value)) { 1498588Sgblack@eecs.umich.edu string err("could not parse \""); 1508588Sgblack@eecs.umich.edu 1518588Sgblack@eecs.umich.edu err += str; 1528588Sgblack@eecs.umich.edu err += "\""; 1538588Sgblack@eecs.umich.edu 1548588Sgblack@eecs.umich.edu fatal(err); 1558588Sgblack@eecs.umich.edu } 1568588Sgblack@eecs.umich.edu 1572469SN/A // assign parsed value to vector 1588588Sgblack@eecs.umich.edu param[i] = scalar_value; 1592646Ssaidi@eecs.umich.edu } 1602482SN/A} 1612469SN/A 1628588Sgblack@eecs.umich.edu 1638588Sgblack@eecs.umich.eduvoid 1642482SN/AobjParamIn(Checkpoint *cp, const std::string §ion, 1658588Sgblack@eecs.umich.edu const std::string &name, Serializeable * ¶m) 1662469SN/A{ 1677741Sgblack@eecs.umich.edu if (!cp->findObj(section, name, param)) { 16810474Sandreas.hansson@arm.com fatal("Can't unserialize '%s:%s'\n", section, name); 1697741Sgblack@eecs.umich.edu } 1708588Sgblack@eecs.umich.edu} 1712482SN/A 1722469SN/A 1737741Sgblack@eecs.umich.edu#define INSTANTIATE_PARAM_TEMPLATES(type) \ 17410474Sandreas.hansson@arm.comtemplate void \ 1757741Sgblack@eecs.umich.eduparamOut(ostream &os, const std::string &name, type const ¶m); \ 1768588Sgblack@eecs.umich.edutemplate void \ 1778588Sgblack@eecs.umich.eduparamIn(Checkpoint *cp, const std::string §ion, \ 1788588Sgblack@eecs.umich.edu const std::string &name, type & param); \ 1792482SN/Atemplate void \ 1802482SN/AarrayParamOut(ostream &os, const std::string &name, \ 1812482SN/A type const *param, int size); \ 1828588Sgblack@eecs.umich.edutemplate void \ 18310474Sandreas.hansson@arm.comarrayParamIn(Checkpoint *cp, const std::string §ion, \ 1847741Sgblack@eecs.umich.edu const std::string &name, type *param, int size); 1858588Sgblack@eecs.umich.edu 1868588Sgblack@eecs.umich.edu 1878588Sgblack@eecs.umich.eduINSTANTIATE_PARAM_TEMPLATES(int8_t) 1887741Sgblack@eecs.umich.eduINSTANTIATE_PARAM_TEMPLATES(uint8_t) 1898588Sgblack@eecs.umich.eduINSTANTIATE_PARAM_TEMPLATES(int16_t) 1908588Sgblack@eecs.umich.eduINSTANTIATE_PARAM_TEMPLATES(uint16_t) 1917741Sgblack@eecs.umich.eduINSTANTIATE_PARAM_TEMPLATES(int32_t) 1928588Sgblack@eecs.umich.eduINSTANTIATE_PARAM_TEMPLATES(uint32_t) 1937741Sgblack@eecs.umich.eduINSTANTIATE_PARAM_TEMPLATES(int64_t) 1942482SN/AINSTANTIATE_PARAM_TEMPLATES(uint64_t) 1952526SN/AINSTANTIATE_PARAM_TEMPLATES(bool) 1962469SN/AINSTANTIATE_PARAM_TEMPLATES(string) 1972482SN/A 1982469SN/A 1995093Sgblack@eecs.umich.edu#if 0 2005093Sgblack@eecs.umich.edu// unneeded? 2015093Sgblack@eecs.umich.eduvoid 2022482SN/ASerializeable::childOut(const string &name, Serializeable *child) 2032482SN/A{ 2042482SN/A child->mark(); 2052469SN/A if (child->name() == "") 2065093Sgblack@eecs.umich.edu panic("child is unnamed"); 2075093Sgblack@eecs.umich.edu 2085093Sgblack@eecs.umich.edu out() << name << "=" << child->name() << "\n"; 2092482SN/A} 2102482SN/A#endif 2112482SN/A 2122469SN/ASerializer::Serializer() 2135093Sgblack@eecs.umich.edu{ } 2145093Sgblack@eecs.umich.edu 2155093Sgblack@eecs.umich.eduSerializer::~Serializer() 2163765Sgblack@eecs.umich.edu{ } 2172615SN/A 2188588Sgblack@eecs.umich.eduostream & 2193765Sgblack@eecs.umich.eduSerializer::out() const 2203765Sgblack@eecs.umich.edu{ 2212615SN/A if (!output) 2228588Sgblack@eecs.umich.edu panic("must set output before serializing"); 2233765Sgblack@eecs.umich.edu 2242469SN/A return *output; 2255093Sgblack@eecs.umich.edu} 2265093Sgblack@eecs.umich.edu 2275093Sgblack@eecs.umich.eduvoid 2283765Sgblack@eecs.umich.eduSerializer::add_object(Serializeable *obj) 2298588Sgblack@eecs.umich.edu{ 23010474Sandreas.hansson@arm.com objects.push_back(obj); 2317741Sgblack@eecs.umich.edu} 2328588Sgblack@eecs.umich.edu 2335093Sgblack@eecs.umich.eduvoid 2346639Svince@csl.cornell.eduSerializer::add_objects() 2358588Sgblack@eecs.umich.edu{ 2365093Sgblack@eecs.umich.edu mainEventQueue.mark(); 2377741Sgblack@eecs.umich.edu 23810474Sandreas.hansson@arm.com SimObject::SimObjectList::iterator i = SimObject::simObjectList.begin(); 2397741Sgblack@eecs.umich.edu SimObject::SimObjectList::iterator end = SimObject::simObjectList.end(); 2408588Sgblack@eecs.umich.edu 2415093Sgblack@eecs.umich.edu while (i != end) { 2427741Sgblack@eecs.umich.edu (*i)->mark(); 2437741Sgblack@eecs.umich.edu ++i; 2447741Sgblack@eecs.umich.edu } 2457741Sgblack@eecs.umich.edu} 2465093Sgblack@eecs.umich.edu 2475093Sgblack@eecs.umich.eduvoid 2485093Sgblack@eecs.umich.eduSerializer::serialize() 2498588Sgblack@eecs.umich.edu{ 2505093Sgblack@eecs.umich.edu if (Serializeable::serializer != NULL) 2517741Sgblack@eecs.umich.edu panic("in process of serializing!"); 25210474Sandreas.hansson@arm.com 2537741Sgblack@eecs.umich.edu Serializeable::serializer = this; 2548588Sgblack@eecs.umich.edu 2555093Sgblack@eecs.umich.edu file = CheckpointFile(); 2565093Sgblack@eecs.umich.edu string cpt_file = file + ".cpt"; 2577741Sgblack@eecs.umich.edu output = new ofstream(cpt_file.c_str()); 2587741Sgblack@eecs.umich.edu time_t t = time(NULL); 2597741Sgblack@eecs.umich.edu *output << "// checkpoint generated: " << ctime(&t); 2607741Sgblack@eecs.umich.edu 2615093Sgblack@eecs.umich.edu serlist_t list; 2625093Sgblack@eecs.umich.edu 2632469SN/A add_objects(); 2645093Sgblack@eecs.umich.edu while (!objects.empty()) { 2655093Sgblack@eecs.umich.edu Serializeable *obj = objects.front(); 2665093Sgblack@eecs.umich.edu DPRINTF(Serialize, "Serializing %s\n", obj->name()); 2675093Sgblack@eecs.umich.edu obj->nameOut(out()); 2685093Sgblack@eecs.umich.edu obj->serialize(out()); 2695093Sgblack@eecs.umich.edu objects.pop_front(); 2702469SN/A list.push_back(obj); 2715093Sgblack@eecs.umich.edu } 2725093Sgblack@eecs.umich.edu 2735093Sgblack@eecs.umich.edu while (!list.empty()) { 2745093Sgblack@eecs.umich.edu list.front()->serialized = false; 2755093Sgblack@eecs.umich.edu list.pop_front(); 2765093Sgblack@eecs.umich.edu } 2772469SN/A 2785093Sgblack@eecs.umich.edu Serializeable::serializer = NULL; 2795093Sgblack@eecs.umich.edu 2805093Sgblack@eecs.umich.edu delete output; 2815093Sgblack@eecs.umich.edu output = NULL; 2827741Sgblack@eecs.umich.edu file = ""; 28310474Sandreas.hansson@arm.com} 2845093Sgblack@eecs.umich.edu 2852469SN/Aclass SerializeEvent : public Event 2865093Sgblack@eecs.umich.edu{ 2875093Sgblack@eecs.umich.edu protected: 2885093Sgblack@eecs.umich.edu string file; 2895093Sgblack@eecs.umich.edu Tick repeat; 2907741Sgblack@eecs.umich.edu 29110474Sandreas.hansson@arm.com public: 2925093Sgblack@eecs.umich.edu SerializeEvent(Tick _when, Tick _repeat); 2932469SN/A virtual void process(); 2945093Sgblack@eecs.umich.edu virtual void serialize(std::ostream &os) 2954237Sgblack@eecs.umich.edu { 2967741Sgblack@eecs.umich.edu panic("Cannot serialize the SerializeEvent"); 2975093Sgblack@eecs.umich.edu } 2987741Sgblack@eecs.umich.edu 2995093Sgblack@eecs.umich.edu}; 3005093Sgblack@eecs.umich.edu 3017741Sgblack@eecs.umich.eduSerializeEvent::SerializeEvent(Tick _when, Tick _repeat) 3025093Sgblack@eecs.umich.edu : Event(&mainEventQueue, 990), repeat(_repeat) 3035093Sgblack@eecs.umich.edu{ 3045093Sgblack@eecs.umich.edu setFlags(AutoDelete); 3057741Sgblack@eecs.umich.edu schedule(_when); 3065093Sgblack@eecs.umich.edu} 3075093Sgblack@eecs.umich.edu 3082526SN/Avoid 3092526SN/ASerializeEvent::process() 3102526SN/A{ 3112526SN/A Serializer serial; 3122526SN/A serial.serialize(); 3132526SN/A if (repeat) 3142469SN/A schedule(curTick + repeat); 3152526SN/A} 3168588Sgblack@eecs.umich.edu 3178588Sgblack@eecs.umich.edustring __CheckpointFileBase; 3182526SN/A 3192526SN/Astring 3208588Sgblack@eecs.umich.eduCheckpointFile() 3218588Sgblack@eecs.umich.edu{ 3222526SN/A if (__CheckpointFileBase.empty()) 3232954Sgblack@eecs.umich.edu return __CheckpointFileBase; 3243929Ssaidi@eecs.umich.edu 3257741Sgblack@eecs.umich.edu return csprintf("%s.%d", __CheckpointFileBase, curTick); 3263587Sgblack@eecs.umich.edu} 3273587Sgblack@eecs.umich.edu 3285094Sgblack@eecs.umich.eduvoid 3293587Sgblack@eecs.umich.eduSetupCheckpoint(Tick when, Tick period) 3308829Sgblack@eecs.umich.edu{ 3317790Sgblack@eecs.umich.edu new SerializeEvent(when, period); 3323587Sgblack@eecs.umich.edu} 3337790Sgblack@eecs.umich.edu 3347720Sgblack@eecs.umich.educlass SerializeParamContext : public ParamContext 3353587Sgblack@eecs.umich.edu{ 3367741Sgblack@eecs.umich.edu private: 3373587Sgblack@eecs.umich.edu SerializeEvent *event; 3383587Sgblack@eecs.umich.edu 3397741Sgblack@eecs.umich.edu public: 3403587Sgblack@eecs.umich.edu SerializeParamContext(const string §ion); 34112289Sgabeblack@google.com ~SerializeParamContext(); 34212289Sgabeblack@google.com void checkParams(); 3432954Sgblack@eecs.umich.edu}; 3443587Sgblack@eecs.umich.edu 3455094Sgblack@eecs.umich.eduSerializeParamContext serialParams("serialize"); 3467741Sgblack@eecs.umich.edu 3473587Sgblack@eecs.umich.eduParam<string> serialize_file(&serialParams, 3484010Ssaidi@eecs.umich.edu "file", 3494010Ssaidi@eecs.umich.edu "file to write to", "m5"); 3504010Ssaidi@eecs.umich.edu 3514010Ssaidi@eecs.umich.eduParam<Counter> serialize_cycle(&serialParams, 3522954Sgblack@eecs.umich.edu "cycle", 3537741Sgblack@eecs.umich.edu "cycle to serialize", 3543587Sgblack@eecs.umich.edu 0); 3553823Ssaidi@eecs.umich.edu 3565094Sgblack@eecs.umich.eduParam<Counter> serialize_period(&serialParams, 3573823Ssaidi@eecs.umich.edu "period", 3583598Sgblack@eecs.umich.edu "period to repeat serializations", 3598829Sgblack@eecs.umich.edu 0); 3603598Sgblack@eecs.umich.edu 3613598Sgblack@eecs.umich.edu 3623598Sgblack@eecs.umich.edu 3633598Sgblack@eecs.umich.eduSerializeParamContext::SerializeParamContext(const string §ion) 3647741Sgblack@eecs.umich.edu : ParamContext(section), event(NULL) 3657741Sgblack@eecs.umich.edu{ } 3667741Sgblack@eecs.umich.edu 3672954Sgblack@eecs.umich.eduSerializeParamContext::~SerializeParamContext() 3683587Sgblack@eecs.umich.edu{ 3693587Sgblack@eecs.umich.edu} 37012287Sgabeblack@google.com 3717741Sgblack@eecs.umich.eduvoid 3723587Sgblack@eecs.umich.eduSerializeParamContext::checkParams() 3737741Sgblack@eecs.umich.edu{ 3743587Sgblack@eecs.umich.edu __CheckpointFileBase = serialize_file; 3753587Sgblack@eecs.umich.edu if (serialize_cycle > 0) 3767741Sgblack@eecs.umich.edu SetupCheckpoint(serialize_cycle, serialize_period); 3773823Ssaidi@eecs.umich.edu} 3783587Sgblack@eecs.umich.edu 3793587Sgblack@eecs.umich.eduvoid 38012287Sgabeblack@google.comdebug_serialize() 38112287Sgabeblack@google.com{ 38212287Sgabeblack@google.com Serializer serial; 38312287Sgabeblack@google.com serial.serialize(); 3843823Ssaidi@eecs.umich.edu} 3853587Sgblack@eecs.umich.edu 3863587Sgblack@eecs.umich.eduvoid 3873587Sgblack@eecs.umich.edudebug_serialize(Tick when) 3883587Sgblack@eecs.umich.edu{ 3893587Sgblack@eecs.umich.edu new SerializeEvent(when, 0); 3903587Sgblack@eecs.umich.edu} 3913587Sgblack@eecs.umich.edu 3923587Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////// 3933587Sgblack@eecs.umich.edu// 3943587Sgblack@eecs.umich.edu// SerializeableClass member definitions 3957741Sgblack@eecs.umich.edu// 3963587Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////////// 3977741Sgblack@eecs.umich.edu 3983587Sgblack@eecs.umich.edu// Map of class names to SerializeableBuilder creation functions. 3992526SN/A// Need to make this a pointer so we can force initialization on the 4007741Sgblack@eecs.umich.edu// first reference; otherwise, some SerializeableClass constructors 4017741Sgblack@eecs.umich.edu// may be invoked before the classMap constructor. 40210474Sandreas.hansson@arm.commap<string,SerializeableClass::CreateFunc> *SerializeableClass::classMap = 0; 4032526SN/A 40410474Sandreas.hansson@arm.com// SerializeableClass constructor: add mapping to classMap 4052526SN/ASerializeableClass::SerializeableClass(const string &className, 4062526SN/A CreateFunc createFunc) 4072526SN/A{ 4082469SN/A if (classMap == NULL) 4097085Sgblack@eecs.umich.edu classMap = new map<string,SerializeableClass::CreateFunc>(); 4107085Sgblack@eecs.umich.edu 4117085Sgblack@eecs.umich.edu if ((*classMap)[className]) 4127741Sgblack@eecs.umich.edu { 4137085Sgblack@eecs.umich.edu cerr << "Error: simulation object class " << className << " redefined" 4147085Sgblack@eecs.umich.edu << endl; 4157085Sgblack@eecs.umich.edu fatal(""); 4167085Sgblack@eecs.umich.edu } 4177085Sgblack@eecs.umich.edu 4187741Sgblack@eecs.umich.edu // add className --> createFunc to class map 4197085Sgblack@eecs.umich.edu (*classMap)[className] = createFunc; 4207085Sgblack@eecs.umich.edu} 4217085Sgblack@eecs.umich.edu 4227085Sgblack@eecs.umich.edu 4237085Sgblack@eecs.umich.edu// 4247741Sgblack@eecs.umich.edu// 4257085Sgblack@eecs.umich.eduSerializeable * 4267085Sgblack@eecs.umich.eduSerializeableClass::createObject(Checkpoint *cp, 4277085Sgblack@eecs.umich.edu const std::string §ion) 4287085Sgblack@eecs.umich.edu{ 4297085Sgblack@eecs.umich.edu string className; 4307741Sgblack@eecs.umich.edu 4317085Sgblack@eecs.umich.edu if (!cp->find(section, "type", className)) { 4327085Sgblack@eecs.umich.edu fatal("Serializeable::create: no 'type' entry in section '%s'.\n", 4337085Sgblack@eecs.umich.edu section); 4347085Sgblack@eecs.umich.edu } 4357085Sgblack@eecs.umich.edu 4362526SN/A CreateFunc createFunc = (*classMap)[className]; 4372526SN/A 4382526SN/A if (createFunc == NULL) { 4397741Sgblack@eecs.umich.edu fatal("Serializeable::create: no create function for class '%s'.\n", 4402591SN/A className); 4412591SN/A } 4422591SN/A 4432526SN/A Serializeable *object = createFunc(cp, section); 4442526SN/A 4457741Sgblack@eecs.umich.edu assert(object != NULL); 4462591SN/A 4472591SN/A return object; 4482591SN/A} 4492526SN/A 4502224SN/A 4512526SN/ASerializeable * 4522526SN/ASerializeable::create(Checkpoint *cp, const std::string §ion) 4538588Sgblack@eecs.umich.edu{ 45410474Sandreas.hansson@arm.com Serializeable *object = SerializeableClass::createObject(cp, section); 4557741Sgblack@eecs.umich.edu object->unserialize(cp, section); 4568588Sgblack@eecs.umich.edu return object; 4572526SN/A} 45810474Sandreas.hansson@arm.com 4592526SN/A 4602526SN/ACheckpoint::Checkpoint(const std::string &filename, const std::string &path, 4618588Sgblack@eecs.umich.edu const ConfigNode *_configNode) 4628588Sgblack@eecs.umich.edu : db(new IniFile), basePath(path), configNode(_configNode) 4638588Sgblack@eecs.umich.edu{ 4648588Sgblack@eecs.umich.edu if (!db->load(filename)) { 4658588Sgblack@eecs.umich.edu fatal("Can't load checkpoint file '%s'\n", filename); 4668588Sgblack@eecs.umich.edu } 4672526SN/A 4683587Sgblack@eecs.umich.edu mainEventQueue.unserialize(this, "MainEventQueue"); 4693929Ssaidi@eecs.umich.edu} 4707741Sgblack@eecs.umich.edu 4713587Sgblack@eecs.umich.edu 47212287Sgabeblack@google.combool 4737784SAli.Saidi@ARM.comCheckpoint::find(const std::string §ion, const std::string &entry, 4747741Sgblack@eecs.umich.edu std::string &value) 4753587Sgblack@eecs.umich.edu{ 4767741Sgblack@eecs.umich.edu return db->find(section, entry, value); 47710474Sandreas.hansson@arm.com} 4783587Sgblack@eecs.umich.edu 4795094Sgblack@eecs.umich.edu 4807741Sgblack@eecs.umich.edubool 4813587Sgblack@eecs.umich.eduCheckpoint::findObj(const std::string §ion, const std::string &entry, 4828829Sgblack@eecs.umich.edu Serializeable *&value) 48310474Sandreas.hansson@arm.com{ 4843587Sgblack@eecs.umich.edu string path; 4853587Sgblack@eecs.umich.edu 4863587Sgblack@eecs.umich.edu if (!db->find(section, entry, path)) 4873587Sgblack@eecs.umich.edu return false; 4883587Sgblack@eecs.umich.edu 4893823Ssaidi@eecs.umich.edu if ((value = configNode->resolveSimObject(path)) != NULL) 4903587Sgblack@eecs.umich.edu return true; 4918829Sgblack@eecs.umich.edu 49210474Sandreas.hansson@arm.com if ((value = objMap[path]) != NULL) 4933823Ssaidi@eecs.umich.edu return true; 4943587Sgblack@eecs.umich.edu 4953823Ssaidi@eecs.umich.edu return false; 4963598Sgblack@eecs.umich.edu} 4973598Sgblack@eecs.umich.edu