#ifndef morpheo_behavioural_core_multi_front_end_front_end_ifetch_unit_ifetch_queue_Types_h
#define morpheo_behavioural_core_multi_front_end_front_end_ifetch_unit_ifetch_queue_Types_h

/*
 * $Id: Types.h 81 2008-04-15 18:40:01Z rosiere $
 *
 * [ Description ]
 * 
 */

#include "Behavioural/include/Types.h"

namespace morpheo {
namespace behavioural {
namespace core {
namespace multi_front_end {
namespace front_end {
namespace ifetch_unit {
namespace ifetch_queue {

  typedef enum
    {
      IFETCH_QUEUE_STATE_EMPTY         ,  // slot is empty
    //IFETCH_QUEUE_STATE_WAIT_REQ      ,  // slot is allocated               - wait request to   cache
      IFETCH_QUEUE_STATE_WAIT_RSP      ,  // slot have send a request        - wait respons from cache
      IFETCH_QUEUE_STATE_HAVE_RSP      ,  // slot have a bloc of instruction - wait accept by decod
      IFETCH_QUEUE_STATE_ERROR_WAIT_RSP   // A event occure -> flush the queue but, ack rsp
    } ifetch_queue_state_t;

  class ifetch_queue_entry_t
  {
  public : ifetch_queue_state_t   _state                      ;
  public : Tinstruction_t       * _instruction                ;
  public : Tcontrol_t           * _instruction_enable         ;
  public : Tgeneral_address_t     _address                    ;
  public : Tinst_ifetch_ptr_t     _inst_ifetch_ptr            ;
  public : Tbranch_state_t        _branch_state               ;
  public : Tprediction_ptr_t      _branch_update_prediction_id;
  public : Texception_t           _exception                  ;
    
  public : ifetch_queue_entry_t (uint32_t nb_instruction)
    {
      _instruction        = new Tinstruction_t [nb_instruction];
      _instruction_enable = new Tcontrol_t     [nb_instruction];
    }

  public : ~ifetch_queue_entry_t (void)
    {
      delete _instruction       ;
      delete _instruction_enable;
    }

//   public : friend std::ostream& operator<< (std::ostream& output,
// 					    ifetch_queue_entry_t & x)
//     {
//       output << ;
//       return output;
//     }

  };

}; // end namespace ifetch_queue
}; // end namespace ifetch_unit
}; // end namespace front_end
}; // end namespace multi_front_end
}; // end namespace core
}; // end namespace behavioural
}; // end namespace morpheo              
#endif
