summaryrefslogtreecommitdiff
path: root/src/intersim/iq_router.hpp
blob: 47db1fa775f181cf3031abfbfeb76e6ff288555b (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
#ifndef _IQ_ROUTER_HPP_
#define _IQ_ROUTER_HPP_

#include <string>
#include <queue>

#include "module.hpp"
#include "router.hpp"
#include "vc.hpp"
#include "allocator.hpp"
#include "routefunc.hpp"
#include "outputset.hpp"
#include "buffer_state.hpp"
#include "pipefifo.hpp"

class IQRouter : public Router {
   int _vcs;
   int _vc_size;

   int _iq_time;
   int _output_extra_latency;

   VC          **_vc;
   BufferState *_next_vcs;

   Allocator *_vc_allocator;
   Allocator *_sw_allocator;

   int *_sw_rr_offset;

   tRoutingFunction   _rf;

   PipelineFIFO<Flit>   *_crossbar_pipe;
   PipelineFIFO<Credit> *_credit_pipe;

   queue<Flit *> *_input_buffer;
   queue<pair<Flit *,int> > *_output_buffer;

   queue<Credit *> *_in_cred_buffer;
   queue<Credit *> *_out_cred_buffer;

   int _hold_switch_for_packet;
   int *_switch_hold_in;
   int *_switch_hold_out;
   int *_switch_hold_vc;

   void _ReceiveFlits( );
   void _ReceiveCredits( );

   void _InputQueuing( );
   void _Route( );
   void _VCAlloc( );
   void _SWAlloc( );
   void _OutputQueuing( );

   void _SendFlits( );
   void _SendCredits( );

   void _AddVCRequests( VC* cur_vc, int input_index, bool watch = false );

public:
   IQRouter( const Configuration& config,
             Module *parent, string name, int id,
             int inputs, int outputs );

   virtual ~IQRouter( );

   virtual void ReadInputs( );
   virtual void InternalStep( );
   virtual void WriteOutputs( );

   void Display( ) const;
};

#endif