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

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

1) Correct bug in link two signal
2) Fix error detected with valgrind
3) modif distexe script

  • Property svn:keywords set to Id
File size: 22.4 KB
Line 
1/*
2 * $Id: Parameters.cpp 128 2009-06-26 08:43:23Z 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    for (uint32_t i=0; i<_nb_rename_unit; i++)
414    delete    _param_rename_unit [i]      ;
415    delete [] _param_rename_unit          ;
416    delete    _param_commit_unit          ;
417    delete    _param_issue_queue          ;
418    delete    _param_reexecute_unit       ;   
419    delete    _param_special_register_unit;
420    delete    _param_glue                 ;
421   
422    log_end(OOO_Engine,FUNCTION);
423  };
424
425#undef  FUNCTION
426#define FUNCTION "OOO_Engine::copy"
427  void Parameters::copy (void) 
428  {
429    log_begin(OOO_Engine,FUNCTION);
430
431    for (uint32_t i=0; i<_nb_rename_unit; i++)
432    COPY(_param_rename_unit       [i]);
433    COPY(_param_commit_unit          );
434    COPY(_param_issue_queue          );
435    COPY(_param_reexecute_unit       );   
436    COPY(_param_special_register_unit);
437    COPY(_param_glue                 );
438   
439    log_end(OOO_Engine,FUNCTION);
440  };
441
442}; // end namespace ooo_engine
443}; // end namespace multi_ooo_engine
444}; // end namespace core
445
446}; // end namespace behavioural
447}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.