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