summaryrefslogtreecommitdiff
path: root/src/intersim/event_router.hpp
blob: 91bc005b34b60f63e39e4cbd39ac716a9ea27b36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#ifndef _EVENT_ROUTER_HPP_
#define _EVENT_ROUTER_HPP_

#include <string>
#include <queue>

#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<tWaiting *> *_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<Flit>   *_crossbar_pipe;
   PipelineFIFO<Credit> *_credit_pipe;

   queue<Flit *> *_input_buffer;
   queue<Flit *> *_output_buffer;

   queue<Credit *> *_in_cred_buffer;
   queue<Credit *> *_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<tArrivalEvent> *_arrival_pipe;
   queue<tArrivalEvent *>      *_arrival_queue;
   PriorityArbiter             **_arrival_arbiter;

   struct tTransportEvent {
      int  input;
      int  src_vc;
      int  dst_vc;

      int  id;    // debug
      bool watch; // debug
   };

   queue<tTransportEvent *> *_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