diff options
Diffstat (limited to 'src/mem/ruby/buffers')
-rw-r--r-- | src/mem/ruby/buffers/MessageBuffer.cc | 28 | ||||
-rw-r--r-- | src/mem/ruby/buffers/MessageBuffer.hh | 18 | ||||
-rw-r--r-- | src/mem/ruby/buffers/MessageBufferNode.hh | 18 |
3 files changed, 30 insertions, 34 deletions
diff --git a/src/mem/ruby/buffers/MessageBuffer.cc b/src/mem/ruby/buffers/MessageBuffer.cc index 446586f5a..f39e35738 100644 --- a/src/mem/ruby/buffers/MessageBuffer.cc +++ b/src/mem/ruby/buffers/MessageBuffer.cc @@ -39,6 +39,7 @@ using namespace std; using m5::stl_helpers::operator<<; MessageBuffer::MessageBuffer(const string &name) + : m_last_arrival_time(0) { m_msg_counter = 0; m_consumer_ptr = NULL; @@ -48,7 +49,6 @@ MessageBuffer::MessageBuffer(const string &name) m_strict_fifo = true; m_size = 0; m_max_size = -1; - m_last_arrival_time = 0; m_randomization = true; m_size_last_time_size_checked = 0; m_time_last_time_size_checked = 0; @@ -139,19 +139,19 @@ MessageBuffer::peekAtHeadOfQueue() const } // FIXME - move me somewhere else -int +Cycles random_time() { - int time = 1; - time += random() & 0x3; // [0...3] + Cycles time(1); + time += Cycles(random() & 0x3); // [0...3] if ((random() & 0x7) == 0) { // 1 in 8 chance - time += 100 + (random() % 0xf); // 100 + [1...15] + time += Cycles(100 + (random() % 0xf)); // 100 + [1...15] } return time; } void -MessageBuffer::enqueue(MsgPtr message, Time delta) +MessageBuffer::enqueue(MsgPtr message, Cycles delta) { m_msg_counter++; m_size++; @@ -170,8 +170,9 @@ MessageBuffer::enqueue(MsgPtr message, Time delta) // Calculate the arrival time of the message, that is, the first // cycle the message can be dequeued. assert(delta>0); - Time current_time = m_clockobj_ptr->curCycle(); - Time arrival_time = 0; + Cycles current_time(m_clockobj_ptr->curCycle()); + Cycles arrival_time(0); + if (!RubySystem::getRandomization() || (m_randomization == false)) { // No randomization arrival_time = current_time + delta; @@ -304,6 +305,7 @@ MessageBuffer::recycle() MessageBufferNode node = m_prio_heap.front(); pop_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MessageBufferNode>()); + node.m_time = m_clockobj_ptr->curCycle() + m_recycle_latency; m_prio_heap.back() = node; push_heap(m_prio_heap.begin(), m_prio_heap.end(), @@ -317,6 +319,7 @@ MessageBuffer::reanalyzeMessages(const Address& addr) { DPRINTF(RubyQueue, "ReanalyzeMessages\n"); assert(m_stall_msg_map.count(addr) > 0); + Cycles nextCycle(m_clockobj_ptr->curCycle() + Cycles(1)); // // Put all stalled messages associated with this address back on the @@ -324,8 +327,7 @@ MessageBuffer::reanalyzeMessages(const Address& addr) // while(!m_stall_msg_map[addr].empty()) { m_msg_counter++; - MessageBufferNode msgNode(m_clockobj_ptr->curCycle() + 1, - m_msg_counter, + MessageBufferNode msgNode(nextCycle, m_msg_counter, m_stall_msg_map[addr].front()); m_prio_heap.push_back(msgNode); @@ -342,6 +344,7 @@ void MessageBuffer::reanalyzeAllMessages() { DPRINTF(RubyQueue, "ReanalyzeAllMessages %s\n"); + Cycles nextCycle(m_clockobj_ptr->curCycle() + Cycles(1)); // // Put all stalled messages associated with this address back on the @@ -353,14 +356,13 @@ MessageBuffer::reanalyzeAllMessages() while(!(map_iter->second).empty()) { m_msg_counter++; - MessageBufferNode msgNode(m_clockobj_ptr->curCycle() + 1, - m_msg_counter, + MessageBufferNode msgNode(nextCycle, m_msg_counter, (map_iter->second).front()); m_prio_heap.push_back(msgNode); push_heap(m_prio_heap.begin(), m_prio_heap.end(), greater<MessageBufferNode>()); - + m_consumer_ptr->scheduleEventAbsolute(msgNode.m_time); (map_iter->second).pop_front(); } diff --git a/src/mem/ruby/buffers/MessageBuffer.hh b/src/mem/ruby/buffers/MessageBuffer.hh index 581f03453..5bad45f2d 100644 --- a/src/mem/ruby/buffers/MessageBuffer.hh +++ b/src/mem/ruby/buffers/MessageBuffer.hh @@ -54,11 +54,8 @@ class MessageBuffer std::string name() const { return m_name; } - void - setRecycleLatency(int recycle_latency) - { - m_recycle_latency = recycle_latency; - } + void setRecycleLatency(Cycles recycle_latency) + { m_recycle_latency = recycle_latency; } void reanalyzeMessages(const Address& addr); void reanalyzeAllMessages(); @@ -74,7 +71,7 @@ class MessageBuffer std::pop_heap(m_prio_heap.begin(), m_prio_heap.end(), std::greater<MessageBufferNode>()); m_prio_heap.pop_back(); - enqueue(node.m_msgptr, 1); + enqueue(node.m_msgptr, Cycles(1)); } bool areNSlotsAvailable(int n); @@ -114,8 +111,8 @@ class MessageBuffer return m_prio_heap.front().m_msgptr; } - void enqueue(MsgPtr message) { enqueue(message, 1); } - void enqueue(MsgPtr message, Time delta); + void enqueue(MsgPtr message) { enqueue(message, Cycles(1)); } + void enqueue(MsgPtr message, Cycles delta); //! returns delay ticks of the message. Time dequeue_getDelayCycles(MsgPtr& message); @@ -160,7 +157,7 @@ class MessageBuffer private: //added by SS - int m_recycle_latency; + Cycles m_recycle_latency; // Private Methods Time setAndReturnDelayCycles(MsgPtr message); @@ -204,7 +201,8 @@ class MessageBuffer bool m_strict_fifo; bool m_ordering_set; bool m_randomization; - Time m_last_arrival_time; + + Cycles m_last_arrival_time; int m_input_link_id; int m_vnet_id; diff --git a/src/mem/ruby/buffers/MessageBufferNode.hh b/src/mem/ruby/buffers/MessageBufferNode.hh index 5e7a52e12..57f09a913 100644 --- a/src/mem/ruby/buffers/MessageBufferNode.hh +++ b/src/mem/ruby/buffers/MessageBufferNode.hh @@ -37,22 +37,18 @@ class MessageBufferNode { public: MessageBufferNode() - { - m_time = 0; - m_msg_counter = 0; - } + : m_time(0), m_msg_counter(0) + {} - MessageBufferNode(const Time& time, int counter, const MsgPtr& msgptr) - { - m_time = time; - m_msgptr = msgptr; - m_msg_counter = counter; - } + MessageBufferNode(const Cycles& time, uint64_t counter, + const MsgPtr& msgptr) + : m_time(time), m_msg_counter(counter), m_msgptr(msgptr) + {} void print(std::ostream& out) const; public: - Time m_time; + Cycles m_time; uint64 m_msg_counter; // FIXME, should this be a 64-bit value? MsgPtr m_msgptr; }; |