diff options
author | Ron Dreslinski <rdreslin@umich.edu> | 2004-02-20 12:44:41 -0500 |
---|---|---|
committer | Ron Dreslinski <rdreslin@umich.edu> | 2004-02-20 12:44:41 -0500 |
commit | 373d70980eabb4598ee1fcc9429e38ef15950e04 (patch) | |
tree | 8755cf0c5a49e3627390545f0c3f34beaa4c08e1 | |
parent | 4ec55bef1179a3fc8aa0e2a4c6f0ec37df444e7e (diff) | |
download | gem5-373d70980eabb4598ee1fcc9429e38ef15950e04.tar.xz |
Add serialization for packets on the ethernet link,
and for link events
--HG--
extra : convert_revision : 0054dbc4a42dd38ff8bbf64af303bc509dd5aa8a
-rw-r--r-- | dev/etherlink.cc | 51 | ||||
-rw-r--r-- | dev/etherlink.hh | 7 |
2 files changed, 58 insertions, 0 deletions
diff --git a/dev/etherlink.cc b/dev/etherlink.cc index 676b1da1c..7c70b82ce 100644 --- a/dev/etherlink.cc +++ b/dev/etherlink.cc @@ -42,6 +42,7 @@ #include "dev/etherpkt.hh" #include "sim/builder.hh" #include "sim/universe.hh" +#include "sim/system.hh" using namespace std; @@ -85,6 +86,20 @@ EtherLink::Link::Link(const std::string &name, double rate, EtherDump *d) {} void +EtherLink::serialize(ostream &os) +{ + link1->serialize(os); + link2->serialize(os); +} + +void +EtherLink::unserialize(Checkpoint *cp, const string §ion) +{ + link1->unserialize(cp, section); + link2->unserialize(cp, section); +} + +void EtherLink::Link::txDone() { if (dump) @@ -121,6 +136,42 @@ EtherLink::Link::transmit(PacketPtr &pkt) return true; } +void +EtherLink::Link::serialize(ostream &os) +{ + bool packetExists = false; + if (packet) packetExists = true; + SERIALIZE_SCALAR(packetExists); + if (packetExists) { + nameOut(os, csprintf("%s.linkPacket", name())); + packet->serialize(os); + } + + bool event_scheduled = event.scheduled(); + SERIALIZE_SCALAR(event_scheduled); + if (event_scheduled) { + SERIALIZE_SCALAR(event.when()); + } +} + +void +EtherLink::Link::unserialize(Checkpoint *cp, const string §ion) +{ + bool event_scheduled, packetExists; + Tick eventTime; + UNSERIALIZE_SCALAR(packetExists); + if (packetExists) { + packet = new EtherPacket; + packet->unserialize(cp, csprintf("%s.linkPacket", section)); + } + + UNSERIALIZE_SCALAR(event_scheduled); + if (event_scheduled) { + UNSERIALIZE_SCALAR(eventTime); + event.schedule(eventTime); + } +} + BEGIN_DECLARE_SIM_OBJECT_PARAMS(EtherLink) SimObjectParam<EtherInt *> interface1; diff --git a/dev/etherlink.hh b/dev/etherlink.hh index e1a7957ee..8505570a6 100644 --- a/dev/etherlink.hh +++ b/dev/etherlink.hh @@ -96,6 +96,9 @@ class EtherLink : public SimObject void setTxInt(Interface *i) { assert(!txint); txint = i; } void setRxInt(Interface *i) { assert(!rxint); rxint = i; } + + virtual void serialize(std::ostream &os); + virtual void unserialize(Checkpoint *cp, const std::string §ion); }; /* @@ -122,6 +125,10 @@ class EtherLink : public SimObject EtherLink(const std::string &name, EtherInt *i1, EtherInt *i2, Tick speed, EtherDump *dump); virtual ~EtherLink(); + + virtual void serialize(std::ostream &os); + virtual void unserialize(Checkpoint *cp, const std::string §ion); + }; #endif // __ETHERLINK_HH__ |