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

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

1) decod_queue : add reg_LAST_SLOT.
2) Commit : insert on event -> to pop decod_queue. Head test : add information (speculative or not)
3) Context State / UPT : Branch miss and Load miss in same cycle.
4) Free List : Bank is on LSB not MSB.
5) Platforms : move data

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