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:
parent
928d4b4ba8
commit
b3eb0d1423
|
@ -57,7 +57,6 @@ WireBuffer::WireBuffer(const Params *p)
|
||||||
: SimObject(p)
|
: SimObject(p)
|
||||||
{
|
{
|
||||||
m_msg_counter = 0;
|
m_msg_counter = 0;
|
||||||
m_ruby_system = p->ruby_system;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -70,11 +69,10 @@ WireBuffer::~WireBuffer()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
WireBuffer::enqueue(MsgPtr message, Cycles latency)
|
WireBuffer::enqueue(MsgPtr message, Tick current_time, Tick delta)
|
||||||
{
|
{
|
||||||
m_msg_counter++;
|
m_msg_counter++;
|
||||||
Cycles current_time = m_ruby_system->curCycle();
|
Tick arrival_time = current_time + delta;
|
||||||
Cycles arrival_time = current_time + latency;
|
|
||||||
assert(arrival_time > current_time);
|
assert(arrival_time > current_time);
|
||||||
|
|
||||||
Message* msg_ptr = message.get();
|
Message* msg_ptr = message.get();
|
||||||
|
@ -82,16 +80,16 @@ WireBuffer::enqueue(MsgPtr message, Cycles latency)
|
||||||
m_message_queue.push_back(message);
|
m_message_queue.push_back(message);
|
||||||
if (m_consumer_ptr != NULL) {
|
if (m_consumer_ptr != NULL) {
|
||||||
m_consumer_ptr->
|
m_consumer_ptr->
|
||||||
scheduleEventAbsolute(m_ruby_system->clockPeriod() * arrival_time);
|
scheduleEventAbsolute(arrival_time);
|
||||||
} else {
|
} else {
|
||||||
panic("No Consumer for WireBuffer! %s\n", *this);
|
panic("No Consumer for WireBuffer! %s\n", *this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
WireBuffer::dequeue()
|
WireBuffer::dequeue(Tick current_time)
|
||||||
{
|
{
|
||||||
assert(isReady());
|
assert(isReady(current_time));
|
||||||
pop_heap(m_message_queue.begin(), m_message_queue.end(),
|
pop_heap(m_message_queue.begin(), m_message_queue.end(),
|
||||||
greater<MsgPtr>());
|
greater<MsgPtr>());
|
||||||
m_message_queue.pop_back();
|
m_message_queue.pop_back();
|
||||||
|
@ -106,31 +104,31 @@ WireBuffer::peek()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
WireBuffer::recycle()
|
WireBuffer::recycle(Tick current_time, Tick recycle_latency)
|
||||||
{
|
{
|
||||||
// Because you don't want anything reordered, make sure the 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
|
// 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
|
// 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.
|
// being stuck behind something if you're not actually supposed to.
|
||||||
assert(isReady());
|
assert(isReady(current_time));
|
||||||
MsgPtr node = m_message_queue.front();
|
MsgPtr node = m_message_queue.front();
|
||||||
pop_heap(m_message_queue.begin(), m_message_queue.end(), greater<MsgPtr>());
|
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;
|
m_message_queue.back() = node;
|
||||||
push_heap(m_message_queue.begin(), m_message_queue.end(),
|
push_heap(m_message_queue.begin(), m_message_queue.end(),
|
||||||
greater<MsgPtr>());
|
greater<MsgPtr>());
|
||||||
m_consumer_ptr->
|
m_consumer_ptr->
|
||||||
scheduleEventAbsolute(m_ruby_system->clockPeriod()
|
scheduleEventAbsolute(future_time);
|
||||||
* (m_ruby_system->curCycle() + Cycles(1)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
WireBuffer::isReady()
|
WireBuffer::isReady(Tick current_time)
|
||||||
{
|
{
|
||||||
return ((!m_message_queue.empty()) &&
|
return ((!m_message_queue.empty()) &&
|
||||||
(m_message_queue.front()->getLastEnqueueTime() <=
|
(m_message_queue.front()->getLastEnqueueTime() <= current_time));
|
||||||
m_ruby_system->curCycle()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -72,12 +72,13 @@ class WireBuffer : public SimObject
|
||||||
void setDescription(const std::string& name) { m_description = name; };
|
void setDescription(const std::string& name) { m_description = name; };
|
||||||
std::string getDescription() { return m_description; };
|
std::string getDescription() { return m_description; };
|
||||||
|
|
||||||
void enqueue(MsgPtr message, Cycles latency);
|
void enqueue(MsgPtr message, Tick current_time, Tick delta);
|
||||||
void dequeue();
|
void dequeue(Tick current_time);
|
||||||
const Message* peek();
|
const Message* peek();
|
||||||
void recycle();
|
void recycle(Tick current_time, Tick recycle_latency);
|
||||||
bool isReady();
|
bool isReady(Tick current_time);
|
||||||
bool areNSlotsAvailable(int n) { return true; }; // infinite queue length
|
// infinite queue length
|
||||||
|
bool areNSlotsAvailable(int n, Tick current_time) { return true; };
|
||||||
|
|
||||||
void print(std::ostream& out) const;
|
void print(std::ostream& out) const;
|
||||||
uint64_t m_msg_counter;
|
uint64_t m_msg_counter;
|
||||||
|
@ -93,9 +94,6 @@ class WireBuffer : public SimObject
|
||||||
|
|
||||||
// queues where memory requests live
|
// queues where memory requests live
|
||||||
std::vector<MsgPtr> m_message_queue;
|
std::vector<MsgPtr> m_message_queue;
|
||||||
|
|
||||||
RubySystem * m_ruby_system;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream& operator<<(std::ostream& out, const WireBuffer& obj);
|
std::ostream& operator<<(std::ostream& out, const WireBuffer& obj);
|
||||||
|
|
|
@ -1080,7 +1080,7 @@ ${ident}_Controller::wakeup()
|
||||||
if len(ports) > 1:
|
if len(ports) > 1:
|
||||||
# only produce checks when a buffer is shared by multiple ports
|
# only produce checks when a buffer is shared by multiple ports
|
||||||
code('''
|
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
|
// no port claimed the message on the top of this buffer
|
||||||
panic("Runtime Error at Ruby Time: %d. "
|
panic("Runtime Error at Ruby Time: %d. "
|
||||||
|
|
Loading…
Reference in a new issue