#ifndef morpheo_behavioural_custom_Custom_h
#define morpheo_behavioural_custom_Custom_h

/*
 * $Id: Custom.h 81 2008-04-15 18:40:01Z rosiere $
 *
 * [ 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_Front_end/Front_end/Decod_unit/Decod/Instruction/include/Types.h"
#include "Behavioural/Core/Multi_Front_end/Front_end/Decod_unit/Decod/Instruction/include/Instruction.h"
#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Operation/include/Types.h"
#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Operation/include/Operation.h"

namespace morpheo {
namespace behavioural {
namespace custom {

  // TODO get_custom_vhdl
  typedef uint32_t custom_vhdl_t;

  typedef morpheo::behavioural::core::multi_front_end::front_end::decod_unit::decod::function_decod_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             ) (Toperation_t);
    custom_execute_genMoore_t   * (*_get_custom_execute_genMoore  ) (Toperation_t);
    custom_execute_transition_t * (*_get_custom_execute_transition) (uint32_t);
    custom_execute_transition_t * (*_get_custom_execute_reset     ) (uint32_t);
    custom_vhdl_t               * (*_get_vhdl_decod               ) (void);
    custom_vhdl_t               * (*_get_vhdl_execute             ) (void);
  } custom_information_t;

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

#endif
