serialize.hh revision 13414
12SN/A/*
213107Sgiacomo.travaglini@arm.com * Copyright (c) 2015, 2018 ARM Limited
310905Sandreas.sandberg@arm.com * All rights reserved
410905Sandreas.sandberg@arm.com *
510905Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
610905Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
710905Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
810905Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
910905Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1010905Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1110905Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1210905Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1310905Sandreas.sandberg@arm.com *
141762SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan
152SN/A * All rights reserved.
162SN/A *
172SN/A * Redistribution and use in source and binary forms, with or without
182SN/A * modification, are permitted provided that the following conditions are
192SN/A * met: redistributions of source code must retain the above copyright
202SN/A * notice, this list of conditions and the following disclaimer;
212SN/A * redistributions in binary form must reproduce the above copyright
222SN/A * notice, this list of conditions and the following disclaimer in the
232SN/A * documentation and/or other materials provided with the distribution;
242SN/A * neither the name of the copyright holders nor the names of its
252SN/A * contributors may be used to endorse or promote products derived from
262SN/A * this software without specific prior written permission.
272SN/A *
282SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
292SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
302SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
312SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
322SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
332SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
342SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
352SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
362SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
372SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
382SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
392665Ssaidi@eecs.umich.edu *
402760Sbinkertn@umich.edu * Authors: Nathan Binkert
412760Sbinkertn@umich.edu *          Erik Hallnor
422665Ssaidi@eecs.umich.edu *          Steve Reinhardt
4310905Sandreas.sandberg@arm.com *          Andreas Sandberg
442SN/A */
452SN/A
462SN/A/* @file
472SN/A * Serialization Interface Declarations
482SN/A */
492SN/A
502SN/A#ifndef __SERIALIZE_HH__
512SN/A#define __SERIALIZE_HH__
522SN/A
532SN/A
5413107Sgiacomo.travaglini@arm.com#include <algorithm>
558229Snate@binkert.org#include <iostream>
562SN/A#include <list>
578229Snate@binkert.org#include <map>
5810905Sandreas.sandberg@arm.com#include <stack>
5911076SCurtis.Dunham@arm.com#include <set>
604841Ssaidi@eecs.umich.edu#include <vector>
612SN/A
6210459SAndreas.Sandberg@ARM.com#include "base/bitunion.hh"
6313414Sgiacomo.travaglini@arm.com#include "base/logging.hh"
6413414Sgiacomo.travaglini@arm.com#include "base/str.hh"
652SN/A
662738Sstever@eecs.umich.educlass IniFile;
674000Ssaidi@eecs.umich.educlass SimObject;
6811067Sandreas.sandberg@arm.comclass SimObjectResolver;
692SN/A
7010905Sandreas.sandberg@arm.comtypedef std::ostream CheckpointOut;
7110905Sandreas.sandberg@arm.com
7213414Sgiacomo.travaglini@arm.comclass CheckpointIn
7313414Sgiacomo.travaglini@arm.com{
7413414Sgiacomo.travaglini@arm.com  private:
7510905Sandreas.sandberg@arm.com
7613414Sgiacomo.travaglini@arm.com    IniFile *db;
77217SN/A
7813414Sgiacomo.travaglini@arm.com    SimObjectResolver &objNameResolver;
7910459SAndreas.Sandberg@ARM.com
8013414Sgiacomo.travaglini@arm.com  public:
8113414Sgiacomo.travaglini@arm.com    CheckpointIn(const std::string &cpt_dir, SimObjectResolver &resolver);
8213414Sgiacomo.travaglini@arm.com    ~CheckpointIn();
83217SN/A
8413414Sgiacomo.travaglini@arm.com    const std::string cptDir;
8510459SAndreas.Sandberg@ARM.com
8613414Sgiacomo.travaglini@arm.com    bool find(const std::string &section, const std::string &entry,
8713414Sgiacomo.travaglini@arm.com              std::string &value);
886820SLisa.Hsu@amd.com
8913414Sgiacomo.travaglini@arm.com    bool findObj(const std::string &section, const std::string &entry,
9013414Sgiacomo.travaglini@arm.com                 SimObject *&value);
9110459SAndreas.Sandberg@ARM.com
92217SN/A
9313414Sgiacomo.travaglini@arm.com    bool entryExists(const std::string &section, const std::string &entry);
9413414Sgiacomo.travaglini@arm.com    bool sectionExists(const std::string &section);
954841Ssaidi@eecs.umich.edu
9613414Sgiacomo.travaglini@arm.com    // The following static functions have to do with checkpoint
9713414Sgiacomo.travaglini@arm.com    // creation rather than restoration.  This class makes a handy
9813414Sgiacomo.travaglini@arm.com    // namespace for them though.  Currently no Checkpoint object is
9913414Sgiacomo.travaglini@arm.com    // created on serialization (only unserialization) so we track the
10013414Sgiacomo.travaglini@arm.com    // directory name as a global.  It would be nice to change this
10113414Sgiacomo.travaglini@arm.com    // someday
1027948SAli.Saidi@ARM.com
10313414Sgiacomo.travaglini@arm.com  private:
10413414Sgiacomo.travaglini@arm.com    // current directory we're serializing into.
10513414Sgiacomo.travaglini@arm.com    static std::string currentDirectory;
10611076SCurtis.Dunham@arm.com
10713414Sgiacomo.travaglini@arm.com  public:
10813414Sgiacomo.travaglini@arm.com    // Set the current directory.  This function takes care of
10913414Sgiacomo.travaglini@arm.com    // inserting curTick() if there's a '%d' in the argument, and
11013414Sgiacomo.travaglini@arm.com    // appends a '/' if necessary.  The final name is returned.
11113414Sgiacomo.travaglini@arm.com    static std::string setDir(const std::string &base_name);
112217SN/A
11313414Sgiacomo.travaglini@arm.com    // Export current checkpoint directory name so other objects can
11413414Sgiacomo.travaglini@arm.com    // derive filenames from it (e.g., memory).  The return value is
11513414Sgiacomo.travaglini@arm.com    // guaranteed to end in '/' so filenames can be directly appended.
11613414Sgiacomo.travaglini@arm.com    // This function is only valid while a checkpoint is being created.
11713414Sgiacomo.travaglini@arm.com    static std::string dir();
1184841Ssaidi@eecs.umich.edu
11913414Sgiacomo.travaglini@arm.com    // Filename for base checkpoint file within directory.
12013414Sgiacomo.travaglini@arm.com    static const char *baseFilename;
12113414Sgiacomo.travaglini@arm.com};
122217SN/A
1239342SAndreas.Sandberg@arm.com/**
1242SN/A * Basic support for object serialization.
1259342SAndreas.Sandberg@arm.com *
12610905Sandreas.sandberg@arm.com * Objects that support serialization should derive from this
12710905Sandreas.sandberg@arm.com * class. Such objects can largely be divided into two categories: 1)
12810905Sandreas.sandberg@arm.com * True SimObjects (deriving from SimObject), and 2) child objects
12910905Sandreas.sandberg@arm.com * (non-SimObjects).
13010905Sandreas.sandberg@arm.com *
13110905Sandreas.sandberg@arm.com * SimObjects are serialized automatically into their own sections
13210905Sandreas.sandberg@arm.com * automatically by the SimObject base class (see
13310905Sandreas.sandberg@arm.com * SimObject::serializeAll().
13410905Sandreas.sandberg@arm.com *
13510905Sandreas.sandberg@arm.com * SimObjects can contain other serializable objects that are not
13610905Sandreas.sandberg@arm.com * SimObjects. Much like normal serialized members are not serialized
13710905Sandreas.sandberg@arm.com * automatically, these objects will not be serialized automatically
13810905Sandreas.sandberg@arm.com * and it is expected that the objects owning such serializable
13910905Sandreas.sandberg@arm.com * objects call the required serialization/unserialization methods on
14010905Sandreas.sandberg@arm.com * child objects. The preferred method to serialize a child object is
14110905Sandreas.sandberg@arm.com * to call serializeSection() on the child, which serializes the
14210905Sandreas.sandberg@arm.com * object into a new subsection in the current section. Another option
14310905Sandreas.sandberg@arm.com * is to call serialize() directly, which serializes the object into
14410905Sandreas.sandberg@arm.com * the current section. The latter is not recommended as it can lead
14510905Sandreas.sandberg@arm.com * to naming clashes between objects.
14610905Sandreas.sandberg@arm.com *
1479342SAndreas.Sandberg@arm.com * @note Many objects that support serialization need to be put in a
1489342SAndreas.Sandberg@arm.com * consistent state when serialization takes place. We refer to the
1499342SAndreas.Sandberg@arm.com * action of forcing an object into a consistent state as
1509342SAndreas.Sandberg@arm.com * 'draining'. Objects that need draining inherit from Drainable. See
1519342SAndreas.Sandberg@arm.com * Drainable for more information.
1522SN/A */
153395SN/Aclass Serializable
1542SN/A{
1552SN/A  protected:
15610905Sandreas.sandberg@arm.com    /**
15710905Sandreas.sandberg@arm.com     * Scoped checkpoint section helper class
15810905Sandreas.sandberg@arm.com     *
15910905Sandreas.sandberg@arm.com     * This helper class creates a section within a checkpoint without
16010905Sandreas.sandberg@arm.com     * the need for a separate serializeable object. It is mainly used
16110905Sandreas.sandberg@arm.com     * within the Serializable class when serializing or unserializing
16210905Sandreas.sandberg@arm.com     * section (see serializeSection() and unserializeSection()). It
16310905Sandreas.sandberg@arm.com     * can also be used to maintain backwards compatibility in
16410905Sandreas.sandberg@arm.com     * existing code that serializes structs that are not inheriting
16510905Sandreas.sandberg@arm.com     * from Serializable into subsections.
16610905Sandreas.sandberg@arm.com     *
16710905Sandreas.sandberg@arm.com     * When the class is instantiated, it appends a name to the active
16810905Sandreas.sandberg@arm.com     * path in a checkpoint. The old path is later restored when the
16910905Sandreas.sandberg@arm.com     * instance is destroyed. For example, serializeSection() could be
17010905Sandreas.sandberg@arm.com     * implemented by instantiating a ScopedCheckpointSection and then
17110905Sandreas.sandberg@arm.com     * calling serialize() on an object.
17210905Sandreas.sandberg@arm.com     */
17310905Sandreas.sandberg@arm.com    class ScopedCheckpointSection {
17410905Sandreas.sandberg@arm.com      public:
17510905Sandreas.sandberg@arm.com        template<class CP>
17610905Sandreas.sandberg@arm.com        ScopedCheckpointSection(CP &cp, const char *name) {
17710905Sandreas.sandberg@arm.com            pushName(name);
17810905Sandreas.sandberg@arm.com            nameOut(cp);
17910905Sandreas.sandberg@arm.com        }
18010905Sandreas.sandberg@arm.com
18110905Sandreas.sandberg@arm.com        template<class CP>
18210905Sandreas.sandberg@arm.com        ScopedCheckpointSection(CP &cp, const std::string &name) {
18310905Sandreas.sandberg@arm.com            pushName(name.c_str());
18410905Sandreas.sandberg@arm.com            nameOut(cp);
18510905Sandreas.sandberg@arm.com        }
18610905Sandreas.sandberg@arm.com
18710905Sandreas.sandberg@arm.com        ~ScopedCheckpointSection();
18810905Sandreas.sandberg@arm.com
18910905Sandreas.sandberg@arm.com        ScopedCheckpointSection() = delete;
19010905Sandreas.sandberg@arm.com        ScopedCheckpointSection(const ScopedCheckpointSection &) = delete;
19110905Sandreas.sandberg@arm.com        ScopedCheckpointSection &operator=(
19210905Sandreas.sandberg@arm.com            const ScopedCheckpointSection &) = delete;
19310905Sandreas.sandberg@arm.com        ScopedCheckpointSection &operator=(
19410905Sandreas.sandberg@arm.com            ScopedCheckpointSection &&) = delete;
19510905Sandreas.sandberg@arm.com
19610905Sandreas.sandberg@arm.com      private:
19710905Sandreas.sandberg@arm.com        void pushName(const char *name);
19810905Sandreas.sandberg@arm.com        void nameOut(CheckpointOut &cp);
19910905Sandreas.sandberg@arm.com        void nameOut(CheckpointIn &cp) {};
20010905Sandreas.sandberg@arm.com    };
2012SN/A
2022SN/A  public:
2035739Snate@binkert.org    Serializable();
2045739Snate@binkert.org    virtual ~Serializable();
2052SN/A
20610905Sandreas.sandberg@arm.com    /**
20710905Sandreas.sandberg@arm.com     * Serialize an object
20810905Sandreas.sandberg@arm.com     *
20910905Sandreas.sandberg@arm.com     * Output an object's state into the current checkpoint section.
21010905Sandreas.sandberg@arm.com     *
21110905Sandreas.sandberg@arm.com     * @param cp Checkpoint state
21210905Sandreas.sandberg@arm.com     */
21310905Sandreas.sandberg@arm.com    virtual void serialize(CheckpointOut &cp) const = 0;
2142SN/A
21510905Sandreas.sandberg@arm.com    /**
21610905Sandreas.sandberg@arm.com     * Unserialize an object
21710905Sandreas.sandberg@arm.com     *
21810905Sandreas.sandberg@arm.com     * Read an object's state from the current checkpoint section.
21910905Sandreas.sandberg@arm.com     *
22010905Sandreas.sandberg@arm.com     * @param cp Checkpoint state
22110905Sandreas.sandberg@arm.com     */
22210905Sandreas.sandberg@arm.com    virtual void unserialize(CheckpointIn &cp) = 0;
223237SN/A
22410905Sandreas.sandberg@arm.com    /**
22510905Sandreas.sandberg@arm.com     * Serialize an object into a new section
22610905Sandreas.sandberg@arm.com     *
22710905Sandreas.sandberg@arm.com     * This method creates a new section in a checkpoint and calls
22810905Sandreas.sandberg@arm.com     * serialize() to serialize the current object into that
22910905Sandreas.sandberg@arm.com     * section. The name of the section is appended to the current
23010905Sandreas.sandberg@arm.com     * checkpoint path.
23110905Sandreas.sandberg@arm.com     *
23210905Sandreas.sandberg@arm.com     * @param cp Checkpoint state
23310905Sandreas.sandberg@arm.com     * @param name Name to append to the active path
23410905Sandreas.sandberg@arm.com     */
23510905Sandreas.sandberg@arm.com    void serializeSection(CheckpointOut &cp, const char *name) const;
23610905Sandreas.sandberg@arm.com
23710905Sandreas.sandberg@arm.com    void serializeSection(CheckpointOut &cp, const std::string &name) const {
23810905Sandreas.sandberg@arm.com        serializeSection(cp, name.c_str());
23910905Sandreas.sandberg@arm.com    }
24010905Sandreas.sandberg@arm.com
24110905Sandreas.sandberg@arm.com    /**
24210905Sandreas.sandberg@arm.com     * Unserialize an a child object
24310905Sandreas.sandberg@arm.com     *
24410905Sandreas.sandberg@arm.com     * This method loads a child object from a checkpoint. The object
24510905Sandreas.sandberg@arm.com     * name is appended to the active path to form a fully qualified
24610905Sandreas.sandberg@arm.com     * section name and unserialize() is called.
24710905Sandreas.sandberg@arm.com     *
24810905Sandreas.sandberg@arm.com     * @param cp Checkpoint state
24910905Sandreas.sandberg@arm.com     * @param name Name to append to the active path
25010905Sandreas.sandberg@arm.com     */
25110905Sandreas.sandberg@arm.com    void unserializeSection(CheckpointIn &cp, const char *name);
25210905Sandreas.sandberg@arm.com
25310905Sandreas.sandberg@arm.com    void unserializeSection(CheckpointIn &cp, const std::string &name) {
25410905Sandreas.sandberg@arm.com        unserializeSection(cp, name.c_str());
25510905Sandreas.sandberg@arm.com    }
25610905Sandreas.sandberg@arm.com
25710905Sandreas.sandberg@arm.com    /** Get the fully-qualified name of the active section */
25810905Sandreas.sandberg@arm.com    static const std::string &currentSection();
25910905Sandreas.sandberg@arm.com
2602287SN/A    static int ckptCount;
2612287SN/A    static int ckptMaxCount;
2622287SN/A    static int ckptPrevCount;
2632868Sktlim@umich.edu    static void serializeAll(const std::string &cpt_dir);
26410905Sandreas.sandberg@arm.com    static void unserializeGlobals(CheckpointIn &cp);
26510905Sandreas.sandberg@arm.com
26610905Sandreas.sandberg@arm.com  private:
26710905Sandreas.sandberg@arm.com    static std::stack<std::string> path;
2682SN/A};
2692SN/A
27013414Sgiacomo.travaglini@arm.com//
27113414Sgiacomo.travaglini@arm.com// The base implementations use to_number for parsing and '<<' for
27213414Sgiacomo.travaglini@arm.com// displaying, suitable for integer types.
27313414Sgiacomo.travaglini@arm.com//
27413414Sgiacomo.travaglini@arm.comtemplate <class T>
27513414Sgiacomo.travaglini@arm.combool
27613414Sgiacomo.travaglini@arm.comparseParam(const std::string &s, T &value)
27713414Sgiacomo.travaglini@arm.com{
27813414Sgiacomo.travaglini@arm.com    return to_number(s, value);
27913414Sgiacomo.travaglini@arm.com}
2809554Sandreas.hansson@arm.com
28113414Sgiacomo.travaglini@arm.comtemplate <class T>
28213414Sgiacomo.travaglini@arm.comvoid
28313414Sgiacomo.travaglini@arm.comshowParam(CheckpointOut &os, const T &value)
28413414Sgiacomo.travaglini@arm.com{
28513414Sgiacomo.travaglini@arm.com    os << value;
28613414Sgiacomo.travaglini@arm.com}
28710453SAndrew.Bardsley@arm.com
28813414Sgiacomo.travaglini@arm.com// Treat 8-bit ints (chars) as ints on output, not as chars
28913414Sgiacomo.travaglini@arm.comtemplate <>
29013414Sgiacomo.travaglini@arm.cominline void
29113414Sgiacomo.travaglini@arm.comshowParam(CheckpointOut &os, const char &value)
292237SN/A{
29313414Sgiacomo.travaglini@arm.com    os << (int)value;
29413414Sgiacomo.travaglini@arm.com}
295237SN/A
29613414Sgiacomo.travaglini@arm.comtemplate <>
29713414Sgiacomo.travaglini@arm.cominline void
29813414Sgiacomo.travaglini@arm.comshowParam(CheckpointOut &os, const signed char &value)
29913414Sgiacomo.travaglini@arm.com{
30013414Sgiacomo.travaglini@arm.com    os << (int)value;
30113414Sgiacomo.travaglini@arm.com}
302237SN/A
30313414Sgiacomo.travaglini@arm.comtemplate <>
30413414Sgiacomo.travaglini@arm.cominline void
30513414Sgiacomo.travaglini@arm.comshowParam(CheckpointOut &os, const unsigned char &value)
30613414Sgiacomo.travaglini@arm.com{
30713414Sgiacomo.travaglini@arm.com    os << (unsigned int)value;
30813414Sgiacomo.travaglini@arm.com}
30910453SAndrew.Bardsley@arm.com
31013414Sgiacomo.travaglini@arm.comtemplate <>
31113414Sgiacomo.travaglini@arm.cominline bool
31213414Sgiacomo.travaglini@arm.comparseParam(const std::string &s, float &value)
31313414Sgiacomo.travaglini@arm.com{
31413414Sgiacomo.travaglini@arm.com    return to_number(s, value);
31513414Sgiacomo.travaglini@arm.com}
316237SN/A
31713414Sgiacomo.travaglini@arm.comtemplate <>
31813414Sgiacomo.travaglini@arm.cominline bool
31913414Sgiacomo.travaglini@arm.comparseParam(const std::string &s, double &value)
32013414Sgiacomo.travaglini@arm.com{
32113414Sgiacomo.travaglini@arm.com    return to_number(s, value);
32213414Sgiacomo.travaglini@arm.com}
323937SN/A
32413414Sgiacomo.travaglini@arm.comtemplate <>
32513414Sgiacomo.travaglini@arm.cominline bool
32613414Sgiacomo.travaglini@arm.comparseParam(const std::string &s, bool &value)
32713414Sgiacomo.travaglini@arm.com{
32813414Sgiacomo.travaglini@arm.com    return to_bool(s, value);
32913414Sgiacomo.travaglini@arm.com}
330237SN/A
33113414Sgiacomo.travaglini@arm.com// Display bools as strings
33213414Sgiacomo.travaglini@arm.comtemplate <>
33313414Sgiacomo.travaglini@arm.cominline void
33413414Sgiacomo.travaglini@arm.comshowParam(CheckpointOut &os, const bool &value)
33513414Sgiacomo.travaglini@arm.com{
33613414Sgiacomo.travaglini@arm.com    os << (value ? "true" : "false");
33713414Sgiacomo.travaglini@arm.com}
338304SN/A
33913414Sgiacomo.travaglini@arm.com// String requires no processing to speak of
34013414Sgiacomo.travaglini@arm.comtemplate <>
34113414Sgiacomo.travaglini@arm.cominline bool
34213414Sgiacomo.travaglini@arm.comparseParam(const std::string &s, std::string &value)
34313414Sgiacomo.travaglini@arm.com{
34413414Sgiacomo.travaglini@arm.com    value = s;
34513414Sgiacomo.travaglini@arm.com    return true;
34613414Sgiacomo.travaglini@arm.com}
34711655Sandreas.sandberg@arm.com
34813414Sgiacomo.travaglini@arm.comtemplate <class T>
34913414Sgiacomo.travaglini@arm.comvoid
35013414Sgiacomo.travaglini@arm.comparamOut(CheckpointOut &os, const std::string &name, const T &param)
35113414Sgiacomo.travaglini@arm.com{
35213414Sgiacomo.travaglini@arm.com    os << name << "=";
35313414Sgiacomo.travaglini@arm.com    showParam(os, param);
35413414Sgiacomo.travaglini@arm.com    os << "\n";
35513414Sgiacomo.travaglini@arm.com}
356449SN/A
35713414Sgiacomo.travaglini@arm.comtemplate <typename T>
35813414Sgiacomo.travaglini@arm.comvoid
35913414Sgiacomo.travaglini@arm.comparamOut(CheckpointOut &cp, const std::string &name, const BitUnionType<T> &p)
36013414Sgiacomo.travaglini@arm.com{
36113414Sgiacomo.travaglini@arm.com    paramOut(cp, name, static_cast<BitUnionBaseType<T> >(p));
36213414Sgiacomo.travaglini@arm.com}
3637491Ssteve.reinhardt@amd.com
36413414Sgiacomo.travaglini@arm.comtemplate <class T>
36513414Sgiacomo.travaglini@arm.comvoid
36613414Sgiacomo.travaglini@arm.comparamIn(CheckpointIn &cp, const std::string &name, T &param)
36713414Sgiacomo.travaglini@arm.com{
36813414Sgiacomo.travaglini@arm.com    const std::string &section(Serializable::currentSection());
36913414Sgiacomo.travaglini@arm.com    std::string str;
37013414Sgiacomo.travaglini@arm.com    if (!cp.find(section, name, str) || !parseParam(str, param)) {
37113414Sgiacomo.travaglini@arm.com        fatal("Can't unserialize '%s:%s'\n", section, name);
37213414Sgiacomo.travaglini@arm.com    }
37313414Sgiacomo.travaglini@arm.com}
3747491Ssteve.reinhardt@amd.com
37513414Sgiacomo.travaglini@arm.comtemplate <typename T>
37613414Sgiacomo.travaglini@arm.comvoid
37713414Sgiacomo.travaglini@arm.comparamIn(CheckpointIn &cp, const std::string &name, BitUnionType<T> &p)
37813414Sgiacomo.travaglini@arm.com{
37913414Sgiacomo.travaglini@arm.com    BitUnionBaseType<T> b;
38013414Sgiacomo.travaglini@arm.com    paramIn(cp, name, b);
38113414Sgiacomo.travaglini@arm.com    p = b;
38213414Sgiacomo.travaglini@arm.com}
383449SN/A
38413414Sgiacomo.travaglini@arm.comtemplate <class T>
38513414Sgiacomo.travaglini@arm.combool
38613414Sgiacomo.travaglini@arm.comoptParamIn(CheckpointIn &cp, const std::string &name,
38713414Sgiacomo.travaglini@arm.com           T &param, bool warn = true)
38813414Sgiacomo.travaglini@arm.com{
38913414Sgiacomo.travaglini@arm.com    const std::string &section(Serializable::currentSection());
39013414Sgiacomo.travaglini@arm.com    std::string str;
39113414Sgiacomo.travaglini@arm.com    if (!cp.find(section, name, str) || !parseParam(str, param)) {
39213414Sgiacomo.travaglini@arm.com        if (warn)
39313414Sgiacomo.travaglini@arm.com            warn("optional parameter %s:%s not present\n", section, name);
39413414Sgiacomo.travaglini@arm.com        return false;
39513414Sgiacomo.travaglini@arm.com    } else {
39613414Sgiacomo.travaglini@arm.com        return true;
39713414Sgiacomo.travaglini@arm.com    }
39813414Sgiacomo.travaglini@arm.com}
399449SN/A
40013414Sgiacomo.travaglini@arm.comtemplate <typename T>
40113414Sgiacomo.travaglini@arm.combool
40213414Sgiacomo.travaglini@arm.comoptParamIn(CheckpointIn &cp, const std::string &name,
40313414Sgiacomo.travaglini@arm.com           BitUnionType<T> &p, bool warn = true)
40413414Sgiacomo.travaglini@arm.com{
40513414Sgiacomo.travaglini@arm.com    BitUnionBaseType<T> b;
40613414Sgiacomo.travaglini@arm.com    if (optParamIn(cp, name, b, warn)) {
40713414Sgiacomo.travaglini@arm.com        p = b;
40813414Sgiacomo.travaglini@arm.com        return true;
40913414Sgiacomo.travaglini@arm.com    } else {
41013414Sgiacomo.travaglini@arm.com        return false;
41113414Sgiacomo.travaglini@arm.com    }
41213414Sgiacomo.travaglini@arm.com}
41313414Sgiacomo.travaglini@arm.com
41413414Sgiacomo.travaglini@arm.comtemplate <class T>
41513414Sgiacomo.travaglini@arm.comvoid
41613414Sgiacomo.travaglini@arm.comarrayParamOut(CheckpointOut &os, const std::string &name,
41713414Sgiacomo.travaglini@arm.com              const std::vector<T> &param)
41813414Sgiacomo.travaglini@arm.com{
41913414Sgiacomo.travaglini@arm.com    typename std::vector<T>::size_type size = param.size();
42013414Sgiacomo.travaglini@arm.com    os << name << "=";
42113414Sgiacomo.travaglini@arm.com    if (size > 0)
42213414Sgiacomo.travaglini@arm.com        showParam(os, param[0]);
42313414Sgiacomo.travaglini@arm.com    for (typename std::vector<T>::size_type i = 1; i < size; ++i) {
42413414Sgiacomo.travaglini@arm.com        os << " ";
42513414Sgiacomo.travaglini@arm.com        showParam(os, param[i]);
42613414Sgiacomo.travaglini@arm.com    }
42713414Sgiacomo.travaglini@arm.com    os << "\n";
42813414Sgiacomo.travaglini@arm.com}
42913414Sgiacomo.travaglini@arm.com
43013414Sgiacomo.travaglini@arm.comtemplate <class T>
43113414Sgiacomo.travaglini@arm.comvoid
43213414Sgiacomo.travaglini@arm.comarrayParamOut(CheckpointOut &os, const std::string &name,
43313414Sgiacomo.travaglini@arm.com              const std::list<T> &param)
43413414Sgiacomo.travaglini@arm.com{
43513414Sgiacomo.travaglini@arm.com    typename std::list<T>::const_iterator it = param.begin();
43613414Sgiacomo.travaglini@arm.com
43713414Sgiacomo.travaglini@arm.com    os << name << "=";
43813414Sgiacomo.travaglini@arm.com    if (param.size() > 0)
43913414Sgiacomo.travaglini@arm.com        showParam(os, *it);
44013414Sgiacomo.travaglini@arm.com    it++;
44113414Sgiacomo.travaglini@arm.com    while (it != param.end()) {
44213414Sgiacomo.travaglini@arm.com        os << " ";
44313414Sgiacomo.travaglini@arm.com        showParam(os, *it);
44413414Sgiacomo.travaglini@arm.com        it++;
44513414Sgiacomo.travaglini@arm.com    }
44613414Sgiacomo.travaglini@arm.com    os << "\n";
44713414Sgiacomo.travaglini@arm.com}
44813414Sgiacomo.travaglini@arm.com
44913414Sgiacomo.travaglini@arm.comtemplate <class T>
45013414Sgiacomo.travaglini@arm.comvoid
45113414Sgiacomo.travaglini@arm.comarrayParamOut(CheckpointOut &os, const std::string &name,
45213414Sgiacomo.travaglini@arm.com              const std::set<T> &param)
45313414Sgiacomo.travaglini@arm.com{
45413414Sgiacomo.travaglini@arm.com    typename std::set<T>::const_iterator it = param.begin();
45513414Sgiacomo.travaglini@arm.com
45613414Sgiacomo.travaglini@arm.com    os << name << "=";
45713414Sgiacomo.travaglini@arm.com    if (param.size() > 0)
45813414Sgiacomo.travaglini@arm.com        showParam(os, *it);
45913414Sgiacomo.travaglini@arm.com    it++;
46013414Sgiacomo.travaglini@arm.com    while (it != param.end()) {
46113414Sgiacomo.travaglini@arm.com        os << " ";
46213414Sgiacomo.travaglini@arm.com        showParam(os, *it);
46313414Sgiacomo.travaglini@arm.com        it++;
46413414Sgiacomo.travaglini@arm.com    }
46513414Sgiacomo.travaglini@arm.com    os << "\n";
46613414Sgiacomo.travaglini@arm.com}
46713414Sgiacomo.travaglini@arm.com
46813414Sgiacomo.travaglini@arm.comtemplate <class T>
46913414Sgiacomo.travaglini@arm.comvoid
47013414Sgiacomo.travaglini@arm.comarrayParamOut(CheckpointOut &os, const std::string &name,
47113414Sgiacomo.travaglini@arm.com              const T *param, unsigned size)
47213414Sgiacomo.travaglini@arm.com{
47313414Sgiacomo.travaglini@arm.com    os << name << "=";
47413414Sgiacomo.travaglini@arm.com    if (size > 0)
47513414Sgiacomo.travaglini@arm.com        showParam(os, param[0]);
47613414Sgiacomo.travaglini@arm.com    for (unsigned i = 1; i < size; ++i) {
47713414Sgiacomo.travaglini@arm.com        os << " ";
47813414Sgiacomo.travaglini@arm.com        showParam(os, param[i]);
47913414Sgiacomo.travaglini@arm.com    }
48013414Sgiacomo.travaglini@arm.com    os << "\n";
48113414Sgiacomo.travaglini@arm.com}
48213414Sgiacomo.travaglini@arm.com
48313414Sgiacomo.travaglini@arm.com
48413414Sgiacomo.travaglini@arm.comtemplate <class T>
48513414Sgiacomo.travaglini@arm.comvoid
48613414Sgiacomo.travaglini@arm.comarrayParamIn(CheckpointIn &cp, const std::string &name,
48713414Sgiacomo.travaglini@arm.com             T *param, unsigned size)
48813414Sgiacomo.travaglini@arm.com{
48913414Sgiacomo.travaglini@arm.com    const std::string &section(Serializable::currentSection());
49013414Sgiacomo.travaglini@arm.com    std::string str;
49113414Sgiacomo.travaglini@arm.com    if (!cp.find(section, name, str)) {
49213414Sgiacomo.travaglini@arm.com        fatal("Can't unserialize '%s:%s'\n", section, name);
49313414Sgiacomo.travaglini@arm.com    }
49413414Sgiacomo.travaglini@arm.com
49513414Sgiacomo.travaglini@arm.com    // code below stolen from VectorParam<T>::parse().
49613414Sgiacomo.travaglini@arm.com    // it would be nice to unify these somehow...
49713414Sgiacomo.travaglini@arm.com
49813414Sgiacomo.travaglini@arm.com    std::vector<std::string> tokens;
49913414Sgiacomo.travaglini@arm.com
50013414Sgiacomo.travaglini@arm.com    tokenize(tokens, str, ' ');
50113414Sgiacomo.travaglini@arm.com
50213414Sgiacomo.travaglini@arm.com    // Need this if we were doing a vector
50313414Sgiacomo.travaglini@arm.com    // value.resize(tokens.size());
50413414Sgiacomo.travaglini@arm.com
50513414Sgiacomo.travaglini@arm.com    if (tokens.size() != size) {
50613414Sgiacomo.travaglini@arm.com        fatal("Array size mismatch on %s:%s'\n", section, name);
50713414Sgiacomo.travaglini@arm.com    }
50813414Sgiacomo.travaglini@arm.com
50913414Sgiacomo.travaglini@arm.com    for (std::vector<std::string>::size_type i = 0; i < tokens.size(); i++) {
51013414Sgiacomo.travaglini@arm.com        // need to parse into local variable to handle vector<bool>,
51113414Sgiacomo.travaglini@arm.com        // for which operator[] returns a special reference class
51213414Sgiacomo.travaglini@arm.com        // that's not the same as 'bool&', (since it's a packed
51313414Sgiacomo.travaglini@arm.com        // vector)
51413414Sgiacomo.travaglini@arm.com        T scalar_value;
51513414Sgiacomo.travaglini@arm.com        if (!parseParam(tokens[i], scalar_value)) {
51613414Sgiacomo.travaglini@arm.com            std::string err("could not parse \"");
51713414Sgiacomo.travaglini@arm.com
51813414Sgiacomo.travaglini@arm.com            err += str;
51913414Sgiacomo.travaglini@arm.com            err += "\"";
52013414Sgiacomo.travaglini@arm.com
52113414Sgiacomo.travaglini@arm.com            fatal(err);
52213414Sgiacomo.travaglini@arm.com        }
52313414Sgiacomo.travaglini@arm.com
52413414Sgiacomo.travaglini@arm.com        // assign parsed value to vector
52513414Sgiacomo.travaglini@arm.com        param[i] = scalar_value;
52613414Sgiacomo.travaglini@arm.com    }
52713414Sgiacomo.travaglini@arm.com}
52813414Sgiacomo.travaglini@arm.com
52913414Sgiacomo.travaglini@arm.comtemplate <class T>
53013414Sgiacomo.travaglini@arm.comvoid
53113414Sgiacomo.travaglini@arm.comarrayParamIn(CheckpointIn &cp, const std::string &name, std::vector<T> &param)
53213414Sgiacomo.travaglini@arm.com{
53313414Sgiacomo.travaglini@arm.com    const std::string &section(Serializable::currentSection());
53413414Sgiacomo.travaglini@arm.com    std::string str;
53513414Sgiacomo.travaglini@arm.com    if (!cp.find(section, name, str)) {
53613414Sgiacomo.travaglini@arm.com        fatal("Can't unserialize '%s:%s'\n", section, name);
53713414Sgiacomo.travaglini@arm.com    }
53813414Sgiacomo.travaglini@arm.com
53913414Sgiacomo.travaglini@arm.com    // code below stolen from VectorParam<T>::parse().
54013414Sgiacomo.travaglini@arm.com    // it would be nice to unify these somehow...
54113414Sgiacomo.travaglini@arm.com
54213414Sgiacomo.travaglini@arm.com    std::vector<std::string> tokens;
54313414Sgiacomo.travaglini@arm.com
54413414Sgiacomo.travaglini@arm.com    tokenize(tokens, str, ' ');
54513414Sgiacomo.travaglini@arm.com
54613414Sgiacomo.travaglini@arm.com    // Need this if we were doing a vector
54713414Sgiacomo.travaglini@arm.com    // value.resize(tokens.size());
54813414Sgiacomo.travaglini@arm.com
54913414Sgiacomo.travaglini@arm.com    param.resize(tokens.size());
55013414Sgiacomo.travaglini@arm.com
55113414Sgiacomo.travaglini@arm.com    for (std::vector<std::string>::size_type i = 0; i < tokens.size(); i++) {
55213414Sgiacomo.travaglini@arm.com        // need to parse into local variable to handle vector<bool>,
55313414Sgiacomo.travaglini@arm.com        // for which operator[] returns a special reference class
55413414Sgiacomo.travaglini@arm.com        // that's not the same as 'bool&', (since it's a packed
55513414Sgiacomo.travaglini@arm.com        // vector)
55613414Sgiacomo.travaglini@arm.com        T scalar_value;
55713414Sgiacomo.travaglini@arm.com        if (!parseParam(tokens[i], scalar_value)) {
55813414Sgiacomo.travaglini@arm.com            std::string err("could not parse \"");
55913414Sgiacomo.travaglini@arm.com
56013414Sgiacomo.travaglini@arm.com            err += str;
56113414Sgiacomo.travaglini@arm.com            err += "\"";
56213414Sgiacomo.travaglini@arm.com
56313414Sgiacomo.travaglini@arm.com            fatal(err);
56413414Sgiacomo.travaglini@arm.com        }
56513414Sgiacomo.travaglini@arm.com
56613414Sgiacomo.travaglini@arm.com        // assign parsed value to vector
56713414Sgiacomo.travaglini@arm.com        param[i] = scalar_value;
56813414Sgiacomo.travaglini@arm.com    }
56913414Sgiacomo.travaglini@arm.com}
57013414Sgiacomo.travaglini@arm.com
57113414Sgiacomo.travaglini@arm.comtemplate <class T>
57213414Sgiacomo.travaglini@arm.comvoid
57313414Sgiacomo.travaglini@arm.comarrayParamIn(CheckpointIn &cp, const std::string &name, std::list<T> &param)
57413414Sgiacomo.travaglini@arm.com{
57513414Sgiacomo.travaglini@arm.com    const std::string &section(Serializable::currentSection());
57613414Sgiacomo.travaglini@arm.com    std::string str;
57713414Sgiacomo.travaglini@arm.com    if (!cp.find(section, name, str)) {
57813414Sgiacomo.travaglini@arm.com        fatal("Can't unserialize '%s:%s'\n", section, name);
57913414Sgiacomo.travaglini@arm.com    }
58013414Sgiacomo.travaglini@arm.com    param.clear();
58113414Sgiacomo.travaglini@arm.com
58213414Sgiacomo.travaglini@arm.com    std::vector<std::string> tokens;
58313414Sgiacomo.travaglini@arm.com    tokenize(tokens, str, ' ');
58413414Sgiacomo.travaglini@arm.com
58513414Sgiacomo.travaglini@arm.com    for (std::vector<std::string>::size_type i = 0; i < tokens.size(); i++) {
58613414Sgiacomo.travaglini@arm.com        T scalar_value;
58713414Sgiacomo.travaglini@arm.com        if (!parseParam(tokens[i], scalar_value)) {
58813414Sgiacomo.travaglini@arm.com            std::string err("could not parse \"");
58913414Sgiacomo.travaglini@arm.com
59013414Sgiacomo.travaglini@arm.com            err += str;
59113414Sgiacomo.travaglini@arm.com            err += "\"";
59213414Sgiacomo.travaglini@arm.com
59313414Sgiacomo.travaglini@arm.com            fatal(err);
59413414Sgiacomo.travaglini@arm.com        }
59513414Sgiacomo.travaglini@arm.com
59613414Sgiacomo.travaglini@arm.com        // assign parsed value to vector
59713414Sgiacomo.travaglini@arm.com        param.push_back(scalar_value);
59813414Sgiacomo.travaglini@arm.com    }
59913414Sgiacomo.travaglini@arm.com}
60013414Sgiacomo.travaglini@arm.com
60113414Sgiacomo.travaglini@arm.comtemplate <class T>
60213414Sgiacomo.travaglini@arm.comvoid
60313414Sgiacomo.travaglini@arm.comarrayParamIn(CheckpointIn &cp, const std::string &name, std::set<T> &param)
60413414Sgiacomo.travaglini@arm.com{
60513414Sgiacomo.travaglini@arm.com    const std::string &section(Serializable::currentSection());
60613414Sgiacomo.travaglini@arm.com    std::string str;
60713414Sgiacomo.travaglini@arm.com    if (!cp.find(section, name, str)) {
60813414Sgiacomo.travaglini@arm.com        fatal("Can't unserialize '%s:%s'\n", section, name);
60913414Sgiacomo.travaglini@arm.com    }
61013414Sgiacomo.travaglini@arm.com    param.clear();
61113414Sgiacomo.travaglini@arm.com
61213414Sgiacomo.travaglini@arm.com    std::vector<std::string> tokens;
61313414Sgiacomo.travaglini@arm.com    tokenize(tokens, str, ' ');
61413414Sgiacomo.travaglini@arm.com
61513414Sgiacomo.travaglini@arm.com    for (std::vector<std::string>::size_type i = 0; i < tokens.size(); i++) {
61613414Sgiacomo.travaglini@arm.com        T scalar_value;
61713414Sgiacomo.travaglini@arm.com        if (!parseParam(tokens[i], scalar_value)) {
61813414Sgiacomo.travaglini@arm.com            std::string err("could not parse \"");
61913414Sgiacomo.travaglini@arm.com
62013414Sgiacomo.travaglini@arm.com            err += str;
62113414Sgiacomo.travaglini@arm.com            err += "\"";
62213414Sgiacomo.travaglini@arm.com
62313414Sgiacomo.travaglini@arm.com            fatal(err);
62413414Sgiacomo.travaglini@arm.com        }
62513414Sgiacomo.travaglini@arm.com
62613414Sgiacomo.travaglini@arm.com        // assign parsed value to vector
62713414Sgiacomo.travaglini@arm.com        param.insert(scalar_value);
62813414Sgiacomo.travaglini@arm.com    }
62913414Sgiacomo.travaglini@arm.com}
63013414Sgiacomo.travaglini@arm.com
63113414Sgiacomo.travaglini@arm.comtemplate <class T>
63213414Sgiacomo.travaglini@arm.comstatic void
63313414Sgiacomo.travaglini@arm.comarrayParamOut(CheckpointOut &cp, const std::string &name,
63413414Sgiacomo.travaglini@arm.com              const BitUnionType<T> *param, unsigned size)
63513414Sgiacomo.travaglini@arm.com{
63613414Sgiacomo.travaglini@arm.com    // We copy the array into a vector. This is needed since we cannot
63713414Sgiacomo.travaglini@arm.com    // directly typecast a pointer to BitUnionType<T> into a pointer
63813414Sgiacomo.travaglini@arm.com    // of BitUnionBaseType<T> but we can typecast BitUnionType<T>
63913414Sgiacomo.travaglini@arm.com    // to BitUnionBaseType<T> since we overloaded the typecast operator
64013414Sgiacomo.travaglini@arm.com    std::vector<BitUnionBaseType<T>> bitunion_vec(param, param + size);
64113414Sgiacomo.travaglini@arm.com
64213414Sgiacomo.travaglini@arm.com    arrayParamOut(cp, name, bitunion_vec);
64313414Sgiacomo.travaglini@arm.com}
64413414Sgiacomo.travaglini@arm.com
64513414Sgiacomo.travaglini@arm.comtemplate <class T>
64613414Sgiacomo.travaglini@arm.comstatic void
64713414Sgiacomo.travaglini@arm.comarrayParamIn(CheckpointIn &cp, const std::string &name,
64813414Sgiacomo.travaglini@arm.com             BitUnionType<T> *param, unsigned size)
64913414Sgiacomo.travaglini@arm.com{
65013414Sgiacomo.travaglini@arm.com    std::vector<BitUnionBaseType<T>> bitunion_vec(size);
65113414Sgiacomo.travaglini@arm.com
65213414Sgiacomo.travaglini@arm.com    arrayParamIn(cp, name, bitunion_vec);
65313414Sgiacomo.travaglini@arm.com    std::copy(bitunion_vec.begin(), bitunion_vec.end(), param);
65413414Sgiacomo.travaglini@arm.com}
65513414Sgiacomo.travaglini@arm.com
65613414Sgiacomo.travaglini@arm.comvoid
65713414Sgiacomo.travaglini@arm.comdebug_serialize(const std::string &cpt_dir);
65813414Sgiacomo.travaglini@arm.com
65913414Sgiacomo.travaglini@arm.comvoid
66013414Sgiacomo.travaglini@arm.comobjParamIn(CheckpointIn &cp, const std::string &name, SimObject * &param);
66113414Sgiacomo.travaglini@arm.com
66213414Sgiacomo.travaglini@arm.com//
66313414Sgiacomo.travaglini@arm.com// These macros are streamlined to use in serialize/unserialize
66413414Sgiacomo.travaglini@arm.com// functions.  It's assumed that serialize() has a parameter 'os' for
66513414Sgiacomo.travaglini@arm.com// the ostream, and unserialize() has parameters 'cp' and 'section'.
66613414Sgiacomo.travaglini@arm.com#define SERIALIZE_SCALAR(scalar)        paramOut(cp, #scalar, scalar)
66713414Sgiacomo.travaglini@arm.com
66813414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_SCALAR(scalar)      paramIn(cp, #scalar, scalar)
66913414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_OPT_SCALAR(scalar)      optParamIn(cp, #scalar, scalar)
67013414Sgiacomo.travaglini@arm.com
67113414Sgiacomo.travaglini@arm.com// ENUMs are like SCALARs, but we cast them to ints on the way out
67213414Sgiacomo.travaglini@arm.com#define SERIALIZE_ENUM(scalar)          paramOut(cp, #scalar, (int)scalar)
67313414Sgiacomo.travaglini@arm.com
67413414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_ENUM(scalar)                        \
67513414Sgiacomo.travaglini@arm.com    do {                                                \
67613414Sgiacomo.travaglini@arm.com        int tmp;                                        \
67713414Sgiacomo.travaglini@arm.com        paramIn(cp, #scalar, tmp);                      \
67813414Sgiacomo.travaglini@arm.com        scalar = static_cast<decltype(scalar)>(tmp);    \
67913414Sgiacomo.travaglini@arm.com    } while (0)
68013414Sgiacomo.travaglini@arm.com
68113414Sgiacomo.travaglini@arm.com#define SERIALIZE_ARRAY(member, size)           \
68213414Sgiacomo.travaglini@arm.com        arrayParamOut(cp, #member, member, size)
68313414Sgiacomo.travaglini@arm.com
68413414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_ARRAY(member, size)         \
68513414Sgiacomo.travaglini@arm.com        arrayParamIn(cp, #member, member, size)
68613414Sgiacomo.travaglini@arm.com
68713414Sgiacomo.travaglini@arm.com#define SERIALIZE_CONTAINER(member)             \
68813414Sgiacomo.travaglini@arm.com        arrayParamOut(cp, #member, member)
68913414Sgiacomo.travaglini@arm.com
69013414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_CONTAINER(member)           \
69113414Sgiacomo.travaglini@arm.com        arrayParamIn(cp, #member, member)
69213414Sgiacomo.travaglini@arm.com
69313414Sgiacomo.travaglini@arm.com#define SERIALIZE_EVENT(event) event.serializeSection(cp, #event);
69413414Sgiacomo.travaglini@arm.com
69513414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_EVENT(event)                        \
69613414Sgiacomo.travaglini@arm.com    do {                                                \
69713414Sgiacomo.travaglini@arm.com        event.unserializeSection(cp, #event);           \
69813414Sgiacomo.travaglini@arm.com        eventQueue()->checkpointReschedule(&event);     \
69913414Sgiacomo.travaglini@arm.com    } while (0)
70013414Sgiacomo.travaglini@arm.com
70113414Sgiacomo.travaglini@arm.com#define SERIALIZE_OBJ(obj) obj.serializeSection(cp, #obj)
70213414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_OBJ(obj) obj.unserializeSection(cp, #obj)
70313414Sgiacomo.travaglini@arm.com
70413414Sgiacomo.travaglini@arm.com#define SERIALIZE_OBJPTR(objptr)        paramOut(cp, #objptr, (objptr)->name())
70513414Sgiacomo.travaglini@arm.com
70613414Sgiacomo.travaglini@arm.com#define UNSERIALIZE_OBJPTR(objptr)                      \
70713414Sgiacomo.travaglini@arm.com    do {                                                \
70813414Sgiacomo.travaglini@arm.com        SimObject *sptr;                                \
70913414Sgiacomo.travaglini@arm.com        objParamIn(cp, #objptr, sptr);                  \
71013414Sgiacomo.travaglini@arm.com        objptr = dynamic_cast<decltype(objptr)>(sptr);  \
71113414Sgiacomo.travaglini@arm.com    } while (0)
7122SN/A
7132SN/A#endif // __SERIALIZE_HH__
714