1/* 2 * Copyright (c) 2008 Princeton University 3 * Copyright (c) 2016 Georgia Institute of Technology 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Niket Agarwal 30 * Tushar Krishna 31 */ 32 33 34#ifndef __MEM_RUBY_NETWORK_GARNET2_0_VIRTUALCHANNEL_HH__ 35#define __MEM_RUBY_NETWORK_GARNET2_0_VIRTUALCHANNEL_HH__ 36 37#include <utility> 38 39#include "mem/ruby/network/garnet2.0/CommonTypes.hh" 40#include "mem/ruby/network/garnet2.0/flitBuffer.hh" 41 42class VirtualChannel 43{ 44 public: 45 VirtualChannel(int id); 46 ~VirtualChannel(); 47 48 bool need_stage(flit_stage stage, Cycles time); 49 void set_idle(Cycles curTime); 50 void set_active(Cycles curTime); 51 void set_outvc(int outvc) { m_output_vc = outvc; } 52 inline int get_outvc() { return m_output_vc; } 53 void set_outport(int outport) { m_output_port = outport; }; 54 inline int get_outport() { return m_output_port; } 55 56 inline Cycles get_enqueue_time() { return m_enqueue_time; } 57 inline void set_enqueue_time(Cycles time) { m_enqueue_time = time; } 58 inline VC_state_type get_state() { return m_vc_state.first; } 59 60 inline bool isReady(Cycles curTime) 61 { 62 return m_input_buffer->isReady(curTime); 63 } 64 65 inline void 66 insertFlit(flit *t_flit) 67 { 68 m_input_buffer->insert(t_flit); 69 } 70 71 inline void 72 set_state(VC_state_type m_state, Cycles curTime) 73 { 74 m_vc_state.first = m_state; 75 m_vc_state.second = curTime; 76 } 77 78 inline flit* 79 peekTopFlit() 80 { 81 return m_input_buffer->peekTopFlit(); 82 } 83 84 inline flit* 85 getTopFlit() 86 { 87 return m_input_buffer->getTopFlit(); 88 } 89 90 uint32_t functionalWrite(Packet *pkt); 91 92 private: 93 int m_id; 94 flitBuffer *m_input_buffer; 95 std::pair<VC_state_type, Cycles> m_vc_state; 96 int m_output_port; 97 Cycles m_enqueue_time; 98 int m_output_vc; 99}; 100 101#endif // __MEM_RUBY_NETWORK_GARNET2_0_VIRTUALCHANNEL_HH__ 102