Message.hh (10876:7544f29b7dfc) | Message.hh (10893:f567e80c0714) |
---|---|
1/* 2 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 30 unchanged lines hidden (view full) --- 39typedef std::shared_ptr<Message> MsgPtr; 40 41class Message 42{ 43 public: 44 Message(Tick curTime) 45 : m_time(curTime), 46 m_LastEnqueueTime(curTime), | 1/* 2 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 30 unchanged lines hidden (view full) --- 39typedef std::shared_ptr<Message> MsgPtr; 40 41class Message 42{ 43 public: 44 Message(Tick curTime) 45 : m_time(curTime), 46 m_LastEnqueueTime(curTime), |
47 m_DelayedTicks(0) | 47 m_DelayedTicks(0), m_msg_counter(0) |
48 { } 49 50 Message(const Message &other) 51 : m_time(other.m_time), 52 m_LastEnqueueTime(other.m_LastEnqueueTime), | 48 { } 49 50 Message(const Message &other) 51 : m_time(other.m_time), 52 m_LastEnqueueTime(other.m_LastEnqueueTime), |
53 m_DelayedTicks(other.m_DelayedTicks) | 53 m_DelayedTicks(other.m_DelayedTicks), 54 m_msg_counter(other.m_msg_counter) |
54 { } 55 56 virtual ~Message() { } 57 58 virtual MsgPtr clone() const = 0; 59 virtual void print(std::ostream& out) const = 0; 60 virtual void setIncomingLink(int) {} 61 virtual void setVnet(int) {} 62 63 /** 64 * The two functions below are used for reading / writing the message 65 * functionally. The methods return true if the address in the packet 66 * matches the address / address range in the message. Each message 67 * class that can be potentially searched for the address needs to 68 * implement these methods. 69 */ 70 virtual bool functionalRead(Packet *pkt) = 0; | 55 { } 56 57 virtual ~Message() { } 58 59 virtual MsgPtr clone() const = 0; 60 virtual void print(std::ostream& out) const = 0; 61 virtual void setIncomingLink(int) {} 62 virtual void setVnet(int) {} 63 64 /** 65 * The two functions below are used for reading / writing the message 66 * functionally. The methods return true if the address in the packet 67 * matches the address / address range in the message. Each message 68 * class that can be potentially searched for the address needs to 69 * implement these methods. 70 */ 71 virtual bool functionalRead(Packet *pkt) = 0; |
71 //{ fatal("Read functional access not implemented!"); } | |
72 virtual bool functionalWrite(Packet *pkt) = 0; | 72 virtual bool functionalWrite(Packet *pkt) = 0; |
73 //{ fatal("Write functional access not implemented!"); } | |
74 75 //! Update the delay this message has experienced so far. 76 void updateDelayedTicks(Tick curTime) 77 { 78 assert(m_LastEnqueueTime <= curTime); 79 Tick delta = curTime - m_LastEnqueueTime; 80 m_DelayedTicks += delta; 81 } 82 const Tick getDelayedTicks() const {return m_DelayedTicks;} 83 84 void setLastEnqueueTime(const Tick& time) { m_LastEnqueueTime = time; } 85 const Tick getLastEnqueueTime() const {return m_LastEnqueueTime;} 86 87 const Tick& getTime() const { return m_time; } | 73 74 //! Update the delay this message has experienced so far. 75 void updateDelayedTicks(Tick curTime) 76 { 77 assert(m_LastEnqueueTime <= curTime); 78 Tick delta = curTime - m_LastEnqueueTime; 79 m_DelayedTicks += delta; 80 } 81 const Tick getDelayedTicks() const {return m_DelayedTicks;} 82 83 void setLastEnqueueTime(const Tick& time) { m_LastEnqueueTime = time; } 84 const Tick getLastEnqueueTime() const {return m_LastEnqueueTime;} 85 86 const Tick& getTime() const { return m_time; } |
88 void setTime(const Tick& new_time) { m_time = new_time; } | 87 void setMsgCounter(uint64_t c) { m_msg_counter = c; } 88 uint64_t getMsgCounter() const { return m_msg_counter; } |
89 90 private: | 89 90 private: |
91 Tick m_time; | 91 const Tick m_time; |
92 Tick m_LastEnqueueTime; // my last enqueue time 93 Tick m_DelayedTicks; // my delayed cycles | 92 Tick m_LastEnqueueTime; // my last enqueue time 93 Tick m_DelayedTicks; // my delayed cycles |
94 uint64_t m_msg_counter; // FIXME, should this be a 64-bit value? |
|
94}; 95 | 95}; 96 |
97inline bool 98operator>(const MsgPtr &lhs, const MsgPtr &rhs) 99{ 100 const Message *l = lhs.get(); 101 const Message *r = rhs.get(); 102 103 if (l->getLastEnqueueTime() == r->getLastEnqueueTime()) { 104 assert(l->getMsgCounter() != r->getMsgCounter()); 105 return l->getMsgCounter() > r->getMsgCounter(); 106 } 107 return l->getLastEnqueueTime() > r->getLastEnqueueTime(); 108} 109 |
|
96inline std::ostream& 97operator<<(std::ostream& out, const Message& obj) 98{ 99 obj.print(out); 100 out << std::flush; 101 return out; 102} 103 104#endif // __MEM_RUBY_SLICC_INTERFACE_MESSAGE_HH__ | 110inline std::ostream& 111operator<<(std::ostream& out, const Message& obj) 112{ 113 obj.print(out); 114 out << std::flush; 115 return out; 116} 117 118#endif // __MEM_RUBY_SLICC_INTERFACE_MESSAGE_HH__ |