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

Last change on this file since 138 was 138, checked in by rosiere, 14 years ago

1) add counters_t type for interface
2) fix in check load in load_store_unit
3) add parameters (but not yet implemented)
4) change environment and add script (distcc_env.sh ...)
5) add warning if an unser change rename flag with l.mtspr instruction
6) ...

  • Property svn:keywords set to Id
File size: 13.3 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  //--------------------------------------------------[ instruction ]-----
123  class instruction_t
124  {
125  public :
126    Ttype_t      _type      ;
127    Toperation_t _operation ;
128    ISA          _isa_subset;
129    uint8_t      _isa_class ;
130
131    instruction_t (Ttype_t      type      ,
132                   Toperation_t operation ,
133                   ISA          isa_subset,
134                   uint8_t      isa_class )
135    {
136      _type       = type      ;
137      _operation  = operation ;
138      _isa_subset = isa_subset;
139      _isa_class  = isa_class ;
140    }
141  };
142
143  instruction_t instruction_information (uint32_t instruction);
144  uint32_t      instruction_size_data   (uint32_t instruction);
145
146  //----------------------------------------------[ spr_mode_access ]-----
147  class spr_access_mode_t
148  {
149  public : uint8_t _user_access_mode      ;
150  public : uint8_t _supervisor_access_mode;
151   
152  public : spr_access_mode_t (uint32_t user_access_mode       = SPR_ACCESS_MODE_NONE,
153                              uint32_t supervisor_access_mode = SPR_ACCESS_MODE_NONE)
154    {
155      _user_access_mode       = user_access_mode      ;
156      _supervisor_access_mode = supervisor_access_mode;
157    }
158  };
159
160}; // end namespace behavioural
161
162  template<> inline std::string toString<morpheo::behavioural::Tpriority_t>(const morpheo::behavioural::Tpriority_t& x)
163  {
164    switch (x)
165      {
166      case morpheo::behavioural::PRIORITY_STATIC      : return "priority_static"; break;
167      case morpheo::behavioural::PRIORITY_ROUND_ROBIN : return "priority_round_robin"; break;
168      default    : return ""      ; break;
169      }
170  };
171
172  template<> inline morpheo::behavioural::Tpriority_t fromString<morpheo::behavioural::Tpriority_t>(const std::string& x)
173  {
174    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PRIORITY_STATIC))) == 0) or
175        (x.compare(toString(                      morpheo::behavioural::PRIORITY_STATIC )) == 0))
176      return morpheo::behavioural::PRIORITY_STATIC;
177
178    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PRIORITY_ROUND_ROBIN))) == 0) or
179        (x.compare(toString(                      morpheo::behavioural::PRIORITY_ROUND_ROBIN )) == 0))
180      return morpheo::behavioural::PRIORITY_ROUND_ROBIN;
181
182    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
183  };
184
185  template<> inline std::string toString<morpheo::behavioural::Tload_balancing_t>(const morpheo::behavioural::Tload_balancing_t& x)
186  {
187    switch (x)
188      {
189      case morpheo::behavioural::LOAD_BALANCING_BALANCE              : return "load_balancing_balance"; break;
190      case morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY : return "load_balancing_maximum_for_priority"; break;
191      default    : return ""      ; break;
192      }
193  };
194
195  template<> inline morpheo::behavioural::Tload_balancing_t fromString<morpheo::behavioural::Tload_balancing_t>(const std::string& x)
196  {
197    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::LOAD_BALANCING_BALANCE))) == 0) or
198        (x.compare(toString(                      morpheo::behavioural::LOAD_BALANCING_BALANCE )) == 0))
199      return morpheo::behavioural::LOAD_BALANCING_BALANCE;
200
201    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY))) == 0) or
202        (x.compare(toString(                      morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY )) == 0))
203      return morpheo::behavioural::LOAD_BALANCING_MAXIMUM_FOR_PRIORITY;
204
205    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
206  };
207
208  template<> inline std::string toString<morpheo::behavioural::Tvictim_t>(const morpheo::behavioural::Tvictim_t& x)
209  {
210    switch (x)
211      {
212      case morpheo::behavioural::VICTIM_RANDOM      : return "victim_random"     ; break;
213      case morpheo::behavioural::VICTIM_ROUND_ROBIN : return "victim_round_robin"; break;
214      case morpheo::behavioural::VICTIM_NLU         : return "victim_nlu"        ; break;
215      case morpheo::behavioural::VICTIM_PSEUDO_LRU  : return "victim_pseudo_lru" ; break;
216      case morpheo::behavioural::VICTIM_LRU         : return "victim_lru"        ; break;
217      case morpheo::behavioural::VICTIM_FIFO        : return "victim_fifo"       ; break;
218      default    : return ""      ; break;
219      }
220  };
221
222  template<> inline morpheo::behavioural::Tvictim_t fromString<morpheo::behavioural::Tvictim_t>(const std::string& x)
223  {
224    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_RANDOM     ))) == 0) or
225        (x.compare(toString(                      morpheo::behavioural::VICTIM_RANDOM      )) == 0))
226      return morpheo::behavioural::VICTIM_RANDOM;
227
228    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_ROUND_ROBIN))) == 0) or
229        (x.compare(toString(                      morpheo::behavioural::VICTIM_ROUND_ROBIN )) == 0))
230      return morpheo::behavioural::VICTIM_ROUND_ROBIN;
231
232    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_NLU        ))) == 0) or
233        (x.compare(toString(                      morpheo::behavioural::VICTIM_NLU         )) == 0))
234      return morpheo::behavioural::VICTIM_NLU;
235
236    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_PSEUDO_LRU ))) == 0) or
237        (x.compare(toString(                      morpheo::behavioural::VICTIM_PSEUDO_LRU  )) == 0))
238      return morpheo::behavioural::VICTIM_PSEUDO_LRU;
239
240    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_LRU        ))) == 0) or
241        (x.compare(toString(                      morpheo::behavioural::VICTIM_LRU         )) == 0))
242      return morpheo::behavioural::VICTIM_LRU;
243
244    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::VICTIM_FIFO       ))) == 0) or
245        (x.compare(toString(                      morpheo::behavioural::VICTIM_FIFO        )) == 0))
246      return morpheo::behavioural::VICTIM_FIFO;
247
248    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
249  };
250
251  template<> inline std::string toString<morpheo::behavioural::Tpredictor_t>(const morpheo::behavioural::Tpredictor_t& x)
252  {
253    switch (x)
254      {
255      case morpheo::behavioural::PREDICTOR_NEVER_TAKE  : return "predictor_never_take" ; break;
256      case morpheo::behavioural::PREDICTOR_ALWAYS_TAKE : return "predictor_always_take"; break;
257      case morpheo::behavioural::PREDICTOR_STATIC      : return "predictor_static"     ; break;
258      case morpheo::behavioural::PREDICTOR_LAST_TAKE   : return "predictor_last_take"  ; break;
259      case morpheo::behavioural::PREDICTOR_COUNTER     : return "predictor_counter"    ; break;
260      case morpheo::behavioural::PREDICTOR_LOCAL       : return "predictor_local"      ; break;
261      case morpheo::behavioural::PREDICTOR_GLOBAL      : return "predictor_global"     ; break;
262      case morpheo::behavioural::PREDICTOR_META        : return "predictor_meta"       ; break;
263      case morpheo::behavioural::PREDICTOR_CUSTOM      : return "predictor_custom"     ; break;
264      default    : return ""      ; break;
265      }
266  };
267
268  template<> inline morpheo::behavioural::Tpredictor_t fromString<morpheo::behavioural::Tpredictor_t>(const std::string& x)
269  {
270    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_NEVER_TAKE ))) == 0) or
271        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_NEVER_TAKE  )) == 0))
272      return morpheo::behavioural::PREDICTOR_NEVER_TAKE;
273
274    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_ALWAYS_TAKE))) == 0) or
275        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_ALWAYS_TAKE )) == 0))
276      return morpheo::behavioural::PREDICTOR_ALWAYS_TAKE;
277
278    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_STATIC     ))) == 0) or
279        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_STATIC      )) == 0))
280      return morpheo::behavioural::PREDICTOR_STATIC;
281
282    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_LAST_TAKE  ))) == 0) or
283        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_LAST_TAKE   )) == 0))
284      return morpheo::behavioural::PREDICTOR_LAST_TAKE;
285
286    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_COUNTER    ))) == 0) or
287        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_COUNTER     )) == 0))
288      return morpheo::behavioural::PREDICTOR_COUNTER;
289
290    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_LOCAL      ))) == 0) or
291        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_LOCAL       )) == 0))
292      return morpheo::behavioural::PREDICTOR_LOCAL;
293
294    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_GLOBAL     ))) == 0) or
295        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_GLOBAL      )) == 0))
296      return morpheo::behavioural::PREDICTOR_GLOBAL;
297
298    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_META       ))) == 0) or
299        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_META        )) == 0))
300      return morpheo::behavioural::PREDICTOR_META;
301
302    if ((x.compare(toString(static_cast<uint32_t>(morpheo::behavioural::PREDICTOR_CUSTOM     ))) == 0) or
303        (x.compare(toString(                      morpheo::behavioural::PREDICTOR_CUSTOM      )) == 0))
304      return morpheo::behavioural::PREDICTOR_CUSTOM;
305
306    throw (ERRORMORPHEO ("fromString","Unknow string : \""+x+"\""));
307  };
308
309}; // end namespace morpheo             
310#endif
Note: See TracBrowser for help on using the repository browser.