tport.cc revision 2914
12914Ssaidi@eecs.umich.edu/*
22914Ssaidi@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
32914Ssaidi@eecs.umich.edu * All rights reserved.
42914Ssaidi@eecs.umich.edu *
52914Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
62914Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
72914Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
82914Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
92914Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
102914Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
112914Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
122914Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
132914Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
142914Ssaidi@eecs.umich.edu * this software without specific prior written permission.
152914Ssaidi@eecs.umich.edu *
162914Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172914Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182914Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192914Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202914Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212914Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222914Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232914Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242914Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252914Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262914Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272914Ssaidi@eecs.umich.edu *
282914Ssaidi@eecs.umich.edu * Authors: Ali Saidi
292914Ssaidi@eecs.umich.edu */
302914Ssaidi@eecs.umich.edu
312914Ssaidi@eecs.umich.edu#include "mem/tport.hh"
322914Ssaidi@eecs.umich.edu
332914Ssaidi@eecs.umich.eduvoid
342914Ssaidi@eecs.umich.eduSimpleTimingPort::recvRetry()
352914Ssaidi@eecs.umich.edu{
362914Ssaidi@eecs.umich.edu    bool result = true;
372914Ssaidi@eecs.umich.edu    while (result && transmitList.size()) {
382914Ssaidi@eecs.umich.edu        result = Port::sendTiming(transmitList.front());
392914Ssaidi@eecs.umich.edu        if (result)
402914Ssaidi@eecs.umich.edu            transmitList.pop_front();
412914Ssaidi@eecs.umich.edu    }
422914Ssaidi@eecs.umich.edu   if (transmitList.size() == 0 && drainEvent) {
432914Ssaidi@eecs.umich.edu       drainEvent->process();
442914Ssaidi@eecs.umich.edu       drainEvent = NULL;
452914Ssaidi@eecs.umich.edu   }
462914Ssaidi@eecs.umich.edu}
472914Ssaidi@eecs.umich.edu
482914Ssaidi@eecs.umich.eduvoid
492914Ssaidi@eecs.umich.eduSimpleTimingPort::SendEvent::process()
502914Ssaidi@eecs.umich.edu{
512914Ssaidi@eecs.umich.edu    port->outTiming--;
522914Ssaidi@eecs.umich.edu    assert(port->outTiming >= 0);
532914Ssaidi@eecs.umich.edu    if (port->Port::sendTiming(packet))
542914Ssaidi@eecs.umich.edu       if (port->transmitList.size() == 0 && port->drainEvent) {
552914Ssaidi@eecs.umich.edu           port->drainEvent->process();
562914Ssaidi@eecs.umich.edu           port->drainEvent = NULL;
572914Ssaidi@eecs.umich.edu       }
582914Ssaidi@eecs.umich.edu       return;
592914Ssaidi@eecs.umich.edu
602914Ssaidi@eecs.umich.edu    port->transmitList.push_back(packet);
612914Ssaidi@eecs.umich.edu}
622914Ssaidi@eecs.umich.edu
632914Ssaidi@eecs.umich.eduvoid
642914Ssaidi@eecs.umich.eduSimpleTimingPort::resendNacked(Packet *pkt) {
652914Ssaidi@eecs.umich.edu    pkt->reinitNacked();
662914Ssaidi@eecs.umich.edu    if (transmitList.size()) {
672914Ssaidi@eecs.umich.edu         transmitList.push_front(pkt);
682914Ssaidi@eecs.umich.edu    } else {
692914Ssaidi@eecs.umich.edu        if (!Port::sendTiming(pkt))
702914Ssaidi@eecs.umich.edu            transmitList.push_front(pkt);
712914Ssaidi@eecs.umich.edu    }
722914Ssaidi@eecs.umich.edu};
732914Ssaidi@eecs.umich.edu
742914Ssaidi@eecs.umich.edu
752914Ssaidi@eecs.umich.eduunsigned int
762914Ssaidi@eecs.umich.eduSimpleTimingPort::drain(Event *de)
772914Ssaidi@eecs.umich.edu{
782914Ssaidi@eecs.umich.edu    if (outTiming == 0 && transmitList.size() == 0)
792914Ssaidi@eecs.umich.edu        return 0;
802914Ssaidi@eecs.umich.edu    drainEvent = de;
812914Ssaidi@eecs.umich.edu    return 1;
822914Ssaidi@eecs.umich.edu}
83