#ifndef morpheo_behavioural_core_multi_ooo_engine_ooo_engine_commit_unit_Types_h
#define morpheo_behavioural_core_multi_ooo_engine_ooo_engine_commit_unit_Types_h

/*
 * $Id: Types.h 88 2008-12-10 18:31:39Z rosiere $
 *
 * [ Description ]
 * 
 */

#include "Behavioural/include/Types.h"

namespace morpheo {
namespace behavioural {
namespace core {
namespace multi_ooo_engine {
namespace ooo_engine {
namespace commit_unit {

  typedef enum
    {
      RETIRE_IN_ORDER       ,
      RETIRE_OOO_RENAME_UNIT,
      RETIRE_OOO_CONTEXT
    } retire_ooo_t;

  typedef enum
    {
      ROB_EMPTY                     , // 
      ROB_BRANCH_WAIT_END           , // 
      ROB_BRANCH_COMPLETE           , // 
      ROB_STORE_WAIT_HEAD_OK        , // 
//    ROB_STORE_WAIT_HEAD_KO        , // 
      ROB_STORE_HEAD_OK             , // 
      ROB_STORE_HEAD_KO             , // 
      ROB_OTHER_WAIT_END            , // 
      ROB_MISS_WAIT_END             , // 
      ROB_END_OK_SPECULATIVE        , // 
      ROB_END_OK                    , // 
      ROB_END_KO_SPECULATIVE        , // 
      ROB_END_KO                    , // 
      ROB_END_MISS                  , // 
      ROB_END_EXCEPTION_WAIT_HEAD   , // 
      ROB_END_EXCEPTION               // 
    } rob_state_t;

  class entry_t 
  {
  public  : rob_state_t        state                   ;
  public  : uint32_t           ptr                     ;
  public  : Tcontext_t         front_end_id            ;
  public  : Tcontext_t         context_id              ;
  public  : uint32_t           rename_unit_id          ;
  public  : Tdepth_t           depth                   ;
  public  : Ttype_t            type                    ;
  public  : Toperation_t       operation               ;
  public  : Tcontrol_t         is_delay_slot           ;
  public  : Tgeneral_data_t    address                 ;
  public  : Tcontrol_t         use_store_queue         ;
  public  : Tcontrol_t         use_load_queue          ;
  public  : Tlsq_ptr_t         store_queue_ptr_write   ;
  public  : Tlsq_ptr_t         load_queue_ptr_write    ;
  public  : Tcontrol_t         read_ra                 ;
  public  : Tgeneral_address_t num_reg_ra_log          ;
  public  : Tgeneral_address_t num_reg_ra_phy          ;
  public  : Tcontrol_t         read_rb                 ;
  public  : Tgeneral_address_t num_reg_rb_log          ;
  public  : Tgeneral_address_t num_reg_rb_phy          ;
  public  : Tcontrol_t         read_rc                 ;
  public  : Tspecial_address_t num_reg_rc_log          ;
  public  : Tspecial_address_t num_reg_rc_phy          ;
  public  : Tcontrol_t         write_rd                ;
  public  : Tgeneral_address_t num_reg_rd_log          ;
  public  : Tgeneral_address_t num_reg_rd_phy_old      ;
  public  : Tgeneral_address_t num_reg_rd_phy_new      ;
  public  : Tcontrol_t         write_re                ;
  public  : Tspecial_address_t num_reg_re_log          ;
  public  : Tspecial_address_t num_reg_re_phy_old      ;
  public  : Tspecial_address_t num_reg_re_phy_new      ;

  public  : Tevent_state_t     event_state             ;
  public  : Texception_t       exception               ;
  public  : Texception_t       exception_use           ;

