1 | /* |
---|
2 | * $Id: Parameters.cpp 88 2008-12-10 18:31:39Z rosiere $ |
---|
3 | * |
---|
4 | * [ Description ] |
---|
5 | * |
---|
6 | */ |
---|
7 | |
---|
8 | #include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/include/Parameters.h" |
---|
9 | #include "Common/include/Max.h" |
---|
10 | |
---|
11 | namespace morpheo { |
---|
12 | namespace behavioural { |
---|
13 | namespace core { |
---|
14 | namespace multi_ooo_engine { |
---|
15 | namespace ooo_engine { |
---|
16 | |
---|
17 | |
---|
18 | #undef FUNCTION |
---|
19 | #define FUNCTION "OOO_Engine::Parameters" |
---|
20 | Parameters::Parameters (uint32_t nb_front_end , |
---|
21 | uint32_t * nb_context ,//[nb_front_end] |
---|
22 | uint32_t nb_rename_unit , |
---|
23 | uint32_t nb_execute_loop , |
---|
24 | uint32_t * nb_inst_decod ,//[nb_front_end] |
---|
25 | uint32_t * nb_inst_insert ,//[nb_rename_unit] |
---|
26 | uint32_t * nb_inst_retire ,//[nb_rename_unit] |
---|
27 | uint32_t nb_inst_issue , |
---|
28 | uint32_t * nb_inst_execute ,//[nb_execute_loop] |
---|
29 | uint32_t nb_inst_reexecute , |
---|
30 | uint32_t nb_inst_commit , |
---|
31 | uint32_t nb_inst_branch_complete , |
---|
32 | uint32_t ** nb_branch_speculated ,//[nb_front_end][nb_context] |
---|
33 | uint32_t nb_rename_unit_select , |
---|
34 | uint32_t nb_execute_loop_select , |
---|
35 | uint32_t size_general_data , |
---|
36 | uint32_t size_special_data , |
---|
37 | uint32_t * link_rename_unit_with_front_end ,//[nb_front_end] |
---|
38 | // Commit |
---|
39 | uint32_t size_re_order_buffer , |
---|
40 | uint32_t nb_re_order_buffer_bank , |
---|
41 | Tpriority_t commit_priority , |
---|
42 | Tload_balancing_t commit_load_balancing , |
---|
43 | // Issue |
---|
44 | uint32_t size_issue_queue , |
---|
45 | uint32_t nb_issue_queue_bank , |
---|
46 | Tpriority_t issue_priority , |
---|
47 | Tload_balancing_t issue_load_balancing , |
---|
48 | bool ** table_routing ,//[nb_rename_unit][nb_inst_issue] |
---|
49 | bool ** table_issue_type ,//[nb_inst_issue][nb_type] |
---|
50 | // Reexecute |
---|
51 | uint32_t size_reexecute_queue , |
---|
52 | Tpriority_t reexecute_priority , |
---|
53 | Tload_balancing_t reexecute_load_balancing , |
---|
54 | // Rename_unit |
---|
55 | Tpriority_t * rename_select_priority ,//[nb_rename_unit] |
---|
56 | Tload_balancing_t * rename_select_load_balancing ,//[nb_rename_unit] |
---|
57 | uint32_t * rename_select_nb_front_end_select,//[nb_rename_unit] |
---|
58 | uint32_t * nb_general_register ,//[nb_rename_unit] |
---|
59 | uint32_t * nb_special_register ,//[nb_rename_unit] |
---|
60 | uint32_t * nb_reg_free ,//[nb_rename_unit] |
---|
61 | uint32_t * nb_rename_unit_bank ,//[nb_rename_unit] |
---|
62 | uint32_t * size_read_counter ,//[nb_rename_unit] |
---|
63 | uint32_t * nb_load_store_queue ,//[nb_rename_unit] |
---|
64 | uint32_t ** size_store_queue ,//[nb_rename_unit][nb_load_store_queue] |
---|
65 | uint32_t ** size_load_queue ,//[nb_rename_unit][nb_load_store_queue] |
---|
66 | uint32_t ** link_load_store_unit_with_thread ,//[nb_front_end][nb_context] |
---|
67 | // SPR |
---|
68 | bool *** implement_group ,//[nb_front_end][nb_context][NB_GROUP] |
---|
69 | |
---|
70 | bool is_toplevel |
---|
71 | ) |
---|
72 | { |
---|
73 | log_begin(OOO_Engine,FUNCTION); |
---|
74 | |
---|
75 | _nb_front_end = nb_front_end ; |
---|
76 | _nb_context = nb_context ; |
---|
77 | _nb_rename_unit = nb_rename_unit ; |
---|
78 | _nb_execute_loop = nb_execute_loop ; |
---|
79 | _nb_inst_decod = nb_inst_decod ; |
---|
80 | _nb_inst_insert = nb_inst_insert ; |
---|
81 | _nb_inst_retire = nb_inst_retire ; |
---|
82 | _nb_inst_issue = nb_inst_issue ; |
---|
83 | _nb_inst_execute = nb_inst_execute ; |
---|
84 | _nb_inst_reexecute = nb_inst_reexecute ; |
---|
85 | _nb_inst_commit = nb_inst_commit ; |
---|
86 | _nb_inst_branch_complete = nb_inst_branch_complete ; |
---|
87 | _nb_branch_speculated = nb_branch_speculated ; |
---|
88 | _nb_rename_unit_select = nb_rename_unit_select ; |
---|
89 | _nb_execute_loop_select = nb_execute_loop_select ; |
---|
90 | // _size_general_data = size_general_data ; |
---|
91 | // _size_special_data = size_special_data ; |
---|
92 | _link_rename_unit_with_front_end = link_rename_unit_with_front_end ; |
---|
93 | _size_re_order_buffer = size_re_order_buffer ; |
---|
94 | _nb_re_order_buffer_bank = nb_re_order_buffer_bank ; |
---|
95 | _commit_priority = commit_priority ; |
---|
96 | _commit_load_balancing = commit_load_balancing ; |
---|
97 | _size_issue_queue = size_issue_queue ; |
---|
98 | _nb_issue_queue_bank = nb_issue_queue_bank ; |
---|
99 | _issue_priority = issue_priority ; |
---|
100 | _issue_load_balancing = issue_load_balancing ; |
---|
101 | _table_routing = table_routing ; |
---|
102 | _table_issue_type = table_issue_type ; |
---|
103 | _size_reexecute_queue = size_reexecute_queue ; |
---|
104 | _reexecute_priority = reexecute_priority ; |
---|
105 | _reexecute_load_balancing = reexecute_load_balancing ; |
---|
106 | _rename_select_priority = rename_select_priority ; |
---|
107 | _rename_select_load_balancing = rename_select_load_balancing ; |
---|
108 | _rename_select_nb_front_end_select = rename_select_nb_front_end_select; |
---|
109 | _nb_general_register = nb_general_register ; |
---|
110 | _nb_special_register = nb_special_register ; |
---|
111 | _nb_reg_free = nb_reg_free ; |
---|
112 | _nb_rename_unit_bank = nb_rename_unit_bank ; |
---|
113 | _size_read_counter = size_read_counter ; |
---|
114 | _nb_load_store_queue = nb_load_store_queue ; |
---|
115 | _size_store_queue = size_store_queue ; |
---|
116 | _size_load_queue = size_load_queue ; |
---|
117 | _link_load_store_unit_with_thread = link_load_store_unit_with_thread ; |
---|
118 | _implement_group = implement_group ; |
---|
119 | |
---|
120 | test(); |
---|
121 | |
---|
122 | _link_front_end_with_rename_unit = new std::vector<uint32_t> [_nb_rename_unit]; |
---|
123 | for (uint32_t i=0; i<_nb_front_end; i++) |
---|
124 | _link_front_end_with_rename_unit[_link_rename_unit_with_front_end[i]].push_back(i); |
---|
125 | |
---|
126 | _rename_unit_size_front_end_id = new uint32_t [_nb_rename_unit]; |
---|
127 | _rename_unit_size_context_id = new uint32_t [_nb_rename_unit]; |
---|
128 | _rename_unit_nb_front_end = new uint32_t [_nb_rename_unit]; |
---|
129 | _rename_unit_nb_context = new uint32_t * [_nb_rename_unit]; |
---|
130 | _rename_unit_nb_inst_decod = new uint32_t * [_nb_rename_unit]; |
---|
131 | _rename_unit_link_load_store_unit_with_thread = new uint32_t ** [_nb_rename_unit]; |
---|
132 | |
---|
133 | for (uint32_t i=0; i<_nb_rename_unit; i++) |
---|
134 | { |
---|
135 | uint32_t x = _link_front_end_with_rename_unit[i].size(); // number of linked front_end |
---|
136 | |
---|
137 | _rename_unit_nb_front_end [i] = x; |
---|
138 | _rename_unit_nb_context [i] = new uint32_t [x]; |
---|
139 | _rename_unit_nb_inst_decod [i] = new uint32_t [x]; |
---|
140 | _rename_unit_link_load_store_unit_with_thread [i] = new uint32_t * [x]; |
---|
141 | |
---|
142 | // Scan front_end list |
---|
143 | std::vector<uint32_t>::iterator it=_link_front_end_with_rename_unit[i].begin(); |
---|
144 | for (uint32_t j=0; j<x; j++) |
---|
145 | { |
---|
146 | _rename_unit_nb_context [i][j] = _nb_context [*it]; |
---|
147 | _rename_unit_nb_inst_decod [i][j] = _nb_inst_decod [*it]; |
---|
148 | _rename_unit_link_load_store_unit_with_thread [i][j] = new uint32_t [_nb_context [*it]]; |
---|
149 | |
---|
150 | for (uint32_t k=0; k<_nb_context [*it]; k++) |
---|
151 | _rename_unit_link_load_store_unit_with_thread [i][j][k] = _link_load_store_unit_with_thread [*it][k]; |
---|
152 | |
---|
153 | ++it; |
---|
154 | } |
---|
155 | |
---|
156 | _rename_unit_size_front_end_id [i] = log2(_rename_unit_nb_front_end [i]); |
---|
157 | _rename_unit_size_context_id [i] = log2(max<uint32_t>(_rename_unit_nb_context [i], _rename_unit_nb_front_end [i])); |
---|
158 | } |
---|
159 | |
---|
160 | for (uint32_t i=0; i<_nb_rename_unit; i++) |
---|
161 | { |
---|
162 | log_printf(TRACE,OOO_Engine,FUNCTION,"Rename_unit [%d]",i); |
---|
163 | log_printf(TRACE,OOO_Engine,FUNCTION," * front_end : %d",_rename_unit_nb_front_end[i]); |
---|
164 | |
---|
165 | for (uint32_t j=0; j<_rename_unit_nb_front_end[i]; j++) |
---|
166 | { |
---|
167 | log_printf(TRACE,OOO_Engine,FUNCTION," * [%d] nb_context : %d, nb_inst_decod : %d",j,_rename_unit_nb_context[i][j],_rename_unit_nb_inst_decod[i][j]); |
---|
168 | |
---|
169 | for (uint32_t k=0; k<_rename_unit_nb_context[i][j]; ++k) |
---|
170 | log_printf(TRACE,OOO_Engine,FUNCTION," * [%d][%d] link_lsq : %d",j,k,_rename_unit_link_load_store_unit_with_thread[i][j][k]); |
---|
171 | } |
---|
172 | } |
---|
173 | |
---|
174 | _max_nb_context = max<uint32_t>(_nb_context,_nb_front_end); |
---|
175 | _max_branch_speculated = max<uint32_t>(_nb_branch_speculated,_nb_front_end,_nb_context); |
---|
176 | _size_rename_id = log2(_nb_rename_unit); |
---|
177 | // _size_max_depth = log2(_max_branch_speculated); |
---|
178 | uint32_t size_front_end_id = log2(_nb_front_end); |
---|
179 | uint32_t size_context_id = log2(_max_nb_context); |
---|
180 | uint32_t size_packet_id = log2(nb_re_order_buffer_bank)+log2(size_re_order_buffer/nb_re_order_buffer_bank); |
---|
181 | uint32_t size_general_register = log2(max<uint32_t>(_nb_general_register,_nb_rename_unit)); |
---|
182 | uint32_t size_special_register = log2(max<uint32_t>(_nb_special_register,_nb_rename_unit)); |
---|
183 | uint32_t size_store_queue_ptr = log2(max<uint32_t>(_size_store_queue,_nb_rename_unit,_nb_load_store_queue)); |
---|
184 | uint32_t size_load_queue_ptr = log2(max<uint32_t>(_size_load_queue ,_nb_rename_unit,_nb_load_store_queue)); |
---|
185 | |
---|
186 | _sum_inst_insert = 0; |
---|
187 | _sum_inst_retire = 0; |
---|
188 | for (uint32_t i=0; i<_nb_rename_unit; i++) |
---|
189 | { |
---|
190 | _sum_inst_insert += _nb_inst_insert [i]; |
---|
191 | _sum_inst_retire += _nb_inst_retire [i]; |
---|
192 | |
---|
193 | log_printf(TRACE,OOO_Engine,FUNCTION,"rename_unit [%d] - nb_inst_insert %d, nb_inst_retire %d", i,_nb_inst_insert [i],_nb_inst_retire [i]); |
---|
194 | } |
---|
195 | |
---|
196 | log_printf(TRACE,OOO_Engine,FUNCTION,"sum_inst_insert %d, sum_inst_retire %d",_sum_inst_insert,_sum_inst_retire); |
---|
197 | |
---|
198 | // _have_port_front_end_id = _size_front_end_id > 0; |
---|
199 | // _have_port_context_id = _size_context_id > 0; |
---|
200 | // _have_port_packet_id = _size_packet_id > 0; |
---|
201 | _have_port_rename_id = _size_rename_id > 0; |
---|
202 | // _have_port_load_queue_ptr = _size_load_queue_ptr > 0; |
---|
203 | // _have_port_max_depth = _size_max_depth > 0; |
---|
204 | // _have_port_depth = _param_commit_unit->_have_port_depth; |
---|
205 | |
---|
206 | _param_rename_unit = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::rename_unit::Parameters * [_nb_rename_unit]; |
---|
207 | for (uint32_t i=0; i<_nb_rename_unit; i++) |
---|
208 | _param_rename_unit [i] = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::rename_unit::Parameters |
---|
209 | ( |
---|
210 | _rename_unit_nb_front_end [i], |
---|
211 | _rename_unit_nb_context [i], |
---|
212 | _rename_unit_nb_inst_decod [i], |
---|
213 | _nb_inst_insert [i], |
---|
214 | _nb_inst_retire [i], |
---|
215 | _nb_load_store_queue [i], |
---|
216 | _size_store_queue [i], |
---|
217 | _size_load_queue [i], |
---|
218 | _rename_unit_link_load_store_unit_with_thread [i], |
---|
219 | _rename_select_priority [i], |
---|
220 | _rename_select_load_balancing [i], |
---|
221 | _rename_select_nb_front_end_select [i], |
---|
222 | _max_branch_speculated , |
---|
223 | size_general_data , |
---|
224 | _nb_general_register [i], |
---|
225 | _nb_special_register [i], |
---|
226 | _nb_reg_free [i], |
---|
227 | _nb_rename_unit_bank [i], |
---|
228 | _size_read_counter [i] |
---|
229 | ); |
---|
230 | |
---|
231 | _param_commit_unit = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::Parameters |
---|
232 | ( |
---|
233 | _nb_front_end , |
---|
234 | _nb_context , |
---|
235 | _nb_rename_unit , |
---|
236 | _size_re_order_buffer , |
---|
237 | _nb_re_order_buffer_bank , |
---|
238 | _nb_inst_insert , |
---|
239 | _nb_inst_retire , |
---|
240 | _nb_inst_commit , |
---|
241 | _nb_inst_reexecute , |
---|
242 | _nb_inst_branch_complete , |
---|
243 | _nb_branch_speculated , |
---|
244 | size_general_data , |
---|
245 | size_store_queue_ptr , |
---|
246 | size_load_queue_ptr , |
---|
247 | size_general_register , |
---|
248 | size_special_register , |
---|
249 | _commit_priority , |
---|
250 | _commit_load_balancing , |
---|
251 | _nb_rename_unit_select |
---|
252 | ); |
---|
253 | |
---|
254 | |
---|
255 | _param_issue_queue = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Parameters |
---|
256 | (_max_nb_context , |
---|
257 | _nb_front_end , |
---|
258 | _nb_rename_unit , |
---|
259 | _size_issue_queue , |
---|
260 | _nb_issue_queue_bank , |
---|
261 | size_packet_id , |
---|
262 | size_general_data , |
---|
263 | size_special_data , |
---|
264 | size_general_register ,//+_size_rename_id |
---|
265 | size_special_register ,//+_size_rename_id |
---|
266 | size_store_queue_ptr , |
---|
267 | size_load_queue_ptr , |
---|
268 | _nb_inst_issue , |
---|
269 | _nb_inst_insert , |
---|
270 | _nb_inst_reexecute , |
---|
271 | _nb_rename_unit_select , |
---|
272 | _issue_priority , |
---|
273 | _issue_load_balancing , |
---|
274 | _table_routing , |
---|
275 | _table_issue_type |
---|
276 | ); |
---|
277 | |
---|
278 | _param_reexecute_unit = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::reexecute_unit::Parameters |
---|
279 | ( size_context_id , |
---|
280 | size_front_end_id , |
---|
281 | size_packet_id , |
---|
282 | _size_reexecute_queue , |
---|
283 | _nb_execute_loop , |
---|
284 | _nb_inst_execute , |
---|
285 | _nb_inst_commit , |
---|
286 | _nb_inst_reexecute , |
---|
287 | _nb_execute_loop_select , |
---|
288 | _reexecute_priority , |
---|
289 | _reexecute_load_balancing, |
---|
290 | size_general_register ,//+_size_rename_id |
---|
291 | size_special_register ,//+_size_rename_id |
---|
292 | size_general_data , |
---|
293 | size_special_data , |
---|
294 | size_store_queue_ptr , |
---|
295 | size_load_queue_ptr |
---|
296 | ); |
---|
297 | |
---|
298 | _param_special_register_unit = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::special_register_unit::Parameters |
---|
299 | ( |
---|
300 | _nb_front_end , |
---|
301 | _nb_context , |
---|
302 | _nb_inst_reexecute , |
---|
303 | _implement_group |
---|
304 | ); |
---|
305 | |
---|
306 | _param_glue = new morpheo::behavioural::core::multi_ooo_engine::ooo_engine::ooo_engine_glue::Parameters |
---|
307 | (_nb_front_end , |
---|
308 | _nb_context , |
---|
309 | _nb_rename_unit , |
---|
310 | _nb_inst_decod , |
---|
311 | _nb_inst_insert , |
---|
312 | _nb_inst_retire , |
---|
313 | size_general_data , |
---|
314 | size_special_data , |
---|
315 | _link_rename_unit_with_front_end , |
---|
316 | _link_front_end_with_rename_unit , |
---|
317 | size_packet_id , |
---|
318 | size_general_register , |
---|
319 | size_special_register , |
---|
320 | size_store_queue_ptr , |
---|
321 | size_load_queue_ptr |
---|
322 | ); |
---|
323 | |
---|
324 | if (is_toplevel) |
---|
325 | { |
---|
326 | _size_front_end_id = size_front_end_id; |
---|
327 | _size_context_id = size_context_id ; |
---|
328 | _size_depth = log2(_max_branch_speculated); |
---|
329 | _size_instruction_address = size_general_data-2; |
---|
330 | _size_general_data = size_general_data; |
---|
331 | _size_special_data = size_special_data; |
---|
332 | _size_general_register = size_general_register; |
---|
333 | _size_special_register = size_special_register; |
---|
334 | _size_store_queue_ptr = size_store_queue_ptr ; |
---|
335 | _size_load_queue_ptr = size_load_queue_ptr ; |
---|
336 | _size_rob_ptr = size_packet_id; |
---|
337 | _size_nb_inst_commit = log2(size_re_order_buffer)+1; |
---|
338 | |
---|
339 | _have_port_front_end_id = _size_front_end_id > 0; |
---|
340 | _have_port_context_id = _size_context_id > 0; |
---|
341 | _have_port_rob_ptr = _size_rob_ptr > 0; |
---|
342 | _have_port_load_queue_ptr = _size_load_queue_ptr > 0; |
---|
343 | _have_port_depth = _size_depth > 0; |
---|
344 | |
---|
345 | copy(); |
---|
346 | } |
---|
347 | |
---|
348 | |
---|
349 | log_end(OOO_Engine,FUNCTION); |
---|
350 | }; |
---|
351 | |
---|
352 | // #undef FUNCTION |
---|
353 | // #define FUNCTION "OOO_Engine::Parameters (copy)" |
---|
354 | // Parameters::Parameters (Parameters & param) |
---|
355 | // { |
---|
356 | // log_begin(OOO_Engine,FUNCTION); |
---|
357 | // test(); |
---|
358 | // log_end(OOO_Engine,FUNCTION); |
---|
359 | // }; |
---|
360 | |
---|
361 | #undef FUNCTION |
---|
362 | #define FUNCTION "OOO_Engine::~Parameters" |
---|
363 | Parameters::~Parameters (void) |
---|
364 | { |
---|
365 | log_begin(OOO_Engine,FUNCTION); |
---|
366 | |
---|
367 | for (uint32_t i=0; i<_nb_rename_unit; i++) |
---|
368 | { |
---|
369 | for (uint32_t j=0; j<_nb_front_end; j++) |
---|
370 | delete [] _rename_unit_link_load_store_unit_with_thread [i][j]; |
---|
371 | |
---|
372 | delete [] _rename_unit_link_load_store_unit_with_thread [i]; |
---|
373 | delete [] _rename_unit_nb_inst_decod [i]; |
---|
374 | delete [] _rename_unit_nb_context [i]; |
---|
375 | } |
---|
376 | |
---|
377 | delete [] _rename_unit_link_load_store_unit_with_thread; |
---|
378 | delete [] _rename_unit_nb_inst_decod ; |
---|
379 | delete [] _rename_unit_nb_context ; |
---|
380 | delete [] _rename_unit_nb_front_end ; |
---|
381 | delete [] _rename_unit_size_front_end_id ; |
---|
382 | delete [] _rename_unit_size_context_id ; |
---|
383 | delete [] _link_front_end_with_rename_unit ; |
---|
384 | |
---|
385 | delete [] _param_rename_unit ; |
---|
386 | delete _param_commit_unit ; |
---|
387 | delete _param_issue_queue ; |
---|
388 | delete _param_reexecute_unit ; |
---|
389 | delete _param_special_register_unit; |
---|
390 | delete _param_glue ; |
---|
391 | |
---|
392 | log_end(OOO_Engine,FUNCTION); |
---|
393 | }; |
---|
394 | |
---|
395 | #undef FUNCTION |
---|
396 | #define FUNCTION "OOO_Engine::copy" |
---|
397 | void Parameters::copy (void) |
---|
398 | { |
---|
399 | log_begin(OOO_Engine,FUNCTION); |
---|
400 | |
---|
401 | for (uint32_t i=0; i<_nb_rename_unit; i++) |
---|
402 | COPY(_param_rename_unit [i]); |
---|
403 | COPY(_param_commit_unit ); |
---|
404 | COPY(_param_issue_queue ); |
---|
405 | COPY(_param_reexecute_unit ); |
---|
406 | COPY(_param_special_register_unit); |
---|
407 | COPY(_param_glue ); |
---|
408 | |
---|
409 | log_end(OOO_Engine,FUNCTION); |
---|
410 | }; |
---|
411 | |
---|
412 | }; // end namespace ooo_engine |
---|
413 | }; // end namespace multi_ooo_engine |
---|
414 | }; // end namespace core |
---|
415 | |
---|
416 | }; // end namespace behavioural |
---|
417 | }; // end namespace morpheo |
---|