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 &section,
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 &section,
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 &section,
1658588Sgblack@eecs.umich.edu           const std::string &name, Serializeable * &param)
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 &param);	\
1768588Sgblack@eecs.umich.edutemplate void								\
1778588Sgblack@eecs.umich.eduparamIn(Checkpoint *cp, const std::string &section,			\
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 &section,		\
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 &section);
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 &section)
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 &section)
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 &section)
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 &section, 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 &section, 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