From 69f2911e04ffb1b19eef1fafb8c040af271f656e Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Thu, 15 Jul 2010 18:09:46 -0800 Subject: creating branch for adding support for CUDA 3.x and Fermi [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6829] --- src/intersim/event_router.hpp | 151 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 src/intersim/event_router.hpp (limited to 'src/intersim/event_router.hpp') diff --git a/src/intersim/event_router.hpp b/src/intersim/event_router.hpp new file mode 100644 index 0000000..91bc005 --- /dev/null +++ b/src/intersim/event_router.hpp @@ -0,0 +1,151 @@ +#ifndef _EVENT_ROUTER_HPP_ +#define _EVENT_ROUTER_HPP_ + +#include +#include + +#include "module.hpp" +#include "router.hpp" +#include "vc.hpp" +#include "arbiter.hpp" +#include "routefunc.hpp" +#include "outputset.hpp" +#include "pipefifo.hpp" + +class EventNextVCState : public Module { +public: + enum eNextVCState { + idle, busy, tail_pending + }; + + struct tWaiting { + int input; + int vc; + int id; + int pres; + bool watch; + }; + +private: + int _buf_size; + int _vcs; + + int *_credits; + int *_presence; + int *_input; + int *_inputVC; + + list *_waiting; + + eNextVCState *_state; + + void _Init( const Configuration& config ); + +public: + EventNextVCState() : Module() {} + void init( const Configuration& config ); + EventNextVCState( const Configuration& config, + Module *parent, const string& name ); + ~EventNextVCState( ); + + eNextVCState GetState( int vc ) const; + int GetPresence( int vc ) const; + int GetCredits( int vc ) const; + int GetInput( int vc ) const; + int GetInputVC( int vc ) const; + + bool IsWaiting( int vc ) const; + bool IsInputWaiting( int vc, int w_input, int w_vc ) const; + + void PushWaiting( int vc, tWaiting *w ); + void IncrWaiting( int vc, int w_input, int w_vc ); + tWaiting *PopWaiting( int vc ); + + void SetState( int vc, eNextVCState state ); + void SetCredits( int vc, int value ); + void SetPresence( int vc, int value ); + void SetInput( int vc, int input ); + void SetInputVC( int vc, int in_vc ); +}; + +class EventRouter : public Router { + int _vcs; + int _vc_size; + + int _vct; + + VC **_vc; + + tRoutingFunction _rf; + + EventNextVCState *_output_state; + + PipelineFIFO *_crossbar_pipe; + PipelineFIFO *_credit_pipe; + + queue *_input_buffer; + queue *_output_buffer; + + queue *_in_cred_buffer; + queue *_out_cred_buffer; + + struct tArrivalEvent { + int input; + int output; + int src_vc; + int dst_vc; + bool head; + bool tail; + + int id; // debug + bool watch; // debug + }; + + PipelineFIFO *_arrival_pipe; + queue *_arrival_queue; + PriorityArbiter **_arrival_arbiter; + + struct tTransportEvent { + int input; + int src_vc; + int dst_vc; + + int id; // debug + bool watch; // debug + }; + + queue *_transport_queue; + PriorityArbiter **_transport_arbiter; + + bool *_transport_free; + int *_transport_match; + + void _ReceiveFlits( ); + void _ReceiveCredits( ); + + void _IncomingFlits( ); + void _ArrivalRequests( int input ); + void _ArrivalArb( int output ); + void _SendTransport( int input, int output, tArrivalEvent *aevt ); + void _ProcessWaiting( int output, int out_vc ); + void _TransportRequests( int output ); + void _TransportArb( int input ); + void _OutputQueuing( ); + + void _SendFlits( ); + void _SendCredits( ); + +public: + EventRouter( const Configuration& config, + Module *parent, string name, int id, + int inputs, int outputs ); + virtual ~EventRouter( ); + + virtual void ReadInputs( ); + virtual void InternalStep( ); + virtual void WriteOutputs( ); + + void Display( ) const; +}; + +#endif -- cgit v1.3