ruby: update WireBuffer API to match that of MessageBuffer

this patch updates the WireBuffer API to mirror the changes in revision 11111
This commit is contained in:
Tony Gutierrez 2015-09-17 14:00:33 -04:00
parent 928d4b4ba8
commit b3eb0d1423
3 changed files with 20 additions and 24 deletions

View file

@ -57,7 +57,6 @@ WireBuffer::WireBuffer(const Params *p)
: SimObject(p)
{
m_msg_counter = 0;
m_ruby_system = p->ruby_system;
}
void
@ -70,11 +69,10 @@ WireBuffer::~WireBuffer()
}
void
WireBuffer::enqueue(MsgPtr message, Cycles latency)
WireBuffer::enqueue(MsgPtr message, Tick current_time, Tick delta)
{
m_msg_counter++;
Cycles current_time = m_ruby_system->curCycle();
Cycles arrival_time = current_time + latency;
Tick arrival_time = current_time + delta;
assert(arrival_time > current_time);
Message* msg_ptr = message.get();
@ -82,16 +80,16 @@ WireBuffer::enqueue(MsgPtr message, Cycles latency)
m_message_queue.push_back(message);
if (m_consumer_ptr != NULL) {
m_consumer_ptr->
scheduleEventAbsolute(m_ruby_system->clockPeriod() * arrival_time);
scheduleEventAbsolute(arrival_time);
} else {
panic("No Consumer for WireBuffer! %s\n", *this);
}
}
void
WireBuffer::dequeue()
WireBuffer::dequeue(Tick current_time)
{
assert(isReady());
assert(isReady(current_time));
pop_heap(m_message_queue.begin(), m_message_queue.end(),
greater<MsgPtr>());
m_message_queue.pop_back();
@ -106,31 +104,31 @@ WireBuffer::peek()
}
void
WireBuffer::recycle()
WireBuffer::recycle(Tick current_time, Tick recycle_latency)
{
// Because you don't want anything reordered, make sure the recycle latency
// is just 1 cycle. As a result, you really want to use this only in
// Wire-like situations because you don't want to deadlock as a result of
// being stuck behind something if you're not actually supposed to.
assert(isReady());
assert(isReady(current_time));
MsgPtr node = m_message_queue.front();
pop_heap(m_message_queue.begin(), m_message_queue.end(), greater<MsgPtr>());
node->setLastEnqueueTime(m_ruby_system->curCycle() + Cycles(1));
Tick future_time = current_time + recycle_latency;
node->setLastEnqueueTime(future_time);
m_message_queue.back() = node;
push_heap(m_message_queue.begin(), m_message_queue.end(),
greater<MsgPtr>());
m_consumer_ptr->
scheduleEventAbsolute(m_ruby_system->clockPeriod()
* (m_ruby_system->curCycle() + Cycles(1)));
scheduleEventAbsolute(future_time);
}
bool
WireBuffer::isReady()
WireBuffer::isReady(Tick current_time)
{
return ((!m_message_queue.empty()) &&
(m_message_queue.front()->getLastEnqueueTime() <=
m_ruby_system->curCycle()));
(m_message_queue.front()->getLastEnqueueTime() <= current_time));
}
void

View file

@ -72,12 +72,13 @@ class WireBuffer : public SimObject
void setDescription(const std::string& name) { m_description = name; };
std::string getDescription() { return m_description; };
void enqueue(MsgPtr message, Cycles latency);
void dequeue();
void enqueue(MsgPtr message, Tick current_time, Tick delta);
void dequeue(Tick current_time);
const Message* peek();
void recycle();
bool isReady();
bool areNSlotsAvailable(int n) { return true; }; // infinite queue length
void recycle(Tick current_time, Tick recycle_latency);
bool isReady(Tick current_time);
// infinite queue length
bool areNSlotsAvailable(int n, Tick current_time) { return true; };
void print(std::ostream& out) const;
uint64_t m_msg_counter;
@ -93,9 +94,6 @@ class WireBuffer : public SimObject
// queues where memory requests live
std::vector<MsgPtr> m_message_queue;
RubySystem * m_ruby_system;
};
std::ostream& operator<<(std::ostream& out, const WireBuffer& obj);

View file

@ -1080,7 +1080,7 @@ ${ident}_Controller::wakeup()
if len(ports) > 1:
# only produce checks when a buffer is shared by multiple ports
code('''
if (${{buf_name}}->isReady() && rejected[${{port_to_buf_map[ports[0]]}}] == ${{len(ports)}})
if (${{buf_name}}->isReady(clockEdge()) && rejected[${{port_to_buf_map[ports[0]]}}] == ${{len(ports)}})
{
// no port claimed the message on the top of this buffer
panic("Runtime Error at Ruby Time: %d. "