source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Configuration/src/Instance_fromInternalStructure.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: 41.9 KB
Line 
1/*
2 * $Id: Instance_fromInternalStructure.cpp 146 2011-02-01 20:57:54Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Configuration/include/Instance.h"
9#include "Behavioural/include/Allocation.h"
10#include "Common/include/FromString.h"
11
12namespace morpheo {
13namespace behavioural {
14namespace configuration {
15
16#undef  FUNCTION
17#define FUNCTION "Instance::fromInternalStructure"
18  void Instance::fromInternalStructure (void)
19  {
20    //-----------------------------------------------------
21    // Common
22    //-----------------------------------------------------
23  //log_printf(INFO,Configuration,FUNCTION,_("COMMON"));
24
25    _param->_size_general_data   = fromString<uint32_t>(getParam("size_data"          , ""));
26    _param->_size_special_data   = SIZE_SPECIAL_DATA; // Constant
27
28    _param->_nb_thread           = fromString<uint32_t>(getParam("nb_thread"          , ""));
29    _param->_nb_decod_bloc       = fromString<uint32_t>(getParam("nb_decod_bloc"      , ""));
30    _param->_nb_rename_bloc      = fromString<uint32_t>(getParam("nb_rename_bloc"     , ""));
31    _param->_nb_read_bloc        = fromString<uint32_t>(getParam("nb_read_bloc"       , ""));
32    _param->_nb_write_bloc       = fromString<uint32_t>(getParam("nb_write_bloc"      , ""));
33    _param->_nb_load_store_unit  = fromString<uint32_t>(getParam("nb_load_store_unit" , ""));
34    _param->_nb_functionnal_unit = fromString<uint32_t>(getParam("nb_functionnal_unit", ""));
35    _param->_nb_front_end        = fromString<uint32_t>(getParam("nb_front_end"       , ""));
36    _param->_nb_ooo_engine       = fromString<uint32_t>(getParam("nb_ooo_engine"      , ""));
37    _param->_nb_execute_loop     = fromString<uint32_t>(getParam("nb_execute_loop"    , ""));
38
39    //-----------------------------------------------------
40    // Thread
41    //-----------------------------------------------------
42
43    ALLOC1(_param->_size_ifetch_queue,uint32_t,_param->_nb_thread);
44    ALLOC1(_param->_ifetch_queue_scheme           ,morpheo::behavioural::core::multi_front_end::front_end::ifetch_unit::ifetch_queue::Tifetch_queue_scheme_t
45                                              ,_param->_nb_thread);
46    ALLOC1(_param->_nb_inst_fetch    ,uint32_t,_param->_nb_thread);
47    ALLOC2(_param->_implement_group  ,bool    ,_param->_nb_thread,NB_GROUP);
48    ALLOC1(_param->_ras_size_queue   ,uint32_t,_param->_nb_thread);
49    ALLOC1(_param->_upt_size_queue   ,uint32_t,_param->_nb_thread);
50    ALLOC1(_param->_ufpt_size_queue  ,uint32_t,_param->_nb_thread);
51   
52    for (uint32_t i=0; i<_param->_nb_thread; ++i)
53      {
54      //log_printf(INFO,Configuration,FUNCTION,_("THREAD [%d]"),i);
55
56        _param->_size_ifetch_queue   [i] = fromString<uint32_t>(getParam("size_ifetch_queue"  , "thread",toString(i).c_str(),""));
57        _param->_ifetch_queue_scheme [i] = fromString<morpheo::behavioural::core::multi_front_end::front_end::ifetch_unit::ifetch_queue::Tifetch_queue_scheme_t> 
58                                                               (getParam("ifetch_queue_scheme", "thread",toString(i).c_str(),""));
59        _param->_nb_inst_fetch       [i] = fromString<uint32_t>(getParam("nb_inst_fetch"      , "thread",toString(i).c_str(),""));
60        _param->_ras_size_queue      [i] = fromString<uint32_t>(getParam("ras_size_queue"     , "thread",toString(i).c_str(),""));
61        _param->_upt_size_queue      [i] = fromString<uint32_t>(getParam("upt_size_queue"     , "thread",toString(i).c_str(),""));
62        _param->_ufpt_size_queue     [i] = fromString<uint32_t>(getParam("ufpt_size_queue"    , "thread",toString(i).c_str(),""));
63
64        // just read !!!
65        try
66          {
67            getParam("nb_group","thread",toString(i).c_str(), "");
68          }
69        catch (morpheo::ErrorMorpheo & error)
70          {
71          }
72
73        for (uint32_t j=0; j<NB_GROUP; ++j)
74          {
75            _param->_implement_group [i][j] = fromString<bool>(getParam("implement_group", 
76                                                                       "thread",toString(i).c_str(),
77                                                                       "group" ,toString(j).c_str(),""));
78          }
79      }
80
81    //-----------------------------------------------------
82    // Decod_bloc
83    //-----------------------------------------------------
84
85    ALLOC1(_param->_size_decod_queue             ,uint32_t         ,_param->_nb_decod_bloc);
86    ALLOC1(_param->_decod_queue_scheme           ,morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod_queue::Tdecod_queue_scheme_t
87                                                                   ,_param->_nb_decod_bloc);
88    ALLOC1(_param->_nb_inst_decod                ,uint32_t         ,_param->_nb_decod_bloc);
89    ALLOC1(_param->_nb_context_select            ,uint32_t         ,_param->_nb_decod_bloc);
90    ALLOC1(_param->_context_select_priority      ,Tpriority_t      ,_param->_nb_decod_bloc);
91    ALLOC1(_param->_context_select_load_balancing,Tload_balancing_t,_param->_nb_decod_bloc);
92
93    for (uint32_t i=0; i<_param->_nb_decod_bloc; ++i)
94      {
95      //log_printf(INFO,Configuration,FUNCTION,_("DECOD_BLOC [%d]"),i);
96
97        _param->_size_decod_queue              [i] = fromString<uint32_t         > (getParam("size_decod_queue"             , "decod_bloc",toString(i).c_str(),""));
98        _param->_decod_queue_scheme            [i] = fromString<morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod_queue::Tdecod_queue_scheme_t> 
99                                                                                   (getParam("decod_queue_scheme"           , "decod_bloc",toString(i).c_str(),""));
100        _param->_nb_inst_decod                 [i] = fromString<uint32_t         > (getParam("nb_inst_decod"                , "decod_bloc",toString(i).c_str(),""));
101        _param->_nb_context_select             [i] = fromString<uint32_t         > (getParam("nb_context_select"            , "decod_bloc",toString(i).c_str(),""));
102        _param->_context_select_priority       [i] = fromString<Tpriority_t      > (getParam("context_select_priority"      , "decod_bloc",toString(i).c_str(),""));
103        _param->_context_select_load_balancing [i] = fromString<Tload_balancing_t> (getParam("context_select_load_balancing", "decod_bloc",toString(i).c_str(),""));
104      }
105
106    //-----------------------------------------------------
107    // Rename_bloc
108    //-----------------------------------------------------
109
110    ALLOC1(_param->_nb_inst_insert                   ,uint32_t         ,_param->_nb_rename_bloc);
111    ALLOC1(_param->_nb_inst_retire                   ,uint32_t         ,_param->_nb_rename_bloc);
112    ALLOC1(_param->_rename_select_priority           ,Tpriority_t      ,_param->_nb_rename_bloc);
113    ALLOC1(_param->_rename_select_load_balancing     ,Tload_balancing_t,_param->_nb_rename_bloc);
114    ALLOC1(_param->_rename_select_nb_front_end_select,uint32_t         ,_param->_nb_rename_bloc);
115    ALLOC1(_param->_nb_general_register              ,uint32_t         ,_param->_nb_rename_bloc);
116    ALLOC1(_param->_nb_special_register              ,uint32_t         ,_param->_nb_rename_bloc);
117    ALLOC1(_param->_rat_scheme                       ,Trat_scheme_t    ,_param->_nb_rename_bloc);
118    ALLOC1(_param->_nb_reg_free                      ,uint32_t         ,_param->_nb_rename_bloc);
119    ALLOC1(_param->_nb_rename_unit_bank              ,uint32_t         ,_param->_nb_rename_bloc);
120//     ALLOC1(_param->_size_read_counter                ,uint32_t         ,_param->_nb_rename_bloc);
121
122    for (uint32_t i=0; i<_param->_nb_rename_bloc; ++i)
123      {
124      //log_printf(INFO,Configuration,FUNCTION,_("RENAME_BLOC [%d]"),i);
125
126        _param->_nb_inst_insert                    [i] = fromString<uint32_t         > (getParam("nb_inst_insert"                   , "rename_bloc",toString(i).c_str(),""));
127        _param->_nb_inst_retire                    [i] = fromString<uint32_t         > (getParam("nb_inst_retire"                   , "rename_bloc",toString(i).c_str(),""));
128        _param->_rename_select_priority            [i] = fromString<Tpriority_t      > (getParam("rename_select_priority"           , "rename_bloc",toString(i).c_str(),""));
129        _param->_rename_select_load_balancing      [i] = fromString<Tload_balancing_t> (getParam("rename_select_load_balancing"     , "rename_bloc",toString(i).c_str(),""));
130        _param->_rename_select_nb_front_end_select [i] = fromString<uint32_t         > (getParam("rename_select_nb_front_end_select", "rename_bloc",toString(i).c_str(),""));
131        _param->_nb_general_register               [i] = fromString<uint32_t         > (getParam("nb_general_register"              , "rename_bloc",toString(i).c_str(),""));
132        _param->_nb_special_register               [i] = fromString<uint32_t         > (getParam("nb_special_register"              , "rename_bloc",toString(i).c_str(),""));
133        _param->_rat_scheme                        [i] = fromString<Trat_scheme_t    > (getParam("rat_scheme"                       , "rename_bloc",toString(i).c_str(),""));
134        _param->_nb_reg_free                       [i] = fromString<uint32_t         > (getParam("nb_reg_free"                      , "rename_bloc",toString(i).c_str(),""));
135        _param->_nb_rename_unit_bank               [i] = fromString<uint32_t         > (getParam("nb_rename_unit_bank"              , "rename_bloc",toString(i).c_str(),""));
136//      _param->_size_read_counter                 [i] = fromString<uint32_t         > (getParam("size_read_counter"                , "rename_bloc",toString(i).c_str(),""));
137      }
138
139    //-----------------------------------------------------
140    // Read_bloc
141    //-----------------------------------------------------
142    ALLOC1(_param->_nb_inst_read                      ,uint32_t,_param->_nb_read_bloc);
143    ALLOC1(_param->_size_read_queue                   ,uint32_t,_param->_nb_read_bloc);
144    ALLOC1(_param->_size_reservation_station          ,uint32_t,_param->_nb_read_bloc);
145    ALLOC1(_param->_nb_inst_retire_reservation_station,uint32_t,_param->_nb_read_bloc);
146
147    for (uint32_t i=0; i<_param->_nb_read_bloc; ++i)
148      {
149      //log_printf(INFO,Configuration,FUNCTION,_("READ_BLOC [%d]"),i);
150
151        _param->_nb_inst_read                       [i] = fromString<uint32_t> (getParam("nb_inst_read"                      ,"read_bloc",toString(i).c_str(),""));
152        _param->_size_read_queue                    [i] = fromString<uint32_t> (getParam("size_read_queue"                   ,"read_bloc",toString(i).c_str(),""));
153        _param->_size_reservation_station           [i] = fromString<uint32_t> (getParam("size_reservation_station"          ,"read_bloc",toString(i).c_str(),""));
154        _param->_nb_inst_retire_reservation_station [i] = fromString<uint32_t> (getParam("nb_inst_retire_reservation_station","read_bloc",toString(i).c_str(),""));
155      }   
156
157    //-----------------------------------------------------
158    // Write_bloc
159    //-----------------------------------------------------
160    ALLOC1(_param->_nb_inst_write     ,uint32_t,_param->_nb_write_bloc);
161    ALLOC1(_param->_size_write_queue  ,uint32_t,_param->_nb_write_bloc);
162    ALLOC1(_param->_size_execute_queue,uint32_t,_param->_nb_write_bloc);
163    ALLOC1(_param->_nb_bypass_write   ,uint32_t,_param->_nb_write_bloc);
164    ALLOC1(_param->_write_queue_scheme,core::multi_execute_loop::execute_loop::multi_write_unit::write_unit::write_queue::Twrite_queue_scheme_t,_param->_nb_write_bloc);
165
166    for (uint32_t i=0; i<_param->_nb_write_bloc; ++i)
167      {
168      //log_printf(INFO,Configuration,FUNCTION,_("WRITE_BLOC [%d]"),i);
169
170        _param->_nb_inst_write      [i] = fromString<uint32_t> (getParam("nb_inst_write"     ,"write_bloc",toString(i).c_str(),""));
171        _param->_size_write_queue   [i] = fromString<uint32_t> (getParam("size_write_queue"  ,"write_bloc",toString(i).c_str(),""));
172        _param->_size_execute_queue [i] = fromString<uint32_t> (getParam("size_execute_queue","write_bloc",toString(i).c_str(),""));
173        _param->_nb_bypass_write    [i] = fromString<uint32_t> (getParam("nb_bypass_write"   ,"write_bloc",toString(i).c_str(),""));
174        _param->_write_queue_scheme [i] = fromString<core::multi_execute_loop::execute_loop::multi_write_unit::write_unit::write_queue::Twrite_queue_scheme_t> (getParam("write_queue_scheme","write_bloc",toString(i).c_str(),""));
175      }   
176
177    //-----------------------------------------------------
178    // load_store_unit
179    //-----------------------------------------------------
180    ALLOC1(_param->_size_store_queue                   ,uint32_t     ,_param->_nb_load_store_unit);
181    ALLOC1(_param->_size_load_queue                    ,uint32_t     ,_param->_nb_load_store_unit);
182    ALLOC1(_param->_size_speculative_access_queue      ,uint32_t     ,_param->_nb_load_store_unit);
183    ALLOC1(_param->_nb_store_queue_bank                ,uint32_t     ,_param->_nb_load_store_unit);
184    ALLOC1(_param->_nb_load_queue_bank                 ,uint32_t     ,_param->_nb_load_store_unit);
185    ALLOC1(_param->_nb_port_check                      ,uint32_t     ,_param->_nb_load_store_unit);
186    ALLOC1(_param->_speculative_load                   ,core::multi_execute_loop::execute_loop::Tspeculative_load_t,_param->_nb_load_store_unit);
187    ALLOC1(_param->_speculative_commit_predictor_scheme,Tpredictor_t ,_param->_nb_load_store_unit);
188    ALLOC2(_param->_lsu_pht_size_counter               ,uint32_t     ,_param->_nb_load_store_unit,1);
189    ALLOC2(_param->_lsu_pht_nb_counter                 ,uint32_t     ,_param->_nb_load_store_unit,1);
190    ALLOC2(_param->_lsu_pht_scheme                     ,Tpht_scheme_t,_param->_nb_load_store_unit,1);
191    ALLOC1(_param->_nb_bypass_memory                   ,uint32_t     ,_param->_nb_load_store_unit);
192    ALLOC1(_param->_nb_cache_port                      ,uint32_t     ,_param->_nb_load_store_unit);
193    ALLOC1(_param->_nb_inst_memory                     ,uint32_t     ,_param->_nb_load_store_unit);
194
195    for (uint32_t i=0; i<_param->_nb_load_store_unit; ++i)
196      {
197      //log_printf(INFO,Configuration,FUNCTION,_("LOAD_STORE_UNIT [%d]"),i);
198
199        _param->_size_store_queue                    [i] = fromString<uint32_t    > (getParam("size_store_queue"                   ,"load_store_unit",toString(i).c_str(),""));
200        _param->_size_load_queue                     [i] = fromString<uint32_t    > (getParam("size_load_queue"                    ,"load_store_unit",toString(i).c_str(),""));
201        _param->_size_speculative_access_queue       [i] = fromString<uint32_t    > (getParam("size_speculative_access_queue"      ,"load_store_unit",toString(i).c_str(),""));
202        _param->_nb_store_queue_bank                 [i] = fromString<uint32_t    > (getParam("nb_store_queue_bank"                ,"load_store_unit",toString(i).c_str(),""));
203        _param->_nb_load_queue_bank                  [i] = fromString<uint32_t    > (getParam("nb_load_queue_bank"                 ,"load_store_unit",toString(i).c_str(),""));
204        _param->_speculative_load                    [i] = fromString<core::multi_execute_loop::execute_loop::Tspeculative_load_t> 
205                                                                                    (getParam("speculative_load"                   ,"load_store_unit",toString(i).c_str(),""));
206        _param->_speculative_commit_predictor_scheme [i] = fromString<Tpredictor_t> 
207                                                                                    (getParam("speculative_commit_predictor_scheme","load_store_unit",toString(i).c_str(),""));
208        _param->_nb_port_check                       [i] = fromString<uint32_t    > (getParam("nb_port_check"                      ,"load_store_unit",toString(i).c_str(),""));
209       
210        // just read !!!
211        try
212          {
213            getParam("nb_predictor","load_store_unit",toString(i).c_str(), "");
214          }
215        catch (morpheo::ErrorMorpheo & error)
216          {
217          }
218
219        const uint32_t max_nb_predictor=1;
220        for (uint32_t j=0; j<max_nb_predictor; ++j)
221          {
222          //log_printf(INFO,Configuration,FUNCTION,_("PREDICTOR [%d][%d]"),i,j);
223        _param->_lsu_pht_size_counter             [i][j] = fromString<uint32_t     > (getParam("lsu_pht_size_counter"               ,"load_store_unit",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
224        _param->_lsu_pht_nb_counter               [i][j] = fromString<uint32_t     > (getParam("lsu_pht_nb_counter"                 ,"load_store_unit",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
225        _param->_lsu_pht_scheme                   [i][j] = fromString<Tpht_scheme_t> (getParam("lsu_pht_scheme"                     ,"load_store_unit",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
226          }
227
228        _param->_nb_bypass_memory                    [i] = fromString<uint32_t    > (getParam("nb_bypass_memory"                   ,"load_store_unit",toString(i).c_str(),""));
229        _param->_nb_cache_port                       [i] = fromString<uint32_t    > (getParam("nb_cache_port"                      ,"load_store_unit",toString(i).c_str(),""));
230        _param->_nb_inst_memory                      [i] = fromString<uint32_t    > (getParam("nb_inst_memory"                     ,"load_store_unit",toString(i).c_str(),""));
231      }   
232
233    //-----------------------------------------------------
234    // functionnal_unit
235    //-----------------------------------------------------
236    ALLOC1(_param->_nb_inst_functionnal_unit,uint32_t,_param->_nb_functionnal_unit);
237    ALLOC3(_param->_timing,core::multi_execute_loop::execute_loop::execute_timing_t,_param->_nb_functionnal_unit,MAX_TYPE,MAX_OPERATION);
238
239    for (uint32_t i=0; i<_param->_nb_functionnal_unit; ++i)
240      {
241      //log_printf(INFO,Configuration,FUNCTION,_("FUNCTIONNAL_UNIT [%d]"),i);
242
243        _param->_nb_inst_functionnal_unit [i] = fromString<uint32_t> (getParam("nb_inst_functionnal_unit","functionnal_unit",toString(i).c_str(),""));
244
245        // just read !!!
246        try
247          {
248            getParam("nb_type","functionnal_unit",toString(i).c_str(), "");
249          }
250        catch (morpheo::ErrorMorpheo & error)
251          {
252          }
253
254        for (uint32_t j=0; j<MAX_TYPE; ++j)
255          {
256            // just read !!!
257            try
258              {
259                getParam("nb_operation","functionnal_unit",toString(i).c_str(),"type",toString(j).c_str(), "");
260              }
261            catch (morpheo::ErrorMorpheo & error)
262              {
263              }
264           
265           
266            for (uint32_t k=0; k<MAX_OPERATION; ++k)
267              {
268                if (is_type_valid(j) and (j != TYPE_MEMORY))// A functional unit can't execute memory instruction
269                  {
270                    _param->_timing [i][j][k]._latence = fromString<uint32_t> (getParam("latence",
271                                                                                        "functionnal_unit",toString(i).c_str(),
272                                                                                        "type"            ,toString(j).c_str(),
273                                                                                        "operation"       ,toString(k).c_str(),
274                                                                                        ""));
275                    _param->_timing [i][j][k]._delay   = fromString<uint32_t> (getParam("delay",
276                                                                                        "functionnal_unit",toString(i).c_str(),
277                                                                                        "type"            ,toString(j).c_str(),
278                                                                                        "operation"       ,toString(k).c_str(),
279                                                                                        ""));
280                  }
281                else
282                  {
283                    _param->_timing [i][j][k]._latence = 0;
284                    _param->_timing [i][j][k]._delay   = 0;
285                  }
286              }
287          }
288      }
289
290    //-----------------------------------------------------
291    // icache_port
292    //-----------------------------------------------------
293
294  //log_printf(INFO,Configuration,FUNCTION,_("ICACHE_PORT"));
295
296    _param->_nb_icache_port             = fromString<uint32_t           >(getParam("nb_icache_port"            , ""));
297    _param->_icache_port_priority       = fromString<Tpriority_t        >(getParam("icache_port_priority"      , ""));
298    _param->_icache_port_load_balancing = fromString<Tload_balancing_t  >(getParam("icache_port_load_balancing", ""));
299
300    //-----------------------------------------------------
301    // dcache_port
302    //-----------------------------------------------------
303  //log_printf(INFO,Configuration,FUNCTION,_("DCACHE_PORT"));
304
305    _param->_nb_dcache_port               = fromString<uint32_t         >(getParam("nb_dcache_port"            , ""));
306    _param->_dcache_port_priority       = fromString<Tpriority_t        >(getParam("dcache_port_priority"      , ""));
307    _param->_dcache_port_load_balancing = fromString<Tload_balancing_t  >(getParam("dcache_port_load_balancing", ""));
308
309
310    //-----------------------------------------------------
311    // front_end
312    //-----------------------------------------------------
313    ALLOC1(_param->_nb_context                    ,uint32_t     ,_param->_nb_front_end);
314    ALLOC1(_param->_nb_decod_unit                 ,uint32_t     ,_param->_nb_front_end);
315    ALLOC1(_param->_nb_inst_branch_predict        ,uint32_t     ,_param->_nb_front_end);
316    ALLOC1(_param->_nb_inst_branch_decod          ,uint32_t     ,_param->_nb_front_end);
317    ALLOC1(_param->_nb_inst_branch_update         ,uint32_t     ,_param->_nb_front_end);
318    ALLOC1(_param->_btb_size_queue                ,uint32_t     ,_param->_nb_front_end);
319    ALLOC1(_param->_btb_associativity             ,uint32_t     ,_param->_nb_front_end);
320    ALLOC1(_param->_btb_size_counter              ,uint32_t     ,_param->_nb_front_end);
321    ALLOC1(_param->_btb_victim_scheme             ,Tvictim_t    ,_param->_nb_front_end);
322    ALLOC1(_param->_dir_predictor_scheme          ,Tpredictor_t ,_param->_nb_front_end);
323    ALLOC2(_param->_dir_have_bht                  ,bool         ,_param->_nb_front_end,3);
324    ALLOC2(_param->_dir_bht_size_shifter          ,uint32_t     ,_param->_nb_front_end,3);
325    ALLOC2(_param->_dir_bht_nb_shifter            ,uint32_t     ,_param->_nb_front_end,3);
326    ALLOC2(_param->_dir_have_pht                  ,bool         ,_param->_nb_front_end,3);
327    ALLOC2(_param->_dir_pht_size_counter          ,uint32_t     ,_param->_nb_front_end,3);
328    ALLOC2(_param->_dir_pht_nb_counter            ,uint32_t     ,_param->_nb_front_end,3);
329    ALLOC2(_param->_dir_pht_size_address_share    ,uint32_t     ,_param->_nb_front_end,3);
330    ALLOC2(_param->_dir_pht_scheme                ,Tpht_scheme_t,_param->_nb_front_end,3);
331
332    for (uint32_t i=0; i<_param->_nb_front_end; ++i)
333      {
334      //log_printf(INFO,Configuration,FUNCTION,_("FRONT_END [%d]"),i);
335
336        _param->_nb_context                    [i] = fromString<uint32_t    >(getParam("nb_context"                ,"front_end",toString(i).c_str(), ""));
337        _param->_nb_decod_unit                 [i] = fromString<uint32_t    >(getParam("nb_decod_unit"             ,"front_end",toString(i).c_str(), ""));
338        _param->_nb_inst_branch_predict        [i] = fromString<uint32_t    >(getParam("nb_inst_branch_predict"    ,"front_end",toString(i).c_str(), ""));
339        _param->_nb_inst_branch_decod          [i] = fromString<uint32_t    >(getParam("nb_inst_branch_decod"      ,"front_end",toString(i).c_str(), ""));
340        _param->_nb_inst_branch_update         [i] = fromString<uint32_t    >(getParam("nb_inst_branch_update"     ,"front_end",toString(i).c_str(), ""));
341        _param->_btb_size_queue                [i] = fromString<uint32_t    >(getParam("btb_size_queue"            ,"front_end",toString(i).c_str(), ""));
342        _param->_btb_associativity             [i] = fromString<uint32_t    >(getParam("btb_associativity"         ,"front_end",toString(i).c_str(), ""));
343        _param->_btb_size_counter              [i] = fromString<uint32_t    >(getParam("btb_size_counter"          ,"front_end",toString(i).c_str(), ""));
344        _param->_btb_victim_scheme             [i] = fromString<Tvictim_t   >(getParam("btb_victim_scheme"         ,"front_end",toString(i).c_str(), ""));
345        _param->_dir_predictor_scheme          [i] = fromString<Tpredictor_t>(getParam("dir_predictor_scheme"      ,"front_end",toString(i).c_str(), ""));
346
347        // just read !!!
348        try
349          {
350            getParam("nb_predictor","front_end",toString(i).c_str(), "");
351          }
352        catch (morpheo::ErrorMorpheo & error)
353          {
354          }
355
356        const uint32_t max_nb_predictor=3;
357        for (uint32_t j=0; j<max_nb_predictor; ++j)
358          {
359          //log_printf(INFO,Configuration,FUNCTION,_("PREDICTOR [%d][%d]"),i,j);
360
361        _param->_dir_have_bht               [i][j] = fromString<bool         >(getParam("dir_have_bht"              ,"front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
362        _param->_dir_bht_size_shifter       [i][j] = fromString<uint32_t     >(getParam("dir_bht_size_shifter"      ,"front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
363        _param->_dir_bht_nb_shifter         [i][j] = fromString<uint32_t     >(getParam("dir_bht_nb_shifter"        ,"front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
364        _param->_dir_have_pht               [i][j] = fromString<bool         >(getParam("dir_have_pht"              ,"front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
365        _param->_dir_pht_size_counter       [i][j] = fromString<uint32_t     >(getParam("dir_pht_size_counter"      ,"front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
366        _param->_dir_pht_nb_counter         [i][j] = fromString<uint32_t     >(getParam("dir_pht_nb_counter"        ,"front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
367        _param->_dir_pht_size_address_share [i][j] = fromString<uint32_t     >(getParam("dir_pht_size_address_share","front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
368        _param->_dir_pht_scheme             [i][j] = fromString<Tpht_scheme_t>(getParam("dir_pht_scheme"            ,"front_end",toString(i).c_str(),"predictor",toString(j).c_str(), ""));
369          }
370      }   
371
372    //-----------------------------------------------------
373    // ooo_engine
374    //-----------------------------------------------------
375
376    ALLOC1(_param->_nb_rename_unit          ,uint32_t         ,_param->_nb_ooo_engine);
377    ALLOC1(_param->_nb_inst_issue           ,uint32_t         ,_param->_nb_ooo_engine);
378    ALLOC1(_param->_nb_inst_reexecute       ,uint32_t         ,_param->_nb_ooo_engine);
379    ALLOC1(_param->_nb_inst_commit          ,uint32_t         ,_param->_nb_ooo_engine);
380    ALLOC1(_param->_nb_inst_branch_complete ,uint32_t         ,_param->_nb_ooo_engine);
381    ALLOC1(_param->_nb_rename_unit_select   ,uint32_t         ,_param->_nb_ooo_engine);
382    ALLOC1(_param->_nb_execute_loop_select  ,uint32_t         ,_param->_nb_ooo_engine);
383    ALLOC1(_param->_size_re_order_buffer    ,uint32_t         ,_param->_nb_ooo_engine);
384    ALLOC1(_param->_nb_re_order_buffer_bank ,uint32_t         ,_param->_nb_ooo_engine);
385    ALLOC1(_param->_retire_ooo_scheme       ,morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::Tretire_ooo_scheme_t
386                                                              ,_param->_nb_ooo_engine);
387    ALLOC1(_param->_commit_priority         ,Tpriority_t      ,_param->_nb_ooo_engine);
388    ALLOC1(_param->_commit_load_balancing   ,Tload_balancing_t,_param->_nb_ooo_engine);
389    ALLOC1(_param->_size_issue_queue        ,uint32_t         ,_param->_nb_ooo_engine);
390    ALLOC1(_param->_issue_queue_scheme      ,morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Tissue_queue_scheme_t
391                                                              ,_param->_nb_ooo_engine);
392    ALLOC1(_param->_nb_issue_queue_bank     ,uint32_t         ,_param->_nb_ooo_engine);
393    ALLOC1(_param->_issue_priority          ,Tpriority_t      ,_param->_nb_ooo_engine);
394    ALLOC1(_param->_issue_load_balancing    ,Tload_balancing_t,_param->_nb_ooo_engine);
395    ALLOC1(_param->_size_reexecute_queue    ,uint32_t         ,_param->_nb_ooo_engine);
396
397    for (uint32_t i=0; i<_param->_nb_ooo_engine; ++i)
398      {
399      //log_printf(INFO,Configuration,FUNCTION,_("OOO_ENGINE [%d]"),i);
400
401        _param->_nb_rename_unit          [i] = fromString<uint32_t         >(getParam("nb_rename_unit"          ,"ooo_engine",toString(i).c_str(), ""));
402        _param->_nb_inst_issue           [i] = fromString<uint32_t         >(getParam("nb_inst_issue"           ,"ooo_engine",toString(i).c_str(), ""));
403        _param->_nb_inst_reexecute       [i] = fromString<uint32_t         >(getParam("nb_inst_reexecute"       ,"ooo_engine",toString(i).c_str(), ""));
404        _param->_nb_inst_commit          [i] = fromString<uint32_t         >(getParam("nb_inst_commit"          ,"ooo_engine",toString(i).c_str(), ""));
405        _param->_nb_inst_branch_complete [i] = fromString<uint32_t         >(getParam("nb_inst_branch_complete" ,"ooo_engine",toString(i).c_str(), ""));
406        _param->_nb_rename_unit_select   [i] = fromString<uint32_t         >(getParam("nb_rename_unit_select"   ,"ooo_engine",toString(i).c_str(), ""));
407        _param->_nb_execute_loop_select  [i] = fromString<uint32_t         >(getParam("nb_execute_loop_select"  ,"ooo_engine",toString(i).c_str(), ""));
408        _param->_size_re_order_buffer    [i] = fromString<uint32_t         >(getParam("size_re_order_buffer"    ,"ooo_engine",toString(i).c_str(), ""));
409        _param->_nb_re_order_buffer_bank [i] = fromString<uint32_t         >(getParam("nb_re_order_buffer_bank" ,"ooo_engine",toString(i).c_str(), ""));
410        _param->_retire_ooo_scheme       [i] = fromString<morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::Tretire_ooo_scheme_t>
411                                                                            (getParam("retire_ooo_scheme"       ,"ooo_engine",toString(i).c_str(), ""));
412        _param->_commit_priority         [i] = fromString<Tpriority_t      >(getParam("commit_priority"         ,"ooo_engine",toString(i).c_str(), ""));
413        _param->_commit_load_balancing   [i] = fromString<Tload_balancing_t>(getParam("commit_load_balancing"   ,"ooo_engine",toString(i).c_str(), ""));
414        _param->_size_issue_queue        [i] = fromString<uint32_t         >(getParam("size_issue_queue"        ,"ooo_engine",toString(i).c_str(), ""));
415        _param->_issue_queue_scheme      [i] = fromString<morpheo::behavioural::core::multi_ooo_engine::ooo_engine::issue_queue::Tissue_queue_scheme_t>
416                                                                            (getParam("issue_queue_scheme"      ,"ooo_engine",toString(i).c_str(), ""));
417        _param->_nb_issue_queue_bank     [i] = fromString<uint32_t         >(getParam("nb_issue_queue_bank"     ,"ooo_engine",toString(i).c_str(), ""));
418        _param->_issue_priority          [i] = fromString<Tpriority_t      >(getParam("issue_priority"          ,"ooo_engine",toString(i).c_str(), ""));
419        _param->_issue_load_balancing    [i] = fromString<Tload_balancing_t>(getParam("issue_load_balancing"    ,"ooo_engine",toString(i).c_str(), ""));
420        _param->_size_reexecute_queue    [i] = fromString<uint32_t         >(getParam("size_reexecute_queue"    ,"ooo_engine",toString(i).c_str(), ""));
421      }   
422
423    //-----------------------------------------------------
424    // execute_loop
425    //-----------------------------------------------------
426   
427    ALLOC1(_param->_nb_read_unit                         ,uint32_t   ,_param->_nb_execute_loop);
428    ALLOC1(_param->_nb_execute_unit                      ,uint32_t   ,_param->_nb_execute_loop);
429    ALLOC1(_param->_nb_write_unit                        ,uint32_t   ,_param->_nb_execute_loop);
430    ALLOC1(_param->_nb_gpr_bank                          ,uint32_t   ,_param->_nb_execute_loop);
431    ALLOC1(_param->_nb_gpr_port_read_by_bank             ,uint32_t   ,_param->_nb_execute_loop);
432    ALLOC1(_param->_nb_gpr_port_write_by_bank            ,uint32_t   ,_param->_nb_execute_loop);
433    ALLOC1(_param->_nb_spr_bank                          ,uint32_t   ,_param->_nb_execute_loop);
434    ALLOC1(_param->_nb_spr_port_read_by_bank             ,uint32_t   ,_param->_nb_execute_loop);
435    ALLOC1(_param->_nb_spr_port_write_by_bank            ,uint32_t   ,_param->_nb_execute_loop);
436    ALLOC1(_param->_execution_unit_to_write_unit_priority,Tpriority_t,_param->_nb_execute_loop);
437    ALLOC1(_param->_read_unit_to_execution_unit_priority ,Tpriority_t,_param->_nb_execute_loop);
438
439    for (uint32_t i=0; i<_param->_nb_execute_loop; ++i)
440      {
441      //log_printf(INFO,Configuration,FUNCTION,_("EXECUTE_LOOP [%d]"),i);
442
443        _param->_nb_read_unit                         [i] = fromString<uint32_t   >(getParam("nb_read_unit"                         ,"execute_loop",toString(i).c_str(), ""));
444        _param->_nb_execute_unit                      [i] = fromString<uint32_t   >(getParam("nb_execute_unit"                      ,"execute_loop",toString(i).c_str(), ""));
445        _param->_nb_write_unit                        [i] = fromString<uint32_t   >(getParam("nb_write_unit"                        ,"execute_loop",toString(i).c_str(), ""));
446        _param->_nb_gpr_bank                          [i] = fromString<uint32_t   >(getParam("nb_gpr_bank"                          ,"execute_loop",toString(i).c_str(), ""));
447        _param->_nb_gpr_port_read_by_bank             [i] = fromString<uint32_t   >(getParam("nb_gpr_port_read_by_bank"             ,"execute_loop",toString(i).c_str(), ""));
448        _param->_nb_gpr_port_write_by_bank            [i] = fromString<uint32_t   >(getParam("nb_gpr_port_write_by_bank"            ,"execute_loop",toString(i).c_str(), ""));
449        _param->_nb_spr_bank                          [i] = fromString<uint32_t   >(getParam("nb_spr_bank"                          ,"execute_loop",toString(i).c_str(), ""));
450        _param->_nb_spr_port_read_by_bank             [i] = fromString<uint32_t   >(getParam("nb_spr_port_read_by_bank"             ,"execute_loop",toString(i).c_str(), ""));
451        _param->_nb_spr_port_write_by_bank            [i] = fromString<uint32_t   >(getParam("nb_spr_port_write_by_bank"            ,"execute_loop",toString(i).c_str(), ""));
452        _param->_execution_unit_to_write_unit_priority[i] = fromString<Tpriority_t>(getParam("execution_unit_to_write_unit_priority","execute_loop",toString(i).c_str(), ""));
453        _param->_read_unit_to_execution_unit_priority [i] = fromString<Tpriority_t>(getParam("read_unit_to_execution_unit_priority" ,"execute_loop",toString(i).c_str(), ""));
454      }   
455
456    //-----------------------------------------------------
457    // Link
458    //-----------------------------------------------------
459
460  //log_printf(INFO,Configuration,FUNCTION,_("LINK"));
461
462    _param->_dispatch_priority       = fromString<Tpriority_t      >(getParam("dispatch_priority"      , ""));
463    _param->_dispatch_load_balancing = fromString<Tload_balancing_t>(getParam("dispatch_load_balancing", ""));
464
465    ALLOC1(_param->_link_context_with_thread               ,pair_dual,_param->_nb_thread);
466    ALLOC1(_param->_link_decod_unit_with_decod_bloc        ,pair_dual,_param->_nb_decod_bloc);
467    ALLOC1(_param->_link_rename_unit_with_rename_bloc      ,pair_dual,_param->_nb_rename_bloc);
468    ALLOC1(_param->_link_read_unit_with_read_bloc          ,pair_dual,_param->_nb_read_bloc);
469    ALLOC1(_param->_link_write_unit_with_write_bloc        ,pair_dual,_param->_nb_write_bloc);
470    ALLOC1(_param->_link_execute_unit_with_functionnal_unit,pair_dual,_param->_nb_functionnal_unit);
471    ALLOC1(_param->_link_execute_unit_with_load_store_unit ,pair_dual,_param->_nb_load_store_unit);
472    ALLOC1(_param->_link_decod_bloc_with_thread            ,uint32_t ,_param->_nb_thread);
473    ALLOC1(_param->_link_rename_bloc_with_front_end        ,uint32_t ,_param->_nb_front_end);
474//  ALLOC3(_param->_table_dispatch                         ,bool     ,_param->_nb_ooo_engine,_param->_nb_issue_queue_bank[it1],_param->_nb_read_bloc);
475    ALLOC1(_param->_link_read_bloc_with_load_store_unit    ,uint32_t ,_param->_nb_load_store_unit);
476    ALLOC2(_param->_link_read_bloc_and_functionnal_unit    ,bool     ,_param->_nb_read_bloc,_param->_nb_functionnal_unit);
477    ALLOC1(_param->_link_write_bloc_with_load_store_unit   ,uint32_t ,_param->_nb_load_store_unit);
478    ALLOC2(_param->_link_write_bloc_and_functionnal_unit   ,bool     ,_param->_nb_write_bloc,_param->_nb_functionnal_unit);
479    ALLOC1(_param->_link_load_store_unit_with_thread       ,uint32_t ,_param->_nb_thread);
480    ALLOC2(_param->_link_thread_and_functionnal_unit       ,bool     ,_param->_nb_thread,_param->_nb_functionnal_unit);
481    ALLOC1(_param->_link_icache_port_with_thread           ,uint32_t ,_param->_nb_thread);
482    ALLOC2(_param->_link_dcache_port_with_load_store_unit  ,uint32_t ,_param->_nb_load_store_unit,_param->_nb_cache_port[it1]);
483
484    std::vector<std::string> dest;
485
486#define getLink_n(x,nb_dest,src...) {dest = getLink(x, src); test(x,dest,nb_dest);}
487#define getLink_2(x,src...) {getLink_n(x,2,src);}
488#define getLink_1(x,src...) {getLink_n(x,1,src);}
489
490    for (uint32_t i=0; i<_param->_nb_thread; ++i)
491      {
492        getLink_2("link_context_with_thread",toString(i).c_str(), "");
493        _param->_link_context_with_thread [i] = pair_dual(fromString<uint32_t>(dest[0]),
494                                                          fromString<uint32_t>(dest[1]));
495       
496        getLink_1("link_decod_bloc_with_thread",toString(i).c_str(), "");
497        _param->_link_decod_bloc_with_thread [i] = fromString<uint32_t>(dest[0]);
498       
499        getLink_1("link_load_store_unit_with_thread",toString(i).c_str(), "");
500        _param->_link_load_store_unit_with_thread [i] = fromString<uint32_t>(dest[0]);
501
502        getLink_1("link_icache_port_with_thread",toString(i).c_str(), "");
503        _param->_link_icache_port_with_thread [i] = fromString<uint32_t>(dest[0]);
504
505        for (uint32_t j=0; j<_param->_nb_functionnal_unit; ++j)
506          {
507            getLink_1("link_thread_and_functionnal_unit",toString(i).c_str(),toString(j).c_str(), "");
508            _param->_link_thread_and_functionnal_unit [i][j] = fromString<bool>(dest[0]);
509          }
510      }
511   
512    for (uint32_t i=0; i<_param->_nb_decod_bloc; ++i)
513      {
514        getLink_2("link_decod_unit_with_decod_bloc",toString(i).c_str(), "");
515        _param->_link_decod_unit_with_decod_bloc [i] = pair_dual(fromString<uint32_t>(dest[0]),
516                                                                fromString<uint32_t>(dest[1]));
517      }
518
519    for (uint32_t i=0; i<_param->_nb_rename_bloc; ++i)
520      {
521        getLink_2("link_rename_unit_with_rename_bloc",toString(i).c_str(), "");
522        _param->_link_rename_unit_with_rename_bloc [i] = pair_dual(fromString<uint32_t>(dest[0]),
523                                                                  fromString<uint32_t>(dest[1]));
524      }
525
526    for (uint32_t i=0; i<_param->_nb_read_bloc; ++i)
527      {
528        getLink_2("link_read_unit_with_read_bloc",toString(i).c_str(), "");
529        _param->_link_read_unit_with_read_bloc [i] = pair_dual(fromString<uint32_t>(dest[0]),
530                                                              fromString<uint32_t>(dest[1]));
531
532        for (uint32_t j=0; j<_param->_nb_functionnal_unit; ++j)
533          {
534            getLink_1("link_read_bloc_and_functionnal_unit",toString(i).c_str(),toString(j).c_str(), "");
535            _param->_link_read_bloc_and_functionnal_unit [i][j] = fromString<bool>(dest[0]);
536          }
537      }
538
539    for (uint32_t i=0; i<_param->_nb_load_store_unit; ++i)
540      {
541        getLink_1("link_read_bloc_with_load_store_unit",toString(i).c_str(), "");
542        _param->_link_read_bloc_with_load_store_unit [i] = fromString<uint32_t>(dest[0]);
543
544        getLink_1("link_write_bloc_with_load_store_unit",toString(i).c_str(), "");
545        _param->_link_write_bloc_with_load_store_unit [i] = fromString<uint32_t>(dest[0]);
546      }
547
548    for (uint32_t i=0; i<_param->_nb_write_bloc; ++i)
549      {
550        getLink_2("link_write_unit_with_write_bloc",toString(i).c_str(), "");
551        _param->_link_write_unit_with_write_bloc [i] = pair_dual(fromString<uint32_t>(dest[0]),
552                                                                fromString<uint32_t>(dest[1]));
553
554        for (uint32_t j=0; j<_param->_nb_functionnal_unit; ++j)
555          {
556            getLink_1("link_write_bloc_and_functionnal_unit",toString(i).c_str(),toString(j).c_str(), "");
557            _param->_link_write_bloc_and_functionnal_unit [i][j] = fromString<bool>(dest[0]);
558          }
559      }
560
561    for (uint32_t i=0; i<_param->_nb_functionnal_unit; ++i)
562      {
563        getLink_2("link_execute_unit_with_functionnal_unit",toString(i).c_str(), "");
564        _param->_link_execute_unit_with_functionnal_unit [i] = pair_dual(fromString<uint32_t>(dest[0]),
565                                                                         fromString<uint32_t>(dest[1]));
566      }
567
568    for (uint32_t i=0; i<_param->_nb_load_store_unit; ++i)
569      {
570        getLink_2("link_execute_unit_with_load_store_unit",toString(i).c_str(), "");
571        _param->_link_execute_unit_with_load_store_unit [i] = pair_dual(fromString<uint32_t>(dest[0]),
572                                                                        fromString<uint32_t>(dest[1]));
573
574        for (uint32_t j=0; j<_param->_nb_cache_port[i]; ++j)
575          {
576            getLink_1("link_dcache_port_with_load_store_unit",toString(i).c_str(),toString(j).c_str(), "");
577            _param->_link_dcache_port_with_load_store_unit [i][j] = fromString<uint32_t>(dest[0]);
578          }
579      }
580
581    for (uint32_t i=0; i<_param->_nb_front_end; ++i)
582      {
583        getLink_1("link_rename_bloc_with_front_end",toString(i).c_str(), "");
584        _param->_link_rename_bloc_with_front_end [i] = fromString<uint32_t>(dest[0]);
585      }
586
587    // for (uint32_t i=0; i<_param->_nb_ooo_engine; ++i)
588    //   for (uint32_t j=0; j<_param->_nb_issue_queue_bank[i]; ++j)
589    //     for (uint32_t k=0; k<_param->_nb_read_bloc; ++k)
590    //       {
591    //         getLink_1("table_dispatch",toString(i).c_str(),toString(j).c_str(),toString(k).c_str(),"");
592    //         _param->_table_dispatch [i][j][k] = fromString<bool>(dest[0]);
593    //       }
594
595    test_use ();
596  };
597
598}; // end namespace configuration
599}; // end namespace behavioural
600}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.