source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Front_end/Front_end/src/Parameters.cpp @ 146

Last change on this file since 146 was 146, checked in by rosiere, 13 years ago

1) Integration of RegisterFile_Internal_Banked in RegisterFile?
2) Erase "read_write" interface in RegisterFile_Monolithic component
3) Add smith predictor parameters in Load_store_pointer_unit.
4) Fix not statistics flags

  • Property svn:keywords set to Id
File size: 17.1 KB
Line 
1/*
2 * $Id: Parameters.cpp 146 2011-02-01 20:57:54Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Multi_Front_end/Front_end/include/Parameters.h"
9#include "Behavioural/include/Allocation.h"
10#include "Common/include/Max.h"
11
12namespace morpheo {
13namespace behavioural {
14namespace core {
15namespace multi_front_end {
16namespace front_end {
17
18
19#undef  FUNCTION
20#define FUNCTION "Front_end::Parameters"
21  Parameters::Parameters (uint32_t                nb_context                          ,
22                          uint32_t                nb_decod_unit                       ,
23                          uint32_t                size_general_data                   ,
24                          morpheo::behavioural::custom::custom_information_t (*get_custom_information) (void),
25                          // ifetch_unit                                             
26                          uint32_t              * size_ifetch_queue                   ,//[nb_context]
27                          ifetch_unit::ifetch_queue::Tifetch_queue_scheme_t
28                                                * ifetch_queue_scheme                 ,//[nb_context]
29                          uint32_t              * nb_inst_fetch                       ,//[nb_context]
30                          bool                 ** instruction_implemeted              ,//[nb_context]
31                          uint32_t              * link_context_to_decod_unit          ,//[nb_context]
32                          // decod_unit                                             
33                          uint32_t              * size_decod_queue                    ,//[nb_decod_unit]
34                          decod_unit::decod_queue::Tdecod_queue_scheme_t
35                                                * decod_queue_scheme                  ,//[nb_decod_unit]
36                          uint32_t              * nb_inst_decod                       ,//[nb_decod_unit]
37                          uint32_t              * nb_context_select                   ,//[nb_decod_unit]
38                          Tpriority_t           * context_select_priority             ,//[nb_decod_unit]
39                          Tload_balancing_t     * context_select_load_balancing       ,//[nb_decod_unit]
40                          // prediction_unit                                                 
41                          uint32_t                nb_inst_branch_predict              ,
42                          uint32_t                nb_inst_branch_decod                ,
43                          uint32_t                nb_inst_branch_update               ,
44                          uint32_t                nb_inst_branch_complete             ,
45                          uint32_t                btb_size_queue                      ,
46                          uint32_t                btb_associativity                   ,
47                          uint32_t                btb_size_counter                    ,
48                          Tvictim_t               btb_victim_scheme                   ,
49                          Tpredictor_t            dir_predictor_scheme                ,
50                          bool                  * dir_have_bht                        ,//[3]
51                          uint32_t              * dir_bht_size_shifter                ,//[3]
52                          uint32_t              * dir_bht_nb_shifter                  ,//[3]
53                          bool                  * dir_have_pht                        ,//[3]
54                          uint32_t              * dir_pht_size_counter                ,//[3]
55                          uint32_t              * dir_pht_nb_counter                  ,//[3]
56                          uint32_t              * dir_pht_size_address_share          ,//[3]
57                          Tpht_scheme_t         * dir_pht_scheme                      ,//[3]
58                          uint32_t              * ras_size_queue                      ,
59                          uint32_t              * upt_size_queue                      ,
60                          uint32_t              * ufpt_size_queue                     ,
61                          // context_state                                           
62                          uint32_t                size_nb_inst_commit                 ,
63
64                          uint32_t                nb_thread                           ,
65                          uint32_t              * translate_num_context_to_num_thread ,//[nb_context]                   
66
67                          bool                    is_toplevel):
68    morpheo::behavioural::Parameters()
69  {
70    log_begin(Front_end,FUNCTION);
71
72    _nb_context                          = nb_context                          ;
73    _nb_decod_unit                       = nb_decod_unit                       ;
74//  _size_general_data                   = size_general_data                   ;
75    _get_custom_information              = get_custom_information              ;
76    _nb_thread                           = nb_thread                           ;
77    _translate_num_context_to_num_thread = translate_num_context_to_num_thread ;
78    _size_ifetch_queue                   = size_ifetch_queue                   ;
79    _ifetch_queue_scheme                 = ifetch_queue_scheme                 ;
80    _nb_inst_fetch                       = nb_inst_fetch                       ;
81    _instruction_implemeted              = instruction_implemeted              ;
82    _link_context_to_decod_unit          = link_context_to_decod_unit          ;
83    _size_decod_queue                    = size_decod_queue                    ;
84    _decod_queue_scheme                  = decod_queue_scheme                  ;
85    _nb_inst_decod                       = nb_inst_decod                       ;
86    _nb_context_select                   = nb_context_select                   ;
87    _context_select_priority             = context_select_priority             ;
88    _context_select_load_balancing       = context_select_load_balancing       ;
89    _nb_inst_branch_predict              = nb_inst_branch_predict              ;
90    _nb_inst_branch_decod                = nb_inst_branch_decod                ;
91    _nb_inst_branch_update               = nb_inst_branch_update               ;
92    _nb_inst_branch_complete             = nb_inst_branch_complete             ;
93    _btb_size_queue                      = btb_size_queue                      ;
94    _btb_associativity                   = btb_associativity                   ;
95    _btb_size_counter                    = btb_size_counter                    ;
96    _btb_victim_scheme                   = btb_victim_scheme                   ;
97    _dir_predictor_scheme                = dir_predictor_scheme                ;
98    for (uint32_t i=0; i<3; i++)
99      {
100        _dir_have_bht               [i] = dir_have_bht               [i];
101        _dir_bht_size_shifter       [i] = dir_bht_size_shifter       [i];
102        _dir_bht_nb_shifter         [i] = dir_bht_nb_shifter         [i];
103        _dir_have_pht               [i] = dir_have_pht               [i];
104        _dir_pht_size_counter       [i] = dir_pht_size_counter       [i];
105        _dir_pht_nb_counter         [i] = dir_pht_nb_counter         [i];
106        _dir_pht_size_address_share [i] = dir_pht_size_address_share [i];
107        _dir_pht_scheme             [i] = dir_pht_scheme             [i];
108      }
109    _ras_size_queue                      = ras_size_queue                      ;
110    _upt_size_queue                      = upt_size_queue                      ;
111    _ufpt_size_queue                     = ufpt_size_queue                     ;
112
113    test();
114
115//  _size_context_id                     = log2(_nb_context);
116    uint32_t size_instruction_address   = size_general_data - 2;
117
118    ALLOC1(_array_size_depth            ,uint32_t,_nb_context);
119    for (uint32_t i=0; i<_nb_context; i++)
120      _array_size_depth [i] = log2(_upt_size_queue[i]);
121   
122    ALLOC1(_array_size_nb_inst_decod    ,uint32_t,_nb_decod_unit);
123    for (uint32_t i=0; i<_nb_decod_unit; i++)
124      _array_size_nb_inst_decod [i] = log2(_size_decod_queue[i]+1);
125
126    uint32_t size_nb_inst_decod         = max<uint32_t>(_array_size_nb_inst_decod,_nb_decod_unit);
127
128    _param_ifetch_unit = new behavioural::core::multi_front_end::front_end::ifetch_unit::Parameters * [_nb_context];
129    for (uint32_t i=0; i<_nb_context; ++i)
130      {
131        _param_ifetch_unit [i] = new behavioural::core::multi_front_end::front_end::ifetch_unit::Parameters
132          (_size_ifetch_queue  [i]        ,
133           _ifetch_queue_scheme[i]        ,
134           _nb_inst_fetch      [i]        ,
135           log2(_upt_size_queue[i])       ,
136           size_instruction_address      );
137      }
138
139    _param_prediction_unit = new behavioural::core::multi_front_end::front_end::prediction_unit::Parameters
140      (_nb_context                         ,
141       _nb_decod_unit                      ,
142       size_instruction_address            ,
143       _nb_inst_fetch                      ,
144       _nb_inst_decod                      ,
145       _nb_inst_branch_predict             ,
146       _nb_inst_branch_decod               ,
147       _nb_inst_branch_update              ,
148       _nb_inst_branch_complete            ,
149       _btb_size_queue                     ,
150       _btb_associativity                  ,
151       _btb_size_counter                   ,
152       _btb_victim_scheme                  ,
153       _dir_predictor_scheme               ,
154       _dir_have_bht                       ,
155       _dir_bht_size_shifter               ,
156       _dir_bht_nb_shifter                 ,
157       _dir_have_pht                       ,
158       _dir_pht_size_counter               ,
159       _dir_pht_nb_counter                 ,
160       _dir_pht_size_address_share         ,
161       _dir_pht_scheme                     ,
162       _ras_size_queue                     ,
163       _upt_size_queue                     ,
164       _ufpt_size_queue                    ,
165       _nb_thread                          ,
166       _translate_num_context_to_num_thread
167       );
168
169    ALLOC1(_translate_context_id_from_decod_unit,std::vector<uint32_t>,_nb_decod_unit);
170
171    for (uint32_t i=0; i<_nb_context; ++i)
172      _translate_context_id_from_decod_unit [_link_context_to_decod_unit[i]].push_back(i);
173
174    ALLOC1(_decod_unit_nb_context            ,uint32_t,_nb_decod_unit);
175    ALLOC2(_decod_unit_nb_inst_fetch         ,uint32_t,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size());
176    ALLOC2(_decod_unit_nb_branch_speculated  ,uint32_t,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size());
177//  ALLOC2(_decod_unit_depth                 ,uint32_t,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size());
178    ALLOC3(_decod_unit_instruction_implemeted,bool    ,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size(),NB_INSTRUCTION);
179//  ALLOC2(_have_port_decod_unit_context_id  ,bool    ,_nb_decod_unit);
180    _sum_inst_decod                      = 0;
181   
182    for (uint32_t i=0; i<_nb_decod_unit; ++i)
183      {
184        _sum_inst_decod += _nb_inst_decod [i];
185
186        uint32_t size = _translate_context_id_from_decod_unit [i].size();
187
188        _decod_unit_nb_context             [i] = size;
189//      _have_port_decod_unit_context_id   [i] = size > 0;
190
191        for (uint32_t j=0; j<size; ++j)
192          {
193            uint32_t x = _translate_context_id_from_decod_unit[i][j];
194
195            _decod_unit_nb_inst_fetch          [i][j] = _nb_inst_fetch  [x];
196            _decod_unit_nb_branch_speculated   [i][j] = _upt_size_queue [x];
197//          _decod_unit_depth                  [i][j] = log2(_upt_size_queue[x]);
198
199            for (uint32_t k=0; k<NB_INSTRUCTION; ++k)
200              _decod_unit_instruction_implemeted [i][j][k] = _instruction_implemeted [x][k];
201          }
202      }
203
204    log_printf(TRACE,Front_end,FUNCTION,_("Translate"));
205    for (uint32_t i=0; i<_nb_decod_unit; ++i)
206      {
207        uint32_t size = _decod_unit_nb_context [i];
208        log_printf(TRACE,Front_end,FUNCTION,_("Decod_unit [%d], nb_decod_unit_context : %d"),i,size);
209
210        for (uint32_t j=0; j<size; ++j)
211          {
212            log_printf(TRACE,Front_end,FUNCTION,_("  Context [%d] -> Decod_unit_Context [%d]"),j,(_translate_context_id_from_decod_unit [i])[j]);
213            log_printf(TRACE,Front_end,FUNCTION,_("    * decod_unit_nb_inst_fetch        : %d"),_decod_unit_nb_inst_fetch       [i][j]);
214            log_printf(TRACE,Front_end,FUNCTION,_("    * decod_unit_nb_branch_speculated : %d"),_decod_unit_nb_branch_speculated[i][j]);
215          }
216      }
217
218    _param_decod_unit = new behavioural::core::multi_front_end::front_end::decod_unit::Parameters * [_nb_decod_unit];
219    for (uint32_t i=0; i<_nb_decod_unit; ++i)
220      {
221        _param_decod_unit [i] = new behavioural::core::multi_front_end::front_end::decod_unit::Parameters
222          (_decod_unit_nb_context             [i],
223           _decod_unit_nb_inst_fetch          [i],
224           _nb_inst_decod                     [i],
225           _size_decod_queue                  [i],
226           _decod_queue_scheme                [i],
227            size_general_data                    ,
228           _decod_unit_nb_branch_speculated   [i],
229//         _decod_unit_depth                  [i],
230           _nb_context_select                 [i],
231           _context_select_priority           [i],
232           _context_select_load_balancing     [i],
233           _decod_unit_instruction_implemeted [i],
234           _get_custom_information               );
235      }
236
237    _param_context_state = new behavioural::core::multi_front_end::front_end::context_state::Parameters
238      (_nb_context,
239       _nb_decod_unit,
240       _nb_inst_branch_complete,
241       _upt_size_queue,               
242        size_instruction_address,
243       _array_size_nb_inst_decod,           
244        size_nb_inst_commit,         
245       _link_context_to_decod_unit);
246
247    _param_glue = new behavioural::core::multi_front_end::front_end::front_end_glue::Parameters
248      (_nb_context                           ,
249       _nb_decod_unit                        ,
250       _nb_inst_decod                        ,
251       _nb_inst_branch_complete              ,
252       _link_context_to_decod_unit           ,
253       _translate_context_id_from_decod_unit ,
254       size_instruction_address              ,
255       _array_size_depth                     ,
256       _upt_size_queue                       ,//_nb_branch_speculated
257       size_nb_inst_decod
258       );
259
260    if (is_toplevel)
261      {
262        _size_context_id            = log2(_nb_context);
263        _size_instruction_address   = size_instruction_address;
264        _size_general_data          = size_general_data;
265        _size_nb_inst_decod         = size_nb_inst_decod;
266        _size_nb_inst_commit        = size_nb_inst_commit;
267        _size_depth                 = max<uint32_t>(_array_size_depth,_nb_context);
268        _size_ifetch_queue_ptr      = log2(max<uint32_t>(_size_ifetch_queue,_nb_context));
269        _size_inst_ifetch_ptr       = log2(max<uint32_t>(_nb_inst_fetch    ,_nb_context));
270       
271        _have_port_context_id       = _size_context_id      > 0;
272        _have_port_depth            = _size_depth           > 0;
273        _have_port_ifetch_queue_ptr = _size_ifetch_queue_ptr> 0;
274        _have_port_inst_ifetch_ptr  = _size_inst_ifetch_ptr > 0;
275
276        copy ();
277      }
278
279    log_end(Front_end,FUNCTION);
280  };
281 
282// #undef  FUNCTION
283// #define FUNCTION "Front_end::Parameters (copy)"
284//   Parameters::Parameters (Parameters & param)
285//   {
286//     log_begin(Front_end,FUNCTION);
287//     test();
288//     log_end(Front_end,FUNCTION);
289//   };
290
291#undef  FUNCTION
292#define FUNCTION "Front_end::~Parameters"
293  Parameters::~Parameters () 
294  {
295    log_begin(Front_end,FUNCTION);
296   
297    delete    _param_glue           ;
298    delete    _param_context_state  ;
299    for (uint32_t i=0; i<_nb_decod_unit; i++)
300    delete    _param_decod_unit [i];
301    delete [] _param_decod_unit     ;
302    delete    _param_prediction_unit;
303    for (uint32_t i=0; i<_nb_context; i++)
304    delete    _param_ifetch_unit [i];
305    delete [] _param_ifetch_unit    ;
306
307//  DELETE2(_have_port_decod_unit_context_id     ,_nb_decod_unit);
308    DELETE3(_decod_unit_instruction_implemeted   ,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size(),NB_INSTRUCTION);
309//  DELETE2(_decod_unit_depth                    ,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size());
310    DELETE2(_decod_unit_nb_branch_speculated     ,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size());
311    DELETE2(_decod_unit_nb_inst_fetch            ,_nb_decod_unit,_translate_context_id_from_decod_unit [it1].size());
312    DELETE1(_decod_unit_nb_context               ,_nb_decod_unit);
313
314    DELETE1(_translate_context_id_from_decod_unit,_nb_decod_unit);
315    DELETE1(_array_size_nb_inst_decod            ,_nb_decod_unit);
316    DELETE1(_array_size_depth                    ,_nb_context);
317
318    log_end(Front_end,FUNCTION);
319  };
320
321
322#undef  FUNCTION
323#define FUNCTION "Front_end::copy"
324  void Parameters::copy (void) 
325  {
326    log_begin(Front_end,FUNCTION);
327
328    COPY(_param_glue           );
329    COPY(_param_context_state  );
330    for (uint32_t i=0; i<_nb_decod_unit; i++)
331      {
332        COPY(_param_decod_unit  [i]);
333      }
334    COPY(_param_prediction_unit);
335    for (uint32_t i=0; i<_nb_context; i++)
336    COPY(_param_ifetch_unit [i]);
337
338    log_end(Front_end,FUNCTION);
339  };
340
341}; // end namespace front_end
342}; // end namespace multi_front_end
343}; // end namespace core
344
345}; // end namespace behavioural
346}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.