#ifndef morpheo_behavioural_custom_Custom_h
#define morpheo_behavioural_custom_Custom_h

/*
 * $Id$
 *
 * [ Description ]
 * 
 */

#include "Common/include/ToString.h"
#include "Common/include/Debug.h"
#include "Common/include/ErrorMorpheo.h"
#include "Behavioural/include/Types.h"
#include "Behavioural/include/Usage.h"
#include "Behavioural/include/Constants.h"
#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h"
#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Operation.h"

namespace morpheo {
namespace behavioural {
namespace custom {

  // TODO get_custom_vhdl
  // TODO : complete the custom_decod_t type
  typedef uint32_t custom_decod_t;

  typedef morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::function_execute_t           custom_execute_genMoore_t;

  typedef morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::function_execute_end_cycle_t custom_execute_transition_t;

  typedef morpheo::behavioural::spr_access_mode_t access_mode_t;

  typedef struct 
  {
    bool                          (*_get_valid_group)               (uint32_t);
    uint32_t                      (*_get_nb_register)               (uint32_t);
    access_mode_t                 (*_get_access_mode)               (uint32_t, uint32_t);
    custom_decod_t              * (*_get_custom_decod)              (uint32_t);
    custom_execute_genMoore_t   * (*_get_custom_execute_genMoore)   (uint32_t);
    custom_execute_transition_t * (*_get_custom_execute_transition) (uint32_t);
    custom_execute_transition_t * (*_get_custom_execute_reset)      (uint32_t);
  } custom_information_t;

}; // end namespace custom
}; // end namespace behavioural
}; // end namespace morpheo              

#endif
