MessageBuffer.hh revision 7973
12SN/A/* 21762SN/A * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 32SN/A * All rights reserved. 42SN/A * 52SN/A * Redistribution and use in source and binary forms, with or without 62SN/A * modification, are permitted provided that the following conditions are 72SN/A * met: redistributions of source code must retain the above copyright 82SN/A * notice, this list of conditions and the following disclaimer; 92SN/A * redistributions in binary form must reproduce the above copyright 102SN/A * notice, this list of conditions and the following disclaimer in the 112SN/A * documentation and/or other materials provided with the distribution; 122SN/A * neither the name of the copyright holders nor the names of its 132SN/A * contributors may be used to endorse or promote products derived from 142SN/A * this software without specific prior written permission. 152SN/A * 162SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu */ 282665Ssaidi@eecs.umich.edu 292665Ssaidi@eecs.umich.edu/* 302665Ssaidi@eecs.umich.edu * Unordered buffer of messages that can be inserted such 312665Ssaidi@eecs.umich.edu * that they can be dequeued after a given delta time has expired. 322SN/A */ 332SN/A 344265Sgblack@eecs.umich.edu#ifndef __MEM_RUBY_BUFFERS_MESSAGEBUFFER_HH__ 352SN/A#define __MEM_RUBY_BUFFERS_MESSAGEBUFFER_HH__ 362SN/A 373506Ssaidi@eecs.umich.edu#include <algorithm> 383506Ssaidi@eecs.umich.edu#include <cassert> 392SN/A#include <functional> 404266Sgblack@eecs.umich.edu#include <iostream> 412973Sgblack@eecs.umich.edu#include <vector> 423584Ssaidi@eecs.umich.edu#include <string> 4356SN/A 444265Sgblack@eecs.umich.edu#include "mem/ruby/buffers/MessageBufferNode.hh" 453614Sgblack@eecs.umich.edu#include "mem/ruby/common/Consumer.hh" 461717SN/A#include "mem/ruby/common/Global.hh" 472518SN/A#include "mem/ruby/eventqueue/RubyEventQueue.hh" 4856SN/A#include "mem/ruby/slicc_interface/Message.hh" 494762Snate@binkert.org#include "mem/ruby/common/Address.hh" 502518SN/A 512SN/Aclass MessageBuffer 523614Sgblack@eecs.umich.edu{ 533614Sgblack@eecs.umich.edu public: 543614Sgblack@eecs.umich.edu MessageBuffer(const std::string &name = ""); 553614Sgblack@eecs.umich.edu 563065Sgblack@eecs.umich.edu static void printConfig(std::ostream& out) {} 573065Sgblack@eecs.umich.edu void 583506Ssaidi@eecs.umich.edu setRecycleLatency(int recycle_latency) 593065Sgblack@eecs.umich.edu { 602SN/A m_recycle_latency = recycle_latency; 612973Sgblack@eecs.umich.edu } 622SN/A 633840Shsul@eecs.umich.edu void reanalyzeMessages(const Address& addr); 643825Ssaidi@eecs.umich.edu void reanalyzeAllMessages(); 653903Ssaidi@eecs.umich.edu void stallMessage(const Address& addr); 663840Shsul@eecs.umich.edu 673825Ssaidi@eecs.umich.edu // TRUE if head of queue timestamp <= SystemTime 683506Ssaidi@eecs.umich.edu bool 693506Ssaidi@eecs.umich.edu isReady() const 704265Sgblack@eecs.umich.edu { 714054Sbinkertn@umich.edu return ((m_prio_heap.size() > 0) && 724054Sbinkertn@umich.edu (m_prio_heap.front().m_time <= g_eventQueue_ptr->getTime())); 734054Sbinkertn@umich.edu } 744054Sbinkertn@umich.edu 754054Sbinkertn@umich.edu void 764054Sbinkertn@umich.edu delayHead() 774054Sbinkertn@umich.edu { 784054Sbinkertn@umich.edu MessageBufferNode node = m_prio_heap.front(); 794054Sbinkertn@umich.edu std::pop_heap(m_prio_heap.begin(), m_prio_heap.end(), 804054Sbinkertn@umich.edu std::greater<MessageBufferNode>()); 814054Sbinkertn@umich.edu m_prio_heap.pop_back(); 824054Sbinkertn@umich.edu enqueue(node.m_msgptr, 1); 834054Sbinkertn@umich.edu } 844054Sbinkertn@umich.edu 854054Sbinkertn@umich.edu bool areNSlotsAvailable(int n); 864054Sbinkertn@umich.edu int getPriority() { return m_priority_rank; } 874054Sbinkertn@umich.edu void setPriority(int rank) { m_priority_rank = rank; } 884054Sbinkertn@umich.edu void setConsumer(Consumer* consumer_ptr) 894054Sbinkertn@umich.edu { 904054Sbinkertn@umich.edu assert(m_consumer_ptr == NULL); 914054Sbinkertn@umich.edu m_consumer_ptr = consumer_ptr; 923506Ssaidi@eecs.umich.edu } 933506Ssaidi@eecs.umich.edu 942SN/A void setDescription(const std::string& name) { m_name = name; } 952SN/A std::string getDescription() { return m_name;} 962SN/A 972SN/A Consumer* getConsumer() { return m_consumer_ptr; } 982SN/A 993748Sgblack@eecs.umich.edu const Message* peekAtHeadOfQueue() const; 1003748Sgblack@eecs.umich.edu const Message* peek() const { return peekAtHeadOfQueue(); } 1013748Sgblack@eecs.umich.edu const MsgPtr getMsgPtrCopy() const; 1023748Sgblack@eecs.umich.edu 1033748Sgblack@eecs.umich.edu const MsgPtr& 1043748Sgblack@eecs.umich.edu peekMsgPtr() const 1053748Sgblack@eecs.umich.edu { 1063748Sgblack@eecs.umich.edu assert(isReady()); 1073748Sgblack@eecs.umich.edu return m_prio_heap.front().m_msgptr; 1083748Sgblack@eecs.umich.edu } 1093748Sgblack@eecs.umich.edu 1103748Sgblack@eecs.umich.edu const MsgPtr& 1113748Sgblack@eecs.umich.edu peekMsgPtrEvenIfNotReady() const 1123748Sgblack@eecs.umich.edu { 1133748Sgblack@eecs.umich.edu return m_prio_heap.front().m_msgptr; 1143748Sgblack@eecs.umich.edu } 1153748Sgblack@eecs.umich.edu 1163748Sgblack@eecs.umich.edu void enqueue(MsgPtr message) { enqueue(message, 1); } 1173748Sgblack@eecs.umich.edu void enqueue(MsgPtr message, Time delta); 1183748Sgblack@eecs.umich.edu // void enqueueAbsolute(const MsgPtr& message, Time absolute_time); 1193748Sgblack@eecs.umich.edu int dequeue_getDelayCycles(MsgPtr& message); // returns delay 1203748Sgblack@eecs.umich.edu // cycles of the 1213748Sgblack@eecs.umich.edu // message 1223748Sgblack@eecs.umich.edu void dequeue(MsgPtr& message); 1233748Sgblack@eecs.umich.edu int dequeue_getDelayCycles(); // returns delay cycles of the message 1243748Sgblack@eecs.umich.edu void dequeue() { pop(); } 1253748Sgblack@eecs.umich.edu void pop(); 1263748Sgblack@eecs.umich.edu void recycle(); 1273748Sgblack@eecs.umich.edu bool isEmpty() const { return m_prio_heap.size() == 0; } 1283748Sgblack@eecs.umich.edu 1293748Sgblack@eecs.umich.edu void 1303748Sgblack@eecs.umich.edu setOrdering(bool order) 1313748Sgblack@eecs.umich.edu { 1323748Sgblack@eecs.umich.edu m_strict_fifo = order; 1333748Sgblack@eecs.umich.edu m_ordering_set = true; 1343748Sgblack@eecs.umich.edu } 1353748Sgblack@eecs.umich.edu void resize(int size) { m_max_size = size; } 1363748Sgblack@eecs.umich.edu int getSize(); 1373748Sgblack@eecs.umich.edu void setRandomization(bool random_flag) { m_randomization = random_flag; } 1383748Sgblack@eecs.umich.edu 1393748Sgblack@eecs.umich.edu void clear(); 1403748Sgblack@eecs.umich.edu 1413748Sgblack@eecs.umich.edu void print(std::ostream& out) const; 1423748Sgblack@eecs.umich.edu void printStats(std::ostream& out); 1433748Sgblack@eecs.umich.edu void clearStats() { m_not_avail_count = 0; m_msg_counter = 0; } 1443748Sgblack@eecs.umich.edu 1453748Sgblack@eecs.umich.edu void setIncomingLink(int link_id) { m_input_link_id = link_id; } 1463748Sgblack@eecs.umich.edu void setVnet(int net) { m_vnet_id = net; } 1473748Sgblack@eecs.umich.edu 1483748Sgblack@eecs.umich.edu private: 1492SN/A //added by SS 1502SN/A int m_recycle_latency; 1514046Sbinkertn@umich.edu 1522SN/A // Private Methods 1534046Sbinkertn@umich.edu int setAndReturnDelayCycles(MsgPtr message); 1544046Sbinkertn@umich.edu 1553903Ssaidi@eecs.umich.edu // Private copy constructor and assignment operator 1564265Sgblack@eecs.umich.edu MessageBuffer(const MessageBuffer& obj); 1574054Sbinkertn@umich.edu MessageBuffer& operator=(const MessageBuffer& obj); 1582973Sgblack@eecs.umich.edu 1594265Sgblack@eecs.umich.edu // Data Members (m_ prefix) 1604265Sgblack@eecs.umich.edu Consumer* m_consumer_ptr; // Consumer to signal a wakeup(), can be NULL 1613065Sgblack@eecs.umich.edu std::vector<MessageBufferNode> m_prio_heap; 1624265Sgblack@eecs.umich.edu 1634265Sgblack@eecs.umich.edu typedef m5::hash_map< Address, std::list<MsgPtr> > StallMsgMapType; 1644265Sgblack@eecs.umich.edu typedef std::vector<MsgPtr>::iterator MsgListIter; 1654539Sgblack@eecs.umich.edu 1664265Sgblack@eecs.umich.edu StallMsgMapType m_stall_msg_map; 1674265Sgblack@eecs.umich.edu std::string m_name; 1684265Sgblack@eecs.umich.edu 1694265Sgblack@eecs.umich.edu int m_max_size; 1704265Sgblack@eecs.umich.edu int m_size; 1714265Sgblack@eecs.umich.edu 1724265Sgblack@eecs.umich.edu Time m_time_last_time_size_checked; 1734265Sgblack@eecs.umich.edu int m_size_last_time_size_checked; 1744265Sgblack@eecs.umich.edu 1754265Sgblack@eecs.umich.edu // variables used so enqueues appear to happen imediately, while 1764265Sgblack@eecs.umich.edu // pop happen the next cycle 1774265Sgblack@eecs.umich.edu Time m_time_last_time_enqueue; 1784265Sgblack@eecs.umich.edu Time m_time_last_time_pop; 1794265Sgblack@eecs.umich.edu int m_size_at_cycle_start; 1804265Sgblack@eecs.umich.edu int m_msgs_this_cycle; 1814265Sgblack@eecs.umich.edu 1824265Sgblack@eecs.umich.edu int m_not_avail_count; // count the # of times I didn't have N 1834265Sgblack@eecs.umich.edu // slots available 1844265Sgblack@eecs.umich.edu uint64 m_msg_counter; 1854265Sgblack@eecs.umich.edu int m_priority_rank; 1864265Sgblack@eecs.umich.edu bool m_strict_fifo; 1874265Sgblack@eecs.umich.edu bool m_ordering_set; 1884265Sgblack@eecs.umich.edu bool m_randomization; 1894265Sgblack@eecs.umich.edu Time m_last_arrival_time; 1904265Sgblack@eecs.umich.edu 1914265Sgblack@eecs.umich.edu int m_input_link_id; 1924265Sgblack@eecs.umich.edu int m_vnet_id; 1934265Sgblack@eecs.umich.edu}; 1944265Sgblack@eecs.umich.edu 1954265Sgblack@eecs.umich.eduinline std::ostream& 1964265Sgblack@eecs.umich.eduoperator<<(std::ostream& out, const MessageBuffer& obj) 1974265Sgblack@eecs.umich.edu{ 1984265Sgblack@eecs.umich.edu obj.print(out); 1994265Sgblack@eecs.umich.edu out << std::flush; 2004265Sgblack@eecs.umich.edu return out; 2014265Sgblack@eecs.umich.edu} 2024265Sgblack@eecs.umich.edu 2034265Sgblack@eecs.umich.edu#endif // __MEM_RUBY_BUFFERS_MESSAGEBUFFER_HH__ 2044265Sgblack@eecs.umich.edu