source: trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Types.h @ 139

Last change on this file since 139 was 139, checked in by rosiere, 14 years ago
  • Add test for all configuration
  • RAT : add rat scheme (depth_save)
  • Property svn:keywords set to Id
File size: 14.9 KB
Line 
1#ifndef morpheo_behavioural_Types_h
2#define morpheo_behavioural_Types_h
3
4#include "Common/include/Types.h"
5#include "Common/include/ToString.h"
6#include "Common/include/FromString.h"
7#include "Common/include/ErrorMorpheo.h"
8#include "Behavioural/include/Constants.h"
9
10namespace morpheo {
11namespace behavioural {
12 
13  //============================================
14  // Type definition
15  //============================================
16
17  // ***** general
18  typedef uint32_t           Tcounter_t; // universal counter
19  typedef uint32_t           Tptr_t;     // universal pointer
20  typedef uint32_t           Tinstruction_t;
21  typedef bool               Tcontrol_t;
22  typedef uint8_t            Texception_t;
23  typedef uint8_t            Tcontext_t;
24  typedef Tptr_t             Tpacket_t;
25  typedef uint8_t            Toperation_t;
26  typedef uint8_t            Ttype_t;
27  typedef uint32_t           Tspr_t;
28  typedef uint16_t           Tspr_address_t;
29
30//typedef uint32_t           Tdestination1_t;
31//typedef uint32_t           Tdestination2_t;
32//typedef uint32_t           Texec_flag_t;
33//typedef bool               Texec_excep_t;
34                             
35  // ***** Event             
36  typedef uint8_t            Tevent_state_t;
37  typedef uint8_t            Tevent_type_t;
38                             
39  // ***** Register         
40  typedef uint32_t           Tgeneral_address_t;
41  typedef uint32_t           Tgeneral_data_t;
42  typedef uint32_t           Tspecial_address_t;
43  typedef uint32_t           Tspecial_data_t;
44                             
45  // ~~~~~ prediction_unit   
46  typedef uint64_t           Thistory_t;
47  typedef Tptr_t             Tprediction_ptr_t;
48  typedef uint8_t            Tbranch_state_t;
49  typedef uint8_t            Tbranch_condition_t;
50  typedef Tprediction_ptr_t  Tdepth_t;
51  typedef Tgeneral_data_t    Taddress_t;
52
53  // ***** component dependant
54  // ~~~~~ load store queue
55  typedef uint8_t            Taccess_t;
56  typedef Tptr_t             Tlsq_ptr_t;
57  typedef Tgeneral_address_t Tdcache_address_t;
58  typedef Tgeneral_data_t    Tdcache_data_t;
59  typedef bool               Tdcache_error_t;
60  typedef uint8_t            Tdcache_type_t;
61                             
62                             
63  // ~~~~~ ifetch           
64  typedef Tptr_t             Tinst_ifetch_ptr_t;
65  typedef Tptr_t             Tifetch_queue_ptr_t;
66  typedef Tgeneral_address_t Ticache_address_t;
67  typedef Tgeneral_data_t    Ticache_instruction_t;
68  typedef bool               Ticache_error_t;
69  typedef uint8_t            Ticache_type_t;
70
71  typedef enum
72    {
73      ORBIS32,
74      ORBIS64,
75      ORFPX32,
76      ORFPX64,
77      ORVDX64
78    } ISA;
79
80  typedef enum
81    {
82      PRIORITY_STATIC,
83      PRIORITY_ROUND_ROBIN
84    } Tpriority_t;
85
86  typedef enum
87    {
88      LOAD_BALANCING_BALANCE,
89      LOAD_BALANCING_MAXIMUM_FOR_PRIORITY
90    } Tload_balancing_t;
91
92  typedef enum
93    {
94      VICTIM_RANDOM     , // Random
95      VICTIM_ROUND_ROBIN, // Round Robin
96      VICTIM_NLU        , // Not Last Used
97      VICTIM_PSEUDO_LRU , // Pseudo Least Recently Used
98      VICTIM_LRU        , // Least Recently Used
99      VICTIM_FIFO         // First IN First OUT
100    } Tvictim_t;
101
102  typedef enum
103    {
104      PREDICTOR_NEVER_TAKE      , // Branch is never  Take
105      PREDICTOR_ALWAYS_TAKE     , // Branch is always Take
106      PREDICTOR_STATIC          , // If the address of destination is previous, then the branch is take
107      PREDICTOR_LAST_TAKE       , // The direction is as the last time (if is the first time : static)
108      PREDICTOR_COUNTER         , // Counter table
109      PREDICTOR_LOCAL           , // Counter bank indexed with history bank
110      PREDICTOR_GLOBAL          , // Counter bank indexed with history table
111      PREDICTOR_META            , // A meta_predictor choose between 2 predictor : the local or the global
112      PREDICTOR_CUSTOM            // Not predefined scheme
113    } Tpredictor_t;
114
115  typedef enum
116    {
117      MANAGE_EVENT_WAIT_ALL,
118      MANAGE_EVENT_WAIT_DECODE,
119      MANAGE_EVENT_NO_WAIT
120    } Tmanage_event_t;
121
122  typedef enum
123    {
124      RAT_NO_SAVE     , // Rat without save
125      RAT_ONE_SAVE    , // Rat with one save
126      RAT_DEPTH_SAVE    // RAT with multiple save (depth)
127    } Trat_scheme_t;
128
129  //--------------------------------------------------[ instruction ]-----
130  class instruction_t
131  {
132  public :
133    Ttype_t      _type      ;
134    Toperation_t _operation ;
135    ISA          _isa_subset;
136    uint8_t      _isa_class ;
137
138    instruction_t (Ttype_t      type      ,
139                   Toperation_t operation ,
140                   ISA          isa_subset,
141                   uint8_t      isa_class )
142    {
143      _type       = type      ;
144      _operation  = operation ;
145      _isa_subset = isa_subset;
146      _isa_class  = isa_class ;
147    }
148  };
149
150  instruction_t instruction_information (uint32_t instruction);
151  uint32_t      instruction_size_data   (uint32_t instruction);
152
153  //----------------------------------------------[ spr_mode_access ]-----
154  class spr_access_mode_t
155  {
156  public : uint8_t _user_access_mode      ;
157  public : uint8_t _supervisor_access_mode;
158   
159  public : spr_access_mode_t (uint32_t user_access_mode       = SPR_ACCESS_MODE_NONE,
160                              uint32_t supervisor_access_mode = SPR_ACCESS_MODE_NONE)
161    {
162      _user_access_mode       = user_access_mode      ;
163      _supervisor_access_mode = supervisor_access_mode;
164    }
165  };
166
167}; // end namespace behavioural
168
169  template<> inline std::string toString<morpheo::behavioural::Tpriority_t>(const morpheo::behavioural::Tpriority_t& x)
170  {
171    switch (x)
172      {
173      case morpheo::behavioural::PRIORITY_STATIC      : return "priority_static"; break;
174      case morpheo::behavioural::PRIORITY_ROUND_ROBIN : return "priority_round_robin"; break;
175      default    : return ""      ; break;
176      }
177  };
178
179  template<> inline morpheo::behavioural::Tpriority_t fromString<morpheo::behavioural::Tpriority_t>(const std::string& x)
180  {
181    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PRIORITY_STATIC))) == 0) or
182        (x.compare(toString(                      morpheo::behavioural::PRIORITY_STATIC )) == 0))
183      return morpheo::behavioural::PRIORITY_STATIC;
184
185    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PRIORITY_ROUND_ROBIN))) == 0) or
186        (x.compare(toString(                      morpheo::behavioural::PRIORITY_ROUND_ROBIN )) == 0))
187      return morpheo::behavioural::PRIORITY_ROUND_ROBIN;
188
189    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
190  };
191
192  template<> inline std::string toString<morpheo::behavioural::Tload_balancing_t>(const morpheo::behavioural::Tload_balancing_t& x)
193  {
194    switch (x)
195      {
196      case morpheo::behavioural::LOAD_BALANCING_BALANCE              : return "load_balancing_balance"; break;
197      case morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY : return "load_balancing_maximum_for_priority"; break;
198      default    : return ""      ; break;
199      }
200  };
201
202  template<> inline morpheo::behavioural::Tload_balancing_t fromString<morpheo::behavioural::Tload_balancing_t>(const std::string& x)
203  {
204    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::LOAD_BALANCING_BALANCE))) == 0) or
205        (x.compare(toString(                      morpheo::behavioural::LOAD_BALANCING_BALANCE )) == 0))
206      return morpheo::behavioural::LOAD_BALANCING_BALANCE;
207
208    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY))) == 0) or
209        (x.compare(toString(                      morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY )) == 0))
210      return morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY;
211
212    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
213  };
214
215  template<> inline std::string toString<morpheo::behavioural::Tvictim_t>(const morpheo::behavioural::Tvictim_t& x)
216  {
217    switch (x)
218      {
219      case morpheo::behavioural::VICTIM_RANDOM      : return "victim_random"     ; break;
220      case morpheo::behavioural::VICTIM_ROUND_ROBIN : return "victim_round_robin"; break;
221      case morpheo::behavioural::VICTIM_NLU         : return "victim_nlu"        ; break;
222      case morpheo::behavioural::VICTIM_PSEUDO_LRU  : return "victim_pseudo_lru" ; break;
223      case morpheo::behavioural::VICTIM_LRU         : return "victim_lru"        ; break;
224      case morpheo::behavioural::VICTIM_FIFO        : return "victim_fifo"       ; break;
225      default    : return ""      ; break;
226      }
227  };
228
229  template<> inline morpheo::behavioural::Tvictim_t fromString<morpheo::behavioural::Tvictim_t>(const std::string& x)
230  {
231    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_RANDOM     ))) == 0) or
232        (x.compare(toString(                      morpheo::behavioural::VICTIM_RANDOM      )) == 0))
233      return morpheo::behavioural::VICTIM_RANDOM;
234
235    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_ROUND_ROBIN))) == 0) or
236        (x.compare(toString(                      morpheo::behavioural::VICTIM_ROUND_ROBIN )) == 0))
237      return morpheo::behavioural::VICTIM_ROUND_ROBIN;
238
239    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_NLU        ))) == 0) or
240        (x.compare(toString(                      morpheo::behavioural::VICTIM_NLU         )) == 0))
241      return morpheo::behavioural::VICTIM_NLU;
242
243    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_PSEUDO_LRU ))) == 0) or
244        (x.compare(toString(                      morpheo::behavioural::VICTIM_PSEUDO_LRU  )) == 0))
245      return morpheo::behavioural::VICTIM_PSEUDO_LRU;
246
247    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_LRU        ))) == 0) or
248        (x.compare(toString(                      morpheo::behavioural::VICTIM_LRU         )) == 0))
249      return morpheo::behavioural::VICTIM_LRU;
250
251    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_FIFO       ))) == 0) or
252        (x.compare(toString(                      morpheo::behavioural::VICTIM_FIFO        )) == 0))
253      return morpheo::behavioural::VICTIM_FIFO;
254
255    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
256  };
257
258  template<> inline std::string toString<morpheo::behavioural::Tpredictor_t>(const morpheo::behavioural::Tpredictor_t& x)
259  {
260    switch (x)
261      {
262      case morpheo::behavioural::PREDICTOR_NEVER_TAKE  : return "predictor_never_take" ; break;
263      case morpheo::behavioural::PREDICTOR_ALWAYS_TAKE : return "predictor_always_take"; break;
264      case morpheo::behavioural::PREDICTOR_STATIC      : return "predictor_static"     ; break;
265      case morpheo::behavioural::PREDICTOR_LAST_TAKE   : return "predictor_last_take"  ; break;
266      case morpheo::behavioural::PREDICTOR_COUNTER     : return "predictor_counter"    ; break;
267      case morpheo::behavioural::PREDICTOR_LOCAL       : return "predictor_local"      ; break;
268      case morpheo::behavioural::PREDICTOR_GLOBAL      : return "predictor_global"     ; break;
269      case morpheo::behavioural::PREDICTOR_META        : return "predictor_meta"       ; break;
270      case morpheo::behavioural::PREDICTOR_CUSTOM      : return "predictor_custom"     ; break;
271      default    : return ""      ; break;
272      }
273  };
274
275  template<> inline morpheo::behavioural::Tpredictor_t fromString<morpheo::behavioural::Tpredictor_t>(const std::string& x)
276  {
277    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_NEVER_TAKE ))) == 0) or
278        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_NEVER_TAKE  )) == 0))
279      return morpheo::behavioural::PREDICTOR_NEVER_TAKE;
280
281    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_ALWAYS_TAKE))) == 0) or
282        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_ALWAYS_TAKE )) == 0))
283      return morpheo::behavioural::PREDICTOR_ALWAYS_TAKE;
284
285    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_STATIC     ))) == 0) or
286        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_STATIC      )) == 0))
287      return morpheo::behavioural::PREDICTOR_STATIC;
288
289    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_LAST_TAKE  ))) == 0) or
290        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_LAST_TAKE   )) == 0))
291      return morpheo::behavioural::PREDICTOR_LAST_TAKE;
292
293    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_COUNTER    ))) == 0) or
294        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_COUNTER     )) == 0))
295      return morpheo::behavioural::PREDICTOR_COUNTER;
296
297    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_LOCAL      ))) == 0) or
298        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_LOCAL       )) == 0))
299      return morpheo::behavioural::PREDICTOR_LOCAL;
300
301    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_GLOBAL     ))) == 0) or
302        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_GLOBAL      )) == 0))
303      return morpheo::behavioural::PREDICTOR_GLOBAL;
304
305    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_META       ))) == 0) or
306        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_META        )) == 0))
307      return morpheo::behavioural::PREDICTOR_META;
308
309    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_CUSTOM     ))) == 0) or
310        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_CUSTOM      )) == 0))
311      return morpheo::behavioural::PREDICTOR_CUSTOM;
312
313    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
314  };
315
316  template<> inline std::string toString<morpheo::behavioural::Trat_scheme_t>(const morpheo::behavioural::Trat_scheme_t& x)
317  {
318    switch (x)
319      {
320      case morpheo::behavioural::RAT_NO_SAVE    : return "rat_no_save"   ; break;
321      case morpheo::behavioural::RAT_ONE_SAVE   : return "rat_one_save"  ; break;
322      case morpheo::behavioural::RAT_DEPTH_SAVE : return "rat_depth_save"; break;
323      default    : return ""      ; break;
324      }
325  };
326
327  template<> inline morpheo::behavioural::Trat_scheme_t fromString<morpheo::behavioural::Trat_scheme_t>(const std::string& x)
328  {
329    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::RAT_NO_SAVE   ))) == 0) or
330        (x.compare(toString(                      morpheo::behavioural::RAT_NO_SAVE    )) == 0))
331      return morpheo::behavioural::RAT_NO_SAVE;
332
333    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::RAT_ONE_SAVE  ))) == 0) or
334        (x.compare(toString(                      morpheo::behavioural::RAT_ONE_SAVE   )) == 0))
335      return morpheo::behavioural::RAT_ONE_SAVE;
336
337    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::RAT_DEPTH_SAVE))) == 0) or
338        (x.compare(toString(                      morpheo::behavioural::RAT_DEPTH_SAVE )) == 0))
339      return morpheo::behavioural::RAT_DEPTH_SAVE;
340
341    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
342  };
343
344}; // end namespace morpheo             
345#endif
Note: See TracBrowser for help on using the repository browser.