X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fdev%2Fetherlink.cc;h=5ebc4fba52ee8c35081054e24c16909794cbdde5;hb=eae1e97fb002b44a9d8c46df2da1ddc1d0156ce4;hp=baa4fb741fdb9205d0d49ebcf46e2d0dfe9639ae;hpb=a874cb40ab9f22612b0609cbac2c739daebacbd5;p=gem5.git diff --git a/src/dev/etherlink.cc b/src/dev/etherlink.cc index baa4fb741..5ebc4fba5 100644 --- a/src/dev/etherlink.cc +++ b/src/dev/etherlink.cc @@ -40,24 +40,26 @@ #include "base/random.hh" #include "base/trace.hh" +#include "debug/Ethernet.hh" +#include "debug/EthernetData.hh" #include "dev/etherdump.hh" #include "dev/etherint.hh" #include "dev/etherlink.hh" #include "dev/etherpkt.hh" #include "params/EtherLink.hh" +#include "sim/core.hh" #include "sim/serialize.hh" #include "sim/system.hh" -#include "sim/core.hh" using namespace std; EtherLink::EtherLink(const Params *p) : EtherObject(p) { - link[0] = new Link(name() + ".link0", this, 0, params()->speed, - params()->delay, params()->delay_var, params()->dump); - link[1] = new Link(name() + ".link1", this, 1, params()->speed, - params()->delay, params()->delay_var, params()->dump); + link[0] = new Link(name() + ".link0", this, 0, p->speed, + p->delay, p->delay_var, p->dump); + link[1] = new Link(name() + ".link1", this, 1, p->speed, + p->delay, p->delay_var, p->dump); interface[0] = new Interface(name() + ".int0", link[0], link[1]); interface[1] = new Interface(name() + ".int1", link[1], link[0]); @@ -135,7 +137,7 @@ class LinkDelayEvent : public Event public: // non-scheduling version for createForUnserialize() LinkDelayEvent(); - LinkDelayEvent(EtherLink::Link *link, EthPacketPtr pkt, Tick when); + LinkDelayEvent(EtherLink::Link *link, EthPacketPtr pkt); void process(); @@ -153,7 +155,8 @@ EtherLink::Link::txDone() if (linkDelay > 0) { DPRINTF(Ethernet, "packet delayed: delay=%d\n", linkDelay); - new LinkDelayEvent(this, packet, curTick + linkDelay); + Event *event = new LinkDelayEvent(this, packet); + parent->schedule(event, curTick() + linkDelay); } else { txComplete(packet); } @@ -177,13 +180,12 @@ EtherLink::Link::transmit(EthPacketPtr pkt) packet = pkt; Tick delay = (Tick)ceil(((double)pkt->length * ticksPerByte) + 1.0); - if (delayVar != 0) { - Random var; - delay += var.uniform(0, delayVar); - } + if (delayVar != 0) + delay += random_mt.random(0, delayVar); + DPRINTF(Ethernet, "scheduling packet: delay=%d, (rate=%f)\n", delay, ticksPerByte); - doneEvent.schedule(curTick + delay); + parent->schedule(doneEvent, curTick() + delay); return true; } @@ -221,23 +223,18 @@ EtherLink::Link::unserialize(const string &base, Checkpoint *cp, if (event_scheduled) { Tick event_time; paramIn(cp, section, base + ".event_time", event_time); - doneEvent.schedule(event_time); + parent->schedule(doneEvent, event_time); } } LinkDelayEvent::LinkDelayEvent() - : Event(&mainEventQueue), link(NULL) + : Event(Default_Pri, AutoSerialize | AutoDelete), link(NULL) { - setFlags(AutoSerialize); - setFlags(AutoDelete); } -LinkDelayEvent::LinkDelayEvent(EtherLink::Link *l, EthPacketPtr p, Tick when) - : Event(&mainEventQueue), link(l), packet(p) +LinkDelayEvent::LinkDelayEvent(EtherLink::Link *l, EthPacketPtr p) + : Event(Default_Pri, AutoSerialize | AutoDelete), link(l), packet(p) { - setFlags(AutoSerialize); - setFlags(AutoDelete); - schedule(when); } void