  public  : Tspecial_data_t    flags                   ;
  public  : Tcontrol_t         no_sequence             ;
  public  : Tgeneral_data_t    data_commit             ; // branch's destination

//   public  : entry_t (uint32_t           ptr                     ,
// 		     Tcontext_t         front_end_id            ,
// 		     Tcontext_t         context_id              ,
// 		     Tcontext_t         rename_unit_id          ,
// 		     Tdepth_t           depth                   ,
// 		     Ttype_t            type                    ,
// 		     Toperation_t       operation               ,
// 		     Tcontrol_t         is_delay_slot           ,
// 		     Tgeneral_data_t    address                 ,
// 		     Texception_t       exception               ,
// 		     Texception_t       exception_use           ,
// 		     Tlsq_ptr_t         store_queue_ptr_write   ,
// 		     Tlsq_ptr_t         load_queue_ptr_write    ,
// 		     Tcontrol_t         read_ra                 ,
// 		     Tgeneral_address_t num_reg_ra_log          ,
// 		     Tgeneral_address_t num_reg_ra_phy          ,
// 		     Tcontrol_t         read_rb                 ,
// 		     Tgeneral_address_t num_reg_rb_log          ,
// 		     Tgeneral_address_t num_reg_rb_phy          ,
// 		     Tcontrol_t         read_rc                 ,
// 		     Tspecial_address_t num_reg_rc_log          ,
// 		     Tspecial_address_t num_reg_rc_phy          ,
// 		     Tcontrol_t         write_rd                ,
// 		     Tgeneral_address_t num_reg_rd_log          ,
// 		     Tgeneral_address_t num_reg_rd_phy_old      ,
// 		     Tgeneral_address_t num_reg_rd_phy_new      ,
// 		     Tcontrol_t         write_re                ,
// 		     Tspecial_address_t num_reg_re_log          ,
// 		     Tspecial_address_t num_reg_re_phy_old      ,
// 		     Tspecial_address_t num_reg_re_phy_new      )
//     {
//       this->ptr                     = ptr                   ;
//       this->front_end_id            = front_end_id          ;
//       this->context_id              = context_id            ;
//       this->rename_unit_id          = rename_unit_id        ;
//       this->depth                   = depth                 ;
//       this->type                    = type                  ;
//       this->operation               = operation             ;
//       this->is_delay_slot           = is_delay_slot         ;
//       this->address                 = address               ;
//       this->exception               = exception             ;
//       this->exception_use           = exception_use         ;
//       this->store_queue_ptr_write   = store_queue_ptr_write ;
//       this->load_queue_ptr_write    = load_queue_ptr_write  ;
//       this->read_ra                 = read_ra               ;
//       this->num_reg_ra_log          = num_reg_ra_log        ;
//       this->num_reg_ra_phy          = num_reg_ra_phy        ;
//       this->read_rb                 = read_rb               ;
//       this->num_reg_rb_log          = num_reg_rb_log        ;
//       this->num_reg_rb_phy          = num_reg_rb_phy        ;
//       this->read_rc                 = read_rc               ;
//       this->num_reg_rc_log          = num_reg_rc_log        ;
//       this->num_reg_rc_phy          = num_reg_rc_phy        ;
//       this->write_rd                = write_rd              ;
//       this->num_reg_rd_log          = num_reg_rd_log        ;
//       this->num_reg_rd_phy_old      = num_reg_rd_phy_old    ;
//       this->num_reg_rd_phy_new      = num_reg_rd_phy_new    ;
//       this->write_re                = write_re              ;
//       this->num_reg_re_log          = num_reg_re_log        ;
//       this->num_reg_re_phy_old      = num_reg_re_phy_old    ;
//       this->num_reg_re_phy_new      = num_reg_re_phy_new    ;
//     }
  };

}; // end namespace commit_unit
}; // end namespace ooo_engine
}; // end namespace multi_ooo_engine
}; // end namespace core
}; // end namespace behavioural

 template<> inline std::string toString<morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::rob_state_t>(const morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::rob_state_t& x)
  {
    switch (x)
      {
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_EMPTY                     : return "empty"                     ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_BRANCH_WAIT_END           : return "branch_wait_end"           ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_BRANCH_COMPLETE           : return "branch_complete"           ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_STORE_WAIT_HEAD_OK        : return "store_wait_head_ok"        ; break;
//    case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_STORE_WAIT_HEAD_KO        : return "store_wait_head_ko"        ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_STORE_HEAD_OK             : return "store_head_ok"             ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_STORE_HEAD_KO             : return "store_head_ko"             ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_OTHER_WAIT_END            : return "other_wait_end"            ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_MISS_WAIT_END             : return "miss_wait_end"             ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_END_OK_SPECULATIVE        : return "end_ok_speculative"        ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_END_OK                    : return "end_ok"                    ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_END_KO_SPECULATIVE        : return "end_ko_speculative"        ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_END_KO                    : return "end_ko"                    ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_END_EXCEPTION_WAIT_HEAD   : return "end_exception_wait_head"   ; break;
      case morpheo::behavioural::core::multi_ooo_engine::ooo_engine::commit_unit::ROB_END_EXCEPTION             : return "end_exception"             ; break;
      default    : return ""      ; break;
      }
  };

}; // end namespace morpheo              

#endif
