www.pudn.com > noc.rar > oqueue.cpp
/*
* TU Eindhoven
* Eindhoven, The Netherlands
*
* Name : oqueue.cpp
*
* Author : A.S.Slusarczyk@tue.nl
*
* Date : 13-09-2003
*
* Function : Output queue of the e-cube router
*
*
*/
#include "oqueue.h"
// FSM controling the buffer
void OUTPUT_QUEUE::control_logic()
{
bool req_v, ack_in_v, buffer_write_v, buffer_clear_v;
req_v = false;
ack_in_v = false;
buffer_write_v = false;
buffer_clear_v = false;
next_state = EMPTY;
switch( current_state.read() )
{
case EMPTY :
// empty buffer - wait for request from switch
if( req_in.read() ){
// buffer the input data, acknowledge its storing and try sending further
buffer_write_v = true;
next_state = BUFFERING;
ack_in_v = true;
#ifdef ROUTEPRINT
cout << name() << " got flit 0x" << hex << data_in.read().to_uint() << dec << " @" << sc_time_stamp() << endl;
#endif
}
else
next_state = EMPTY;
break;
case BUFFERING :
// sending buffered data - assert network request, wait for ack
req_v = true;
if( ack.read() ){
next_state = EMPTY;
#ifdef ROUTEPRINT
cout << name() << " sent flit 0x" << hex << buffer.read().to_uint() << dec << " @" << sc_time_stamp() << endl;
#endif
}
else
next_state = BUFFERING;
break;
}
req.write(req_v);
ack_in.write(ack_in_v);
buffer_write.write(buffer_write_v);
buffer_clear.write(buffer_clear_v);
}
void OUTPUT_QUEUE::control_change_state()
{
if( rst.read() )
current_state = EMPTY;
else
current_state = next_state;
}
void OUTPUT_QUEUE::buffer_process()
{
if( rst.read() )
{
buffer = 0;
}
else
{
if( buffer_clear.read() ){
buffer = 0;
}
else if( buffer_write.read() ){
buffer = data_in.read();
}
}
}
void OUTPUT_QUEUE::data_out()
{
data.write( buffer.read() );
}