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() );
}