source: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/src/Parameters_msg_error.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: 15.0 KB
Line 
1/*
2 * $Id: Parameters_msg_error.cpp 146 2011-02-01 20:57:54Z rosiere $
3 *
4 * [ Description ]
5 *
6 */
7
8#include "Behavioural/include/Types.h"
9#include "Behavioural/Core/include/Parameters.h"
10#include "Common/include/Max.h"
11#include <sstream>
12
13namespace morpheo {
14namespace behavioural {
15namespace core {
16
17#undef  FUNCTION
18#define FUNCTION "Core::msg_error"
19  Parameters_test Parameters::msg_error(void)
20  {
21    log_begin(Core,FUNCTION);
22
23    Parameters_test test ("Core");
24
25    // Test if value is valid
26    {
27      // initialisation
28      uint32_t nb_link_context [_nb_front_end][max<uint32_t>(_nb_context,_nb_front_end)];
29     
30      for (uint32_t i=0; i<_nb_front_end; ++i)
31        for (uint32_t j=0; j<_nb_context[i];++j)
32          nb_link_context [i][j] = 0;
33     
34      // set link
35      for (uint32_t i=0; i<_nb_thread; ++i)
36        nb_link_context[_link_context_with_thread[i].first][_link_context_with_thread[i].second] ++;
37
38      // test
39      for (uint32_t i=0; i<_nb_front_end; ++i)
40        for (uint32_t j=0; j<_nb_context[i];++j)
41          {
42            if (nb_link_context[i][j] == 0)
43              test.error(toString(_("Context [%d][%d] is not link with a thread.\n"),i,j));
44            if (nb_link_context[i][j]  > 1)
45              test.error(toString(_("Context [%d][%d] is linked with 2 or more threads.\n"),i,j));
46          }
47    }
48
49    {
50      // initialisation
51      uint32_t nb_link_decod_unit [_nb_front_end][max<uint32_t>(_nb_decod_unit,_nb_front_end)];
52     
53      for (uint32_t i=0; i<_nb_front_end; ++i)
54        for (uint32_t j=0; j<_nb_decod_unit[i];++j)
55          nb_link_decod_unit [i][j] = 0;
56     
57      // set link
58      for (uint32_t i=0; i<_nb_decod_bloc; ++i)
59        {
60          uint32_t num_front_end  = _link_decod_unit_with_decod_bloc[i].first;
61          uint32_t num_decod_unit = _link_decod_unit_with_decod_bloc[i].second;
62
63          bool error = false;
64
65          if (num_front_end >= _nb_front_end)
66            {
67              error = true;
68              test.error(toString(_("Decod_bloc [%d] is connected with an invalid front_end (%d).\n"),i,num_front_end));
69            }
70
71          if (num_decod_unit >= _nb_decod_unit[num_front_end])
72            {
73              error = true;
74              test.error(toString(_("Decod_bloc [%d] is connected with an invalid decod_unit (%d.%d).\n"),i,num_front_end,num_decod_unit));
75            }
76
77          if (not error)
78            nb_link_decod_unit[num_front_end][num_decod_unit] ++;
79        }
80      // test
81      for (uint32_t i=0; i<_nb_front_end; ++i)
82        for (uint32_t j=0; j<_nb_decod_unit[i];++j)
83          {
84            if (nb_link_decod_unit[i][j] == 0)
85              test.error(toString(_("Decod_Unit [%d][%d] is not link with a decod_bloc.\n"),i,j));
86            if (nb_link_decod_unit[i][j]  > 1)
87              test.error(toString(_("Decod_Unit [%d][%d] is linked with 2 or more decod_bloc.\n"),i,j));
88          }
89    }
90
91    {
92      // initialisation
93      uint32_t nb_link_rename_unit [_nb_ooo_engine][max<uint32_t>(_nb_rename_unit,_nb_ooo_engine)];
94     
95      for (uint32_t i=0; i<_nb_ooo_engine; ++i)
96        for (uint32_t j=0; j<_nb_rename_unit[i];++j)
97          nb_link_rename_unit [i][j] = 0;
98     
99      // set link
100      for (uint32_t i=0; i<_nb_rename_bloc; ++i)
101        nb_link_rename_unit[_link_rename_unit_with_rename_bloc[i].first][_link_rename_unit_with_rename_bloc[i].second] ++;
102
103      // test
104      for (uint32_t i=0; i<_nb_ooo_engine; ++i)
105        for (uint32_t j=0; j<_nb_rename_unit[i];++j)
106          {
107            if (nb_link_rename_unit[i][j] == 0)
108              test.error(toString(_("Rename_Unit [%d][%d] is not link with a rename_bloc.\n"),i,j));
109            if (nb_link_rename_unit[i][j]  > 1)
110              test.error(toString(_("Rename_Unit [%d][%d] is linked with 2 or more rename_bloc.\n"),i,j));
111          }
112    }
113
114    {
115      // initialisation
116      uint32_t nb_link_read_unit [_nb_execute_loop][max<uint32_t>(_nb_read_unit,_nb_execute_loop)];
117     
118      for (uint32_t i=0; i<_nb_execute_loop; ++i)
119        for (uint32_t j=0; j<_nb_read_unit[i];++j)
120          nb_link_read_unit [i][j] = 0;
121     
122      // set link
123      for (uint32_t i=0; i<_nb_read_bloc; ++i)
124        nb_link_read_unit[_link_read_unit_with_read_bloc[i].first][_link_read_unit_with_read_bloc[i].second] ++;
125
126      // test
127      for (uint32_t i=0; i<_nb_execute_loop; ++i)
128        for (uint32_t j=0; j<_nb_read_unit[i];++j)
129          {
130            if (nb_link_read_unit[i][j] == 0)
131              test.error(toString(_("Read_Unit [%d][%d] is not link with a read_bloc.\n"),i,j));
132            if (nb_link_read_unit[i][j]  > 1)
133              test.error(toString(_("Read_Unit [%d][%d] is linked with 2 or more read_bloc.\n"),i,j));
134          }
135    }
136
137    {
138      // initialisation
139      uint32_t nb_link_write_unit [_nb_execute_loop][max<uint32_t>(_nb_write_unit,_nb_execute_loop)];
140     
141      for (uint32_t i=0; i<_nb_execute_loop; ++i)
142        for (uint32_t j=0; j<_nb_write_unit[i];++j)
143          nb_link_write_unit [i][j] = 0;
144     
145      // set link
146      for (uint32_t i=0; i<_nb_write_bloc; ++i)
147        nb_link_write_unit[_link_write_unit_with_write_bloc[i].first][_link_write_unit_with_write_bloc[i].second] ++;
148
149      // test
150      for (uint32_t i=0; i<_nb_execute_loop; ++i)
151        for (uint32_t j=0; j<_nb_write_unit[i];++j)
152          {
153            if (nb_link_write_unit[i][j] == 0)
154              test.error(toString(_("Write_Unit [%d][%d] is not link with a write_bloc.\n"),i,j));
155            if (nb_link_write_unit[i][j]  > 1)
156              test.error(toString(_("Write_Unit [%d][%d] is linked with 2 or more write_bloc.\n"),i,j));
157          }
158    }
159
160    {
161      // initialisation
162      uint32_t nb_link_execute_unit [_nb_execute_loop][max<uint32_t>(_nb_execute_unit,_nb_execute_loop)];
163//       uint32_t nb_functionnal_unit  [_nb_functionnal_unit];
164//       uint32_t nb_load_store_unit   [_nb_load_store_unit];
165
166//       for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
167//         nb_functionnal_unit [i] = 0;
168     
169//       for (uint32_t i=0; i<_nb_load_store_unit; ++i)
170//         nb_load_store_unit  [i] = 0;
171     
172      for (uint32_t i=0; i<_nb_execute_loop; ++i)
173        for (uint32_t j=0; j<_nb_execute_unit[i];++j)
174          nb_link_execute_unit [i][j] = 0;
175
176      // set link
177      for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
178        {
179          uint32_t num_execute_loop = _link_execute_unit_with_functionnal_unit [i].first;
180          uint32_t num_execute_unit = _link_execute_unit_with_functionnal_unit [i].second;
181
182          log_printf(TRACE,Core,FUNCTION,"  * _link_execute_unit_with_functionnal_unit [%d] = %d.%d",i,num_execute_loop,num_execute_unit);
183
184          nb_link_execute_unit [num_execute_loop][num_execute_unit] ++;
185//           nb_functionnal_unit  [i] ++;
186        }
187      for (uint32_t i=0; i<_nb_load_store_unit; ++i)
188        {
189          uint32_t num_execute_loop = _link_execute_unit_with_load_store_unit [i].first;
190          uint32_t num_execute_unit = _link_execute_unit_with_load_store_unit [i].second;
191
192          log_printf(TRACE,Core,FUNCTION,"  * _link_execute_unit_with_load_store_unit  [%d] = %d.%d",i,num_execute_loop,num_execute_unit);
193
194          nb_link_execute_unit [num_execute_loop][num_execute_unit] ++;
195//           nb_load_store_unit   [i] ++;
196        }
197
198      // test
199      for (uint32_t i=0; i<_nb_execute_loop; ++i)
200        for (uint32_t j=0; j<_nb_execute_unit[i];++j)
201          {
202            if (nb_link_execute_unit[i][j] == 0)
203              test.error(toString(_("Execute_Unit [%d][%d] is not link with a load_store_unit or functionnal_unit.\n"),i,j));
204            if (nb_link_execute_unit[i][j]  > 1)
205              test.error(toString(_("Execute_Unit [%d][%d] is linked with 2 or more time.\n"),i,j));
206          }
207
208//       for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
209//         {
210//           if (nb_functionnal_unit[i] == 0)
211//             test.error(toString(_("Functionnal_Unit [%d] is not instanced.\n"),i));
212//           if (nb_functionnal_unit[i]  > 1)
213//             test.error(toString(_("Functionnal_Unit [%d] is linked with 2 or more time.\n"),i));
214//         }
215
216//       for (uint32_t i=0; i<_nb_load_store_unit; ++i)
217//         {
218//           if (nb_load_store_unit[i] == 0)
219//             test.error(toString(_("Load_Store_Unit [%d] is not instanced.\n"),i));
220//           if (nb_load_store_unit[i]  > 1)
221//             test.error(toString(_("Load_Store_Unit [%d] is linked with 2 or more time.\n"),i));
222//         }
223    }
224   
225    {
226      bool     read_bloc_link_with_load_store_unit  [_nb_read_bloc];
227      bool     read_bloc_link_with_functionnal_unit [_nb_read_bloc];
228      uint32_t nb_link_functionnal_unit [_nb_functionnal_unit];
229     
230      for (uint32_t i=0; i<_nb_read_bloc; ++i)
231        {
232          read_bloc_link_with_load_store_unit  [i] = false;
233          read_bloc_link_with_functionnal_unit [i] = false;
234        }
235      for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
236        nb_link_functionnal_unit [i] = 0;
237     
238      for (uint32_t i=0; i<_nb_load_store_unit; ++i)
239        read_bloc_link_with_load_store_unit [_link_read_bloc_with_load_store_unit[i]] = true;
240     
241      for (uint32_t i=0; i<_nb_read_bloc; ++i)
242        for (uint32_t j=0; j<_nb_functionnal_unit; ++j)
243          if (_link_read_bloc_and_functionnal_unit [i][j])
244            {
245              nb_link_functionnal_unit [j] ++;
246              read_bloc_link_with_functionnal_unit [i] = true;
247            }
248
249      for (uint32_t i=0; i<_nb_read_bloc; ++i)
250        {
251          if (not read_bloc_link_with_load_store_unit  [i] and
252              not read_bloc_link_with_functionnal_unit [i])
253            test.error(toString(_("Read_bloc [%d] is not link with an execute_unit.\n"),i));
254          if (    read_bloc_link_with_load_store_unit  [i] and
255                  read_bloc_link_with_functionnal_unit [i])
256            test.error(toString(_("Read_bloc [%d] is linked with an load store unit and functionnal unit.\n"),i));
257        }
258      for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
259        if (nb_link_functionnal_unit [i] == 0)
260          test.error(toString(_("functionnal_unit [%d] is not link with a read_bloc.\n"),i));
261    }
262
263    {
264      uint32_t nb_link_write_bloc       [_nb_write_bloc];
265      uint32_t nb_link_functionnal_unit [_nb_functionnal_unit];
266
267      for (uint32_t i=0; i<_nb_write_bloc; ++i)
268        nb_link_write_bloc [i] = 0;
269      for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
270        nb_link_functionnal_unit [i] = 0;
271
272      for (uint32_t i=0; i<_nb_load_store_unit; ++i)
273        nb_link_write_bloc [_link_write_bloc_with_load_store_unit[i]] = true;
274
275      for (uint32_t i=0; i<_nb_write_bloc; ++i)
276        for (uint32_t j=0; j<_nb_functionnal_unit; ++j)
277          if (_link_write_bloc_and_functionnal_unit [i][j])
278            {
279              nb_link_write_bloc       [i] ++;
280              nb_link_functionnal_unit [j] ++;
281            }
282
283      for (uint32_t i=0; i<_nb_write_bloc; ++i)
284        if (nb_link_write_bloc [i] == 0)
285          test.error(toString(_("Write_bloc [%d] is not link with an execute_unit.\n"),i));
286      for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
287        if (nb_link_functionnal_unit [i] == 0)
288          test.error(toString(_("functionnal_unit [%d] is not link with a write_bloc.\n"),i));
289    }
290
291    {
292      uint32_t nb_link_thread                      [_nb_thread];
293      uint32_t nb_link_load_store_unit             [_nb_load_store_unit];
294      uint32_t nb_link_functionnal_unit            [_nb_functionnal_unit];
295      bool     link_front_end_with_execute_loop    [_nb_front_end][_nb_execute_loop];
296      uint32_t nb_link_front_end_with_execute_loop [_nb_front_end];
297
298      for (uint32_t i=0; i<_nb_thread; ++i)
299        nb_link_thread [i] = 0;
300      for (uint32_t i=0; i<_nb_load_store_unit; ++i)
301        nb_link_load_store_unit [i] = 0;
302      for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
303        nb_link_functionnal_unit [i] = 0;
304      for (uint32_t i=0; i<_nb_front_end; ++i)
305        {
306          nb_link_front_end_with_execute_loop [i] = 0;
307          for (uint32_t j=0; j<_nb_execute_loop; ++j)
308            link_front_end_with_execute_loop [i][j] = false;
309        }
310
311      for (uint32_t i=0; i<_nb_thread; ++i)
312        {
313          uint32_t num_front_end = _link_context_with_thread [i].first;
314
315          {
316            uint32_t num_load_store_unit = _link_load_store_unit_with_thread [i];
317            uint32_t num_execute_loop    = _link_execute_unit_with_load_store_unit [i].first;
318           
319            nb_link_thread           [i] ++;
320            nb_link_load_store_unit  [num_load_store_unit] ++;
321
322            if (not link_front_end_with_execute_loop [num_front_end][num_execute_loop])
323              nb_link_front_end_with_execute_loop [num_front_end] ++;
324            link_front_end_with_execute_loop [num_front_end][num_execute_loop] = true;
325          }
326
327          for (uint32_t j=0; j<_nb_functionnal_unit; ++j)
328            if (_link_thread_and_functionnal_unit [i][j])
329              {
330                uint32_t num_execute_loop = _link_execute_unit_with_functionnal_unit [i].first;
331
332                nb_link_thread           [i] ++;
333                nb_link_functionnal_unit [j] ++;
334               
335                if (not link_front_end_with_execute_loop [num_front_end][num_execute_loop])
336                  nb_link_front_end_with_execute_loop [num_front_end] ++;
337                link_front_end_with_execute_loop [num_front_end][num_execute_loop] = true;
338              }
339        }
340
341      for (uint32_t i=0; i<_nb_thread; ++i)
342        if (nb_link_thread [i] < 2)
343          test.error(toString(_("Thread [%d] is not link with a load_store_unit and a functionnal_unit.\n"),i));
344      for (uint32_t i=0; i<_nb_load_store_unit; ++i)
345        if (nb_link_load_store_unit [i] == 0)
346          test.error(toString(_("Load_store_unit [%d] is not link with a thread.\n"),i));
347      for (uint32_t i=0; i<_nb_functionnal_unit; ++i)
348        if (nb_link_functionnal_unit [i] == 0)
349          test.error(toString(_("Functionnal_unit [%d] is not link with a thread.\n"),i));
350      for (uint32_t i=0; i<_nb_front_end; ++i)
351        if (nb_link_front_end_with_execute_loop [i] != 1)
352          test.error(toString(_("Front end [%d] is link with many execute_loop.\n"),i));
353    }
354   
355    {
356      uint32_t nb_link_icache_port [_nb_icache_port];
357
358      for (uint32_t i=0; i<_nb_icache_port; ++i)
359        nb_link_icache_port [i] = 0;
360
361      for (uint32_t i=0; i<_nb_thread; ++i)
362        nb_link_icache_port [_link_icache_port_with_thread [i]] ++;
363     
364      for (uint32_t i=0; i<_nb_icache_port; ++i)
365        if (nb_link_icache_port [i] == 0)
366          test.error(toString(_("Icache port [%d] is not link with a thread.\n"),i));
367    }
368
369    {
370      uint32_t nb_link_dcache_port [_nb_dcache_port];
371
372      for (uint32_t i=0; i<_nb_dcache_port; ++i)
373        nb_link_dcache_port [i] = 0;
374         
375      for (uint32_t i=0; i<_nb_load_store_unit; ++i)
376        for (uint32_t j=0; j<_nb_cache_port[i]; ++j)
377          nb_link_dcache_port [_link_dcache_port_with_load_store_unit[i][j]] ++;
378     
379      for (uint32_t i=0; i<_nb_dcache_port; ++i)
380        if (nb_link_dcache_port [i] == 0)
381          test.error(toString(_("Dcache port [%d] is not link with a port of load store unit.\n"),i));
382    }
383
384    log_end(Core,FUNCTION);
385
386    return test;
387  };
388
389}; // end namespace core
390}; // end namespace behavioural
391}; // end namespace morpheo             
Note: See TracBrowser for help on using the repository browser.