summaryrefslogtreecommitdiff
path: root/src/mem/ruby/buffers
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/ruby/buffers')
-rw-r--r--src/mem/ruby/buffers/MessageBuffer.cc28
-rw-r--r--src/mem/ruby/buffers/MessageBuffer.hh18
-rw-r--r--src/mem/ruby/buffers/MessageBufferNode.hh18
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;
};