X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsim%2Fserialize.cc;h=095a44c347086ea21939470b62155bc9a1c4d0b0;hb=e35b491c464f8961f5f3fff56478f12716f5a424;hp=f9a945b95892d4c37d34844cf79d605603377660;hpb=80b911afd573ecda0cefb8f24b83d94b7faf4b7b;p=gem5.git diff --git a/src/sim/serialize.cc b/src/sim/serialize.cc index f9a945b95..095a44c34 100644 --- a/src/sim/serialize.cc +++ b/src/sim/serialize.cc @@ -45,6 +45,8 @@ * Andreas Sandberg */ +#include "sim/serialize.hh" + #include #include #include @@ -55,15 +57,11 @@ #include #include -#include "base/framebuffer.hh" #include "base/inifile.hh" -#include "base/misc.hh" #include "base/output.hh" -#include "base/str.hh" #include "base/trace.hh" #include "debug/Checkpoint.hh" #include "sim/eventq.hh" -#include "sim/serialize.hh" #include "sim/sim_events.hh" #include "sim/sim_exit.hh" #include "sim/sim_object.hh" @@ -73,410 +71,11 @@ using namespace std; -// -// The base implementations use to_number for parsing and '<<' for -// displaying, suitable for integer types. -// -template -bool -parseParam(const string &s, T &value) -{ - return to_number(s, value); -} - -template -void -showParam(CheckpointOut &os, const T &value) -{ - os << value; -} - -// -// Template specializations: -// - char (8-bit integer) -// - floating-point types -// - bool -// - string -// - -// Treat 8-bit ints (chars) as ints on output, not as chars -template <> -void -showParam(CheckpointOut &os, const char &value) -{ - os << (int)value; -} - - -template <> -void -showParam(CheckpointOut &os, const signed char &value) -{ - os << (int)value; -} - - -template <> -void -showParam(CheckpointOut &os, const unsigned char &value) -{ - os << (unsigned int)value; -} - - -template <> -bool -parseParam(const string &s, float &value) -{ - return to_number(s, value); -} - -template <> -bool -parseParam(const string &s, double &value) -{ - return to_number(s, value); -} - -template <> -bool -parseParam(const string &s, bool &value) -{ - return to_bool(s, value); -} - -// Display bools as strings -template <> -void -showParam(CheckpointOut &os, const bool &value) -{ - os << (value ? "true" : "false"); -} - - -// String requires no processing to speak of -template <> -bool -parseParam(const string &s, string &value) -{ - value = s; - return true; -} - int Serializable::ckptMaxCount = 0; int Serializable::ckptCount = 0; int Serializable::ckptPrevCount = -1; std::stack Serializable::path; -template -void -paramOut(CheckpointOut &os, const string &name, const T ¶m) -{ - os << name << "="; - showParam(os, param); - os << "\n"; -} - -template -void -arrayParamOut(CheckpointOut &os, const string &name, const vector ¶m) -{ - typename vector::size_type size = param.size(); - os << name << "="; - if (size > 0) - showParam(os, param[0]); - for (typename vector::size_type i = 1; i < size; ++i) { - os << " "; - showParam(os, param[i]); - } - os << "\n"; -} - -template -void -arrayParamOut(CheckpointOut &os, const string &name, const list ¶m) -{ - typename list::const_iterator it = param.begin(); - - os << name << "="; - if (param.size() > 0) - showParam(os, *it); - it++; - while (it != param.end()) { - os << " "; - showParam(os, *it); - it++; - } - os << "\n"; -} - -template -void -arrayParamOut(CheckpointOut &os, const string &name, const set ¶m) -{ - typename set::const_iterator it = param.begin(); - - os << name << "="; - if (param.size() > 0) - showParam(os, *it); - it++; - while (it != param.end()) { - os << " "; - showParam(os, *it); - it++; - } - os << "\n"; -} - -template -void -paramIn(CheckpointIn &cp, const string &name, T ¶m) -{ - const string §ion(Serializable::currentSection()); - string str; - if (!cp.find(section, name, str) || !parseParam(str, param)) { - fatal("Can't unserialize '%s:%s'\n", section, name); - } -} - -template -bool -optParamIn(CheckpointIn &cp, const string &name, T ¶m, bool warn) -{ - const string §ion(Serializable::currentSection()); - string str; - if (!cp.find(section, name, str) || !parseParam(str, param)) { - if (warn) - warn("optional parameter %s:%s not present\n", section, name); - return false; - } else { - return true; - } -} - -template -void -arrayParamOut(CheckpointOut &os, const string &name, - const T *param, unsigned size) -{ - os << name << "="; - if (size > 0) - showParam(os, param[0]); - for (unsigned i = 1; i < size; ++i) { - os << " "; - showParam(os, param[i]); - } - os << "\n"; -} - - -template -void -arrayParamIn(CheckpointIn &cp, const string &name, T *param, unsigned size) -{ - const string §ion(Serializable::currentSection()); - string str; - if (!cp.find(section, name, str)) { - fatal("Can't unserialize '%s:%s'\n", section, name); - } - - // code below stolen from VectorParam::parse(). - // it would be nice to unify these somehow... - - vector tokens; - - tokenize(tokens, str, ' '); - - // Need this if we were doing a vector - // value.resize(tokens.size()); - - if (tokens.size() != size) { - fatal("Array size mismatch on %s:%s'\n", section, name); - } - - for (vector::size_type i = 0; i < tokens.size(); i++) { - // need to parse into local variable to handle vector, - // for which operator[] returns a special reference class - // that's not the same as 'bool&', (since it's a packed - // vector) - T scalar_value; - if (!parseParam(tokens[i], scalar_value)) { - string err("could not parse \""); - - err += str; - err += "\""; - - fatal(err); - } - - // assign parsed value to vector - param[i] = scalar_value; - } -} - -template -void -arrayParamIn(CheckpointIn &cp, const string &name, vector ¶m) -{ - const string §ion(Serializable::currentSection()); - string str; - if (!cp.find(section, name, str)) { - fatal("Can't unserialize '%s:%s'\n", section, name); - } - - // code below stolen from VectorParam::parse(). - // it would be nice to unify these somehow... - - vector tokens; - - tokenize(tokens, str, ' '); - - // Need this if we were doing a vector - // value.resize(tokens.size()); - - param.resize(tokens.size()); - - for (vector::size_type i = 0; i < tokens.size(); i++) { - // need to parse into local variable to handle vector, - // for which operator[] returns a special reference class - // that's not the same as 'bool&', (since it's a packed - // vector) - T scalar_value; - if (!parseParam(tokens[i], scalar_value)) { - string err("could not parse \""); - - err += str; - err += "\""; - - fatal(err); - } - - // assign parsed value to vector - param[i] = scalar_value; - } -} - -template -void -arrayParamIn(CheckpointIn &cp, const string &name, list ¶m) -{ - const string §ion(Serializable::currentSection()); - string str; - if (!cp.find(section, name, str)) { - fatal("Can't unserialize '%s:%s'\n", section, name); - } - param.clear(); - - vector tokens; - tokenize(tokens, str, ' '); - - for (vector::size_type i = 0; i < tokens.size(); i++) { - T scalar_value; - if (!parseParam(tokens[i], scalar_value)) { - string err("could not parse \""); - - err += str; - err += "\""; - - fatal(err); - } - - // assign parsed value to vector - param.push_back(scalar_value); - } -} - -template -void -arrayParamIn(CheckpointIn &cp, const string &name, set ¶m) -{ - const string §ion(Serializable::currentSection()); - string str; - if (!cp.find(section, name, str)) { - fatal("Can't unserialize '%s:%s'\n", section, name); - } - param.clear(); - - vector tokens; - tokenize(tokens, str, ' '); - - for (vector::size_type i = 0; i < tokens.size(); i++) { - T scalar_value; - if (!parseParam(tokens[i], scalar_value)) { - string err("could not parse \""); - - err += str; - err += "\""; - - fatal(err); - } - - // assign parsed value to vector - param.insert(scalar_value); - } -} - - -void -objParamIn(CheckpointIn &cp, const string &name, SimObject * ¶m) -{ - const string §ion(Serializable::currentSection()); - if (!cp.findObj(section, name, param)) { - fatal("Can't unserialize '%s:%s'\n", section, name); - } -} - - -#define INSTANTIATE_PARAM_TEMPLATES(type) \ - template void \ - paramOut(CheckpointOut &os, const string &name, type const ¶m); \ - template void \ - paramIn(CheckpointIn &cp, const string &name, type & param); \ - template bool \ - optParamIn(CheckpointIn &cp, const string &name, type & param, \ - bool warn); \ - template void \ - arrayParamOut(CheckpointOut &os, const string &name, \ - type const *param, unsigned size); \ - template void \ - arrayParamIn(CheckpointIn &cp, const string &name, \ - type *param, unsigned size); \ - template void \ - arrayParamOut(CheckpointOut &os, const string &name, \ - const vector ¶m); \ - template void \ - arrayParamIn(CheckpointIn &cp, const string &name, \ - vector ¶m); \ - template void \ - arrayParamOut(CheckpointOut &os, const string &name, \ - const list ¶m); \ - template void \ - arrayParamIn(CheckpointIn &cp, const string &name, \ - list ¶m); - -INSTANTIATE_PARAM_TEMPLATES(char) -INSTANTIATE_PARAM_TEMPLATES(signed char) -INSTANTIATE_PARAM_TEMPLATES(unsigned char) -INSTANTIATE_PARAM_TEMPLATES(signed short) -INSTANTIATE_PARAM_TEMPLATES(unsigned short) -INSTANTIATE_PARAM_TEMPLATES(signed int) -INSTANTIATE_PARAM_TEMPLATES(unsigned int) -INSTANTIATE_PARAM_TEMPLATES(signed long) -INSTANTIATE_PARAM_TEMPLATES(unsigned long) -INSTANTIATE_PARAM_TEMPLATES(signed long long) -INSTANTIATE_PARAM_TEMPLATES(unsigned long long) -INSTANTIATE_PARAM_TEMPLATES(bool) -INSTANTIATE_PARAM_TEMPLATES(float) -INSTANTIATE_PARAM_TEMPLATES(double) -INSTANTIATE_PARAM_TEMPLATES(string) -INSTANTIATE_PARAM_TEMPLATES(Pixel) - -// set is only used with strings and furthermore doesn't agree with Pixel -template void -arrayParamOut(CheckpointOut &, const string &, const set &); -template void -arrayParamIn(CheckpointIn &, const string &, set &); - ///////////////////////////// /// Container for serializing global variables (not associated with @@ -487,8 +86,8 @@ class Globals : public Serializable Globals() : unserializedCurTick(0) {} - void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE; - void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE; + void serialize(CheckpointOut &cp) const override; + void unserialize(CheckpointIn &cp) override; Tick unserializedCurTick; }; @@ -580,13 +179,6 @@ Serializable::serializeSection(CheckpointOut &cp, const char *name) const serialize(cp); } -void -Serializable::serializeSectionOld(CheckpointOut &cp, const char *name) -{ - Serializable::ScopedCheckpointSection sec(cp, name); - serializeOld(cp); -} - void Serializable::unserializeSection(CheckpointIn &cp, const char *name) { @@ -648,12 +240,6 @@ Serializable::ScopedCheckpointSection::nameOut(CheckpointOut &cp) cp << "\n[" << Serializable::currentSection() << "]\n"; } -void -debug_serialize(const string &cpt_dir) -{ - Serializable::serializeAll(cpt_dir); -} - const std::string & Serializable::currentSection() { @@ -684,7 +270,6 @@ CheckpointIn::dir() return currentDirectory; } - CheckpointIn::CheckpointIn(const string &cpt_dir, SimObjectResolver &resolver) : db(new IniFile), objNameResolver(resolver), cptDir(setDir(cpt_dir)) { @@ -699,13 +284,18 @@ CheckpointIn::~CheckpointIn() delete db; } +bool +CheckpointIn::entryExists(const string §ion, const string &entry) +{ + return db->entryExists(section, entry); +} + bool CheckpointIn::find(const string §ion, const string &entry, string &value) { return db->find(section, entry, value); } - bool CheckpointIn::findObj(const string §ion, const string &entry, SimObject *&value) @@ -719,9 +309,23 @@ CheckpointIn::findObj(const string §ion, const string &entry, return true; } - bool CheckpointIn::sectionExists(const string §ion) { return db->sectionExists(section); } + +void +objParamIn(CheckpointIn &cp, const string &name, SimObject * ¶m) +{ + const string §ion(Serializable::currentSection()); + if (!cp.findObj(section, name, param)) { + fatal("Can't unserialize '%s:%s'\n", section, name); + } +} + +void +debug_serialize(const string &cpt_dir) +{ + Serializable::serializeAll(cpt_dir); +}