source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Core_Glue/src/Parameters.cpp @ 136

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

1) Add new algo in ifetch queue
2) Add Cancel bit
3) new config

  • Property svn:keywords set to Id
File size: 11.5 KB
Line 
1/*
2 * $Id: Parameters.cpp 136 2009-10-20 18:52:15Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/Core/Core_Glue/include/Parameters.h"
9#include "Behavioural/include/Allocation.h"
10#include "Common/include/Max.h"
11
12namespace morpheo {
13namespace behavioural {
14namespace core {
15namespace core_glue {
16
17
18#undef  FUNCTION
19#define FUNCTION "Core_Glue::Parameters"
20  Parameters::Parameters
21  (uint32_t                nb_front_end                         ,
22   uint32_t              * nb_context                           ,//[nb_front_end]
23   uint32_t                nb_ooo_engine                        ,
24   uint32_t                nb_execute_loop                      ,
25   uint32_t              * ooo_engine_nb_front_end              ,//[nb_ooo_engine]
26   uint32_t              * ooo_engine_nb_execute_loop           ,//[nb_ooo_engine]
27   uint32_t              * execute_loop_nb_ooo_engine           ,//[nb_execute_loop]
28   uint32_t              * nb_inst_decod                        ,//[nb_front_end] -> [sum_inst_decod]
29   uint32_t              * front_end_nb_inst_branch_complete    ,//[nb_front_end]
30   uint32_t              * ooo_engine_nb_inst_branch_complete   ,//[nb_ooo_engine]
31// uint32_t              * nb_inst_insert                       ,//[nb_ooo_engine]
32   uint32_t              * nb_inst_reexecute                    ,//[nb_ooo_engine]
33   uint32_t              * nb_inst_issue_queue                  ,//[nb_ooo_engine]
34   uint32_t              * nb_inst_issue_slot                   ,//[nb_ooo_engine]
35   uint32_t             ** nb_inst_execute                      ,//[nb_ooo_engine][ooo_engine_nb_execute_loop]
36   bool                  * issue_queue_in_order                 ,//[nb_ooo_engine]
37   uint32_t              * nb_read_unit                         ,//[nb_execute_loop]
38   uint32_t              * nb_write_unit                        ,//[nb_execute_loop]
39   uint32_t                size_depth                           ,
40   uint32_t                size_rob_ptr                         ,
41   uint32_t                size_load_queue_ptr                  ,
42   uint32_t                size_store_queue_ptr                 ,
43   uint32_t                size_general_data                    ,
44   uint32_t                size_special_data                    ,
45   uint32_t                size_general_register                ,
46   uint32_t                size_special_register                ,
47   Tpriority_t             dispatch_priority                    ,
48   Tload_balancing_t       dispatch_load_balancing              ,
49   bool               **** table_dispatch                       ,//[nb_ooo_engine][nb_inst_issue_slot][execute_loop][nb_read_unit]
50   bool                *** table_issue_type                     ,//                                   [execute_loop][nb_read_unit][nb_type]
51   uint32_t             ** translate_ooo_engine_num_front_end   ,//[nb_ooo_engine][ooo_engine_nb_front_end]
52   uint32_t             ** translate_ooo_engine_num_execute_loop,//[nb_ooo_engine][ooo_engine_nb_execute_loop]
53   uint32_t             ** translate_execute_loop_num_ooo_engine,//[nb_execute_loop][execute_loop_nb_ooo_engine]
54   bool                    is_toplevel)
55  {
56    log_begin(Core_Glue,FUNCTION);
57
58    _nb_front_end                          = nb_front_end                         ;
59    _nb_context                            = nb_context                           ;
60    _nb_ooo_engine                         = nb_ooo_engine                        ;
61    _nb_execute_loop                       = nb_execute_loop                      ;
62    _ooo_engine_nb_front_end               = ooo_engine_nb_front_end              ;
63    _ooo_engine_nb_execute_loop            = ooo_engine_nb_execute_loop           ;
64    _execute_loop_nb_ooo_engine            = execute_loop_nb_ooo_engine           ;
65    _nb_inst_decod                         = nb_inst_decod                        ;
66    _front_end_nb_inst_branch_complete     = front_end_nb_inst_branch_complete    ;
67    _ooo_engine_nb_inst_branch_complete    = ooo_engine_nb_inst_branch_complete   ;
68//  _nb_inst_insert                        = nb_inst_insert                       ;
69    _nb_inst_reexecute                     = nb_inst_reexecute                    ;
70    _nb_inst_issue_queue                   = nb_inst_issue_queue                  ;
71    _nb_inst_issue_slot                    = nb_inst_issue_slot                   ;
72    _nb_inst_execute                       = nb_inst_execute                      ;
73    _issue_queue_in_order                  = issue_queue_in_order                 ;
74    _nb_read_unit                          = nb_read_unit                         ;
75    _nb_write_unit                         = nb_write_unit                        ;
76    _dispatch_priority                     = dispatch_priority                    ;
77    _dispatch_load_balancing               = dispatch_load_balancing              ;
78    _table_dispatch                        = table_dispatch                       ;
79    _table_issue_type                      = table_issue_type                     ;
80    _translate_ooo_engine_num_front_end    = translate_ooo_engine_num_front_end   ;
81    _translate_ooo_engine_num_execute_loop = translate_ooo_engine_num_execute_loop;
82    _translate_execute_loop_num_ooo_engine = translate_execute_loop_num_ooo_engine;
83
84    test();
85
86    ALLOC1(_link_ooo_engine_with_front_end,uint32_t,_nb_front_end);
87    ALLOC1(_translate_num_front_end_to_ooo_engine_front_end_id,uint32_t,_nb_front_end);
88    for (uint32_t i=0; i<_nb_ooo_engine; ++i)
89      for (uint32_t j=0; j<_ooo_engine_nb_front_end[i]; ++j)
90        {
91          uint32_t num_front_end = _translate_ooo_engine_num_front_end [i][j];
92         
93          _link_ooo_engine_with_front_end                     [num_front_end] = i;
94          _translate_num_front_end_to_ooo_engine_front_end_id [num_front_end] = j;
95        }
96
97    ALLOC2(_translate_num_execute_loop_to_ooo_engine_execute_loop_id,uint32_t  ,_nb_execute_loop,_execute_loop_nb_ooo_engine[it1]);
98    ALLOC2(_translate_num_ooo_engine_to_execute_loop_ooo_engine_id  ,Tcontext_t,_nb_ooo_engine,_nb_execute_loop);
99
100    for (uint32_t i=0; i<_nb_ooo_engine; ++i)
101      for (uint32_t j=0; j<_nb_execute_loop; ++j)
102        _translate_num_ooo_engine_to_execute_loop_ooo_engine_id [i][j] = _nb_ooo_engine;
103
104    for (uint32_t i=0; i<_nb_execute_loop; ++i)
105      for (uint32_t j=0; j<_execute_loop_nb_ooo_engine[i]; ++j)
106        {
107          uint32_t num_ooo_engine  = _translate_execute_loop_num_ooo_engine [i][j];
108
109          _translate_num_ooo_engine_to_execute_loop_ooo_engine_id [num_ooo_engine][i] = j;
110
111          uint32_t execute_loop_id;
112          for (execute_loop_id = 0; execute_loop_id<_ooo_engine_nb_execute_loop[num_ooo_engine]; ++execute_loop_id)
113            if (_translate_ooo_engine_num_execute_loop [num_ooo_engine][execute_loop_id] == i)
114              break;
115         
116          _translate_num_execute_loop_to_ooo_engine_execute_loop_id [i][j] = execute_loop_id;
117        }
118
119//  ALLOC2(_execute_loop_nb_inst_insert,uint32_t,_nb_execute_loop,_execute_loop_nb_ooo_engine[it1]);
120    ALLOC2(_execute_loop_nb_inst_issue_slot ,uint32_t,_nb_execute_loop,_execute_loop_nb_ooo_engine[it1]);
121
122    for (uint32_t i=0; i<_nb_execute_loop; ++i)
123      for (uint32_t j=0; j<_execute_loop_nb_ooo_engine[i]; ++j)
124        {
125          uint32_t num_ooo_engine = _translate_execute_loop_num_ooo_engine [i][j];
126          _execute_loop_nb_inst_issue_slot [i][j] = _nb_inst_issue_slot [num_ooo_engine];
127//        _execute_loop_nb_inst_insert     [i][j] = _nb_inst_insert     [num_ooo_engine];
128        }
129
130    _max_ooo_engine_nb_inst_branch_complete = max<uint32_t>(_ooo_engine_nb_inst_branch_complete,_nb_ooo_engine);
131    _max_front_end_nb_inst_branch_complete  = max<uint32_t>(_front_end_nb_inst_branch_complete,_nb_front_end);
132    _max_ooo_engine_nb_execute_loop         = max<uint32_t>(_ooo_engine_nb_execute_loop,_nb_ooo_engine);
133    _max_nb_inst_execute                    = max<uint32_t>(_nb_inst_execute           ,_nb_ooo_engine, _ooo_engine_nb_execute_loop);
134    _max_nb_write_unit                      = max<uint32_t>(_nb_write_unit             ,_nb_execute_loop);
135//  _max_nb_inst_insert                     = max<uint32_t>(_nb_inst_insert            ,_nb_ooo_engine);
136    _max_nb_inst_issue_queue                = max<uint32_t>(_nb_inst_issue_queue       ,_nb_ooo_engine);
137    _max_nb_inst_issue_slot                 = max<uint32_t>(_nb_inst_issue_slot        ,_nb_ooo_engine);
138    _max_nb_read_unit                       = max<uint32_t>(_nb_read_unit              ,_nb_execute_loop);
139
140    if (is_toplevel)
141      {
142    _size_context_id                       = log2(max<uint32_t>(nb_context,nb_front_end));
143    _size_front_end_id                     = log2(nb_front_end );
144    _size_ooo_engine_id                    = log2(nb_ooo_engine);
145    _size_instruction_address              = size_general_data-2  ;
146    _size_data_address                     = size_general_data    ;
147    _size_general_data                     = size_general_data    ;
148    _size_special_data                     = size_special_data    ;
149    _size_general_register                 = size_general_register;
150    _size_special_register                 = size_special_register;
151    _size_depth                            = size_depth           ;
152    _size_rob_ptr                          = size_rob_ptr         ;
153    _size_load_queue_ptr                   = size_load_queue_ptr  ;
154    _size_store_queue_ptr                  = size_store_queue_ptr ;
155//  _size_nb_inst_decod                    = size_nb_inst_decod   ;
156//  _size_nb_inst_commit                   = size_nb_inst_commit  ;
157//  _size_ifetch_queue_ptr                 = size_ifetch_queue_ptr;
158//  _size_inst_ifetch_ptr                  = size_inst_ifetch_ptr ;
159                                           
160    _have_port_context_id                  = _size_context_id       > 0;
161    _have_port_front_end_id                = _size_front_end_id     > 0;
162    _have_port_ooo_engine_id               = _size_ooo_engine_id    > 0;
163    _have_port_depth                       = _size_depth            > 0;
164    _have_port_rob_ptr                     = _size_rob_ptr          > 0;
165    _have_port_load_queue_ptr              = _size_load_queue_ptr   > 0;
166//  _have_port_ifetch_queue_ptr            = _size_ifetch_queue_ptr > 0;
167//  _have_port_inst_ifetch_ptr             = _size_inst_ifetch_ptr  > 0;
168
169        copy();
170      }
171
172    log_end(Core_Glue,FUNCTION);
173  };
174 
175// #undef  FUNCTION
176// #define FUNCTION "Core_Glue::Parameters (copy)"
177//   Parameters::Parameters (Parameters & param)
178//   {
179//     log_begin(Core_Glue,FUNCTION);
180//     test();
181//     log_end(Core_Glue,FUNCTION);
182//   };
183
184#undef  FUNCTION
185#define FUNCTION "Core_Glue::~Parameters"
186  Parameters::~Parameters (void) 
187  {
188    log_begin(Core_Glue,FUNCTION);
189
190    DELETE2(_execute_loop_nb_inst_issue_slot                         ,_nb_execute_loop,_execute_loop_nb_ooo_engine[it1]);
191//  DELETE2(_execute_loop_nb_inst_insert                             ,_nb_execute_loop,_execute_loop_nb_ooo_engine[it1]);
192    DELETE2(_translate_num_ooo_engine_to_execute_loop_ooo_engine_id  ,_nb_ooo_engine,_nb_execute_loop);
193    DELETE2(_translate_num_execute_loop_to_ooo_engine_execute_loop_id,_nb_execute_loop,_execute_loop_nb_ooo_engine[it1]);
194    DELETE1(_translate_num_front_end_to_ooo_engine_front_end_id      ,_nb_front_end);
195    DELETE1(_link_ooo_engine_with_front_end                          ,_nb_front_end);
196
197    log_end(Core_Glue,FUNCTION);
198  };
199
200#undef  FUNCTION
201#define FUNCTION "Core_Glue::copy"
202  void Parameters::copy (void) 
203  {
204    log_begin(Core_Glue,FUNCTION);
205    log_end(Core_Glue,FUNCTION);
206  };
207
208}; // end namespace core_glue
209}; // end namespace core
210
211}; // end namespace behavioural
212}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.