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
|