source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/src/Parameters.cpp @ 120

Last change on this file since 120 was 120, checked in by rosiere, 15 years ago

1) Context_state : Add statistics
2) Add configuration with multi front_end
3) Add optionnal pid at log filename

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