etherlink.hh revision 11168
12968SN/A/* 22968SN/A * Copyright (c) 2015 ARM Limited 310409Sandreas.hansson@arm.com * All rights reserved 411502SCurtis.Dunham@arm.com * 511502SCurtis.Dunham@arm.com * The license below extends only to copyright in the software and shall 68721SN/A * not be construed as granting a license to any other intellectual 711530Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating 811530Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software 911530Sandreas.sandberg@arm.com * licensed hereunder. You may use the software subject to the license 1011530Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated 1111530Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software, 1211336Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 1311336Sandreas.hansson@arm.com * 1410036SAli.Saidi@ARM.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 1510036SAli.Saidi@ARM.com * All rights reserved. 1611530Sandreas.sandberg@arm.com * 1711201Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 1811201Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 1911336Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 2011201Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 2110352Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 2211336Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 2311201Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 2411336Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 2511336Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 2611336Sandreas.hansson@arm.com * this software without specific prior written permission. 2711336Sandreas.hansson@arm.com * 2811201Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2911201Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3011336Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3111201Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3210352Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3311336Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3411336Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3511336Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3611201Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3711336Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3811336Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3911201Sandreas.hansson@arm.com * 4010409Sandreas.hansson@arm.com * Authors: Nathan Binkert 4111336Sandreas.hansson@arm.com */ 4211201Sandreas.hansson@arm.com 4311336Sandreas.hansson@arm.com/* @file 4411336Sandreas.hansson@arm.com * Device module for modelling a fixed bandwidth full duplex ethernet link 4511336Sandreas.hansson@arm.com */ 4611336Sandreas.hansson@arm.com 4711336Sandreas.hansson@arm.com#ifndef __DEV_ETHERLINK_HH__ 4811201Sandreas.hansson@arm.com#define __DEV_ETHERLINK_HH__ 4911336Sandreas.hansson@arm.com 5011336Sandreas.hansson@arm.com#include <queue> 5111201Sandreas.hansson@arm.com 5210585Sandreas.hansson@arm.com#include "base/types.hh" 5311502SCurtis.Dunham@arm.com#include "dev/etherint.hh" 5411530Sandreas.sandberg@arm.com#include "dev/etherobject.hh" 5511530Sandreas.sandberg@arm.com#include "dev/etherpkt.hh" 5610036SAli.Saidi@ARM.com#include "params/EtherLink.hh" 578721SN/A#include "sim/eventq.hh" 588721SN/A#include "sim/sim_object.hh" 598721SN/A 608721SN/Aclass EtherDump; 6111336Sandreas.hansson@arm.comclass Checkpoint; 6210409Sandreas.hansson@arm.com/* 638721SN/A * Model for a fixed bandwidth full duplex ethernet link 6410409Sandreas.hansson@arm.com */ 6511336Sandreas.hansson@arm.comclass EtherLink : public EtherObject 6610409Sandreas.hansson@arm.com{ 6710409Sandreas.hansson@arm.com protected: 6810409Sandreas.hansson@arm.com class Interface; 6911336Sandreas.hansson@arm.com 7010409Sandreas.hansson@arm.com /* 7110409Sandreas.hansson@arm.com * Model for a single uni-directional link 7210409Sandreas.hansson@arm.com */ 7311336Sandreas.hansson@arm.com class Link 7410409Sandreas.hansson@arm.com { 758721SN/A protected: 7611336Sandreas.hansson@arm.com const std::string objName; 778721SN/A 788721SN/A EtherLink *const parent; 798721SN/A const int number; 808721SN/A 818721SN/A Interface *txint; 828721SN/A Interface *rxint; 838721SN/A 848721SN/A const double ticksPerByte; 856024SN/A const Tick linkDelay; 866024SN/A const Tick delayVar; 878721SN/A EtherDump *const dump; 888721SN/A 8911530Sandreas.sandberg@arm.com protected: 9011530Sandreas.sandberg@arm.com /* 9111530Sandreas.sandberg@arm.com * Transfer is complete 9211530Sandreas.sandberg@arm.com */ 9311530Sandreas.sandberg@arm.com EthPacketPtr packet; 9411530Sandreas.sandberg@arm.com void txDone(); 9511530Sandreas.sandberg@arm.com typedef EventWrapper<Link, &Link::txDone> DoneEvent; 9611530Sandreas.sandberg@arm.com friend void DoneEvent::process(); 9711530Sandreas.sandberg@arm.com DoneEvent doneEvent; 9811530Sandreas.sandberg@arm.com 9911502SCurtis.Dunham@arm.com /** 1008721SN/A * Maintain a queue of in-flight packets. Assume that the 1018721SN/A * delay is non-zero and constant (i.e., at most one packet 1022968SN/A * per tick). 10310409Sandreas.hansson@arm.com */ 10411336Sandreas.hansson@arm.com std::deque<std::pair<Tick, EthPacketPtr>> txQueue; 10510409Sandreas.hansson@arm.com 10611336Sandreas.hansson@arm.com void processTxQueue(); 10710409Sandreas.hansson@arm.com typedef EventWrapper<Link, &Link::processTxQueue> TxQueueEvent; 10810409Sandreas.hansson@arm.com friend void TxQueueEvent::process(); 10911336Sandreas.hansson@arm.com TxQueueEvent txQueueEvent; 11011336Sandreas.hansson@arm.com 11110409Sandreas.hansson@arm.com void txComplete(EthPacketPtr packet); 11210409Sandreas.hansson@arm.com 11310409Sandreas.hansson@arm.com public: 11410409Sandreas.hansson@arm.com Link(const std::string &name, EtherLink *p, int num, 11510409Sandreas.hansson@arm.com double rate, Tick delay, Tick delay_var, EtherDump *dump); 11610409Sandreas.hansson@arm.com ~Link() {} 11711502SCurtis.Dunham@arm.com 11810409Sandreas.hansson@arm.com const std::string name() const { return objName; } 11910409Sandreas.hansson@arm.com 12010409Sandreas.hansson@arm.com bool busy() const { return (bool)packet; } 12111336Sandreas.hansson@arm.com bool transmit(EthPacketPtr packet); 12211502SCurtis.Dunham@arm.com 12310409Sandreas.hansson@arm.com void setTxInt(Interface *i) { assert(!txint); txint = i; } 1246127SN/A void setRxInt(Interface *i) { assert(!rxint); rxint = i; } 1256127SN/A 1266127SN/A void serialize(const std::string &base, CheckpointOut &cp) const; 12711336Sandreas.hansson@arm.com void unserialize(const std::string &base, CheckpointIn &cp); 12811336Sandreas.hansson@arm.com }; 12910409Sandreas.hansson@arm.com 13010409Sandreas.hansson@arm.com /* 13110409Sandreas.hansson@arm.com * Interface at each end of the link 13210409Sandreas.hansson@arm.com */ 13310409Sandreas.hansson@arm.com class Interface : public EtherInt 13410409Sandreas.hansson@arm.com { 13510409Sandreas.hansson@arm.com private: 13610409Sandreas.hansson@arm.com Link *txlink; 13710409Sandreas.hansson@arm.com 13810409Sandreas.hansson@arm.com public: 13910409Sandreas.hansson@arm.com Interface(const std::string &name, Link *txlink, Link *rxlink); 14010409Sandreas.hansson@arm.com bool recvPacket(EthPacketPtr packet) { return txlink->transmit(packet); } 14110409Sandreas.hansson@arm.com void sendDone() { peer->sendDone(); } 14210409Sandreas.hansson@arm.com bool isBusy() { return txlink->busy(); } 14310409Sandreas.hansson@arm.com }; 14410409Sandreas.hansson@arm.com 14510409Sandreas.hansson@arm.com Link *link[2]; 14610409Sandreas.hansson@arm.com Interface *interface[2]; 14710409Sandreas.hansson@arm.com 14810409Sandreas.hansson@arm.com public: 14910409Sandreas.hansson@arm.com typedef EtherLinkParams Params; 15010409Sandreas.hansson@arm.com EtherLink(const Params *p); 15110409Sandreas.hansson@arm.com virtual ~EtherLink(); 15210409Sandreas.hansson@arm.com 15310409Sandreas.hansson@arm.com const Params * 15410409Sandreas.hansson@arm.com params() const 15510409Sandreas.hansson@arm.com { 15610409Sandreas.hansson@arm.com return dynamic_cast<const Params *>(_params); 1576291SN/A } 1586291SN/A 15910409Sandreas.hansson@arm.com virtual EtherInt *getEthPort(const std::string &if_name, int idx); 1608721SN/A 16110409Sandreas.hansson@arm.com void serialize(CheckpointOut &cp) const override; 16210409Sandreas.hansson@arm.com void unserialize(CheckpointIn &cp) override; 16310409Sandreas.hansson@arm.com 16410409Sandreas.hansson@arm.com}; 16510409Sandreas.hansson@arm.com 16610409Sandreas.hansson@arm.com#endif // __ETHERLINK_HH__ 16710409Sandreas.hansson@arm.com