summaryrefslogtreecommitdiff
path: root/src/intersim/trafficmanager.hpp
blob: 105d73c21414f1d7a8e50407a2060139a877f17d (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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#ifndef _TRAFFICMANAGER_HPP_
#define _TRAFFICMANAGER_HPP_

#include <list>
#include <map>
#include <queue>

#include "module.hpp"
#include "config_utils.hpp"
#include "network.hpp"
#include "flit.hpp"
#include "buffer_state.hpp"
#include "stats.hpp"
#include "traffic.hpp"
#include "routefunc.hpp"
#include "outputset.hpp"
#include "injection.hpp"

class flitp_compare {
public:
   bool operator()( const Flit *a, const Flit *b ) const {
      return( a->sn > b->sn );
   }
};

class TrafficManager : public Module {
public:
   int _sources;
   int _dests;

   Network *_net;

   // ============ Message priorities ============ 

   enum ePriority {
      class_based, age_based, none
   };

   ePriority _pri_type;
   int       _classes;

   // ============ Injection VC states  ============ 

   BufferState **_buf_states;

   // ============ Injection queues ============ 

   int          _voqing;
   int          **_qtime;
   bool         **_qdrained;
   list<Flit *> **_partial_packets;

   bool         _use_lagging;

   list<Flit *> **_voq;
   list<int>    *_active_list;
   bool         **_active_vc;

   int           _measured_in_flight;
   int           _total_in_flight;
   map<int,bool> _in_flight;
   bool          _empty_network;

   int          _split_packets; 

   queue<Flit *> * credit_return_queue; //keeps flits that their corresponding credits are not sent yet
   // ============ Reorder queues ============ 

   bool _reorder;

   int                    **_inject_sqn;
   int                    **_rob_sqn;
   int                    **_rob_sqn_max;
   int                     *_rob_pri;

   priority_queue<Flit *, vector<Flit *>, flitp_compare> **_rob;

   // ============ Statistics ============

   Stats **_latency_stats;     
   Stats **_overall_latency;
   Stats *_rob_latency;
   Stats *_rob_size;

   Stats **_pair_latency;
   Stats *_hop_stats;

   Stats **_accepted_packets;
   Stats *_overall_accepted;
   Stats *_overall_accepted_min;

   int   **_latest_packet;

   bool  _flit_timing;

   // ============ Simulation parameters ============ 

   enum eSimState {
      warming_up, running, draining, done
   };
   eSimState _sim_state;

   enum eSimMode {
      latency, throughput
   };
   eSimMode _sim_mode;

   int   _warmup_time;
   int   _drain_time;

   float _load;
   int   _packet_size;

   int   _total_sims;
   int   _sample_period;
   int   _max_samples;
   int   _warmup_periods;

   int   _include_queuing;

   double _latency_thres;

   float _internal_speedup;
   float _partial_internal_cycles;

   int _cur_id;
   int _time;

   list<Flit *> _used_flits;
   list<Flit *> _free_flits;

   tTrafficFunction  _traffic_function;
   tRoutingFunction  _routing_function;
   tInjectionProcess _injection_process;

   // ============ Internal methods ============ 

   Flit *_NewFlit( );
   void _RetireFlit( Flit *f, int dest );

   void _FirstStep( );
   void _Step( );

   Flit *_ReadROB( int dest );

   bool _PacketsOutstanding( ) const;

   int  _IssuePacket( int source, int cl ) const;
   void _GeneratePacket( int source, int size, int cl, int time, void* data, int dest );

   void _ClassInject( );
   void _VOQInject( );

   void _ClearStats( );

   int  _ComputeAccepted( double *avg, double *min ) const;

   bool _SingleSim( );

   void _DisplayRemaining( ) const;

public:
   int uid; // this traffic manger's ID useful when we have more than 1 traffic objects
   TrafficManager( const Configuration &config, Network *net,int uid );
   ~TrafficManager( );
   void IcntInitPerGrid  (int time);
   void SetDrainState( );
   void ShowStats(); 
   void ShowOveralStat( );
   void IcntInitPerGrid();  
};

#endif