Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile	(revision 72)
@@ -0,0 +1,24 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+
+#-----[ Directory ]----------------------------------------
+DIR_COMPONENT			= ./
+include				$(DIR_COMPONENT)/Makefile.defs
+
+#-----[ Library ]------------------------------------------
+LIBRARY				= $(DIR_LIB)/libFunctionnal_unit.a
+
+
+#-----[ include ]------------------------------------------
+
+all				:
+				@$(MAKE) all_component
+
+include                         $(DIR_MORPHEO)/Behavioural/Makefile.flags
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Common
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Component
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile.defs
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile.defs	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile.defs	(revision 72)
@@ -0,0 +1,11 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+
+#-----[ Directory ]----------------------------------------
+DIR_COMPONENT_MORPHEO		= ../../../../../../..
+DIR_MORPHEO			= $(DIR_COMPONENT)/$(DIR_COMPONENT_MORPHEO)
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile.deps
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile.deps	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/Makefile.deps	(revision 72)
@@ -0,0 +1,44 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+# DIR_MORPHEO must be defined
+
+Functionnal_unit			= yes
+
+ifndef Behavioural
+include 			$(DIR_MORPHEO)/Behavioural/Makefile.deps
+endif
+ifndef Custom
+include 			$(DIR_MORPHEO)/Behavioural/Custom/Makefile.deps
+endif
+
+#-----[ Library ]------------------------------------------
+Functionnal_unit_LIBRARY	= 	-lFunctionnal_unit	\
+					$(Custom_LIBRARY)	\
+					$(Behavioural_LIBRARY)	
+
+Functionnal_unit_DIR_LIBRARY	=	-L$(DIR_MORPHEO)/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/lib	\
+					$(Custom_DIR_LIBRARY)	\
+					$(Behavioural_DIR_LIBRARY)
+
+Functionnal_unit_DEPENDENCIES	=	Custom_library	\
+					Behavioural_library
+
+Functionnal_unit_CLEAN        	=	Custom_library_clean	\
+					Behavioural_library_clean
+
+#-----[ Rules ]--------------------------------------------
+
+#.NOTPARALLEL			: Functionnal_unit_library Functionnal_unit_library_clean
+
+Functionnal_unit_library	: $(Functionnal_unit_DEPENDENCIES)
+				@\
+				$(MAKE) --directory=$(DIR_MORPHEO)/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit --makefile=Makefile;
+
+Functionnal_unit_library_clean	: $(Functionnal_unit_CLEAN)
+				@\
+				$(MAKE) --directory=$(DIR_MORPHEO)/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit --makefile=Makefile clean;
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/Makefile
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/Makefile	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/Makefile	(revision 72)
@@ -0,0 +1,30 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+
+#-----[ Directory ]----------------------------------------
+DIR_COMPONENT			= ../
+include				$(DIR_COMPONENT)/Makefile.defs
+
+LIBRARY				= $(Functionnal_unit_LIBRARY)
+
+DIR_LIBRARY			= $(Functionnal_unit_DIR_LIBRARY)
+
+#-----[ include ]------------------------------------------
+
+all				:
+				@$(MAKE) all_selftest
+
+library				: Functionnal_unit_library
+
+library_clean			: Functionnal_unit_library_clean
+
+include                         $(DIR_COMPONENT)/Makefile.deps
+include                         $(DIR_MORPHEO)/Behavioural/Makefile.flags
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Common
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Selftest
+include 			$(DIR_MORPHEO)/Behavioural/Makefile.Synthesis
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/configuration.cfg
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/configuration.cfg	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/configuration.cfg	(revision 72)
@@ -0,0 +1,11 @@
+Functionnal_unit
+1	1	+1	# nb_context         
+1	1	+1	# nb_front_end       
+2	2	+1	# nb_ooo_engine      
+1024	1024	+1	# nb_packet          
+32	32	+1	# size_general_data  
+32	32	+1	# nb_general_register
+2 	2 	+1	# size_special_data  
+16	16	+1	# nb_special_register
+10	10	+1	# nb_operation       
+4	4	+1	# nb_type            
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/include/test.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/include/test.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/include/test.h	(revision 72)
@@ -0,0 +1,32 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ * Test "RegisterFile"
+ */
+
+#ifdef SYSTEMC
+#include "systemc.h"
+#endif
+
+#include <string>
+#include <iostream>
+#include <sys/time.h>
+
+#include "Common/include/Time.h"
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+using namespace std;
+using namespace morpheo;
+using namespace morpheo::behavioural;
+using namespace morpheo::behavioural::core;
+using namespace morpheo::behavioural::core::multi_execute_loop;
+using namespace morpheo::behavioural::core::multi_execute_loop::execute_loop;
+using namespace morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit;
+using namespace morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit;
+
+using namespace morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit;
+
+void test    (string name,
+	      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters * param);
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/src/main.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/src/main.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/src/main.cpp	(revision 72)
@@ -0,0 +1,94 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/include/test.h"
+#include "Behavioural/Custom/include/Custom_example.h"
+
+#define NB_PARAMS 10
+
+void usage (int argc, char * argv[])
+{
+  err (_("<Usage> %s name_instance list_params.\n"),argv[0]);
+  err (_("list_params is :\n"));
+  err (_("  * nb_context          (uint32_t)\n"));
+  err (_("  * nb_front_end        (uint32_t)\n"));
+  err (_("  * nb_ooo_engine       (uint32_t)\n"));
+  err (_("  * nb_packet           (uint32_t)\n"));
+  err (_("  * size_general_data   (uint32_t)\n"));
+  err (_("  * nb_general_register (uint32_t)\n"));
+  err (_("  * size_special_data   (uint32_t)\n"));
+  err (_("  * nb_special_register (uint32_t)\n"));
+  err (_("  * nb_operation        (uint32_t)\n"));
+  err (_("  * nb_type             (uint32_t)\n"));
+  exit (1);
+}
+
+#ifndef SYSTEMC
+int main    (int argc, char * argv[])
+#else
+int sc_main (int argc, char * argv[])
+#endif
+{
+  if (argc != 2+NB_PARAMS)
+    usage (argc, argv);
+
+  uint32_t       x = 1;
+
+  const string   name                =      argv[x++];
+  const uint32_t nb_context          = atoi(argv[x++]);
+  const uint32_t nb_front_end        = atoi(argv[x++]);
+  const uint32_t nb_ooo_engine       = atoi(argv[x++]);
+  const uint32_t nb_packet           = atoi(argv[x++]);
+  const uint32_t size_general_data   = atoi(argv[x++]);
+  const uint32_t nb_general_register = atoi(argv[x++]);
+  const uint32_t size_special_data   = atoi(argv[x++]);
+  const uint32_t nb_special_register = atoi(argv[x++]);
+  const uint32_t nb_operation        = atoi(argv[x++]);
+  const uint32_t nb_type             = atoi(argv[x++]);
+
+  execute_timing_t * timing = new execute_timing_t [MAX_OPERATION];
+
+  for (uint32_t i=0; i< MAX_OPERATION; i++)
+    timing[i]._delay = timing[i]._latence = 1;
+
+  try 
+    {
+      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters * param = new morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters
+	(nb_context          ,
+	 nb_front_end        ,
+	 nb_ooo_engine       ,
+	 nb_packet           ,
+	 size_general_data   ,
+	 nb_general_register ,
+	 size_special_data   ,
+	 nb_special_register ,
+	 nb_operation        ,
+	 nb_type             ,
+	 timing              ,
+	 &(morpheo::behavioural::custom::example_get_custom_information)
+        );
+      
+      msg(_("%s"),param->print(1).c_str());
+      
+      test (name,param);
+    }
+  catch (morpheo::ErrorMorpheo & error)
+    {
+      msg (_("<%s> : %s.\n"),name.c_str(), error.what ());
+      exit (EXIT_FAILURE);
+    }
+  catch (...)
+    {
+      err (_("<%s> : This test must generate a error.\n"),name.c_str());
+      exit (EXIT_FAILURE);
+    }
+
+  delete timing;
+  
+  return (EXIT_SUCCESS);
+}
+
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/src/test.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/src/test.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/src/test.cpp	(revision 72)
@@ -0,0 +1,726 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ * Test
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/SelfTest/include/test.h"
+#include "Common/include/Test.h"
+
+#define NB_ITERATION  1
+#define CYCLE_MAX     (1024*NB_ITERATION)
+
+#define LABEL(str...)							\
+  {									\
+    msg (_("{%d} "),static_cast<uint32_t>(sc_simulation_time()));	\
+    msg (str);								\
+    msg (_("\n"));							\
+  } while(0)
+
+#define SC_START(cycle_offset)                                                       \
+  do									             \
+    {									             \
+      /*cout << "SC_START (begin)" << endl;*/				             \
+									             \
+      uint32_t cycle_current = static_cast<uint32_t>(sc_simulation_time());          \
+      if (cycle_offset != 0)						             \
+	{								             \
+	  cout << "##########[ cycle "<< cycle_current+cycle_offset << " ]" << endl; \
+	}								             \
+									             \
+      if (cycle_current > CYCLE_MAX)					             \
+	{								             \
+	  TEST_KO("Maximal cycles Reached");				             \
+	}								             \
+									             \
+      sc_start(cycle_offset);						             \
+									             \
+      /*cout << "SC_START (end  )" << endl;*/				             \
+    } while(0)
+
+class execute_transaction
+{
+public : const Tcontext_t         _context_id   ;
+public : const Tcontext_t         _front_end_id ;
+public : const Tcontext_t         _ooo_engine_id;
+public : const Tpacket_t          _packet_id    ;
+public : const Toperation_t       _operation    ;
+public : const Ttype_t            _type         ;
+public : const Tcontrol_t         _has_immediat ;
+public : const Tgeneral_data_t    _immediat     ;
+public : const Tgeneral_data_t    _data_ra      ;
+public : const Tgeneral_data_t    _data_rb      ;
+public : const Tspecial_data_t    _data_rc      ;
+public : const Tcontrol_t         _write_rd     ;
+public : const Tgeneral_address_t _num_reg_rd   ;
+public : const Tgeneral_data_t    _data_rd      ;
+public : const Tcontrol_t         _write_re     ;
+public : const Tspecial_address_t _num_reg_re   ;
+public : const Tspecial_data_t    _data_re      ;
+public : const Texception_t       _exception    ;
+public : const Tcontrol_t         _no_sequence  ;
+public : const Tgeneral_data_t    _address      ;
+
+public : execute_transaction (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters * param        ,
+			      Tcontext_t         context_id   ,
+			      Tcontext_t         front_end_id ,
+			      Tcontext_t         ooo_engine_id,
+			      Tpacket_t          packet_id    ,
+			      Toperation_t       operation    ,
+			      Ttype_t            type         ,
+			      Tcontrol_t         has_immediat ,
+			      Tgeneral_data_t    immediat     ,
+			      Tgeneral_data_t    data_ra      ,
+			      Tgeneral_data_t    data_rb      ,
+			      Tspecial_data_t    data_rc      ,
+			      Tcontrol_t         write_rd     ,
+			      Tgeneral_address_t num_reg_rd   ,
+			      Tgeneral_data_t    data_rd      ,
+			      Tcontrol_t         write_re     ,
+			      Tspecial_address_t num_reg_re   ,
+			      Tspecial_data_t    data_re      ,
+			      Texception_t       exception    ,
+			      Tcontrol_t         no_sequence  ,
+			      Tgeneral_data_t    address     =0):
+  _context_id    (context_id   % param->_nb_context   ),
+  _front_end_id  (front_end_id % param->_nb_front_end ),
+  _ooo_engine_id (ooo_engine_id% param->_nb_ooo_engine),
+  _packet_id     (packet_id    % param->_nb_packet    ),
+  _operation     (operation    ),
+  _type          (type         ),
+  _has_immediat  (has_immediat ),
+  _immediat      (immediat     & gen_mask<Tgeneral_data_t>(param->_size_general_data)),
+  _data_ra       (data_ra      & gen_mask<Tgeneral_data_t>(param->_size_general_data)),
+  _data_rb       (data_rb      & gen_mask<Tgeneral_data_t>(param->_size_general_data)),
+  _data_rc       (data_rc      & gen_mask<Tspecial_data_t>(param->_size_special_data)),
+  _write_rd      (write_rd     ),
+  _num_reg_rd    (num_reg_rd   % param->_nb_special_register),
+  _data_rd       (data_rd      & gen_mask<Tgeneral_data_t>(param->_size_general_data)),
+  _write_re      (write_re     ),
+  _num_reg_re    (num_reg_re   % param->_nb_special_register),
+  _data_re       (data_re      & gen_mask<Tspecial_data_t>(param->_size_special_data)),
+  _exception     (exception    ),
+  _no_sequence   (no_sequence  ),
+  _address       (address      & gen_mask<Tgeneral_data_t>(param->_size_general_data))
+  {
+    
+  }
+};
+
+void test (string name,
+	   morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters * _param)
+{
+  msg(_("<%s> : Simulation SystemC.\n"),name.c_str());
+
+#ifdef STATISTICS
+  morpheo::behavioural::Parameters_Statistics * _parameters_statistics = new morpheo::behavioural::Parameters_Statistics (5,50);
+#endif
+
+  Functionnal_unit * _Functionnal_unit = new Functionnal_unit (name.c_str(),
+#ifdef STATISTICS
+					     _parameters_statistics,
+#endif
+					     _param);
+  
+#ifdef SYSTEMC
+  /*********************************************************************
+   * Déclarations des signaux
+   *********************************************************************/
+  string rename = "";
+
+  sc_clock              in_CLOCK  ("clock", 1.0, 0.5);	 
+  sc_signal<Tcontrol_t> in_NRESET ("nreset");
+
+  sc_signal<Tcontrol_t        >  in_EXECUTE_IN_VAL            (rename.c_str());
+  sc_signal<Tcontrol_t        > out_EXECUTE_IN_ACK            (rename.c_str());
+  sc_signal<Tcontext_t        >  in_EXECUTE_IN_CONTEXT_ID     (rename.c_str());
+  sc_signal<Tcontext_t        >  in_EXECUTE_IN_FRONT_END_ID   (rename.c_str());
+  sc_signal<Tcontext_t        >  in_EXECUTE_IN_OOO_ENGINE_ID  (rename.c_str());
+  sc_signal<Tpacket_t         >  in_EXECUTE_IN_PACKET_ID      (rename.c_str());
+  sc_signal<Toperation_t      >  in_EXECUTE_IN_OPERATION      (rename.c_str());
+  sc_signal<Ttype_t           >  in_EXECUTE_IN_TYPE           (rename.c_str());
+  sc_signal<Tcontrol_t        >  in_EXECUTE_IN_HAS_IMMEDIAT   (rename.c_str());
+  sc_signal<Tgeneral_data_t   >  in_EXECUTE_IN_IMMEDIAT       (rename.c_str());
+  sc_signal<Tgeneral_data_t   >  in_EXECUTE_IN_DATA_RA        (rename.c_str());
+  sc_signal<Tgeneral_data_t   >  in_EXECUTE_IN_DATA_RB        (rename.c_str());
+  sc_signal<Tspecial_data_t   >  in_EXECUTE_IN_DATA_RC        (rename.c_str());
+  sc_signal<Tcontrol_t        >  in_EXECUTE_IN_WRITE_RD       (rename.c_str());
+  sc_signal<Tgeneral_address_t>  in_EXECUTE_IN_NUM_REG_RD     (rename.c_str());
+  sc_signal<Tcontrol_t        >  in_EXECUTE_IN_WRITE_RE       (rename.c_str());
+  sc_signal<Tspecial_address_t>  in_EXECUTE_IN_NUM_REG_RE     (rename.c_str());
+
+    // ~~~~~[ Interface "execute_out" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  sc_signal<Tcontrol_t        > out_EXECUTE_OUT_VAL            (rename.c_str());
+  sc_signal<Tcontrol_t        >  in_EXECUTE_OUT_ACK            (rename.c_str());
+  sc_signal<Tcontext_t        > out_EXECUTE_OUT_CONTEXT_ID     (rename.c_str());
+  sc_signal<Tcontext_t        > out_EXECUTE_OUT_FRONT_END_ID   (rename.c_str());
+  sc_signal<Tcontext_t        > out_EXECUTE_OUT_OOO_ENGINE_ID  (rename.c_str());
+  sc_signal<Tpacket_t         > out_EXECUTE_OUT_PACKET_ID      (rename.c_str());
+//sc_signal<Toperation_t      > out_EXECUTE_OUT_OPERATION      (rename.c_str());
+//sc_signal<Ttype_t           > out_EXECUTE_OUT_TYPE           (rename.c_str());
+  sc_signal<Tcontrol_t        > out_EXECUTE_OUT_WRITE_RD       (rename.c_str());
+  sc_signal<Tgeneral_address_t> out_EXECUTE_OUT_NUM_REG_RD     (rename.c_str());
+  sc_signal<Tgeneral_data_t   > out_EXECUTE_OUT_DATA_RD        (rename.c_str());
+  sc_signal<Tcontrol_t        > out_EXECUTE_OUT_WRITE_RE       (rename.c_str());
+  sc_signal<Tspecial_address_t> out_EXECUTE_OUT_NUM_REG_RE     (rename.c_str());
+  sc_signal<Tspecial_data_t   > out_EXECUTE_OUT_DATA_RE        (rename.c_str());
+  sc_signal<Texception_t      > out_EXECUTE_OUT_EXCEPTION      (rename.c_str());
+  sc_signal<Tcontrol_t        > out_EXECUTE_OUT_NO_SEQUENCE    (rename.c_str());
+  sc_signal<Tgeneral_data_t   > out_EXECUTE_OUT_ADDRESS        (rename.c_str());
+  
+  /********************************************************
+   * Instanciation
+   ********************************************************/
+  
+  msg(_("<%s> : Instanciation of _Functionnal_unit.\n"),name.c_str());
+
+  (*(_Functionnal_unit->in_CLOCK))        (in_CLOCK);
+  (*(_Functionnal_unit->in_NRESET))       (in_NRESET);
+  (*(_Functionnal_unit-> in_EXECUTE_IN_VAL           )) ( in_EXECUTE_IN_VAL           );
+  (*(_Functionnal_unit->out_EXECUTE_IN_ACK           )) (out_EXECUTE_IN_ACK           );
+  if (_param->_have_port_context_id)
+  (*(_Functionnal_unit-> in_EXECUTE_IN_CONTEXT_ID    )) ( in_EXECUTE_IN_CONTEXT_ID    );
+  if (_param->_have_port_front_end_id)
+  (*(_Functionnal_unit-> in_EXECUTE_IN_FRONT_END_ID  )) ( in_EXECUTE_IN_FRONT_END_ID  );
+  if (_param->_have_port_ooo_engine_id)
+  (*(_Functionnal_unit-> in_EXECUTE_IN_OOO_ENGINE_ID )) ( in_EXECUTE_IN_OOO_ENGINE_ID );
+  if (_param->_have_port_packet_id)
+  (*(_Functionnal_unit-> in_EXECUTE_IN_PACKET_ID     )) ( in_EXECUTE_IN_PACKET_ID     );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_OPERATION     )) ( in_EXECUTE_IN_OPERATION     );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_TYPE          )) ( in_EXECUTE_IN_TYPE          );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_HAS_IMMEDIAT  )) ( in_EXECUTE_IN_HAS_IMMEDIAT  );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_IMMEDIAT      )) ( in_EXECUTE_IN_IMMEDIAT      );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_DATA_RA       )) ( in_EXECUTE_IN_DATA_RA       );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_DATA_RB       )) ( in_EXECUTE_IN_DATA_RB       );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_DATA_RC       )) ( in_EXECUTE_IN_DATA_RC       );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_WRITE_RD      )) ( in_EXECUTE_IN_WRITE_RD      );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_NUM_REG_RD    )) ( in_EXECUTE_IN_NUM_REG_RD    );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_WRITE_RE      )) ( in_EXECUTE_IN_WRITE_RE      );
+  (*(_Functionnal_unit-> in_EXECUTE_IN_NUM_REG_RE    )) ( in_EXECUTE_IN_NUM_REG_RE    );
+  
+  (*(_Functionnal_unit->out_EXECUTE_OUT_VAL          )) (out_EXECUTE_OUT_VAL          );
+  (*(_Functionnal_unit-> in_EXECUTE_OUT_ACK          )) ( in_EXECUTE_OUT_ACK          );
+  if (_param->_have_port_context_id)
+  (*(_Functionnal_unit->out_EXECUTE_OUT_CONTEXT_ID   )) (out_EXECUTE_OUT_CONTEXT_ID   );
+  if (_param->_have_port_front_end_id)
+  (*(_Functionnal_unit->out_EXECUTE_OUT_FRONT_END_ID )) (out_EXECUTE_OUT_FRONT_END_ID );
+  if (_param->_have_port_ooo_engine_id)
+  (*(_Functionnal_unit->out_EXECUTE_OUT_OOO_ENGINE_ID)) (out_EXECUTE_OUT_OOO_ENGINE_ID);
+  if (_param->_have_port_packet_id)
+  (*(_Functionnal_unit->out_EXECUTE_OUT_PACKET_ID    )) (out_EXECUTE_OUT_PACKET_ID    );
+//(*(_Functionnal_unit->out_EXECUTE_OUT_OPERATION    )) (out_EXECUTE_OUT_OPERATION    );
+//(*(_Functionnal_unit->out_EXECUTE_OUT_TYPE         )) (out_EXECUTE_OUT_TYPE         );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_WRITE_RD     )) (out_EXECUTE_OUT_WRITE_RD     );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_NUM_REG_RD   )) (out_EXECUTE_OUT_NUM_REG_RD   );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_DATA_RD      )) (out_EXECUTE_OUT_DATA_RD      );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_WRITE_RE     )) (out_EXECUTE_OUT_WRITE_RE     );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_NUM_REG_RE   )) (out_EXECUTE_OUT_NUM_REG_RE   );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_DATA_RE      )) (out_EXECUTE_OUT_DATA_RE      );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_EXCEPTION    )) (out_EXECUTE_OUT_EXCEPTION    );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_NO_SEQUENCE  )) (out_EXECUTE_OUT_NO_SEQUENCE  );
+  (*(_Functionnal_unit->out_EXECUTE_OUT_ADDRESS      )) (out_EXECUTE_OUT_ADDRESS      );
+
+  msg(_("<%s> : Start Simulation ............\n"),name.c_str());
+    
+  Time * _time = new Time();
+
+  /********************************************************
+   * Simulation - Begin
+   ********************************************************/
+
+  // Initialisation
+
+  const  int32_t percent_transaction_execute_in  = 75;
+  const  int32_t percent_transaction_execute_out = 75;
+
+  const uint32_t seed = 0;
+//const uint32_t seed = static_cast<uint32_t>(time(NULL));
+
+  srand(seed);
+
+  list<execute_transaction> transaction_in;
+  list<execute_transaction> transaction_out;
+  int32_t nb_transaction_out;
+
+
+  SC_START(0);
+  LABEL("Initialisation");
+  
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  0,OPERATION_ALU_L_ADD     ,TYPE_ALU,0,0xdeadbeef,0x12344321,0x12345678,0              ,1,63,0x24689999,1,15,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  1,OPERATION_ALU_L_ADD     ,TYPE_ALU,0,0xffffffff,0x12345678,0x12345678,0              ,1,56,0x2468acf0,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  2,OPERATION_ALU_L_ADD     ,TYPE_ALU,1,0x12345678,0x12345678,0xffffffff,0              ,1,56,0x2468acf0,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  // Test L_ADD flags					     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  3,OPERATION_ALU_L_ADD     ,TYPE_ALU,1,0x0       ,0x0       ,0x0       ,0              ,1,56,0x0       ,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  4,OPERATION_ALU_L_ADD     ,TYPE_ALU,1,0x90000000,0x70000000,0x0       ,0              ,1,56,0x0       ,1,3 ,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  5,OPERATION_ALU_L_ADD     ,TYPE_ALU,1,0x80000000,0x80001000,0x0       ,0              ,1,1 ,0x1000    ,1,0 ,FLAG_CY|FLAG_OV,EXCEPTION_ALU_RANGE,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  6,OPERATION_ALU_L_ADD     ,TYPE_ALU,1,0x7fffffff,0x00000001,0x0       ,FLAG_CY|FLAG_OV,1,1 ,0x80000000,1,0 ,        FLAG_OV,EXCEPTION_ALU_RANGE,0));
+							     			       
+							     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  7,OPERATION_ALU_L_ADDC    ,TYPE_ALU,0,0xdeadbeef,0x12344321,0x12345678,0              ,1,63,0x24689999,1,15,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  8,OPERATION_ALU_L_ADDC    ,TYPE_ALU,0,0xffffffff,0x12345678,0x12345678,0              ,1,56,0x2468acf0,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,  9,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x12345678,0x12345678,0xffffffff,0              ,1,56,0x2468acf0,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 10,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x0       ,0x0       ,0x0       ,0              ,1,56,0x0       ,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 11,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x90000000,0x70000000,0x0       ,0              ,1,56,0x0       ,1,3 ,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 12,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x80000000,0x80001000,0x0       ,0              ,1,1 ,0x1000    ,1,0 ,FLAG_CY|FLAG_OV,EXCEPTION_ALU_RANGE,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 13,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x7fffffff,0x00000001,0x0       ,0              ,1,1 ,0x80000000,1,0 ,        FLAG_OV,EXCEPTION_ALU_RANGE,0));
+							     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 14,OPERATION_ALU_L_ADDC    ,TYPE_ALU,0,0xdeadbeef,0x12344320,0x12345678,FLAG_CY        ,1,63,0x24689999,1,15,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 15,OPERATION_ALU_L_ADDC    ,TYPE_ALU,0,0xffffffff,0x12345677,0x12345678,FLAG_CY        ,1,56,0x2468acf0,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 16,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x12345678,0x12345677,0xffffffff,FLAG_CY        ,1,56,0x2468acf0,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 17,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x0       ,0x0       ,0x0       ,FLAG_CY        ,1,56,0x00000001,1,3 ,0              ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 18,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x90000000,0x70000003,0x0       ,FLAG_CY        ,1,56,0x00000004,1,3 ,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 19,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x80000000,0x8000000f,0x0       ,FLAG_CY        ,1,1 ,0x00000010,1,0 ,FLAG_CY|FLAG_OV,EXCEPTION_ALU_RANGE,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 20,OPERATION_ALU_L_ADDC    ,TYPE_ALU,1,0x7fffffff,0x00000000,0x0       ,FLAG_CY        ,1,1 ,0x80000000,1,0 ,        FLAG_OV,EXCEPTION_ALU_RANGE,0));
+							     			       
+  							     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 21,OPERATION_ALU_L_AND     ,TYPE_ALU,0,0xdeadbeef,0x0000ffff,0x00ff00ff,0              ,1,63,0x000000ff,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 22,OPERATION_ALU_L_OR      ,TYPE_ALU,0,0xdeadbeef,0x0000ffff,0x00ff00ff,0              ,1,63,0x00ffffff,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 23,OPERATION_ALU_L_XOR     ,TYPE_ALU,0,0xdeadbeef,0x0000ffff,0x00ff00ff,0              ,1,63,0x00ffff00,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 24,OPERATION_ALU_L_CMOV    ,TYPE_ALU,0,0x0       ,0xdeadbeef,0x12345678,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 25,OPERATION_ALU_L_CMOV    ,TYPE_ALU,0,0x0       ,0xdeadbeef,0x12345678,FLAG_F         ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 26,OPERATION_ALU_L_MOVHI   ,TYPE_ALU,1,0xdeadbeef,0x0       ,0x0       ,FLAG_F         ,1,63,0xbeef0000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     			       
+							     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 27,OPERATION_ALU_L_TEST_F  ,TYPE_ALU,1,0xdeadbeef,0x0       ,0x0       ,0              ,0,63,0xbeef0000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0,0x00000000));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 28,OPERATION_ALU_L_TEST_F  ,TYPE_ALU,1,0xdeadbeef,0x0       ,0x0       ,FLAG_F         ,0,63,0xbeef0000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,1,0xdeadbeef));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 29,OPERATION_ALU_L_TEST_NF ,TYPE_ALU,1,0xdeadbeef,0x0       ,0x0       ,FLAG_F         ,0,63,0xbeef0000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0,0x00000000));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 30,OPERATION_ALU_L_TEST_NF ,TYPE_ALU,1,0xdeadbeef,0x0       ,0x0       ,0              ,0,63,0xbeef0000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,1,0xdeadbeef));
+							     			       
+  							     			       
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 31,OPERATION_ALU_L_JALR    ,TYPE_ALU,0,0xdeadbeef,0x0       ,0x12345678,0              ,0,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,1,0x12345678)); // jr
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 32,OPERATION_ALU_L_JALR    ,TYPE_ALU,1,0xdeadbeef,0x0       ,0x12345678,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,1,0x12345678)); // jal
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 33,OPERATION_ALU_L_JALR    ,TYPE_ALU,1,0xdeadbeef,0x0       ,0x12345678,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,1,0x12345678)); // jalr
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 34,OPERATION_ALU_L_EXTEND_S,TYPE_ALU,1,8         ,0x12345678,0x0       ,0              ,1,63,0x00000078,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 35,OPERATION_ALU_L_EXTEND_S,TYPE_ALU,1,16        ,0x12345678,0x0       ,0              ,1,63,0x00005678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 36,OPERATION_ALU_L_EXTEND_S,TYPE_ALU,1,32        ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 34,OPERATION_ALU_L_EXTEND_S,TYPE_ALU,1,8         ,0xdeadbeef,0x0       ,0              ,1,63,0xffffffef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 35,OPERATION_ALU_L_EXTEND_S,TYPE_ALU,1,16        ,0xdeadbeef,0x0       ,0              ,1,63,0xffffbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 36,OPERATION_ALU_L_EXTEND_S,TYPE_ALU,1,32        ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 37,OPERATION_ALU_L_EXTEND_Z,TYPE_ALU,1,8         ,0x12345678,0x0       ,0              ,1,63,0x00000078,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 38,OPERATION_ALU_L_EXTEND_Z,TYPE_ALU,1,16        ,0x12345678,0x0       ,0              ,1,63,0x00005678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 39,OPERATION_ALU_L_EXTEND_Z,TYPE_ALU,1,32        ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 40,OPERATION_ALU_L_EXTEND_Z,TYPE_ALU,1,8         ,0xdeadbeef,0x0       ,0              ,1,63,0x000000ef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 41,OPERATION_ALU_L_EXTEND_Z,TYPE_ALU,1,16        ,0xdeadbeef,0x0       ,0              ,1,63,0x0000beef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 42,OPERATION_ALU_L_EXTEND_Z,TYPE_ALU,1,32        ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 43,OPERATION_ALU_L_SLL     ,TYPE_ALU,1,0         ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 44,OPERATION_ALU_L_SLL     ,TYPE_ALU,1,4         ,0xdeadbeef,0x0       ,0              ,1,63,0xeadbeef0,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 45,OPERATION_ALU_L_SLL     ,TYPE_ALU,1,8         ,0xdeadbeef,0x0       ,0              ,1,63,0xadbeef00,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 46,OPERATION_ALU_L_SLL     ,TYPE_ALU,1,16        ,0xdeadbeef,0x0       ,0              ,1,63,0xbeef0000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 47,OPERATION_ALU_L_SLL     ,TYPE_ALU,1,24        ,0xdeadbeef,0x0       ,0              ,1,63,0xef000000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 48,OPERATION_ALU_L_SLL     ,TYPE_ALU,1,31        ,0xdeadbeef,0x0       ,0              ,1,63,0x80000000,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 49,OPERATION_ALU_L_SLL     ,TYPE_ALU,1,32        ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 50,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,0         ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 51,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,4         ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbee ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 52,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,8         ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbe  ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 53,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,16        ,0xdeadbeef,0x0       ,0              ,1,63,0xdead    ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 54,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,24        ,0xdeadbeef,0x0       ,0              ,1,63,0xde      ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 55,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,31        ,0xdeadbeef,0x0       ,0              ,1,63,0x1       ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 56,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,32        ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 57,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,0         ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 58,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,4         ,0x12345678,0x0       ,0              ,1,63,0x1234567 ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 59,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,8         ,0x12345678,0x0       ,0              ,1,63,0x123456  ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 60,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,16        ,0x12345678,0x0       ,0              ,1,63,0x1234    ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 61,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,24        ,0x12345678,0x0       ,0              ,1,63,0x12      ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 62,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,31        ,0x12345678,0x0       ,0              ,1,63,0x0       ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 63,OPERATION_ALU_L_SRL     ,TYPE_ALU,1,32        ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 64,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,0         ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 65,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,4         ,0xdeadbeef,0x0       ,0              ,1,63,0xfdeadbee,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 66,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,8         ,0xdeadbeef,0x0       ,0              ,1,63,0xffdeadbe,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 67,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,16        ,0xdeadbeef,0x0       ,0              ,1,63,0xffffdead,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 68,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,24        ,0xdeadbeef,0x0       ,0              ,1,63,0xffffffde,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 69,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,31        ,0xdeadbeef,0x0       ,0              ,1,63,0xffffffff,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 70,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,32        ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 71,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,0         ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 72,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,4         ,0x12345678,0x0       ,0              ,1,63,0x1234567 ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 73,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,8         ,0x12345678,0x0       ,0              ,1,63,0x123456  ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 74,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,16        ,0x12345678,0x0       ,0              ,1,63,0x1234    ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 75,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,24        ,0x12345678,0x0       ,0              ,1,63,0x12      ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 76,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,31        ,0x12345678,0x0       ,0              ,1,63,0x0       ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 77,OPERATION_ALU_L_SRA     ,TYPE_ALU,1,32        ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 78,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,0         ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 79,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,4         ,0xdeadbeef,0x0       ,0              ,1,63,0xfdeadbee,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 80,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,8         ,0xdeadbeef,0x0       ,0              ,1,63,0xefdeadbe,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 81,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,16        ,0xdeadbeef,0x0       ,0              ,1,63,0xbeefdead,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 82,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,24        ,0xdeadbeef,0x0       ,0              ,1,63,0xadbeefde,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 83,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,32        ,0xdeadbeef,0x0       ,0              ,1,63,0xdeadbeef,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 84,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,0         ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 85,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,4         ,0x12345678,0x0       ,0              ,1,63,0x81234567,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 86,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,8         ,0x12345678,0x0       ,0              ,1,63,0x78123456,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 87,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,16        ,0x12345678,0x0       ,0              ,1,63,0x56781234,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 88,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,24        ,0x12345678,0x0       ,0              ,1,63,0x34567812,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 89,OPERATION_ALU_L_ROR     ,TYPE_ALU,1,32        ,0x12345678,0x0       ,0              ,1,63,0x12345678,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 90,OPERATION_ALU_L_FF1     ,TYPE_ALU,0,0         ,0x12345678,0x0       ,0              ,1,63,4         ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 91,OPERATION_ALU_L_FF1     ,TYPE_ALU,0,0         ,0x0       ,0x0       ,0              ,1,63,0          ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 92,OPERATION_ALU_L_FF1     ,TYPE_ALU,0,0         ,0x43210000,0x0       ,0              ,1,63,17         ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 93,OPERATION_ALU_L_FF1     ,TYPE_ALU,0,0         ,0x80000000,0x0       ,0              ,1,63,32         ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 94,OPERATION_ALU_L_FF1     ,TYPE_ALU,0,0         ,0x1       ,0x0       ,0              ,1,63,1          ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+							     
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 95,OPERATION_ALU_L_FL1     ,TYPE_ALU,0,0         ,0x12345678,0x0       ,0              ,1,63,29        ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 96,OPERATION_ALU_L_FL1     ,TYPE_ALU,0,0         ,0x0       ,0x0       ,0              ,1,63,0          ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 97,OPERATION_ALU_L_FL1     ,TYPE_ALU,0,0         ,0x00018765,0x0       ,0              ,1,63,17         ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 98,OPERATION_ALU_L_FL1     ,TYPE_ALU,0,0         ,0x1       ,0x0       ,0              ,1,63,1          ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0, 99,OPERATION_ALU_L_FL1     ,TYPE_ALU,0,0         ,0x80000000,0x0       ,0              ,1,63,32         ,0,15,FLAG_CY        ,EXCEPTION_NONE     ,0));
+
+//   transaction_in.push_back(execute_transaction(_param,0,0,0,100,OPERATION_ALU_L_SUB     ,TYPE_ALU,0,0         ,0x12344321,0x1       ,0              ,1,63,0x12344320,1,15,0              ,EXCEPTION_NONE     ,0));
+//   transaction_in.push_back(execute_transaction(_param,0,0,0,101,OPERATION_ALU_L_SUB     ,TYPE_ALU,0,0         ,0x12345678,0xffffffff,0              ,1,56,0x12345679,1,3 ,0              ,EXCEPTION_NONE     ,0));
+//   transaction_in.push_back(execute_transaction(_param,0,0,0,102,OPERATION_ALU_L_SUB     ,TYPE_ALU,0,0         ,0x12345678,0x12345678,0              ,1,56,0x0       ,1,3 ,0              ,EXCEPTION_NONE     ,0));
+//   transaction_in.push_back(execute_transaction(_param,0,0,0,103,OPERATION_ALU_L_SUB     ,TYPE_ALU,0,0         ,0x0       ,0x0       ,0              ,1,56,0x0       ,1,3 ,0              ,EXCEPTION_NONE     ,0));
+//   transaction_in.push_back(execute_transaction(_param,0,0,0,104,OPERATION_ALU_L_SUB     ,TYPE_ALU,0,0         ,0x70000000,0x90000000,0              ,1,56,0x0       ,1,3 ,FLAG_CY        ,EXCEPTION_NONE     ,0));
+//   transaction_in.push_back(execute_transaction(_param,0,0,0,105,OPERATION_ALU_L_SUB     ,TYPE_ALU,0,0         ,0x80001000,0x80000000,0              ,1,1 ,0x1000    ,1,0 ,FLAG_CY|FLAG_OV,EXCEPTION_ALU_RANGE,0));
+//   transaction_in.push_back(execute_transaction(_param,0,0,0,106,OPERATION_ALU_L_SUB     ,TYPE_ALU,0,0         ,0x00000001,0x7fffffff,FLAG_CY|FLAG_OV,1,1 ,0x80000000,1,0 ,        FLAG_OV,EXCEPTION_ALU_RANGE,0));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,120,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,121,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,122,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,123,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,124,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,125,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,126,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,127,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,128,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,129,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,130,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,131,OPERATION_ALU_L_SFEQ    ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,140,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,141,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,142,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,143,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,144,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,145,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,146,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,147,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,148,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,149,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,150,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,151,OPERATION_ALU_L_SFNE    ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,150,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,151,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,152,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,153,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,154,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,155,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,156,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,157,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,158,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,159,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,160,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,161,OPERATION_ALU_L_SFGEU   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,170,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,171,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,172,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,173,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,174,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,175,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,176,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,177,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,178,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,179,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,180,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,181,OPERATION_ALU_L_SFGTU   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,190,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,191,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,192,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,193,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,194,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,195,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,196,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,197,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,198,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,199,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,200,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,201,OPERATION_ALU_L_SFLEU   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,210,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,211,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,212,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,213,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,214,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,215,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,216,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,217,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,218,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,219,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,220,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,221,OPERATION_ALU_L_SFLTU   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,230,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,231,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,232,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,233,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,234,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,235,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,236,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,237,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,238,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,239,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,240,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,241,OPERATION_ALU_L_SFGES   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,250,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,251,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,252,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,253,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,254,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,255,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,256,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,257,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,258,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,259,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,260,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,261,OPERATION_ALU_L_SFGTS   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,270,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,271,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,272,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,273,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,274,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,275,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,276,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,277,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,278,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,279,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,280,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,281,OPERATION_ALU_L_SFLES   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,290,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0xdead    ,0xdead    ,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,291,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0x25071959,0x21071981,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,292,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0x21071981,0x25071959,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // + <  +
+  transaction_in.push_back(execute_transaction(_param,0,0,0,293,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - == -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,294,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0xdeadbabe,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // - >  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,295,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0xdeadbabe,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  -
+  transaction_in.push_back(execute_transaction(_param,0,0,0,296,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0x21524111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - == + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,297,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0x11111111,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - >  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,298,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0xdeadbeef,0x33333333,0              ,0,63,0x0       ,1,15,FLAG_F         ,EXCEPTION_NONE     ,0)); // - <  + (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,299,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0x21524111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + == - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,300,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0x33333333,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + >  - (in unsigned)
+  transaction_in.push_back(execute_transaction(_param,0,0,0,301,OPERATION_ALU_L_SFLTS   ,TYPE_ALU,0,0         ,0x11111111,0xdeadbeef,0              ,0,63,0x0       ,1,15,0              ,EXCEPTION_NONE     ,0)); // + <  - (in unsigned)
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,400,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_ICACHE<<11,   3,0xdeadbeef,0              ,0,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_SPR_ACCESS_NOT_COMPLETE,0,(GROUP_ICACHE<<11)|   3));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,401,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_ICACHE<<11,   5,0xdeadbeef,0              ,0,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_SPR_ACCESS_NOT_COMPLETE,0,(GROUP_ICACHE<<11)|   5));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,402,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   0,0xdeadbeef,0              ,0,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_SPR_ACCESS_INVALID     ,0,(GROUP_MAC   <<11)|   0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,403,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0xdeadbeef,0              ,0,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,404,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   0,0x12345678,0              ,1,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_SPR_ACCESS_INVALID     ,0,(GROUP_MAC   <<11)|   0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,405,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x12345678,0              ,1,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+
+  if (_param->_nb_ooo_engine > 1)
+    {
+  transaction_in.push_back(execute_transaction(_param,0,0,1,406,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x12345678,0              ,0,63,0x12345678,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,407,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x0       ,0              ,1,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,1,408,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x0       ,0              ,1,63,0x12345678,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+    }
+  // TEST MAC Unit
+  transaction_in.push_back(execute_transaction(_param,0,0,0,409,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0xbebebeef,0              ,0,63,0xbebebeef,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,410,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   2,0x21071981,0              ,0,63,0x21071981,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   2));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,411,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x0       ,0              ,1,63,0xbebebeef,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,412,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   2,0x0       ,0              ,1,63,0x21071981,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,413,OPERATION_ALU_L_MACRC   ,TYPE_ALU,0,0x0       , 0x0      ,0x0       ,0              ,1,63,0xbebebeef,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,414,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x0       ,0              ,1,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,415,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   2,0x0       ,0              ,1,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,416,OPERATION_ALU_L_MACRC   ,TYPE_ALU,0,0x0       , 0x0      ,0x0       ,0              ,1,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0));
+
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,417,OPERATION_ALU_L_MAC     ,TYPE_ALU,0,0x0       ,0x22071981,0x1234567 ,0              ,0,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,418,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x0       ,0              ,1,63,0x985e07e7,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,419,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   2,0x0       ,0              ,1,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,420,OPERATION_ALU_L_MAC     ,TYPE_ALU,1,0x22071981,0x1234567 ,0x0       ,0              ,0,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,421,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x0       ,0              ,1,63,0x30bc0fce,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,422,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   2,0x0       ,0              ,1,63,0x1       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,423,OPERATION_ALU_L_MSB     ,TYPE_ALU,1,0xdeadbeef,0x1945    ,0x0       ,0              ,0,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0));
+  
+  transaction_in.push_back(execute_transaction(_param,0,0,0,424,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   1,0x0       ,0              ,1,63,0x34424263,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,425,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_MAC   <<11,   2,0x0       ,0              ,1,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_MAC   <<11)|   2));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,500,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_CUSTOM_3<<11, 0,0xdeadbeef,0              ,0,63,0xdeadbeef,0, 0,0              ,EXCEPTION_ALU_SPR_ACCESS_INVALID,0,(GROUP_CUSTOM_3<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,500,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_CUSTOM_3<<11, 0,0xdeadbeef,0              ,0,63,0xdeadbeef,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_3<<11)|0));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,501,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_CUSTOM_3<<11, 1,0x3       ,0              ,0,63,0x3       ,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_3<<11)|1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,502,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_CUSTOM_3<<11, 2,0x7       ,0              ,0,63,0x7       ,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_3<<11)|2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,503,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_3<<11, 0,0x0       ,0              ,1,63,0xdeadbeef,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_3<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,504,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_3<<11, 1,0x0       ,0              ,1,63,0x3       ,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_3<<11)|1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,505,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_3<<11, 2,0x0       ,0              ,1,63,0x7       ,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_3<<11)|2));
+
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,506,OPERATION_CUSTOM_L_4    ,TYPE_ALU,0,0x0       ,0x21071981,0x0       ,0              ,1,63,0x9ae2802f,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,507,OPERATION_CUSTOM_L_8    ,TYPE_ALU,0,0x0       ,0x9ae2802f,0x0       ,0              ,1,63,0x21071981,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0));
+
+
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,600,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 1,0x0       ,0              ,1,63,0xdeadbeef,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|1));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,601,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 2,0x0       ,0              ,1,63,0x666     ,0, 2,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,602,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 3,0x0       ,0              ,1,63,0xffffffff,0, 3,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|3));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,603,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 3,0x0       ,0              ,0,63,0x0       ,0, 0,0              ,EXCEPTION_ALU_SPR_ACCESS_INVALID     ,0,(GROUP_CUSTOM_7<<11)|3));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,604,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 2,0x0       ,0              ,0,63,0x0       ,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,605,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 2,0x0       ,0              ,1,63,0x666     ,0, 2,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,606,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 2,0x12345678,0              ,0,63,0x12345678,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|2));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,607,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 2,0x0       ,0              ,1,63,0x12345678,0, 2,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|2));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,610,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xbebe    ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,611,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x4add6dda,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,612,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x96c7b0fe,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,613,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xeba5179a,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,614,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x17ebab3e,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,615,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xcd37395a,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,616,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x7325ad7e,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,617,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xb4ad31a ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,618,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x5a4eb7be,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,619,OPERATION_ALU_L_MTSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 3,0xf       ,0              ,0,63,0xf       ,0, 1,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|3));
+
+  transaction_in.push_back(execute_transaction(_param,0,0,0,620,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xbd76e4da,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,621,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xe       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,622,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xa       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,623,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x3       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,624,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x1       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,625,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0x5       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,626,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xc       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,627,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xe       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+  transaction_in.push_back(execute_transaction(_param,0,0,0,628,OPERATION_ALU_L_MFSPR   ,TYPE_ALU,1,GROUP_CUSTOM_7<<11, 0,0x0       ,0              ,1,63,0xa       ,0, 0,0              ,EXCEPTION_ALU_NONE                   ,0,(GROUP_CUSTOM_7<<11)|0));
+
+  LABEL("Reset");
+  in_NRESET.write(0);
+
+  in_EXECUTE_IN_VAL .write(0);
+  in_EXECUTE_OUT_ACK.write(0);
+
+  SC_START(5);
+  in_NRESET.write(1);  
+
+  LABEL("Loop of Test");
+
+  for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
+    {
+      nb_transaction_out = transaction_in.size();
+
+      LABEL("Iteration %d",iteration);
+
+      while (nb_transaction_out > 0)
+	{
+	  Tcontrol_t val = ((rand()%100) < percent_transaction_execute_in) and not transaction_in.empty();
+	  in_EXECUTE_IN_VAL .write(val);
+	  in_EXECUTE_OUT_ACK.write((rand()%100) < percent_transaction_execute_out);
+	  
+	  if (val)
+	    {
+	      if (_param->_have_port_context_id)
+	      in_EXECUTE_IN_CONTEXT_ID    .write(transaction_in.front()._context_id   );
+	      if (_param->_have_port_front_end_id)
+	      in_EXECUTE_IN_FRONT_END_ID  .write(transaction_in.front()._front_end_id );
+	      if (_param->_have_port_ooo_engine_id)
+	      in_EXECUTE_IN_OOO_ENGINE_ID .write(transaction_in.front()._ooo_engine_id);
+	      if (_param->_have_port_packet_id)
+	      in_EXECUTE_IN_PACKET_ID     .write(transaction_in.front()._packet_id    );
+	      in_EXECUTE_IN_OPERATION     .write(transaction_in.front()._operation    );
+	      in_EXECUTE_IN_TYPE          .write(transaction_in.front()._type         );
+	      in_EXECUTE_IN_HAS_IMMEDIAT  .write(transaction_in.front()._has_immediat );
+	      in_EXECUTE_IN_IMMEDIAT      .write(transaction_in.front()._immediat     );
+	      in_EXECUTE_IN_DATA_RA       .write(transaction_in.front()._data_ra      );
+	      in_EXECUTE_IN_DATA_RB       .write(transaction_in.front()._data_rb      );
+	      in_EXECUTE_IN_DATA_RC       .write(transaction_in.front()._data_rc      );
+	      in_EXECUTE_IN_WRITE_RD      .write(transaction_in.front()._write_rd     );
+	      in_EXECUTE_IN_NUM_REG_RD    .write(transaction_in.front()._num_reg_rd   );
+	      in_EXECUTE_IN_WRITE_RE      .write(transaction_in.front()._write_re     );
+	      in_EXECUTE_IN_NUM_REG_RE    .write(transaction_in.front()._num_reg_re   );
+	    }
+	  
+	  SC_START(0);
+	  
+	  if (out_EXECUTE_OUT_VAL.read() and  in_EXECUTE_OUT_ACK.read())
+	    {
+	      // TEST
+	      if (_param->_have_port_packet_id)
+	      TEST(Tpacket_t         , out_EXECUTE_OUT_PACKET_ID    .read(), transaction_out.front()._packet_id    );
+	      if (_param->_have_port_context_id)
+	      TEST(Tcontext_t        , out_EXECUTE_OUT_CONTEXT_ID   .read(), transaction_out.front()._context_id   );
+	      if (_param->_have_port_front_end_id)
+	      TEST(Tcontext_t        , out_EXECUTE_OUT_FRONT_END_ID .read(), transaction_out.front()._front_end_id );
+	      if (_param->_have_port_ooo_engine_id)
+	      TEST(Tcontext_t        , out_EXECUTE_OUT_OOO_ENGINE_ID.read(), transaction_out.front()._ooo_engine_id);
+	    //TEST(Toperation_t      , out_EXECUTE_OUT_OPERATION    .read(), transaction_out.front()._operation    );
+	    //TEST(Ttype_t           , out_EXECUTE_OUT_TYPE         .read(), transaction_out.front()._type         );
+	      TEST(Tcontrol_t        , out_EXECUTE_OUT_WRITE_RE     .read(), transaction_out.front()._write_re     );
+	      TEST(Tgeneral_address_t, out_EXECUTE_OUT_NUM_REG_RD   .read(), transaction_out.front()._num_reg_rd   );
+	      TEST(Tspecial_address_t, out_EXECUTE_OUT_NUM_REG_RE   .read(), transaction_out.front()._num_reg_re   );
+	      TEST(Texception_t      , out_EXECUTE_OUT_EXCEPTION    .read(), transaction_out.front()._exception    );
+	      TEST(Tcontrol_t        , out_EXECUTE_OUT_NO_SEQUENCE  .read(), transaction_out.front()._no_sequence  );
+
+	      switch (transaction_out.front()._operation)
+		{
+		case OPERATION_ALU_L_MFSPR :
+		  {
+		    TEST(Tcontrol_t        , out_EXECUTE_OUT_WRITE_RD     .read(), out_EXECUTE_OUT_EXCEPTION.read() == EXCEPTION_ALU_NONE);
+		    if (out_EXECUTE_OUT_WRITE_RD     .read())
+		    TEST(Tgeneral_data_t   , out_EXECUTE_OUT_DATA_RD      .read(), transaction_out.front()._data_rd      );
+		    TEST(Tgeneral_data_t   , out_EXECUTE_OUT_ADDRESS      .read(), transaction_out.front()._address      );
+		    break;
+		  }
+		case OPERATION_ALU_L_MTSPR :
+		  {
+		    TEST(Tcontrol_t        , out_EXECUTE_OUT_WRITE_RD     .read(), transaction_out.front()._write_rd     );
+		    TEST(Tgeneral_data_t   , out_EXECUTE_OUT_DATA_RD      .read(), transaction_out.front()._data_rd      );
+		    TEST(Tgeneral_data_t   , out_EXECUTE_OUT_ADDRESS      .read(), transaction_out.front()._address      );
+		    break;
+		  }
+		default :
+		  {
+		    TEST(Tcontrol_t        , out_EXECUTE_OUT_WRITE_RD     .read(), transaction_out.front()._write_rd     );
+		    if (transaction_out.front()._write_rd)
+		    TEST(Tgeneral_data_t   , out_EXECUTE_OUT_DATA_RD      .read(), transaction_out.front()._data_rd      );
+		    if (transaction_out.front()._write_re)
+		    TEST(Tspecial_data_t   , out_EXECUTE_OUT_DATA_RE      .read(), transaction_out.front()._data_re      );
+		    if (transaction_out.front()._no_sequence)
+		    TEST(Tgeneral_data_t   , out_EXECUTE_OUT_ADDRESS      .read(), transaction_out.front()._address      );
+		  }
+		}
+	      transaction_out.pop_front();
+
+	      nb_transaction_out--;
+	    }
+	  
+	  if ( in_EXECUTE_IN_VAL .read() and out_EXECUTE_IN_ACK .read())
+	    {
+	      transaction_out.push_back(transaction_in.front());
+	      transaction_in.pop_front();
+	    }
+
+	  SC_START(1);
+	}
+
+    }
+  /********************************************************
+   * Simulation - End
+   ********************************************************/
+
+  TEST_OK ("End of Simulation");
+  delete _time;
+
+  msg(_("<%s> : ............ Stop Simulation\n"),name.c_str());
+
+#endif
+
+  delete _Functionnal_unit;
+#ifdef STATISTICS
+  delete _parameters_statistics;
+#endif
+}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/VERSION
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/VERSION	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/VERSION	(revision 72)
@@ -0,0 +1,4 @@
+v0.6
+
+0.5 modif vhdl_port et vhdl_testbench_port -> ajout d'une macro
+0.6 ajout de la documentation
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/Functionnal_unit.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/Functionnal_unit.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/Functionnal_unit.tex	(revision 72)
@@ -0,0 +1,38 @@
+\documentclass[10pt,a4paper,twocolumn]{article}
+
+\def\dirdoc{tex}
+\def\dirschema{eps}
+
+% Package de variables d'environnement : Titre, command etc ...
+\usepackage{../../../../../../../../Behavioural/doc/sty/doc-style}
+\usepackage{sty/header}
+
+
+%------------------------------------------------------------------------------
+% Début document
+%------------------------------------------------------------------------------
+
+\pagestyle{empty}
+
+\begin{document}
+
+% Créez une page de titre
+\maketitle
+\thispagestyle{empty}
+
+%Table des matières et des figures
+%\tableofcontents
+%\newpage
+%\listoffigures
+
+%------------------------------------------------------------------------------
+% Ajout du corps du documents
+%------------------------------------------------------------------------------
+
+\input{tex/root}
+
+%------------------------------------------------------------------------------
+% Fin d'ajout du corps du document
+%------------------------------------------------------------------------------
+
+\end{document}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/Makefile
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/Makefile	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/Makefile	(revision 72)
@@ -0,0 +1,19 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+
+#-----[ Directory ]----------------------------------------
+DIR_COMPONENT			= ../
+include				$(DIR_COMPONENT)/Makefile.defs
+
+#-----[ include ]------------------------------------------
+
+all				:
+				$(MAKE) all_documentation
+
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Common
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Documentation
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/sty/header.sty
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/sty/header.sty	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/sty/header.sty	(revision 72)
@@ -0,0 +1,12 @@
+\def\review{YYYY/MM/DD}
+%\def\review{\number\day/\number\month/\number\year\xspace}
+
+\title{Functionnal_unit}
+ 
+\author{}
+
+\affiliation{}
+
+\email{}
+
+\date{\review}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/01_introduction.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/01_introduction.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/01_introduction.tex	(revision 72)
@@ -0,0 +1,1 @@
+\Section{Introduction}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/02_features.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/02_features.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/02_features.tex	(revision 72)
@@ -0,0 +1,1 @@
+\Section{Features}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/03_description.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/03_description.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/03_description.tex	(revision 72)
@@ -0,0 +1,1 @@
+\Section{Functional Description}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/04_pinout.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/04_pinout.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/04_pinout.tex	(revision 72)
@@ -0,0 +1,1 @@
+\Section{Pin out}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/05_parameters.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/05_parameters.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/05_parameters.tex	(revision 72)
@@ -0,0 +1,1 @@
+\Section{Parameters}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/06_performance.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/06_performance.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/06_performance.tex	(revision 72)
@@ -0,0 +1,1 @@
+\Section{Performance}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/07_details.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/07_details.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/07_details.tex	(revision 72)
@@ -0,0 +1,1 @@
+\Section{Details}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/08_history.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/08_history.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/08_history.tex	(revision 72)
@@ -0,0 +1,10 @@
+\Section{Revision History}
+
+\begin{tabular}{|c|c|c|}
+\hline
+Revision Date & By  & Modifications\\
+\hline
+\hline
+yyyy/mm/dd    & xxx & Initial document \\
+\hline
+\end{tabular}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/root.tex
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/root.tex	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/doc/tex/root.tex	(revision 72)
@@ -0,0 +1,8 @@
+\input{\dirdoc/01_introduction}
+\input{\dirdoc/02_features}
+\input{\dirdoc/03_description}
+\input{\dirdoc/04_pinout}
+\input{\dirdoc/05_parameters}
+\input{\dirdoc/06_performance}
+\input{\dirdoc/07_details}
+\input{\dirdoc/08_history}
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h	(revision 72)
@@ -0,0 +1,191 @@
+#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_Functionnal_unit_h
+#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_Functionnal_unit_h
+
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ * This functionnal unit can treat an only request. also delay_global = max(latence, delay)
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Operation.h"
+
+#ifdef SYSTEMC
+#include "systemc.h"
+#endif
+
+#include <iostream>
+#include "Common/include/ToString.h"
+#include "Common/include/Debug.h"
+#include "Behavioural/include/Types.h"
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Parameters.h"
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h"
+#ifdef STATISTICS
+#include "Behavioural/include/Stat.h"
+#endif
+#include "Behavioural/include/Component.h"
+#ifdef VHDL
+#include "Behavioural/include/Vhdl.h"
+#endif
+#include "Behavioural/include/Usage.h"
+
+namespace morpheo {
+namespace behavioural {
+
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+  class Functionnal_unit 
+#if SYSTEMC
+    : public sc_module
+#endif
+  {
+    // -----[ fields ]----------------------------------------------------
+    // Parameters
+  protected : const std::string  _name;
+  protected : const Parameters * _param;
+  private   : const Tusage_t     _usage;
+
+#ifdef STATISTICS
+  private   : Stat                           * _stat;
+
+  private   : counter_t                      * _stat_use_functionnal_unit;
+  private   : counter_t                      * _stat_average_use_functionnal_unit;
+  private   : counter_t                      * _stat_percent_use_functionnal_unit;
+
+  private   : counter_t                      * _stat_sum_delay;
+  private   : counter_t                      * _stat_average_delay;
+
+  private   : counter_t                      * _stat_sum_latence;
+  private   : counter_t                      * _stat_average_latence;
+#endif
+
+  public    : Component                      * _component;
+  private   : Interfaces                     * _interfaces;
+
+#ifdef SYSTEMC
+    // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    // Interface
+  public    : SC_CLOCK                      *  in_CLOCK        ;
+  public    : SC_IN (Tcontrol_t)            *  in_NRESET       ;
+
+    // ~~~~~[ Interface "execute_in" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  public    : SC_IN (Tcontrol_t        )    *  in_EXECUTE_IN_VAL            ;
+  public    : SC_OUT(Tcontrol_t        )    * out_EXECUTE_IN_ACK            ;
+  public    : SC_IN (Tcontext_t        )    *  in_EXECUTE_IN_CONTEXT_ID     ;
+  public    : SC_IN (Tcontext_t        )    *  in_EXECUTE_IN_FRONT_END_ID   ;
+  public    : SC_IN (Tcontext_t        )    *  in_EXECUTE_IN_OOO_ENGINE_ID  ;
+  public    : SC_IN (Tpacket_t         )    *  in_EXECUTE_IN_PACKET_ID      ;
+  public    : SC_IN (Toperation_t      )    *  in_EXECUTE_IN_OPERATION      ;
+  public    : SC_IN (Ttype_t           )    *  in_EXECUTE_IN_TYPE           ;
+  public    : SC_IN (Tcontrol_t        )    *  in_EXECUTE_IN_HAS_IMMEDIAT   ;
+  public    : SC_IN (Tgeneral_data_t   )    *  in_EXECUTE_IN_IMMEDIAT       ;
+  public    : SC_IN (Tgeneral_data_t   )    *  in_EXECUTE_IN_DATA_RA        ;
+  public    : SC_IN (Tgeneral_data_t   )    *  in_EXECUTE_IN_DATA_RB        ;
+  public    : SC_IN (Tspecial_data_t   )    *  in_EXECUTE_IN_DATA_RC        ;
+  public    : SC_IN (Tcontrol_t        )    *  in_EXECUTE_IN_WRITE_RD       ;
+  public    : SC_IN (Tgeneral_address_t)    *  in_EXECUTE_IN_NUM_REG_RD     ;
+  public    : SC_IN (Tcontrol_t        )    *  in_EXECUTE_IN_WRITE_RE       ;
+  public    : SC_IN (Tspecial_address_t)    *  in_EXECUTE_IN_NUM_REG_RE     ;
+
+    // ~~~~~[ Interface "execute_out" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  public    : SC_OUT(Tcontrol_t        )    * out_EXECUTE_OUT_VAL            ;
+  public    : SC_IN (Tcontrol_t        )    *  in_EXECUTE_OUT_ACK            ;
+  public    : SC_OUT(Tcontext_t        )    * out_EXECUTE_OUT_CONTEXT_ID     ;
+  public    : SC_OUT(Tcontext_t        )    * out_EXECUTE_OUT_FRONT_END_ID   ;
+  public    : SC_OUT(Tcontext_t        )    * out_EXECUTE_OUT_OOO_ENGINE_ID  ;
+  public    : SC_OUT(Tpacket_t         )    * out_EXECUTE_OUT_PACKET_ID      ;
+//public    : SC_OUT(Toperation_t      )    * out_EXECUTE_OUT_OPERATION      ;
+//public    : SC_OUT(Ttype_t           )    * out_EXECUTE_OUT_TYPE           ;
+  public    : SC_OUT(Tcontrol_t        )    * out_EXECUTE_OUT_WRITE_RD       ;
+  public    : SC_OUT(Tgeneral_address_t)    * out_EXECUTE_OUT_NUM_REG_RD     ;
+  public    : SC_OUT(Tgeneral_data_t   )    * out_EXECUTE_OUT_DATA_RD        ;
+  public    : SC_OUT(Tcontrol_t        )    * out_EXECUTE_OUT_WRITE_RE       ;
+  public    : SC_OUT(Tspecial_address_t)    * out_EXECUTE_OUT_NUM_REG_RE     ;
+  public    : SC_OUT(Tspecial_data_t   )    * out_EXECUTE_OUT_DATA_RE        ;
+  public    : SC_OUT(Texception_t      )    * out_EXECUTE_OUT_EXCEPTION      ;
+  public    : SC_OUT(Tcontrol_t        )    * out_EXECUTE_OUT_NO_SEQUENCE    ;
+  public    : SC_OUT(Tgeneral_data_t   )    * out_EXECUTE_OUT_ADDRESS        ;
+
+    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+
+    // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+
+    // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  private   : Tcontrol_t                      internal_EXECUTE_IN_ACK;
+  private   : Tcontrol_t                      internal_EXECUTE_OUT_VAL;
+  private   : bool                            reg_BUSY;
+
+  private   : execute_operation_t           * _execute_operation;
+  private   : execute_register_t         **** _execute_register;
+  private   : execute_param_t               * _execute_param;
+  private   : function_execute_t           ** _function_execute;
+#endif
+
+    // -----[ Methods ]---------------------------------------------------
+
+#ifdef SYSTEMC
+    SC_HAS_PROCESS (Functionnal_unit);
+#endif
+  public  :          Functionnal_unit              
+  (
+#ifdef SYSTEMC
+   sc_module_name                                name,
+#else					       
+   std::string                                   name,
+#endif					       
+#ifdef STATISTICS
+   morpheo::behavioural::Parameters_Statistics * param_statistics,
+#endif
+   Parameters                                  * param,
+   morpheo::behavioural::Tusage_t                usage=USE_ALL
+   );
+  public  :             ~Functionnal_unit         (void);
+					       
+  private : void        allocation                (void);
+  private : void        deallocation              (void);
+					       
+#ifdef SYSTEMC
+  public  : void        transition                (void);
+  public  : void        genMoore                  (void);
+  public  : void        genMealy                  (void);
+
+
+#endif					       
+#ifdef STATISTICS
+  public  : void        statistics_declaration    (morpheo::behavioural::Parameters_Statistics * param_statistics);
+  public  : std::string statistics_print          (uint32_t depth);
+#endif
+					       
+#if VHDL				       
+  public  : void        vhdl                      (void);
+  private : void        vhdl_declaration          (Vhdl * & vhdl);
+  private : void        vhdl_body                 (Vhdl * & vhdl);
+#endif					       
+					       
+#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
+  private : void        end_cycle                 (void);
+#endif
+
+  };
+
+  void operation_unimplemented   (execute_operation_t * op,
+				  execute_register_t  * reg);
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Operation.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Operation.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Operation.h	(revision 72)
@@ -0,0 +1,75 @@
+#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_operation_h
+#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_operation_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/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+  void operation_unimplemented   (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_add           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_addc          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sub           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+//void operation_l_mul           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+//void operation_l_mulu          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+//void operation_l_div           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+//void operation_l_divu          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_and           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_or            (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_xor           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_test_f        (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_test_nf       (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_jalr          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sll           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sra           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_srl           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_ror           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_movhi         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_extend_s      (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_extend_z      (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_cmov          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_ff1           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_fl1           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_mfspr         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_mtspr         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfeq          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfne          (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfgeu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfgtu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfleu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfltu         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfges         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfgts         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sfles         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_sflts         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_mac           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_msb           (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+  void operation_l_macrc         (execute_operation_t * op, execute_register_t  * reg, execute_param_t * param);
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Parameters.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Parameters.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Parameters.h	(revision 72)
@@ -0,0 +1,92 @@
+#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_Parameters_h
+#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_Parameters_h
+
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Common/include/Debug.h"
+#include "Behavioural/include/Parameters.h"
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h"
+#include "Behavioural/Custom/include/Custom.h"
+#include <math.h>
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+  class Parameters : public morpheo::behavioural::Parameters
+  {
+    //-----[ fields ]------------------------------------------------------------
+  public : const uint32_t            _nb_context                   ;
+  public : const uint32_t            _nb_front_end                 ;
+  public : const uint32_t            _nb_ooo_engine                ;
+  public : const uint32_t            _nb_packet                    ;
+  public : const uint32_t            _size_general_data            ;
+  public : const uint32_t            _nb_general_register          ;
+  public : const uint32_t            _size_special_data            ;
+  public : const uint32_t            _nb_special_register          ;
+  public : const uint32_t            _nb_operation                 ;
+  public : const uint32_t            _nb_type                      ;
+  public : const execute_timing_t  * _timing                       ;
+  public : morpheo::behavioural::custom::custom_information_t (*_get_custom_information) (uint32_t);
+
+  public : const uint32_t            _size_context_id              ;
+  public : const uint32_t            _size_front_end_id            ;
+  public : const uint32_t            _size_ooo_engine_id           ;
+  public : const uint32_t            _size_packet_id               ;
+  public : const uint32_t            _size_general_register        ;
+  public : const uint32_t            _size_special_register        ;
+  public : const uint32_t            _size_operation               ;
+  public : const uint32_t            _size_type                    ;
+
+  public : const bool                _have_port_context_id         ;
+  public : const bool                _have_port_front_end_id       ;
+  public : const bool                _have_port_ooo_engine_id      ;
+  public : const bool                _have_port_packet_id          ;
+
+  public : const bool                _have_groupe_MAC              ;
+
+    //-----[ methods ]-----------------------------------------------------------
+  public : Parameters  (uint32_t           nb_context         ,
+			uint32_t           nb_front_end       ,
+			uint32_t           nb_ooo_engine      ,
+			uint32_t           nb_packet          ,
+			uint32_t           size_general_data  ,
+			uint32_t           nb_general_register,
+			uint32_t           size_special_data  ,
+			uint32_t           nb_special_register,
+			uint32_t           nb_operation       ,
+			uint32_t           nb_type            ,
+			execute_timing_t * timing             ,
+			morpheo::behavioural::custom::custom_information_t (*get_custom_information) (uint32_t));
+  public : Parameters  (Parameters & param) ;
+  public : ~Parameters () ;
+
+  public :        std::string   msg_error  (void);
+
+  public :        std::string   print      (uint32_t depth);
+  public : friend std::ostream& operator<< (std::ostream& output_stream,
+					  morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters & x);
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Types.h	(revision 72)
@@ -0,0 +1,166 @@
+#ifndef morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_Types_h
+#define morpheo_behavioural_core_multi_execute_loop_execute_loop_multi_execute_unit_execute_unit_functionnal_unit_Types_h
+
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#ifdef SYSTEMC
+#include "systemc.h"
+#endif
+
+#include "Common/include/BitManipulation.h"
+#include "Behavioural/include/SPR_access_mode.h"
+#include "Behavioural/include/Types.h"
+#include "Behavioural/include/Parameters.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+  class execute_timing_t
+  {
+    // if delay   > 0, can't accepted a transaction on EXECUTE_IN's  interface.
+  public : uint32_t        _delay  ;
+    // if latence > 0, can't initiate a transaction on EXECUTE_OUT's interface.
+  public : uint32_t        _latence;
+
+  public : execute_timing_t (uint32_t delay=0, uint32_t latence=0)
+    {
+      _delay   = delay;
+      _latence = latence;
+    };
+  };
+
+  typedef struct 
+  {
+    execute_timing_t   _timing      ;
+
+    Tcontext_t         _context_id   ;
+    Tcontext_t         _front_end_id ;
+    Tcontext_t         _ooo_engine_id;
+    Tpacket_t          _packet_id ;
+
+    Toperation_t       _operation   ;
+    Ttype_t            _type        ;
+    Tcontrol_t         _has_immediat;
+    Tgeneral_data_t    _immediat    ;
+    Tgeneral_data_t    _data_ra     ;
+    Tgeneral_data_t    _data_rb     ;
+    Tspecial_data_t    _data_rc     ;
+    Tgeneral_data_t    _data_rd     ;
+    Tspecial_data_t    _data_re     ;
+
+    Tcontrol_t         _write_rd  ;
+    Tgeneral_address_t _num_reg_rd;
+    Tcontrol_t         _write_re  ;
+    Tspecial_address_t _num_reg_re;
+
+    Texception_t       _exception   ;
+    Tcontrol_t         _no_sequence ;
+    Tgeneral_data_t    _address     ;
+  } execute_operation_t;
+
+  class execute_param_t
+  {
+  public : const uint32_t            _size_data;
+  public : const Tgeneral_data_t     _mask_data;
+  public : const Tgeneral_data_t     _mask_shift;
+  public : const execute_timing_t  * _timing;
+
+  public : execute_param_t (const uint32_t            size_data,
+			    const execute_timing_t  * timing):
+    _size_data (size_data),
+    _mask_data (gen_mask<Tgeneral_data_t> (size_data)),
+    _mask_shift(gen_mask<Tgeneral_data_t> (log2(size_data))),
+    _timing    (timing)
+    {
+    };
+  public : ~execute_param_t (void)
+    {
+    };
+  } ;
+
+  class execute_register_t
+  {
+    // information to custom group : 
+    //  * perhalps a custom group start an operation after a access at a internal's group register
+  public : bool               _i_read_spr;
+  public : bool               _i_write_spr;
+  public : uint32_t           _access_num_group;
+  public : uint32_t           _access_num_register;
+  public : Tgeneral_data_t    _spr_old;
+  public : Tgeneral_data_t ** _spr;
+  public : SPR_access_mode  * _spr_access_mode;
+    
+  public : execute_register_t (void)
+    {
+      _spr               = new Tgeneral_data_t * [NB_GROUP];
+      _spr_access_mode   = new SPR_access_mode;
+  
+      for (uint32_t i=0; i<NB_GROUP; i++)
+	{
+	  _spr               [i] = NULL;
+	}
+    }
+
+  public : ~execute_register_t (void)
+    {
+      for (uint32_t x=0; x<NB_GROUP; x++)
+	if (_spr[x] != NULL)
+	  delete _spr[x];
+      delete _spr;
+      delete _spr_access_mode;
+    }
+
+  public : void implement_group (uint32_t num_group, uint32_t nb_reg)
+    {
+      if ((num_group > NB_GROUP) or (_spr[num_group] != NULL))
+	throw ERRORMORPHEO("execute_register_t::implement_group", "Invalid group number or this group is already implemented.");
+
+      if (nb_reg > 0)
+	{
+	  _spr [num_group] = new Tgeneral_data_t [nb_reg];
+
+	  if (num_group >= GROUP_CUSTOM_1)
+	    _spr_access_mode ->implement_group(num_group, nb_reg);
+	}
+    }
+
+  public : void implement_group (uint32_t num_group)
+    {
+      if ((num_group > NB_GROUP) or (_spr[num_group] != NULL))
+	throw ERRORMORPHEO("execute_register_t::implement_group", "Invalid group number or this group is already implemented.");
+
+      uint32_t nb_reg = _spr_access_mode ->implement_group(num_group);
+
+      if (nb_reg > 0)
+	_spr [num_group] = new Tgeneral_data_t [nb_reg];
+    }
+  };
+  
+  typedef void function_execute_t (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_operation_t *, 
+				   morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  *,
+				   morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     *);
+
+  typedef void function_execute_end_cycle_t (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  *,
+					     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     *);
+
+  
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit.cpp	(revision 72)
@@ -0,0 +1,132 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::Functionnal_unit"
+  Functionnal_unit::Functionnal_unit 
+  (
+#ifdef SYSTEMC
+   sc_module_name name,
+#else
+   string name,
+#endif
+#ifdef STATISTICS
+   morpheo::behavioural::Parameters_Statistics * param_statistics,
+#endif
+   morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters * param,
+   morpheo::behavioural::Tusage_t usage
+   ):
+    _name              (name)
+    ,_param            (param)
+    ,_usage            (usage)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    log_printf(INFO,Functionnal_unit,FUNCTION,"Allocation");
+    allocation ();
+
+#ifdef STATISTICS
+    if (_usage & USE_STATISTICS)
+      {	
+	log_printf(INFO,Functionnal_unit,FUNCTION,"Allocation of statistics");
+
+	statistics_declaration(param_statistics);
+      }
+#endif
+
+#ifdef VHDL
+    if (_usage & USE_VHDL)
+      {
+	// generate the vhdl
+	log_printf(INFO,Functionnal_unit,FUNCTION,"Generate the vhdl");
+	
+	vhdl();
+      }
+#endif
+
+#ifdef SYSTEMC
+    if (_usage & USE_SYSTEMC)
+      {
+	log_printf(INFO,Functionnal_unit,FUNCTION,"Method - transition");
+
+	SC_METHOD (transition);
+	dont_initialize ();
+	sensitive << (*(in_CLOCK)).pos();
+	
+# ifdef SYSTEMCASS_SPECIFIC
+	// List dependency information
+# endif    
+
+	log_printf(INFO,Functionnal_unit,FUNCTION,"Method - genMoore");
+
+	SC_METHOD (genMoore);
+	dont_initialize ();
+	sensitive << (*(in_CLOCK)).neg();
+	
+# ifdef SYSTEMCASS_SPECIFIC
+	// List dependency information
+# endif    
+
+	log_printf(INFO,Functionnal_unit,FUNCTION,"Method - genMealy");
+
+	SC_METHOD (genMealy);
+	dont_initialize ();
+	sensitive << (*(in_CLOCK)).neg()
+		  << (*(in_EXECUTE_OUT_ACK));
+	
+# ifdef SYSTEMCASS_SPECIFIC
+	// List dependency information
+	(*(out_EXECUTE_IN_ACK)) (*(in_EXECUTE_OUT_ACK));
+# endif    
+	
+#endif
+      }
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+    
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::~Functionnal_unit"
+  Functionnal_unit::~Functionnal_unit (void)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+#ifdef STATISTICS
+    if (_usage & USE_STATISTICS)
+      {
+	log_printf(INFO,Functionnal_unit,FUNCTION,"Generate Statistics file");
+	
+	delete _stat;
+      }
+#endif
+
+    log_printf(INFO,Functionnal_unit,FUNCTION,"Deallocation");
+    deallocation ();
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_allocation.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_allocation.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_allocation.cpp	(revision 72)
@@ -0,0 +1,216 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::allocation"
+  void Functionnal_unit::allocation (void)
+  {
+    string rename;
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    _component   = new Component (_usage);
+
+    Entity * entity = _component->set_entity (_name       
+					      ,"Functionnal_unit"
+#ifdef POSITION
+					      ,COMBINATORY 
+#endif
+					      );
+
+    _interfaces = entity->set_interfaces();
+
+    // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    {
+      Interface * interface = _interfaces->set_interface(""
+#ifdef POSITION
+							 ,IN
+							 ,SOUTH,
+							 "Generalist interface"
+#endif
+							 );
+
+      in_CLOCK        = interface->set_signal_clk              ("clock" ,1, CLOCK_VHDL_YES);
+      in_NRESET       = interface->set_signal_in  <Tcontrol_t> ("nreset",1, RESET_VHDL_YES);
+    }
+    // ~~~~~[ Interface : "execute_in" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+     {
+      Interface_fifo * interface = _interfaces->set_interface("execute_in"
+#ifdef POSITION
+							      ,IN
+							      ,WEST,
+							      "Input of Functionnal Unit"
+#endif
+							      );
+
+       in_EXECUTE_IN_VAL           = interface->set_signal_valack_in  (VAL);
+      out_EXECUTE_IN_ACK           = interface->set_signal_valack_out (ACK);
+      if (_param->_have_port_context_id)
+       in_EXECUTE_IN_CONTEXT_ID    = interface->set_signal_in <Tcontext_t        > ("context_id"   , _param->_size_context_id   );
+      if (_param->_have_port_front_end_id)
+       in_EXECUTE_IN_FRONT_END_ID  = interface->set_signal_in <Tcontext_t        > ("front_end_id" , _param->_size_front_end_id );
+      if (_param->_have_port_ooo_engine_id)
+       in_EXECUTE_IN_OOO_ENGINE_ID = interface->set_signal_in <Tcontext_t        > ("ooo_engine_id", _param->_size_ooo_engine_id);
+      if (_param->_have_port_packet_id)
+       in_EXECUTE_IN_PACKET_ID     = interface->set_signal_in <Tpacket_t         > ("packet_id"    , _param->_size_packet_id    );
+       in_EXECUTE_IN_OPERATION     = interface->set_signal_in <Toperation_t      > ("operation"    , _param->_size_operation    );
+       in_EXECUTE_IN_TYPE          = interface->set_signal_in <Ttype_t           > ("type"         , _param->_size_type         );
+       in_EXECUTE_IN_HAS_IMMEDIAT  = interface->set_signal_in <Tcontrol_t        > ("has_immediat" , 1);
+       in_EXECUTE_IN_IMMEDIAT      = interface->set_signal_in <Tgeneral_data_t   > ("immediat"     , _param->_size_general_data);
+       in_EXECUTE_IN_DATA_RA       = interface->set_signal_in <Tgeneral_data_t   > ("data_ra"      , _param->_size_general_data);
+       in_EXECUTE_IN_DATA_RB       = interface->set_signal_in <Tgeneral_data_t   > ("data_rb"      , _param->_size_general_data);
+       in_EXECUTE_IN_DATA_RC       = interface->set_signal_in <Tspecial_data_t   > ("data_rc"      , _param->_size_special_data);
+       in_EXECUTE_IN_WRITE_RD      = interface->set_signal_in <Tcontrol_t        > ("write_rd"     , 1);
+       in_EXECUTE_IN_NUM_REG_RD    = interface->set_signal_in <Tgeneral_address_t> ("num_reg_rd"   , _param->_size_general_register);
+       in_EXECUTE_IN_WRITE_RE      = interface->set_signal_in <Tcontrol_t        > ("write_re"     , 1);
+       in_EXECUTE_IN_NUM_REG_RE    = interface->set_signal_in <Tspecial_address_t> ("num_reg_re"   , _param->_size_special_register);
+     }
+    // ~~~~~[ Interface : "execute_out" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     
+     {
+       Interface_fifo * interface = _interfaces->set_interface("execute_out"
+#ifdef POSITION
+							       ,IN
+							       ,EAST,
+							       "Output of Functionnal Unit"
+#endif
+							       );
+
+       out_EXECUTE_OUT_VAL            = interface->set_signal_valack_out (VAL);
+        in_EXECUTE_OUT_ACK            = interface->set_signal_valack_in  (ACK);
+       if (_param->_have_port_context_id)
+       out_EXECUTE_OUT_CONTEXT_ID     = interface->set_signal_out<Tcontext_t        > ("context_id"   ,_param->_size_context_id   );
+       if (_param->_have_port_front_end_id)
+       out_EXECUTE_OUT_FRONT_END_ID   = interface->set_signal_out<Tcontext_t        > ("front_end_id" ,_param->_size_front_end_id );
+       if (_param->_have_port_ooo_engine_id)
+       out_EXECUTE_OUT_OOO_ENGINE_ID  = interface->set_signal_out<Tcontext_t        > ("ooo_engine_id",_param->_size_ooo_engine_id);
+       if (_param->_have_port_packet_id)
+       out_EXECUTE_OUT_PACKET_ID      = interface->set_signal_out<Tpacket_t         > ("packet_id"    ,_param->_size_packet_id    );
+     //out_EXECUTE_OUT_OPERATION      = interface->set_signal_out<Toperation_t      > ("operation"    ,_param->_size_operation    );
+     //out_EXECUTE_OUT_TYPE           = interface->set_signal_out<Ttype_t           > ("type"         ,_param->_size_type         );
+       out_EXECUTE_OUT_WRITE_RD       = interface->set_signal_out<Tcontrol_t        > ("write_rd"     ,1);
+       out_EXECUTE_OUT_NUM_REG_RD     = interface->set_signal_out<Tgeneral_address_t> ("num_reg_rd"   ,_param->_size_general_register);
+       out_EXECUTE_OUT_DATA_RD        = interface->set_signal_out<Tgeneral_data_t   > ("data_rd"      ,_param->_size_general_data);
+       out_EXECUTE_OUT_WRITE_RE       = interface->set_signal_out<Tcontrol_t        > ("write_re"     ,1);
+       out_EXECUTE_OUT_NUM_REG_RE     = interface->set_signal_out<Tspecial_address_t> ("num_reg_re"   ,_param->_size_special_register);
+       out_EXECUTE_OUT_DATA_RE        = interface->set_signal_out<Tspecial_data_t   > ("data_re"      ,_param->_size_special_data);
+       out_EXECUTE_OUT_EXCEPTION      = interface->set_signal_out<Texception_t      > ("exception"    ,_param->_size_exception);
+       out_EXECUTE_OUT_NO_SEQUENCE    = interface->set_signal_out<Tcontrol_t        > ("no_sequence"  ,1);
+       out_EXECUTE_OUT_ADDRESS        = interface->set_signal_out<Tgeneral_data_t   > ("address     " ,_param->_size_general_data);
+     }
+
+    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+     _execute_operation = new execute_operation_t;
+     _execute_param     = new execute_param_t(_param->_size_general_data,
+					      _param->_timing);
+
+     _execute_register = new execute_register_t *** [_param->_nb_context];
+
+     for (uint32_t i=0; i<_param->_nb_context; i++)
+       {
+	 _execute_register [i] = new execute_register_t ** [_param->_nb_front_end];
+	 
+	 for (uint32_t j=0; j<_param->_nb_front_end; j++)
+	   {
+	     _execute_register [i][j] = new execute_register_t * [_param->_nb_ooo_engine];
+	     
+	     for (uint32_t k=0; k<_param->_nb_ooo_engine; k++)
+	       {
+		 uint32_t num_thread = 0;
+
+		 _execute_register [i][j][k] = new execute_register_t;
+		 
+		 if (_param->_have_groupe_MAC)
+		   _execute_register[i][j][k]->implement_group(GROUP_MAC);
+
+		 for (uint32_t x=GROUP_CUSTOM_1; x<GROUP_CUSTOM_8; x++)
+		   if ((_param->_get_custom_information(num_thread))._get_valid_group(x) == true)
+		     {
+		       uint32_t nb_reg = (_param->_get_custom_information(num_thread))._get_nb_register(x);
+		       _execute_register[i][j][k]->implement_group(x,nb_reg);
+
+		       for (uint32_t y=0; y<nb_reg; y++)
+			 _execute_register[i][j][k]->_spr_access_mode->change_mode(x,y,(_param->_get_custom_information(num_thread))._get_access_mode(x,y));
+		     }
+	       }
+	   }
+       }
+
+     _function_execute = new function_execute_t * [MAX_OPERATION];
+     
+     // Initialisation
+     for (uint32_t i=0; i<MAX_OPERATION; i++)
+       _function_execute [i] = &(operation_unimplemented);
+
+     if (_param->_timing[OPERATION_ALU_L_ADD     ]._latence > 0) _function_execute[OPERATION_ALU_L_ADD     ] = &(operation_l_add     );
+     if (_param->_timing[OPERATION_ALU_L_ADDC    ]._latence > 0) _function_execute[OPERATION_ALU_L_ADDC    ] = &(operation_l_addc    );
+     if (_param->_timing[OPERATION_ALU_L_SUB     ]._latence > 0) _function_execute[OPERATION_ALU_L_SUB     ] = &(operation_l_sub     );
+//      if (_param->_timing[OPERATION_ALU_L_MUL     ]._latence > 0) _function_execute[OPERATION_ALU_L_MUL     ] = &(operation_l_mul     );
+//      if (_param->_timing[OPERATION_ALU_L_MULU    ]._latence > 0) _function_execute[OPERATION_ALU_L_MULU    ] = &(operation_l_mulu    );
+//      if (_param->_timing[OPERATION_ALU_L_DIV     ]._latence > 0) _function_execute[OPERATION_ALU_L_DIV     ] = &(operation_l_div     );
+//      if (_param->_timing[OPERATION_ALU_L_DIVU    ]._latence > 0) _function_execute[OPERATION_ALU_L_DIVU    ] = &(operation_l_divu    );
+     if (_param->_timing[OPERATION_ALU_L_AND     ]._latence > 0) _function_execute[OPERATION_ALU_L_AND     ] = &(operation_l_and     );
+     if (_param->_timing[OPERATION_ALU_L_OR      ]._latence > 0) _function_execute[OPERATION_ALU_L_OR      ] = &(operation_l_or      );
+     if (_param->_timing[OPERATION_ALU_L_XOR     ]._latence > 0) _function_execute[OPERATION_ALU_L_XOR     ] = &(operation_l_xor     );
+     if (_param->_timing[OPERATION_ALU_L_TEST_F  ]._latence > 0) _function_execute[OPERATION_ALU_L_TEST_F  ] = &(operation_l_test_f  );
+     if (_param->_timing[OPERATION_ALU_L_TEST_NF ]._latence > 0) _function_execute[OPERATION_ALU_L_TEST_NF ] = &(operation_l_test_nf );
+     if (_param->_timing[OPERATION_ALU_L_JALR    ]._latence > 0) _function_execute[OPERATION_ALU_L_JALR    ] = &(operation_l_jalr    );
+     if (_param->_timing[OPERATION_ALU_L_SLL     ]._latence > 0) _function_execute[OPERATION_ALU_L_SLL     ] = &(operation_l_sll     );
+     if (_param->_timing[OPERATION_ALU_L_SRA     ]._latence > 0) _function_execute[OPERATION_ALU_L_SRA     ] = &(operation_l_sra     );
+     if (_param->_timing[OPERATION_ALU_L_SRL     ]._latence > 0) _function_execute[OPERATION_ALU_L_SRL     ] = &(operation_l_srl     );
+     if (_param->_timing[OPERATION_ALU_L_ROR     ]._latence > 0) _function_execute[OPERATION_ALU_L_ROR     ] = &(operation_l_ror     );
+     if (_param->_timing[OPERATION_ALU_L_MOVHI   ]._latence > 0) _function_execute[OPERATION_ALU_L_MOVHI   ] = &(operation_l_movhi   );
+     if (_param->_timing[OPERATION_ALU_L_EXTEND_S]._latence > 0) _function_execute[OPERATION_ALU_L_EXTEND_S] = &(operation_l_extend_s);
+     if (_param->_timing[OPERATION_ALU_L_EXTEND_Z]._latence > 0) _function_execute[OPERATION_ALU_L_EXTEND_Z] = &(operation_l_extend_z);
+     if (_param->_timing[OPERATION_ALU_L_CMOV    ]._latence > 0) _function_execute[OPERATION_ALU_L_CMOV    ] = &(operation_l_cmov    ); 
+     if (_param->_timing[OPERATION_ALU_L_FF1     ]._latence > 0) _function_execute[OPERATION_ALU_L_FF1     ] = &(operation_l_ff1     ); 
+     if (_param->_timing[OPERATION_ALU_L_FL1     ]._latence > 0) _function_execute[OPERATION_ALU_L_FL1     ] = &(operation_l_fl1     ); 
+     if (_param->_timing[OPERATION_ALU_L_MFSPR   ]._latence > 0) _function_execute[OPERATION_ALU_L_MFSPR   ] = &(operation_l_mfspr   ); 
+     if (_param->_timing[OPERATION_ALU_L_MTSPR   ]._latence > 0) _function_execute[OPERATION_ALU_L_MTSPR   ] = &(operation_l_mtspr   ); 
+     if (_param->_timing[OPERATION_ALU_L_SFEQ    ]._latence > 0) _function_execute[OPERATION_ALU_L_SFEQ    ] = &(operation_l_sfeq    );
+     if (_param->_timing[OPERATION_ALU_L_SFNE    ]._latence > 0) _function_execute[OPERATION_ALU_L_SFNE    ] = &(operation_l_sfne    );
+     if (_param->_timing[OPERATION_ALU_L_SFGEU   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFGEU   ] = &(operation_l_sfgeu   );
+     if (_param->_timing[OPERATION_ALU_L_SFGTU   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFGTU   ] = &(operation_l_sfgtu   );
+     if (_param->_timing[OPERATION_ALU_L_SFLEU   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFLEU   ] = &(operation_l_sfleu   );
+     if (_param->_timing[OPERATION_ALU_L_SFLTU   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFLTU   ] = &(operation_l_sfltu   );
+     if (_param->_timing[OPERATION_ALU_L_SFGES   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFGES   ] = &(operation_l_sfges   );
+     if (_param->_timing[OPERATION_ALU_L_SFGTS   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFGTS   ] = &(operation_l_sfgts   );
+     if (_param->_timing[OPERATION_ALU_L_SFLES   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFLES   ] = &(operation_l_sfles   );
+     if (_param->_timing[OPERATION_ALU_L_SFLTS   ]._latence > 0) _function_execute[OPERATION_ALU_L_SFLTS   ] = &(operation_l_sflts   );
+     if (_param->_timing[OPERATION_ALU_L_MAC     ]._latence > 0) _function_execute[OPERATION_ALU_L_MAC     ] = &(operation_l_mac     ); 
+     if (_param->_timing[OPERATION_ALU_L_MACRC   ]._latence > 0) _function_execute[OPERATION_ALU_L_MACRC   ] = &(operation_l_macrc   ); 
+     if (_param->_timing[OPERATION_ALU_L_MSB     ]._latence > 0) _function_execute[OPERATION_ALU_L_MSB     ] = &(operation_l_msb     ); 
+
+
+#ifdef POSITION
+    _component->generate_file();
+#endif
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_deallocation.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_deallocation.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_deallocation.cpp	(revision 72)
@@ -0,0 +1,95 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::deallocation"
+  void Functionnal_unit::deallocation (void)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    if (_usage & USE_SYSTEMC)
+      {
+	delete    in_CLOCK ;
+	delete    in_NRESET;
+	
+	delete  in_EXECUTE_IN_VAL           ;
+	delete out_EXECUTE_IN_ACK           ;
+	if (_param->_have_port_context_id)
+	delete  in_EXECUTE_IN_CONTEXT_ID    ;
+	if (_param->_have_port_front_end_id)
+	delete  in_EXECUTE_IN_FRONT_END_ID  ;
+	if (_param->_have_port_ooo_engine_id)
+	delete  in_EXECUTE_IN_OOO_ENGINE_ID ;
+	if (_param->_have_port_packet_id)
+	delete  in_EXECUTE_IN_PACKET_ID     ;
+	delete  in_EXECUTE_IN_OPERATION     ;
+	delete  in_EXECUTE_IN_TYPE          ;
+	delete  in_EXECUTE_IN_HAS_IMMEDIAT  ;
+	delete  in_EXECUTE_IN_IMMEDIAT      ;
+	delete  in_EXECUTE_IN_DATA_RA       ;
+	delete  in_EXECUTE_IN_DATA_RB       ;
+	delete  in_EXECUTE_IN_DATA_RC       ;
+	delete  in_EXECUTE_IN_WRITE_RD      ;
+	delete  in_EXECUTE_IN_NUM_REG_RD    ;
+	delete  in_EXECUTE_IN_WRITE_RE      ;
+	delete  in_EXECUTE_IN_NUM_REG_RE    ;
+
+	delete out_EXECUTE_OUT_VAL            ;
+	delete  in_EXECUTE_OUT_ACK            ;
+	if (_param->_have_port_context_id)
+	delete out_EXECUTE_OUT_CONTEXT_ID     ; 
+	if (_param->_have_port_front_end_id)
+	delete out_EXECUTE_OUT_FRONT_END_ID   ; 
+	if (_param->_have_port_ooo_engine_id)
+	delete out_EXECUTE_OUT_OOO_ENGINE_ID  ; 
+	if (_param->_have_port_packet_id)
+	delete out_EXECUTE_OUT_PACKET_ID      ; 
+      //delete out_EXECUTE_OUT_OPERATION      ; 
+      //delete out_EXECUTE_OUT_TYPE           ; 
+	delete out_EXECUTE_OUT_WRITE_RD       ; 
+	delete out_EXECUTE_OUT_NUM_REG_RD     ; 
+	delete out_EXECUTE_OUT_DATA_RD        ; 
+	delete out_EXECUTE_OUT_WRITE_RE       ; 
+	delete out_EXECUTE_OUT_NUM_REG_RE     ; 
+	delete out_EXECUTE_OUT_DATA_RE        ;
+	delete out_EXECUTE_OUT_EXCEPTION      ;
+	delete out_EXECUTE_OUT_NO_SEQUENCE    ;
+	delete out_EXECUTE_OUT_ADDRESS        ;
+      }
+    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+
+    delete [] _execute_register;
+    delete    _execute_param;
+    delete    _execute_operation;
+    delete    _function_execute;
+
+    delete    _component;
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_end_cycle.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_end_cycle.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_end_cycle.cpp	(revision 72)
@@ -0,0 +1,49 @@
+#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::end_cycle"
+void Functionnal_unit::end_cycle ()
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+#ifdef STATISTICS
+    _stat->end_cycle();
+#endif    
+
+#ifdef VHDL_TESTBENCH
+    // Evaluation before read the ouput signal
+//  sc_start(0);
+    _interfaces->testbench();
+#endif
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_genMealy.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_genMealy.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_genMealy.cpp	(revision 72)
@@ -0,0 +1,46 @@
+#ifdef SYSTEMC
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::genMealy"
+  void Functionnal_unit::genMealy (void)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    bool execute_out_transaction = (PORT_READ(in_EXECUTE_OUT_ACK) and
+				    (reg_BUSY and (_execute_operation->_timing._latence == 0)));
+
+    internal_EXECUTE_IN_ACK = not reg_BUSY or (reg_BUSY and execute_out_transaction);
+
+    PORT_WRITE(out_EXECUTE_IN_ACK, internal_EXECUTE_IN_ACK);
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_genMoore.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_genMoore.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_genMoore.cpp	(revision 72)
@@ -0,0 +1,62 @@
+#ifdef SYSTEMC
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::genMealy"
+  void Functionnal_unit::genMoore (void)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    internal_EXECUTE_OUT_VAL = reg_BUSY and (_execute_operation->_timing._latence == 0);
+
+    PORT_WRITE(out_EXECUTE_OUT_VAL          , internal_EXECUTE_OUT_VAL);
+    if (_param->_have_port_context_id)
+    PORT_WRITE(out_EXECUTE_OUT_CONTEXT_ID   ,_execute_operation->_context_id   );
+    if (_param->_have_port_front_end_id)
+    PORT_WRITE(out_EXECUTE_OUT_FRONT_END_ID ,_execute_operation->_front_end_id );
+    if (_param->_have_port_ooo_engine_id)
+    PORT_WRITE(out_EXECUTE_OUT_OOO_ENGINE_ID,_execute_operation->_ooo_engine_id);
+    if (_param->_have_port_packet_id)
+    PORT_WRITE(out_EXECUTE_OUT_PACKET_ID    ,_execute_operation->_packet_id    );
+  //PORT_WRITE(out_EXECUTE_OUT_OPERATION    ,_execute_operation->_operation    );
+  //PORT_WRITE(out_EXECUTE_OUT_TYPE         ,_execute_operation->_type         );
+    PORT_WRITE(out_EXECUTE_OUT_WRITE_RD     ,_execute_operation->_write_rd     );
+    PORT_WRITE(out_EXECUTE_OUT_NUM_REG_RD   ,_execute_operation->_num_reg_rd   );
+    PORT_WRITE(out_EXECUTE_OUT_DATA_RD      ,_execute_operation->_data_rd      );
+    PORT_WRITE(out_EXECUTE_OUT_WRITE_RE     ,_execute_operation->_write_re     );
+    PORT_WRITE(out_EXECUTE_OUT_NUM_REG_RE   ,_execute_operation->_num_reg_re   );
+    PORT_WRITE(out_EXECUTE_OUT_DATA_RE      ,_execute_operation->_data_re      );
+    PORT_WRITE(out_EXECUTE_OUT_EXCEPTION    ,_execute_operation->_exception    );
+    PORT_WRITE(out_EXECUTE_OUT_NO_SEQUENCE  ,_execute_operation->_no_sequence  );
+    PORT_WRITE(out_EXECUTE_OUT_ADDRESS      ,_execute_operation->_address      );
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_statistics_declaration.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_statistics_declaration.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_statistics_declaration.cpp	(revision 72)
@@ -0,0 +1,58 @@
+#ifdef STATISTICS
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::statistics_declaration"
+  void Functionnal_unit::statistics_declaration (morpheo::behavioural::Parameters_Statistics * param_statistics)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    _stat = new Stat (static_cast<string>(_name),
+		      "Functionnal_unit",
+		      param_statistics);
+
+    _stat_use_functionnal_unit         = _stat->create_variable("use_functionnal_unit");
+    _stat_average_use_functionnal_unit = _stat->create_counter ("average_use_functionnal_unit", "" , "Average by cycle of the functionnal_unit occupation.");
+    _stat_percent_use_functionnal_unit = _stat->create_counter ("percent_use_functionnal_unit", "%", "Percent of functionnal_unit usage.");
+
+    _stat->create_expr("average_use_functionnal_unit", "/ use_functionnal_unit cycle"      , false);
+    _stat->create_expr("percent_use_functionnal_unit", "* average_use_functionnal_unit 100", false);
+
+    _stat_sum_delay                    = _stat->create_variable("sum_delay");
+    _stat_average_delay                = _stat->create_counter ("average_delay"               , "" , "Average by operation of the delay.");
+    _stat_sum_latence                  = _stat->create_variable("sum_latence");
+    _stat_average_latence              = _stat->create_counter ("average_latence"             , "" , "Average by operation of the latence.");
+
+    _stat->create_expr("average_delay"               , "/ sum_delay   use_functionnal_unit", false);
+    _stat->create_expr("average_latence"             , "/ sum_latence use_functionnal_unit", false);
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_statistics_print.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_statistics_print.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_statistics_print.cpp	(revision 72)
@@ -0,0 +1,43 @@
+#ifdef STATISTICS
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::statistics_print"
+  std::string Functionnal_unit::statistics_print (uint32_t depth)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    std::string txt = _stat->print(depth);
+    
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+
+    return txt;
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_transition.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_transition.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_transition.cpp	(revision 72)
@@ -0,0 +1,164 @@
+#ifdef SYSTEMC
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::transition"
+  void Functionnal_unit::transition (void)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    if (PORT_READ(in_NRESET) == 0)
+      {
+	reg_BUSY = false;
+	
+	for (uint32_t i=0; i<_param->_nb_context; i++)
+	  for (uint32_t j=0; j<_param->_nb_front_end; j++)
+	    for (uint32_t k=0; k<_param->_nb_ooo_engine; k++)
+	      {
+		uint32_t num_thread = 0;
+		
+		for (uint32_t x=GROUP_CUSTOM_1; x<GROUP_CUSTOM_8; x++)
+		  {
+		    function_execute_end_cycle_t * fct = (_param->_get_custom_information(num_thread)._get_custom_execute_reset(x));
+		    
+		    if (fct != NULL)
+		      (* fct) (_execute_register[i][j][k], _execute_param);
+		  }
+	      }
+      }
+    else
+      {
+	// Test if pop
+	if (internal_EXECUTE_OUT_VAL and PORT_READ(in_EXECUTE_OUT_ACK))
+	  {
+	    // transaction
+	    reg_BUSY = false;
+	  }
+	
+	// Test if push
+	execute_register_t * execute_register = NULL;
+
+	if (PORT_READ(in_EXECUTE_IN_VAL) and internal_EXECUTE_IN_ACK)
+	  {
+	    reg_BUSY = true;
+
+	    Tcontext_t context_id    = (_param->_have_port_context_id   )?PORT_READ(in_EXECUTE_IN_CONTEXT_ID   ):0;
+	    Tcontext_t front_end_id  = (_param->_have_port_front_end_id )?PORT_READ(in_EXECUTE_IN_FRONT_END_ID ):0;
+	    Tcontext_t ooo_engine_id = (_param->_have_port_ooo_engine_id)?PORT_READ(in_EXECUTE_IN_OOO_ENGINE_ID):0;
+	    Tcontext_t packet_id     = (_param->_have_port_packet_id    )?PORT_READ(in_EXECUTE_IN_PACKET_ID    ):0;
+	    Toperation_t operation = PORT_READ(in_EXECUTE_IN_OPERATION);
+
+	    _execute_operation->_context_id    = context_id   ;
+	    _execute_operation->_front_end_id  = front_end_id ;
+	    _execute_operation->_ooo_engine_id = ooo_engine_id;
+	    _execute_operation->_packet_id     = packet_id    ;
+	    _execute_operation->_operation     = operation    ;
+	    _execute_operation->_type          = PORT_READ(in_EXECUTE_IN_TYPE        );
+	    _execute_operation->_has_immediat  = PORT_READ(in_EXECUTE_IN_HAS_IMMEDIAT);
+	    _execute_operation->_immediat      = PORT_READ(in_EXECUTE_IN_IMMEDIAT    );
+	    _execute_operation->_data_ra       = PORT_READ(in_EXECUTE_IN_DATA_RA     );
+	    _execute_operation->_data_rb       = PORT_READ(in_EXECUTE_IN_DATA_RB     );
+	    _execute_operation->_data_rc       = PORT_READ(in_EXECUTE_IN_DATA_RC     );
+	    _execute_operation->_write_rd      = PORT_READ(in_EXECUTE_IN_WRITE_RD    );
+	    _execute_operation->_num_reg_rd    = PORT_READ(in_EXECUTE_IN_NUM_REG_RD  );
+	    _execute_operation->_write_re      = PORT_READ(in_EXECUTE_IN_WRITE_RE    );
+	    _execute_operation->_num_reg_re    = PORT_READ(in_EXECUTE_IN_NUM_REG_RE  );
+
+#ifdef DEBUG_TEST
+	    if (operation >= MAX_OPERATION)
+	      throw ERRORMORPHEO(FUNCTION,"Invalid operation : '"+toString(operation)+"' is higher that MAX_OPERATION");
+#endif
+
+	    // execute the operation
+ 	    execute_register = _execute_register[context_id][front_end_id][ooo_engine_id];
+
+	    // Test if operation is a custom
+	    if ((operation == OPERATION_CUSTOM_L_1) or
+		(operation == OPERATION_CUSTOM_L_2) or
+		(operation == OPERATION_CUSTOM_L_3) or
+		(operation == OPERATION_CUSTOM_L_4) or
+		(operation == OPERATION_CUSTOM_L_5) or
+		(operation == OPERATION_CUSTOM_L_6) or
+		(operation == OPERATION_CUSTOM_L_7) or
+		(operation == OPERATION_CUSTOM_L_8))
+	      {
+		uint32_t num_thread = 0;
+
+		(*(_param->_get_custom_information(num_thread)._get_custom_execute_genMoore(operation))) (_execute_operation, execute_register, _execute_param);
+	      }
+	    else
+	      (*(_function_execute[operation])) (_execute_operation, execute_register, _execute_param);
+
+
+#ifdef STATISTICS
+            (*_stat_use_functionnal_unit) ++;
+	    (*_stat_sum_delay)   += _execute_operation->_timing._delay;
+	    (*_stat_sum_latence) += _execute_operation->_timing._latence;
+#endif
+	  }
+	
+	// End cycle
+	{
+	  for (uint32_t i=0; i<_param->_nb_context; i++)
+	    for (uint32_t j=0; j<_param->_nb_front_end; j++)
+	      for (uint32_t k=0; k<_param->_nb_ooo_engine; k++)
+		{
+		  uint32_t num_thread = 0;
+		  
+		  for (uint32_t x=GROUP_CUSTOM_1; x<GROUP_CUSTOM_8; x++)
+		    {
+		      function_execute_end_cycle_t * fct = (_param->_get_custom_information(num_thread)._get_custom_execute_transition(x));
+		      
+		      if (fct != NULL)
+			(* fct) (_execute_register[i][j][k], _execute_param);
+		    }
+		}
+
+	  // Update status
+	  if (execute_register != NULL)
+	    {
+	      // They have an access
+	      execute_register->_i_write_spr = false;
+	      execute_register->_i_read_spr  = false;
+	    }
+	}
+      }
+
+    // each cycle : decrease the latence
+    if (reg_BUSY and (_execute_operation->_timing._latence > 0))
+      _execute_operation->_timing._latence --;
+
+#if defined(STATISTICS) or defined(VHDL_TESTBENCH)
+    end_cycle ();
+#endif
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl.cpp	(revision 72)
@@ -0,0 +1,52 @@
+#ifdef VHDL
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+#include "Behavioural/include/Vhdl.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::vhdl"
+  void Functionnal_unit::vhdl (void)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    Vhdl * vhdl = new Vhdl (_name);
+
+    _interfaces->set_port(vhdl);
+    _component->vhdl_instance(vhdl);
+
+    vhdl_declaration (vhdl);
+    vhdl_body        (vhdl);
+
+    vhdl->generate_file();
+
+    delete vhdl;
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl_body.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl_body.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl_body.cpp	(revision 72)
@@ -0,0 +1,39 @@
+#ifdef VHDL
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::vhdl_body"
+  void Functionnal_unit::vhdl_body (Vhdl * & vhdl)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+    vhdl->set_body ("");
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl_declaration.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl_declaration.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Functionnal_unit_vhdl_declaration.cpp	(revision 72)
@@ -0,0 +1,38 @@
+#ifdef VHDL
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Functionnal_unit.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::vhdl_declaration"
+  void Functionnal_unit::vhdl_declaration (Vhdl * & vhdl)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Operation.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Operation.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Operation.cpp	(revision 72)
@@ -0,0 +1,836 @@
+#ifdef SYSTEMC
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Operation.h"
+
+#define neg(data)                  (~(data)+1)
+#define sign(data)                 ((data)>>(param->_size_data-1))
+#define unsigned(data)             (data)
+#define signed(data)               ((sign(data)==0)?(data):neg(data))
+#define ovf(op1, op2, res)         ((sign(op1) == sign(op2))?(sign(op1) xor sign(res)):0)
+#define carry(op1, op2, res)       (((res)<(op1)) or ((res)<(op2)))
+#define set_flag(data,flag,is_set) (((is_set)==1)?((data)|(flag)):((data)&~(flag)))
+#define get_flag(data,flag)	   (((data)&(flag))!=0)
+#define concatenation_bool(a,b)    (((a)<<1) | (b))
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_unimplemented"
+  void operation_unimplemented (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : unimplemented");
+
+    throw ERRORMORPHEO(FUNCTION,"The operation '"+toString(op->_operation)+"' is not implemented in this Functionnal_unit");
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_add"
+  void operation_l_add         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_add");
+
+    Tgeneral_data_t gpr1      = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2      = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    
+    Tgeneral_data_t gpr3      = param->_mask_data & (gpr1 + gpr2);
+
+    bool            overflow  = ovf  (gpr1,gpr2,gpr3);
+    bool            carry_out = carry(gpr1,gpr2,gpr3);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+    op->_data_re      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_OV,overflow );
+    op->_data_re      = set_flag(op->_data_re,FLAG_CY,carry_out);
+    op->_exception    = (overflow==1)?EXCEPTION_ALU_RANGE:EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_addc"
+  void operation_l_addc        (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_addc");
+
+    Tgeneral_data_t carry_in   = get_flag(op->_data_rc,FLAG_CY);
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = param->_mask_data & (gpr1 + gpr2 + carry_in);
+
+    bool            overflow   = ovf  (gpr1,gpr2,gpr3);
+    bool            carry_out  = carry(gpr1,gpr2,gpr3);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+    op->_data_re      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_OV,overflow );
+    op->_data_re      = set_flag(op->_data_re,FLAG_CY,carry_out);
+    op->_exception    = (overflow==1)?EXCEPTION_ALU_RANGE:EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sub"
+  void operation_l_sub         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sub");
+
+    Tgeneral_data_t gpr1      =     unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2      = neg(unsigned(op->_data_rb));
+    Tgeneral_data_t gpr3      = param->_mask_data & (gpr1 + gpr2);
+
+    bool            overflow  = ovf  (gpr1,gpr2,gpr3);
+    bool            carry_out = carry(gpr1,gpr2,gpr3);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+    op->_data_re      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_OV,overflow );
+    op->_data_re      = set_flag(op->_data_re,FLAG_CY,carry_out);
+    op->_exception    = (overflow==1)?EXCEPTION_ALU_RANGE:EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_and"
+  void operation_l_and         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_and");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = (gpr1 & gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_or"
+  void operation_l_or          (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_or");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = (gpr1 | gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_xor"
+  void operation_l_xor         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_xor");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = (gpr1 ^ gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_movhi"
+  void operation_l_movhi       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_movhi");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_immediat);
+    Tgeneral_data_t gpr2       = param->_mask_data & (gpr1<<16);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr2;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_cmov"
+  void operation_l_cmov        (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_cmov");
+
+    Tgeneral_data_t f_in       = get_flag(op->_data_rc,FLAG_F);
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned(op->_data_rb);
+    Tgeneral_data_t gpr3       = ((f_in==0)?gpr2:gpr1);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_test_f"
+  void operation_l_test_f      (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_test_f");
+
+    Tgeneral_data_t f_in       = get_flag(op->_data_rc,FLAG_F);
+    Tgeneral_data_t imm        = unsigned(op->_immediat);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = f_in != 0;
+    op->_address      = imm;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_test_nf"
+  void operation_l_test_nf     (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_test_nf");
+
+    Tgeneral_data_t f_in       = get_flag(op->_data_rc,FLAG_F);
+    Tgeneral_data_t imm        = unsigned(op->_immediat);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = f_in == 0;
+    op->_address      = imm;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_jalr"
+  void operation_l_jalr        (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_jalr");
+    // jal  : has_imm = 1, write_rd = 1, read_rb = 0
+    // jalr : has_imm = 1, write_rd = 1, read_rb = 1
+    // jr   : has_imm = 0, write_rd = 0, read_rb = 1
+
+
+    Tgeneral_data_t gpr        = unsigned(op->_data_rb);
+    Tgeneral_data_t imm        = unsigned(op->_immediat);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = imm;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 1;
+    op->_address      = gpr;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_extend_s"
+  void operation_l_extend_s    (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_extend_s");
+
+    Tgeneral_data_t imm        = unsigned(op->_immediat);
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = extend<Tgeneral_data_t>(param->_size_data, gpr1, true , imm);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr2;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_extend_z"
+  void operation_l_extend_z    (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_extend_z");
+
+    Tgeneral_data_t imm        = unsigned(op->_immediat);
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = extend<Tgeneral_data_t>(param->_size_data, gpr1, false , imm);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr2;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sll"
+  void operation_l_sll         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sll");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = shift_logic_left<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_srl"
+  void operation_l_srl         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_srl");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = shift_logic_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sra"
+  void operation_l_sra         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sra");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = shift_arithmetic_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_ror"
+  void operation_l_ror         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_ror");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = param->_mask_shift & unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    Tgeneral_data_t gpr3       = rotate_right<Tgeneral_data_t>(param->_size_data, gpr1, gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr3;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_ff1"
+  void operation_l_ff1         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_ff1");
+
+    Tgeneral_data_t gpr        = unsigned(op->_data_ra);
+    Tgeneral_data_t index;
+
+    for (index=0; (index<param->_size_data) and (((gpr>>index)&1)!= 1); index++);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = (index==param->_size_data)?0:(index+1);
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_fl1"
+  void operation_l_fl1         (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_fl1");
+
+    Tgeneral_data_t gpr        = unsigned(op->_data_ra);
+    Tgeneral_data_t index;
+
+    for (index=param->_size_data; (index>0) and (((gpr>>(index-1))&1)!= 1); index--);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = index;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfeq"
+  void operation_l_sfeq        (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfeq");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+
+    bool            f_out      = (gpr1 == gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfne"
+  void operation_l_sfne        (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfne");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+
+    bool            f_out      = (gpr1 != gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfgeu"
+  void operation_l_sfgeu       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfgeu");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+
+    bool            f_out      = (gpr1 >= gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfgtu"
+  void operation_l_sfgtu       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfgtu");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+
+    bool            f_out      = (gpr1 >  gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfleu"
+  void operation_l_sfleu       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfleu");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+
+    bool            f_out      = (gpr1 <= gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfltu"
+  void operation_l_sfltu       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfltu");
+
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+
+    bool            f_out      = (gpr1 <  gpr2);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfges"
+  void operation_l_sfges       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfges");
+
+    Tgeneral_data_t gpr1       =   op->_data_ra;
+    Tgeneral_data_t gpr2       =   (op->_has_immediat==1)?op->_immediat:op->_data_rb;
+    
+    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ra  : %.8x",unsigned(op->_data_ra));
+    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_ras : %.8x",  signed(op->_data_ra));
+    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rb  : %.8x",unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb));
+    log_printf(TRACE,Functionnal_unit,FUNCTION," * data_rbs : %.8x",  signed((op->_has_immediat==1)?op->_immediat:op->_data_rb));
+    
+    bool            f_out;
+
+    switch (concatenation_bool(sign(gpr1),sign(gpr2)))
+      {
+      case 1 /*b01*/ : f_out = 1                               ; break;
+      case 2 /*b10*/ : f_out = 0                               ; break;
+      default        : f_out = signed(gpr1) >= signed(gpr2); break;
+      }
+
+    log_printf(TRACE,Functionnal_unit,FUNCTION," * f_out    : %.8x",f_out);
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfgts"
+  void operation_l_sfgts       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfgts");
+
+    Tgeneral_data_t gpr1       = op->_data_ra ;
+    Tgeneral_data_t gpr2       = (op->_has_immediat==1)?op->_immediat:op->_data_rb ;
+
+    bool            f_out;
+
+    switch (concatenation_bool(sign(gpr1),sign(gpr2)))
+      {
+      case 1 /*b01*/ : f_out = 1; break;
+      case 2 /*b10*/ : f_out = 0; break;
+      default        : f_out = signed(gpr1) >  signed(gpr2); break;
+      }
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sfles"
+  void operation_l_sfles       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sfles");
+
+    Tgeneral_data_t gpr1       = op->_data_ra ;
+    Tgeneral_data_t gpr2       = (op->_has_immediat==1)?op->_immediat:op->_data_rb ;
+
+    bool            f_out;
+
+    switch (concatenation_bool(sign(gpr1),sign(gpr2)))
+      {
+      case 1 /*b01*/ : f_out = 0; break;
+      case 2 /*b10*/ : f_out = 1; break;
+      default        : f_out = signed(gpr1) <= signed(gpr2); break;
+      }
+    
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_sflts"
+  void operation_l_sflts       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_sflts");
+
+    Tgeneral_data_t gpr1       = op->_data_ra ;
+    Tgeneral_data_t gpr2       = (op->_has_immediat==1)?op->_immediat:op->_data_rb;
+
+    bool            f_out;
+
+    switch (concatenation_bool(sign(gpr1),sign(gpr2)))
+      {
+      case 1 /*b01*/ : f_out = 0; break;
+      case 2 /*b10*/ : f_out = 1; break;
+      default        : f_out = signed(gpr1) <  signed(gpr2); break;
+      }
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+    op->_data_re      = set_flag(op->_data_re,FLAG_F,f_out);
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_mtspr"
+  void operation_l_mtspr       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mtspr");
+
+    Tgeneral_data_t imm        = unsigned(op->_immediat);
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = unsigned(op->_data_rb);
+    Tgeneral_data_t addr       = range<Tgeneral_data_t>(gpr1|imm,16);
+
+    Texception_t    exception;
+
+    // HACK : use the field num_reg_re to pass the SM and SUMRA flag.
+    Tcontrol_t      flag_SM    = get_flag(op->_num_reg_re, 0x1);
+    Tcontrol_t      flag_SUMRA = get_flag(op->_num_reg_re, 0x2);
+
+    spr_address_t   spr_addr   = reg->_spr_access_mode->translate_address(addr);
+    
+    // Test if this group is implemented in this functionnal_unit
+    if (reg->_spr_access_mode->valid(spr_addr))
+      {
+	if (reg->_spr_access_mode->write(spr_addr, flag_SM, flag_SUMRA))
+	  {
+	    reg->_i_write_spr         = true;
+	    reg->_access_num_group    = spr_addr._group;
+	    reg->_access_num_register = spr_addr._register;
+	    reg->_spr_old             = reg->_spr[spr_addr._group][spr_addr._register];
+	    reg->_spr[spr_addr._group][spr_addr._register] = gpr2;
+
+	    exception = EXCEPTION_ALU_NONE;
+	  }
+	else
+	  {
+	    exception = EXCEPTION_ALU_SPR_ACCESS_INVALID;
+	  }
+      }
+    else
+      {
+	exception = EXCEPTION_ALU_SPR_ACCESS_NOT_COMPLETE;
+      }
+    
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr2; // data_rb
+  //op->_data_re      = 0;
+    op->_exception    = exception;
+    op->_no_sequence  = 0;
+    op->_address      = addr; // data_ra or imm
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_mfspr"
+  void operation_l_mfspr       (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mfspr");
+
+    Tgeneral_data_t imm        = unsigned(op->_immediat);
+    Tgeneral_data_t gpr1       = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2       = 0;
+    Tgeneral_data_t addr       = range<Tgeneral_data_t>(gpr1|imm,16);
+
+    Texception_t    exception;
+
+    // HACK : use the field num_reg_re to pass the SM and SUMRA flag.
+    Tcontrol_t      flag_SM    = get_flag(op->_num_reg_re, 0x1);
+    Tcontrol_t      flag_SUMRA = get_flag(op->_num_reg_re, 0x2);
+
+    spr_address_t   spr_addr   = reg->_spr_access_mode->translate_address(addr);
+    
+    // Test if this group is implemented in this functionnal_unit
+    if (reg->_spr_access_mode->valid(spr_addr))
+      {
+	if (reg->_spr_access_mode->read(spr_addr, flag_SM, flag_SUMRA))
+	  {
+	    reg->_i_read_spr          = true;
+	    reg->_access_num_group    = spr_addr._group;
+	    reg->_access_num_register = spr_addr._register;
+	    
+	    gpr2 = reg->_spr[spr_addr._group][spr_addr._register];
+
+	    exception = EXCEPTION_ALU_NONE;
+	  }
+	else
+	  {
+	    exception = EXCEPTION_ALU_SPR_ACCESS_INVALID;
+	  }
+      }
+    else
+      {
+	exception = EXCEPTION_ALU_SPR_ACCESS_NOT_COMPLETE;
+      }
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_write_rd     = (exception == EXCEPTION_ALU_NONE);
+    op->_data_rd      = gpr2; // spr
+  //op->_data_re      = 0;
+    op->_exception    = exception;
+    op->_no_sequence  = 0;
+    op->_address      = addr; // data_ra or imm
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_macrc"
+  void operation_l_macrc        (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_macrc");
+
+    Tgeneral_data_t gpr = static_cast<Tgeneral_data_t>(range<uint64_t>((static_cast<uint64_t>(reg->_spr[GROUP_MAC][SPR_MACHI]) << 32) | static_cast<uint64_t>(reg->_spr[GROUP_MAC][SPR_MACLO]), param->_size_data));
+
+    reg->_spr[GROUP_MAC][SPR_MACLO] = 0;
+    reg->_spr[GROUP_MAC][SPR_MACHI] = 0;
+
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+    op->_data_rd      = gpr;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_mac"
+  void operation_l_mac          (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_mac");
+
+    Tgeneral_data_t gpr1 = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2 = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    uint64_t        temp = range<uint64_t>(gpr1 * gpr2, 32);
+
+    temp = ((static_cast<uint64_t>(reg->_spr[GROUP_MAC][SPR_MACHI]) << 32) | static_cast<uint64_t>(reg->_spr[GROUP_MAC][SPR_MACLO])) + temp;
+
+    reg->_spr[GROUP_MAC][SPR_MACLO] = range<Tgeneral_data_t>(temp    ,32);
+    reg->_spr[GROUP_MAC][SPR_MACHI] = range<Tgeneral_data_t>(temp>>32,32);
+    
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operation_l_msb"
+  void operation_l_msb          (execute_operation_t * op, execute_register_t * reg, execute_param_t * param)
+  {
+    log_printf(TRACE,Functionnal_unit,FUNCTION,"Operation : l_msb");
+
+    Tgeneral_data_t gpr1 = unsigned(op->_data_ra);
+    Tgeneral_data_t gpr2 = unsigned((op->_has_immediat==1)?op->_immediat:op->_data_rb);
+    uint64_t        temp = range<uint64_t>(gpr1 * gpr2, 32);
+
+    temp = ((static_cast<uint64_t>(reg->_spr[GROUP_MAC][SPR_MACHI]) << 32) | static_cast<uint64_t>(reg->_spr[GROUP_MAC][SPR_MACLO])) - temp;
+
+    reg->_spr[GROUP_MAC][SPR_MACLO] = range<Tgeneral_data_t>(temp    ,32);
+    reg->_spr[GROUP_MAC][SPR_MACHI] = range<Tgeneral_data_t>(temp>>32,32);
+    
+    // Result
+    op->_timing       = param->_timing[op->_operation];
+  //op->_data_rd      = 0;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters.cpp	(revision 72)
@@ -0,0 +1,127 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Parameters.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::Parameters"
+  Parameters::Parameters (uint32_t           nb_context         ,
+			  uint32_t           nb_front_end       ,
+			  uint32_t           nb_ooo_engine      ,
+			  uint32_t           nb_packet          ,
+			  uint32_t           size_general_data  ,
+			  uint32_t           nb_general_register,
+			  uint32_t           size_special_data  ,
+			  uint32_t           nb_special_register,
+			  uint32_t           nb_operation       ,
+			  uint32_t           nb_type            ,
+			  execute_timing_t * timing             ,
+			  morpheo::behavioural::custom::custom_information_t (*get_custom_information) (uint32_t)) :
+    _nb_context              (nb_context            ),
+    _nb_front_end            (nb_front_end          ),
+    _nb_ooo_engine           (nb_ooo_engine         ),
+    _nb_packet               (nb_packet             ),
+    _size_general_data       (size_general_data     ),
+    _nb_general_register     (nb_general_register   ),
+    _size_special_data       (size_special_data     ),
+    _nb_special_register     (nb_special_register   ),
+    _nb_operation            (nb_operation          ),
+    _nb_type                 (nb_type               ),
+    _timing                  (timing                ),
+    
+    _size_context_id         (log2(nb_context      )),
+    _size_front_end_id       (log2(nb_front_end    )),
+    _size_ooo_engine_id      (log2(nb_ooo_engine   )),
+    _size_packet_id          (log2(nb_packet       )),
+    _size_general_register   (log2(_size_general_register)),
+    _size_special_register   (log2(_size_special_register)),
+    _size_operation          (log2(_size_operation       )),
+    _size_type               (log2(_size_type            )),
+
+    _have_port_context_id    (_size_context_id    > 0),
+    _have_port_front_end_id  (_size_front_end_id  > 0),
+    _have_port_ooo_engine_id (_size_ooo_engine_id > 0),
+    _have_port_packet_id     (_size_packet_id     > 0),
+
+    _have_groupe_MAC         ( (_timing[OPERATION_ALU_L_MAC  ]._latence > 0) or
+			       (_timing[OPERATION_ALU_L_MACRC]._latence > 0) or
+			       (_timing[OPERATION_ALU_L_MSB  ]._latence > 0))
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    _get_custom_information = get_custom_information;
+
+    test();
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+  
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::Parameters (copy)"
+  Parameters::Parameters (Parameters & param):
+    _nb_context              (param._nb_context             ),
+    _nb_front_end            (param._nb_front_end           ),
+    _nb_ooo_engine           (param._nb_ooo_engine          ),
+    _nb_packet               (param._nb_packet              ),
+    _size_general_data       (param._size_general_data      ),
+    _nb_general_register     (param._nb_general_register    ),
+    _size_special_data       (param._size_special_data      ),
+    _nb_special_register     (param._nb_special_register    ),
+    _nb_operation            (param._nb_operation           ),
+    _nb_type                 (param._nb_type                ),
+    _timing                  (param._timing                 ),
+
+    _size_context_id         (param._size_context_id        ),
+    _size_front_end_id       (param._size_front_end_id      ),
+    _size_ooo_engine_id      (param._size_ooo_engine_id     ),
+    _size_packet_id          (param._size_packet_id         ),
+    _size_general_register   (param._size_general_register  ),
+    _size_special_register   (param._size_special_register  ),
+    _size_operation          (param._size_operation         ),
+    _size_type               (param._size_type              ),
+
+    _have_port_context_id    (param._have_port_context_id   ),
+    _have_port_front_end_id  (param._have_port_front_end_id ),
+    _have_port_ooo_engine_id (param._have_port_ooo_engine_id),
+    _have_port_packet_id     (param._have_port_packet_id    ),
+
+    _have_groupe_MAC         (param._have_groupe_MAC        )
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    _get_custom_information = param._get_custom_information;
+
+    test();
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::~Parameters"
+  Parameters::~Parameters () 
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters_msg_error.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters_msg_error.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters_msg_error.cpp	(revision 72)
@@ -0,0 +1,51 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/include/Types.h"
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Parameters.h"
+#include <sstream>
+
+namespace morpheo                    {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::msg_error"
+  std::string Parameters::msg_error(void)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    std::string msg = "";
+
+    for (uint32_t i=0; i<MAX_OPERATION; i++)
+      if (_timing->_delay != _timing->_latence)
+	msg = "  - For the operation '"+toString(i)+"', the delay and the latence must be equal.";
+
+    if (_have_groupe_MAC and ((_timing[OPERATION_ALU_L_MAC  ]._latence == 0) or
+			      (_timing[OPERATION_ALU_L_MACRC]._latence == 0) or
+			      (_timing[OPERATION_ALU_L_MSB  ]._latence == 0)))
+      msg = "  - The functionnal unit implement a MAC unit, the latence to operation OPERATION_ALU_L_MAC, OPERATION_ALU_L_MACRC and OPERATION_ALU_L_MSB must be higher than 0.";
+
+    return msg;
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters_print.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters_print.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/src/Parameters_print.cpp	(revision 72)
@@ -0,0 +1,67 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Functionnal_unit/include/Parameters.h"
+#include "Behavioural/include/XML.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace core {
+namespace multi_execute_loop {
+namespace execute_loop {
+namespace multi_execute_unit {
+namespace execute_unit {
+namespace functionnal_unit {
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::print"
+  std::string Parameters::print (uint32_t depth)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    XML xml ("functionnal_unit");
+
+    xml.balise_open("functionnal_unit");
+    xml.singleton_begin("nb_context         "); xml.attribut("value",toString(_nb_context         )); xml.singleton_end();
+    xml.singleton_begin("nb_front_end       "); xml.attribut("value",toString(_nb_front_end       )); xml.singleton_end();
+    xml.singleton_begin("nb_ooo_engine      "); xml.attribut("value",toString(_nb_ooo_engine      )); xml.singleton_end();
+    xml.singleton_begin("nb_packet          "); xml.attribut("value",toString(_nb_packet          )); xml.singleton_end();
+    xml.singleton_begin("size_general_data  "); xml.attribut("value",toString(_size_general_data  )); xml.singleton_end();
+    xml.singleton_begin("nb_general_register"); xml.attribut("value",toString(_nb_general_register)); xml.singleton_end();
+    xml.singleton_begin("size_special_data  "); xml.attribut("value",toString(_size_special_data  )); xml.singleton_end();
+    xml.singleton_begin("nb_special_register"); xml.attribut("value",toString(_nb_special_register)); xml.singleton_end();
+    xml.singleton_begin("nb_operation       "); xml.attribut("value",toString(_nb_operation       )); xml.singleton_end();
+    xml.singleton_begin("nb_type            "); xml.attribut("value",toString(_nb_type            )); xml.singleton_end();
+    xml.balise_close();
+
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+    
+    return xml.get_body(depth);
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Functionnal_unit::operator<<"
+  std::ostream& operator<< (std::ostream& output_stream ,
+			    morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::Parameters & x)
+  {
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"Begin");
+
+    output_stream << x.print(0);
+    
+    log_printf(FUNC,Functionnal_unit,FUNCTION,"End");
+
+    return output_stream;
+  };
+
+}; // end namespace functionnal_unit
+}; // end namespace execute_unit
+}; // end namespace multi_execute_unit
+}; // end namespace execute_loop
+}; // end namespace multi_execute_loop
+}; // end namespace core
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/include/Memory.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/include/Memory.h	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/include/Memory.h	(revision 72)
@@ -79,11 +79,11 @@
     morpheo::behavioural::Tdcache_data_t rdata;
 
-    if (type == DCACHE_LOAD)
+    if (type == DCACHE_TYPE_LOAD)
       rdata = read  (context, address, type);
     else
-      if ((type == DCACHE_STORE_8 ) or
-	  (type == DCACHE_STORE_16) or
-	  (type == DCACHE_STORE_32) or
-	  (type == DCACHE_STORE_64) )
+      if ((type == DCACHE_TYPE_STORE_8 ) or
+	  (type == DCACHE_TYPE_STORE_16) or
+	  (type == DCACHE_TYPE_STORE_32) or
+	  (type == DCACHE_TYPE_STORE_64) )
 	rdata = write (context, address, type, data);
       else
@@ -186,7 +186,7 @@
     // 3   24
 
-    uint32_t memory_size = ((type==DCACHE_STORE_16)?MEMORY_SIZE_16:
-			    ((type==DCACHE_STORE_32)?MEMORY_SIZE_32:
-			     ((type==DCACHE_STORE_64 )?MEMORY_SIZE_64:MEMORY_SIZE_8)));
+    uint32_t memory_size = ((type==DCACHE_TYPE_STORE_16)?MEMORY_SIZE_16:
+			    ((type==DCACHE_TYPE_STORE_32)?MEMORY_SIZE_32:
+			     ((type==DCACHE_TYPE_STORE_64 )?MEMORY_SIZE_64:MEMORY_SIZE_8)));
 
     uint32_t index_min = LSB<<3; // *8
@@ -265,14 +265,14 @@
 	switch(i->_type)
 	  {
-	  case DCACHE_LOAD            : std::cout << "DCACHE_LOAD           "; break;
-	  case DCACHE_LOCK            : std::cout << "DCACHE_LOCK           "; break;
-	  case DCACHE_INVALIDATE      : std::cout << "DCACHE_INVALIDATE     "; break;
-	  case DCACHE_PREFETCH        : std::cout << "DCACHE_PREFETCH       "; break;
-	  case DCACHE_FLUSH           : std::cout << "DCACHE_FLUSH          "; break;
-	  case DCACHE_SYNCHRONIZATION : std::cout << "DCACHE_SYNCHRONIZATION"; break;
-	  case DCACHE_STORE_8         : std::cout << "DCACHE_STORE_8        "; break;
-	  case DCACHE_STORE_16        : std::cout << "DCACHE_STORE_16       "; break;
-	  case DCACHE_STORE_32        : std::cout << "DCACHE_STORE_32       "; break;
-	  case DCACHE_STORE_64        : std::cout << "DCACHE_STORE_64       "; break;
+	  case DCACHE_TYPE_LOAD            : std::cout << "DCACHE_TYPE_LOAD           "; break;
+	  case DCACHE_TYPE_LOCK            : std::cout << "DCACHE_TYPE_LOCK           "; break;
+	  case DCACHE_TYPE_INVALIDATE      : std::cout << "DCACHE_TYPE_INVALIDATE     "; break;
+	  case DCACHE_TYPE_PREFETCH        : std::cout << "DCACHE_TYPE_PREFETCH       "; break;
+	  case DCACHE_TYPE_FLUSH           : std::cout << "DCACHE_TYPE_FLUSH          "; break;
+	  case DCACHE_TYPE_SYNCHRONIZATION : std::cout << "DCACHE_TYPE_SYNCHRONIZATION"; break;
+	  case DCACHE_TYPE_STORE_8         : std::cout << "DCACHE_TYPE_STORE_8        "; break;
+	  case DCACHE_TYPE_STORE_16        : std::cout << "DCACHE_TYPE_STORE_16       "; break;
+	  case DCACHE_TYPE_STORE_32        : std::cout << "DCACHE_TYPE_STORE_32       "; break;
+	  case DCACHE_TYPE_STORE_64        : std::cout << "DCACHE_TYPE_STORE_64       "; break;
 	  }
 	std::cout << " - "
@@ -294,15 +294,15 @@
   Memory_t * memory = new Memory_t (_nb_context, _nb_word, _size_word);
   
-  memory -> access (2, 0x10, DCACHE_STORE_32, 0xdeadbeef);
-  memory -> access (2, 0x14, DCACHE_STORE_16, 0xdada5678);
-  memory -> access (2, 0x16, DCACHE_STORE_16, 0xbead1234);
-  memory -> access (2, 0x18, DCACHE_STORE_8 , 0x45675681);
-  memory -> access (2, 0x19, DCACHE_STORE_8 , 0x1f311219);
-  memory -> access (2, 0x1a, DCACHE_STORE_8 , 0x2e075607);
-  memory -> access (2, 0x1b, DCACHE_STORE_8 , 0x19811221);
-  
-  TEST(morpheo::behavioural::Tdcache_data_t, memory -> access (2, 0x10, DCACHE_LOAD, 0), 0xdeadbeef);
-  TEST(morpheo::behavioural::Tdcache_data_t, memory -> access (2, 0x14, DCACHE_LOAD, 0), 0x12345678);
-  TEST(morpheo::behavioural::Tdcache_data_t, memory -> access (2, 0x18, DCACHE_LOAD, 0), 0x21071981);
+  memory -> access (2, 0x10, DCACHE_TYPE_STORE_32, 0xdeadbeef);
+  memory -> access (2, 0x14, DCACHE_TYPE_STORE_16, 0xdada5678);
+  memory -> access (2, 0x16, DCACHE_TYPE_STORE_16, 0xbead1234);
+  memory -> access (2, 0x18, DCACHE_TYPE_STORE_8 , 0x45675681);
+  memory -> access (2, 0x19, DCACHE_TYPE_STORE_8 , 0x1f311219);
+  memory -> access (2, 0x1a, DCACHE_TYPE_STORE_8 , 0x2e075607);
+  memory -> access (2, 0x1b, DCACHE_TYPE_STORE_8 , 0x19811221);
+  
+  TEST(morpheo::behavioural::Tdcache_data_t, memory -> access (2, 0x10, DCACHE_TYPE_LOAD, 0), 0xdeadbeef);
+  TEST(morpheo::behavioural::Tdcache_data_t, memory -> access (2, 0x14, DCACHE_TYPE_LOAD, 0), 0x12345678);
+  TEST(morpheo::behavioural::Tdcache_data_t, memory -> access (2, 0x18, DCACHE_TYPE_LOAD, 0), 0x21071981);
 
   TEST(morpheo::behavioural::Tdcache_data_t, memory -> read_lsq (2, 0x10, OPERATION_MEMORY_LOAD_8_Z ), 0x000000ef);
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/src/test1.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/src/test1.cpp	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/src/test1.cpp	(revision 72)
@@ -629,6 +629,6 @@
 		  LABEL("   * rdata : " + toString(rdata));
 
-		  if ((out_DCACHE_REQ_TYPE->read() == DCACHE_SYNCHRONIZATION) or
-		      (out_DCACHE_REQ_TYPE->read() == DCACHE_LOAD))
+		  if ((out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_SYNCHRONIZATION) or
+		      (out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_LOAD))
 		    {
 		      LABEL("     * have_dcache_rsp");
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/src/test2.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/src/test2.cpp	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/SelfTest/src/test2.cpp	(revision 72)
@@ -657,5 +657,5 @@
 		    {
 		      // Bus error
-		      error = 1;
+		      error = DCACHE_ERROR_BUS_ERROR;
 		      rdata = address; // convention : cache return the address fautive !
 		    }
@@ -667,10 +667,10 @@
 
 		  // test type : send or not a respons !
-		  if ((out_DCACHE_REQ_TYPE->read() == DCACHE_SYNCHRONIZATION) or
-		      (out_DCACHE_REQ_TYPE->read() == DCACHE_LOAD) or
-		      ((error == 1) and ((out_DCACHE_REQ_TYPE->read() == DCACHE_STORE_8 ) or
-					 (out_DCACHE_REQ_TYPE->read() == DCACHE_STORE_16) or
-					 (out_DCACHE_REQ_TYPE->read() == DCACHE_STORE_32) or
-					 (out_DCACHE_REQ_TYPE->read() == DCACHE_STORE_64) )))
+		  if ((out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_SYNCHRONIZATION) or
+		      (out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_LOAD) or
+		      ((error != DCACHE_ERROR_NONE) and ((out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_STORE_8 ) or
+							 (out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_STORE_16) or
+							 (out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_STORE_32) or
+							 (out_DCACHE_REQ_TYPE->read() == DCACHE_TYPE_STORE_64) )))
 		    {
 		      LABEL("     * have_dcache_rsp");
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/src/Load_store_unit_allocation.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/src/Load_store_unit_allocation.cpp	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/src/Load_store_unit_allocation.cpp	(revision 72)
@@ -114,5 +114,4 @@
 //    out_MEMORY_OUT_DATA_RE       = interface->set_signal_out <Tspecial_data_t   > ("data_re"       ,_param->_size_general_data     );
       out_MEMORY_OUT_EXCEPTION     = interface->set_signal_out <Texception_t      > ("exception"     ,_param->_size_exception        );
-
     }
 
@@ -132,5 +131,5 @@
       out_DCACHE_REQ_CONTEXT_ID = interface->set_signal_out <Tcontext_t        > ("context_id",_param->_size_dcache_context_id  );
       out_DCACHE_REQ_PACKET_ID  = interface->set_signal_out <Tpacket_t         > ("packet_id" ,_param->_size_dcache_packet_id   );
-      out_DCACHE_REQ_ADDRESS    = interface->set_signal_out <Tdcache_address_t > ("address"   ,_param->_size_dcache_address);
+      out_DCACHE_REQ_ADDRESS    = interface->set_signal_out <Tdcache_address_t > ("address"   ,_param->_size_general_data);
       out_DCACHE_REQ_TYPE       = interface->set_signal_out <Tdcache_type_t    > ("type"      ,_param->_size_dcache_type );
       out_DCACHE_REQ_WDATA      = interface->set_signal_out <Tdcache_data_t    > ("wdata"     ,_param->_size_general_data);
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/src/Load_store_unit_function_speculative_load_commit_transition.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/src/Load_store_unit_function_speculative_load_commit_transition.cpp	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Execute_unit/Execute_unit/Load_store_unit/src/Load_store_unit_function_speculative_load_commit_transition.cpp	(revision 72)
@@ -620,5 +620,5 @@
 		
 		
-		if (error != 0)
+		if (error != DCACHE_ERROR_NONE)
 		  {
 		    log_printf(TRACE,Load_store_unit,FUNCTION," * have a bus error !!!");
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile	(revision 72)
@@ -0,0 +1,24 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+
+#-----[ Directory ]----------------------------------------
+DIR_COMPONENT			= ./
+include				$(DIR_COMPONENT)/Makefile.defs
+
+#-----[ Library ]------------------------------------------
+LIBRARY				= $(DIR_LIB)/libCustom.a
+
+
+#-----[ include ]------------------------------------------
+
+all				:
+				@$(MAKE) all_component
+
+include                         $(DIR_MORPHEO)/Behavioural/Makefile.flags
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Common
+include				$(DIR_MORPHEO)/Behavioural/Makefile.Component
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile.defs
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile.defs	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile.defs	(revision 72)
@@ -0,0 +1,11 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+
+#-----[ Directory ]----------------------------------------
+DIR_COMPONENT_MORPHEO		= ../..
+DIR_MORPHEO			= $(DIR_COMPONENT)/$(DIR_COMPONENT_MORPHEO)
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile.deps
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile.deps	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/Makefile.deps	(revision 72)
@@ -0,0 +1,37 @@
+# 
+# $Id$
+# 
+# [ Description ]
+# 
+# Makefile
+# 
+# DIR_MORPHEO must be defined
+
+Custom				= yes
+
+ifndef Behavioural
+include 			$(DIR_MORPHEO)/Behavioural/Makefile.deps
+endif
+
+#-----[ Library ]------------------------------------------
+Custom_LIBRARY			= 	-lCustom	\
+					$(Behavioural_LIBRARY)	
+
+Custom_DIR_LIBRARY		=	-L$(DIR_MORPHEO)/Behavioural/./Custom/lib	\
+					$(Behavioural_DIR_LIBRARY)
+
+Custom_DEPENDENCIES		=	Behavioural_library
+
+Custom_CLEAN        		=	Behavioural_library_clean
+
+#-----[ Rules ]--------------------------------------------
+
+#.NOTPARALLEL			: Custom_library Custom_library_clean
+
+Custom_library			: $(Custom_DEPENDENCIES)
+				@\
+				$(MAKE) --directory=$(DIR_MORPHEO)/Behavioural/./Custom --makefile=Makefile;
+
+Custom_library_clean		: $(Custom_CLEAN)
+				@\
+				$(MAKE) --directory=$(DIR_MORPHEO)/Behavioural/./Custom --makefile=Makefile clean;
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom.h	(revision 72)
@@ -0,0 +1,49 @@
+#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
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom_default.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom_default.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom_default.h	(revision 72)
@@ -0,0 +1,31 @@
+#ifndef morpheo_behavioural_custom_Custom_default_h
+#define morpheo_behavioural_custom_Custom_default_h
+
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Custom.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+
+  bool                          default_get_valid_group               (uint32_t     group);
+  uint32_t                      default_get_nb_register               (uint32_t     group);
+  access_mode_t                 default_get_access_mode               (uint32_t     group,
+								       uint32_t     reg);
+  custom_decod_t              * default_get_custom_decod              (Toperation_t operation);
+  custom_execute_genMoore_t   * default_get_custom_execute_genMoore   (Toperation_t operation);
+  custom_execute_transition_t * default_get_custom_execute_transition (uint32_t     group);
+  custom_execute_transition_t * default_get_custom_execute_reset      (uint32_t     group);
+  custom_information_t          default_get_custom_information        (uint32_t     context);
+
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom_example.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom_example.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Custom_example.h	(revision 72)
@@ -0,0 +1,31 @@
+#ifndef morpheo_behavioural_custom_Custom_example_h
+#define morpheo_behavioural_custom_Custom_example_h
+
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Custom.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+
+  bool                          example_get_valid_group               (uint32_t     group);
+  uint32_t                      example_get_nb_register               (uint32_t     group);
+  access_mode_t                 example_get_access_mode               (uint32_t     group, 
+								       uint32_t     reg);
+  custom_decod_t              * example_get_custom_decod              (Toperation_t operation);
+  custom_execute_genMoore_t   * example_get_custom_execute_genMoore   (Toperation_t operation);
+  custom_execute_transition_t * example_get_custom_execute_transition (uint32_t     group);
+  custom_execute_transition_t * example_get_custom_execute_reset      (uint32_t     group);
+  custom_information_t          example_get_custom_information        (uint32_t     context);
+
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Encryption.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Encryption.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Encryption.h	(revision 72)
@@ -0,0 +1,54 @@
+#ifndef morpheo_behavioural_custom_encryption_h
+#define morpheo_behavioural_custom_encryption_h
+
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Custom.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+namespace encryption {
+
+  enum 
+    {
+      num_register_key  ,
+      num_register_shift,
+      num_register_role 
+    };
+
+  class Encryption
+  {
+  private : const  Toperation_t _operation_encrypt;
+  private : const  Toperation_t _operation_decrypt;
+    
+  public  : Encryption (uint32_t     num_group,
+			Toperation_t operation_encrypt,
+			Toperation_t operation_decrypt);
+    
+  public  : uint32_t                      get_nb_register               (void);
+  public  : access_mode_t                 get_access_mode               (uint32_t     reg);
+  public  : custom_decod_t              * get_custom_decod              (Toperation_t operation);
+  public  : custom_execute_genMoore_t   * get_custom_execute_genMoore   (Toperation_t operation);
+  public  : custom_execute_transition_t * get_custom_execute_transition (void);
+  public  : custom_execute_transition_t * get_custom_execute_reset      (void);
+  
+  private : static void function_encrypt (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_operation_t * op,
+					  morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+					  morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param);
+  private : static void function_decrypt (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_operation_t * op,
+					  morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+					  morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param);
+  };
+  
+}; // end namespace encryption 
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Random.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Random.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/include/Random.h	(revision 72)
@@ -0,0 +1,48 @@
+#ifndef morpheo_behavioural_custom_random_h
+#define morpheo_behavioural_custom_random_h
+
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Custom.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+namespace random {
+
+  enum 
+    {
+      num_register_random,
+      num_register_cst1  ,
+      num_register_cst2  , 
+      num_register_max   
+    };
+
+  class Random
+  {
+  public  : Random (uint32_t num_group);
+    
+  public  : uint32_t                      get_nb_register               (void);
+  public  : access_mode_t                 get_access_mode               (uint32_t     reg);
+  public  : custom_decod_t              * get_custom_decod              (Toperation_t operation);
+  public  : custom_execute_genMoore_t   * get_custom_execute_genMoore   (Toperation_t operation);
+  public  : custom_execute_transition_t * get_custom_execute_transition (void);
+  public  : custom_execute_transition_t * get_custom_execute_reset      (void);
+
+  private : static void Random::function_transition (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+						      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param);
+  private : static void Random::function_reset      (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+						      morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param);
+    };
+  
+}; // end namespace random 
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
+#endif
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Custom_default.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Custom_default.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Custom_default.cpp	(revision 72)
@@ -0,0 +1,227 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Custom_default.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_valid_group"
+  bool default_get_valid_group (uint32_t group)
+  {
+    switch (group)
+      {
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 26 : // CUSTOM_3
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 30 : // CUSTOM_7
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+    
+    return false; // default return
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_nb_register"
+  uint32_t default_get_nb_register (uint32_t group)
+  {
+    switch (group)
+      {
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 26 : // CUSTOM_3
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 30 : // CUSTOM_7
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+
+    return 0; // default return
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_access_mode"
+  access_mode_t default_get_access_mode (uint32_t group, uint32_t reg)
+  {
+    if (reg < default_get_nb_register (group))
+      switch (group)
+	{
+	case 24 : // CUSTOM_1
+	case 25 : // CUSTOM_2
+	case 26 : // CUSTOM_3
+	case 27 : // CUSTOM_4
+	case 28 : // CUSTOM_5
+	case 29 : // CUSTOM_6
+	case 30 : // CUSTOM_7
+	case 31 : // CUSTOM_8
+	  {
+	    break;
+	  }
+	default :
+	  {
+	    throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	  }
+	}
+
+    return access_mode_t (SPR_ACCESS_MODE_NONE, SPR_ACCESS_MODE_NONE); // default return
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_custom_decod"
+  custom_decod_t *  default_get_custom_decod (Toperation_t operation)
+  {
+    switch (operation)
+      {
+      case OPERATION_CUSTOM_L_1    :
+      case OPERATION_CUSTOM_L_2    :
+      case OPERATION_CUSTOM_L_3    :
+      case OPERATION_CUSTOM_L_4    :
+      case OPERATION_CUSTOM_L_5    :
+      case OPERATION_CUSTOM_L_6    :
+      case OPERATION_CUSTOM_L_7    :
+      case OPERATION_CUSTOM_L_8    :
+      case OPERATION_CUSTOM_LF_1_D :
+      case OPERATION_CUSTOM_LF_1_S :
+      case OPERATION_CUSTOM_LV_1   :
+      case OPERATION_CUSTOM_LV_2   :
+      case OPERATION_CUSTOM_LV_3   :
+      case OPERATION_CUSTOM_LV_4   :
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom operation");
+	}
+      }
+
+    return NULL; // unimplemented function
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_custom_execute_genMoore"
+  custom_execute_genMoore_t * default_get_custom_execute_genMoore (Toperation_t operation)
+  {
+    switch (operation)
+      {
+      case OPERATION_CUSTOM_L_1    :
+      case OPERATION_CUSTOM_L_2    :
+      case OPERATION_CUSTOM_L_3    :
+      case OPERATION_CUSTOM_L_4    :
+      case OPERATION_CUSTOM_L_5    :
+      case OPERATION_CUSTOM_L_6    :
+      case OPERATION_CUSTOM_L_7    :
+      case OPERATION_CUSTOM_L_8    :
+      case OPERATION_CUSTOM_LF_1_D :
+      case OPERATION_CUSTOM_LF_1_S :
+      case OPERATION_CUSTOM_LV_1   :
+      case OPERATION_CUSTOM_LV_2   :
+      case OPERATION_CUSTOM_LV_3   :
+      case OPERATION_CUSTOM_LV_4   :
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom operation");
+	}
+      }
+
+    return &(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::operation_unimplemented); // unimplemented function
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_custom_execute_transition"
+  custom_execute_transition_t * default_get_custom_execute_transition (uint32_t group)
+  {
+    switch (group)
+      {
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 26 : // CUSTOM_3
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 30 : // CUSTOM_7
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+    
+    return NULL; // unimplemented function
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_custom_execute_reset"
+  custom_execute_transition_t * default_get_custom_execute_reset (uint32_t group)
+  {
+    switch (group)
+      {
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 26 : // CUSTOM_3
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 30 : // CUSTOM_7
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+    
+    return NULL; // unimplemented function
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::default_get_custom_information"
+  custom_information_t default_get_custom_information (uint32_t context)
+  {
+    custom_information_t info;
+    
+    info._get_valid_group               = &morpheo::behavioural::custom::default_get_valid_group              ;
+    info._get_nb_register               = &morpheo::behavioural::custom::default_get_nb_register              ;
+    info._get_access_mode               = &morpheo::behavioural::custom::default_get_access_mode              ;
+    info._get_custom_decod              = &morpheo::behavioural::custom::default_get_custom_decod             ;
+    info._get_custom_execute_genMoore   = &morpheo::behavioural::custom::default_get_custom_execute_genMoore  ;
+    info._get_custom_execute_transition = &morpheo::behavioural::custom::default_get_custom_execute_transition;
+    info._get_custom_execute_reset      = &morpheo::behavioural::custom::default_get_custom_execute_reset     ;
+    return info;
+  }
+  
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Custom_example.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Custom_example.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Custom_example.cpp	(revision 72)
@@ -0,0 +1,272 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Custom_example.h"
+#include "Behavioural/Custom/include/Encryption.h"
+#include "Behavioural/Custom/include/Random.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+
+  static encryption::Encryption group_encryption (GROUP_CUSTOM_3,
+						  OPERATION_CUSTOM_L_4,
+						  OPERATION_CUSTOM_L_8);
+
+  static random::Random         group_random     (GROUP_CUSTOM_7);
+
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_valid_group"
+  bool example_get_valid_group (uint32_t group)
+  {
+    switch (group)
+      {
+      case 26 : // CUSTOM_3
+      case 30 : // CUSTOM_7
+	{
+	  return true;
+	  break;
+	}
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+
+    return false;
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_nb_register"
+  uint32_t example_get_nb_register (uint32_t group)
+  {
+    switch (group)
+      {
+      case 26 : // CUSTOM_3
+	{
+	  return group_encryption.get_nb_register();
+	}
+      case 30 : // CUSTOM_7
+	{
+	  return group_random    .get_nb_register();
+	}
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+    
+    return 0;
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_access_mode"
+  access_mode_t example_get_access_mode (uint32_t group, uint32_t reg)
+  {
+    if (reg < example_get_nb_register (group))
+      switch (group)
+	{
+	case 26 : // CUSTOM_3
+	  {
+	    return group_encryption.get_access_mode(reg);
+	  }
+	case 30 : // CUSTOM_7
+	  {
+	    return group_random    .get_access_mode(reg);
+	  }
+	case 24 : // CUSTOM_1
+	case 25 : // CUSTOM_2
+	case 27 : // CUSTOM_4
+	case 28 : // CUSTOM_5
+	case 29 : // CUSTOM_6
+	case 31 : // CUSTOM_8
+	  {
+	    break;
+	  }
+	default :
+	  {
+	    throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	  }
+	}
+    return access_mode_t (SPR_ACCESS_MODE_NONE, SPR_ACCESS_MODE_NONE);
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_custom_decod"
+  custom_decod_t *  example_get_custom_decod (Toperation_t operation)
+  {
+    switch (operation)
+      {
+      case OPERATION_CUSTOM_L_4    :
+      case OPERATION_CUSTOM_L_8    :
+	{
+	  return group_encryption.get_custom_decod(operation);
+	}
+      case OPERATION_CUSTOM_L_1    :
+      case OPERATION_CUSTOM_L_2    :
+      case OPERATION_CUSTOM_L_3    :
+      case OPERATION_CUSTOM_L_5    :
+      case OPERATION_CUSTOM_L_6    :
+      case OPERATION_CUSTOM_L_7    :
+      case OPERATION_CUSTOM_LF_1_D :
+      case OPERATION_CUSTOM_LF_1_S :
+      case OPERATION_CUSTOM_LV_1   :
+      case OPERATION_CUSTOM_LV_2   :
+      case OPERATION_CUSTOM_LV_3   :
+      case OPERATION_CUSTOM_LV_4   :
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom operation");
+	}
+      }
+
+    return NULL; // unimplemented function
+
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_custom_execute_genMoore"
+  custom_execute_genMoore_t * example_get_custom_execute_genMoore (Toperation_t operation)
+  {
+    switch (operation)
+      {
+      case OPERATION_CUSTOM_L_4    :
+      case OPERATION_CUSTOM_L_8    :
+	{
+	  return group_encryption.get_custom_execute_genMoore(operation);
+	}
+      case OPERATION_CUSTOM_L_1    :
+      case OPERATION_CUSTOM_L_2    :
+      case OPERATION_CUSTOM_L_3    :
+      case OPERATION_CUSTOM_L_5    :
+      case OPERATION_CUSTOM_L_6    :
+      case OPERATION_CUSTOM_L_7    :
+      case OPERATION_CUSTOM_LF_1_D :
+      case OPERATION_CUSTOM_LF_1_S :
+      case OPERATION_CUSTOM_LV_1   :
+      case OPERATION_CUSTOM_LV_2   :
+      case OPERATION_CUSTOM_LV_3   :
+      case OPERATION_CUSTOM_LV_4   :
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom operation");
+	}
+      }
+
+    return &(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::operation_unimplemented); // unimplemented function
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_custom_execute_transition"
+  custom_execute_transition_t * example_get_custom_execute_transition (uint32_t group)
+  {
+    switch (group)
+      {
+      case 26 : // CUSTOM_3
+	{
+	  return group_encryption.get_custom_execute_transition();
+	}
+      case 30 : // CUSTOM_7
+	{
+	  return group_random    .get_custom_execute_transition();
+	}
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+    
+    return NULL; // unimplemented function
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_custom_execute_reset"
+  custom_execute_transition_t * example_get_custom_execute_reset (uint32_t group)
+  {
+    switch (group)
+      {
+      case 26 : // CUSTOM_3
+	{
+	  return group_encryption.get_custom_execute_reset();
+	}
+      case 30 : // CUSTOM_7
+	{
+	  return group_random    .get_custom_execute_reset();
+	}
+      case 24 : // CUSTOM_1
+      case 25 : // CUSTOM_2
+      case 27 : // CUSTOM_4
+      case 28 : // CUSTOM_5
+      case 29 : // CUSTOM_6
+      case 31 : // CUSTOM_8
+	{
+	  break;
+	}
+      default :
+	{
+	  throw ERRORMORPHEO(FUNCTION, "Invalid custom group number");
+	}
+      }
+    
+    return NULL; // unimplemented function
+  }
+
+#undef  FUNCTION
+#define FUNCTION "custom::example_get_custom_information"
+  custom_information_t example_get_custom_information (uint32_t context)
+  {
+    // for all context
+
+    custom_information_t info;
+    
+    info._get_valid_group               = &morpheo::behavioural::custom::example_get_valid_group              ;
+    info._get_nb_register               = &morpheo::behavioural::custom::example_get_nb_register              ;
+    info._get_access_mode               = &morpheo::behavioural::custom::example_get_access_mode              ;
+    info._get_custom_decod              = &morpheo::behavioural::custom::example_get_custom_decod             ;
+    info._get_custom_execute_genMoore   = &morpheo::behavioural::custom::example_get_custom_execute_genMoore  ;
+    info._get_custom_execute_transition = &morpheo::behavioural::custom::example_get_custom_execute_transition;
+    info._get_custom_execute_reset      = &morpheo::behavioural::custom::example_get_custom_execute_reset     ;
+    return info;
+  }
+  
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Encryption.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Encryption.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Encryption.cpp	(revision 72)
@@ -0,0 +1,123 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Encryption.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+namespace encryption {
+
+  static uint32_t _num_group;
+
+  Encryption::Encryption (uint32_t     num_group,
+			  Toperation_t operation_encrypt,
+			  Toperation_t operation_decrypt) :
+    _operation_encrypt (operation_encrypt),
+    _operation_decrypt (operation_decrypt)
+  {
+    _num_group = num_group;
+  };
+
+  uint32_t Encryption::get_nb_register (void)
+  {
+    return 3;
+  };
+    
+  access_mode_t Encryption::get_access_mode (uint32_t reg)
+  {
+    // All reg is access by supervisor
+    return access_mode_t (SPR_ACCESS_MODE_NONE, SPR_ACCESS_MODE_READ_WRITE);
+  }
+
+  custom_decod_t * Encryption::get_custom_decod (Toperation_t operation)
+  {
+    // TODO !!!!!
+    return NULL;
+  }
+
+  custom_execute_genMoore_t * Encryption::get_custom_execute_genMoore (Toperation_t operation)
+  {
+    if (operation == _operation_encrypt)
+      return &(morpheo::behavioural::custom::encryption::Encryption::function_encrypt);
+    if (operation == _operation_decrypt)
+      return &(morpheo::behavioural::custom::encryption::Encryption::function_decrypt);
+
+    return &(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::operation_unimplemented); // unimplemented function
+  }
+
+  custom_execute_transition_t * Encryption::get_custom_execute_transition (void)
+  {
+    // No treatment a the end cycle
+    return NULL;
+  }
+
+  custom_execute_transition_t * Encryption::get_custom_execute_reset (void)
+  {
+    // No treatment a the end cycle
+    return NULL;
+  }
+
+  void Encryption::function_encrypt (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_operation_t * op,
+				     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+				     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
+  {
+    std::cout << "<Encryption::function_decrypt> Operation : encrypt" << std::endl;
+
+    Tgeneral_data_t data = unsigned(op->_data_ra);
+    
+    Tgeneral_data_t key   = reg->_spr[_num_group][num_register_key  ];
+    Tgeneral_data_t shift = reg->_spr[_num_group][num_register_shift];
+    Tgeneral_data_t rool  = reg->_spr[_num_group][num_register_role ];
+
+    for (Tgeneral_data_t i=0 ; i<rool; i++)
+      {
+	data ^= key;
+	data  = rotate_right<Tgeneral_data_t>(param->_size_data,data,shift);
+      }
+    
+    // Result
+    
+    op->_timing       = morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_timing_t(rool, rool);
+    op->_data_rd      = data;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+  
+  void Encryption::function_decrypt (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_operation_t * op,
+				     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+				     morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
+  {
+    std::cout << "<Encryption::function_decrypt> Operation : decrypt" << std::endl;
+
+    Tgeneral_data_t data = unsigned(op->_data_ra);
+    
+    Tgeneral_data_t key   = reg->_spr[_num_group][num_register_key  ];
+    Tgeneral_data_t shift = reg->_spr[_num_group][num_register_shift];
+    Tgeneral_data_t rool  = reg->_spr[_num_group][num_register_role ];
+
+    for (Tgeneral_data_t i=0 ; i<rool; i++)
+      {
+	data  = rotate_left<Tgeneral_data_t>(param->_size_data,data,shift);
+	data ^= key;
+      }
+    
+    // Result
+    op->_timing       = morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_timing_t(rool, rool);
+    op->_data_rd      = data;
+  //op->_data_re      = 0;
+    op->_exception    = EXCEPTION_ALU_NONE;
+    op->_no_sequence  = 0;
+  //op->_address      = 0;
+  };
+
+}; // end namespace encryption 
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Random.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Random.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Custom/src/Random.cpp	(revision 72)
@@ -0,0 +1,104 @@
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Custom/include/Random.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace custom {
+namespace random {
+
+  static uint32_t _num_group;
+
+  Random::Random (uint32_t num_group)
+  {
+    _num_group = num_group;
+  };
+
+  uint32_t Random::get_nb_register (void)
+  {
+    return 4;
+  };
+    
+  access_mode_t Random::get_access_mode (uint32_t reg)
+  {
+    // All reg is access by supervisor
+    if (reg == num_register_random)
+      return access_mode_t (SPR_ACCESS_MODE_READ_ONLY, SPR_ACCESS_MODE_READ_ONLY);
+
+    return access_mode_t (SPR_ACCESS_MODE_READ_ONLY_COND, SPR_ACCESS_MODE_READ_WRITE);
+  }
+
+  custom_decod_t * Random::get_custom_decod (Toperation_t operation)
+  {
+    // TODO !!!!!
+    return NULL;
+  }
+
+  custom_execute_genMoore_t * Random::get_custom_execute_genMoore (Toperation_t operation)
+  {
+    return &(morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::operation_unimplemented); // unimplemented function
+  }
+
+  custom_execute_transition_t * Random::get_custom_execute_transition (void)
+  {
+    // No treatment a the end cycle
+    return &(function_transition);
+  }
+
+  custom_execute_transition_t * Random::get_custom_execute_reset (void)
+  {
+    // No treatment a the end cycle
+    return &(function_reset);
+  }
+
+  void Random::function_transition (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+				    morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
+  {
+    std::cout << "<Random::function_transition> Transition" << std::endl;
+
+    uint32_t num_group    = reg->_access_num_group;
+    uint32_t num_register = reg->_access_num_register;
+    if (num_group == _num_group)
+      {
+	// Test if have a read of num_register_random
+	if ((reg->_i_read_spr) and
+	    (num_register == num_register_random))
+	  {
+	    Tgeneral_data_t random = reg->_spr[num_group][num_register_random];
+	    Tgeneral_data_t cst1   = reg->_spr[num_group][num_register_cst1  ];
+	    Tgeneral_data_t cst2   = reg->_spr[num_group][num_register_cst2  ];
+	    Tgeneral_data_t max    = reg->_spr[num_group][num_register_max   ];
+
+	    // make a new value
+	    reg->_spr[num_group][num_register_random] = (cst1*random+cst2)%max;
+	  }
+
+	// Test if write in register_max
+	if (reg->_i_write_spr and
+	    (reg->_spr[num_group][num_register] == 0))
+	  {
+	    reg->_spr[num_group][num_register] = reg->_spr_old;
+	  }
+      }
+  };
+  
+  void Random::function_reset  (morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_register_t  * reg,
+				morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_execute_unit::execute_unit::functionnal_unit::execute_param_t     * param)
+  {
+    std::cout << "<Random::function_reset> Reset" << std::endl;
+
+    reg->_spr[_num_group][num_register_random] = 0xbebe;
+    reg->_spr[_num_group][num_register_cst1  ] = 0xdeadbeef;
+    reg->_spr[_num_group][num_register_cst2  ] = 0x666;
+    reg->_spr[_num_group][num_register_max   ] = 0xffffffff;
+  };
+
+}; // end namespace random 
+}; // end namespace custom
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/Makefile.flags
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/Makefile.flags	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/Makefile.flags	(revision 72)
@@ -16,11 +16,11 @@
 #-----[ Flags ]--------------------------------------------
 MORPHEO_FLAGS			=	-DSYSTEMC		\
-					-DVHDL			\
-  					-DVHDL_TESTBENCH	\
-					-DVHDL_TESTBENCH_ASSERT	\
 					-DSTATISTICS 		\
 					-DDEBUG=DEBUG_TRACE
 #
 #
+#					-DVHDL			\
+#  					-DVHDL_TESTBENCH	\
+#					-DVHDL_TESTBENCH_ASSERT	\
 #					-DCONFIGURATION  	\
 #					-DPOSITION       	\
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/SelfTest/src/main.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/SelfTest/src/main.cpp	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/SelfTest/src/main.cpp	(revision 72)
@@ -40,5 +40,5 @@
         );
       
-      msg(_("%s"),param->print(1).c_str()):
+      msg(_("%s"),param->print(1).c_str());
       
       test (name,param);
@@ -46,11 +46,10 @@
   catch (morpheo::ErrorMorpheo & error)
     {
-      msg (_("<%s> : %s.\n"),name, error.what ());
+      msg (_("<%s> : %s.\n"),name.c_str(), error.what ());
       exit (EXIT_FAILURE);
     }
   catch (...)
     {
-      
-      err (_("<%s> : This test must generate a error.\n"),name);
+      err (_("<%s> : This test must generate a error.\n"),name.c_str());
       exit (EXIT_FAILURE);
     }
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/SelfTest/src/test.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/SelfTest/src/test.cpp	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/SelfTest/src/test.cpp	(revision 72)
@@ -13,8 +13,10 @@
 #define CYCLE_MAX     (128*NB_ITERATION)
 
-#define LABEL(str)							\
+#define LABEL(str...)							\
   {									\
-  msg (_("{%d} %s\n"),static_cast<uint32_t>(sc_simulation_time()),str);	\
-} while(0)
+    msg (_("{%d} "),static_cast<uint32_t>(sc_simulation_time()));	\
+    msg (str);								\
+    msg (_("\n"));							\
+  } while(0)
 
 #define SC_START(cycle_offset)                                                       \
@@ -100,5 +102,5 @@
   for (uint32_t iteration=0; iteration<NB_ITERATION; iteration ++)
     {
-      LABEL("Iteration "+toString(iteration));
+      LABEL("Iteration %d",iteration);
 
       SC_START(1);
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/include/Parameters.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/include/Parameters.h	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/include/Parameters.h	(revision 72)
@@ -26,9 +26,9 @@
   public : ~Parameters () ;
 
-  public : string msg_error (void);
+  public :        std::string   msg_error  (void);
 
-  public :        string   print      (uint32_t depth);
-  public : friend ostream& operator<< (ostream& output_stream,
-				       morpheo::behavioural::@NAMESPACE_USE::Parameters & x);
+  public :        std::string   print      (uint32_t depth);
+  public : friend std::ostream& operator<< (std::ostream& output_stream,
+					    morpheo::behavioural::@NAMESPACE_USE::Parameters & x);
   };
 
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/src/Parameters_print.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/src/Parameters_print.cpp	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/New_Component/src/Parameters_print.cpp	(revision 72)
@@ -32,6 +32,6 @@
 #undef  FUNCTION
 #define FUNCTION "@COMPONENT::operator<<"
-  ostream& operator<< (ostream& output_stream ,
-		       morpheo::behavioural::@NAMESPACE_USE::Parameters & x)
+  std::stringostream& operator<< (std::stringostream& output_stream ,
+				  morpheo::behavioural::@NAMESPACE_USE::Parameters & x)
   {
     log_printf(FUNC,@COMPONENT,FUNCTION,"Begin");
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Constants.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Constants.h	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Constants.h	(revision 72)
@@ -6,174 +6,365 @@
 
   //=========================================================[ Type ]=====
-#define TYPE_MEMORY                              0x1      // 00001  
+#  define TYPE_ALU                                 0x0        // 000000 - unit multiple
+#  define TYPE_BRANCH                              0x1        // 000001 - unit multiple, to a special routing
+#  define TYPE_MEMORY                              0x2        // 000010 - unit uniq
+#  define TYPE_MAC                                 0x4        // 000100 - unit uniq
+#  define TYPE_TIMER                               0x8        // 001000 - unit uniq
+#  define TYPE_CUSTOM                              0x10       // 010000 - unit uniq
 
   //====================================================[ Operation ]=====
 
   //-------------------------------------------------------[ Memory ]-----
-#define OPERATION_MEMORY_LOAD                    0x0      // 000_0000
-#define OPERATION_MEMORY_LOAD_8_Z                0x0      // 000_0000
-#define OPERATION_MEMORY_LOAD_16_Z               0x20     // 010_0000
-#define OPERATION_MEMORY_LOAD_32_Z               0x40     // 100_0000
-#define OPERATION_MEMORY_LOAD_64_Z               0x60     // 110_0000
-#define OPERATION_MEMORY_LOAD_8_S                0x10     // 001_0000
-#define OPERATION_MEMORY_LOAD_16_S               0x30     // 011_0000
-#define OPERATION_MEMORY_LOAD_32_S               0x50     // 101_0000
-#define OPERATION_MEMORY_LOAD_64_S               0x70     // 111_0000
-
-#define OPERATION_MEMORY_STORE_8                 0x8      // 000_1000
-#define OPERATION_MEMORY_STORE_16                0x9      // 000_1001
-#define OPERATION_MEMORY_STORE_32                0xa      // 000_1010
-#define OPERATION_MEMORY_STORE_64                0xb      // 000_1011
-#define OPERATION_MEMORY_STORE_HEAD_OK           0xc      // 000_1100
-#define OPERATION_MEMORY_STORE_HEAD_KO           0xd      // 000_1101
-
-#define OPERATION_MEMORY_LOCK                    0x1      // 000_0001
-#define OPERATION_MEMORY_INVALIDATE              0x2      // 000_0010
-#define OPERATION_MEMORY_PREFETCH                0x3      // 000_0011
-#define OPERATION_MEMORY_FLUSH                   0x6      // 000_0110
-#define OPERATION_MEMORY_SYNCHRONIZATION         0x7      // 000_0111
-
+#  define OPERATION_MEMORY_LOAD                    0x0        // 000_0000
+#  define OPERATION_MEMORY_LOAD_8_Z                0x0        // 000_0000
+#  define OPERATION_MEMORY_LOAD_16_Z               0x20       // 010_0000
+#  define OPERATION_MEMORY_LOAD_32_Z               0x40       // 100_0000
+#  define OPERATION_MEMORY_LOAD_64_Z               0x60       // 110_0000
+#  define OPERATION_MEMORY_LOAD_8_S                0x10       // 001_0000
+#  define OPERATION_MEMORY_LOAD_16_S               0x30       // 011_0000
+#  define OPERATION_MEMORY_LOAD_32_S               0x50       // 101_0000
+#  define OPERATION_MEMORY_LOAD_64_S               0x70       // 111_0000
+
+#  define OPERATION_MEMORY_STORE_8                 0x8        // 000_1000
+#  define OPERATION_MEMORY_STORE_16                0x9        // 000_1001
+#  define OPERATION_MEMORY_STORE_32                0xa        // 000_1010
+#  define OPERATION_MEMORY_STORE_64                0xb        // 000_1011
+#  define OPERATION_MEMORY_STORE_HEAD_OK           0xc        // 000_1100
+#  define OPERATION_MEMORY_STORE_HEAD_KO           0xd        // 000_1101
+
+#  define OPERATION_MEMORY_LOCK                    0x1        // 000_0001
+#  define OPERATION_MEMORY_INVALIDATE              0x2        // 000_0010
+#  define OPERATION_MEMORY_PREFETCH                0x3        // 000_0011
+#  define OPERATION_MEMORY_FLUSH                   0x6        // 000_0110
+#  define OPERATION_MEMORY_SYNCHRONIZATION         0x7        // 000_0111
+  
 #define is_operation_memory_load(x)             \
-	((x == OPERATION_MEMORY_LOAD_8_Z ) or	\
-	 (x == OPERATION_MEMORY_LOAD_16_Z) or	\
-	 (x == OPERATION_MEMORY_LOAD_32_Z) or	\
-	 (x == OPERATION_MEMORY_LOAD_64_Z) or	\
-	 (x == OPERATION_MEMORY_LOAD_8_S ) or	\
-	 (x == OPERATION_MEMORY_LOAD_16_S) or	\
-	 (x == OPERATION_MEMORY_LOAD_32_S) or	\
-	 (x == OPERATION_MEMORY_LOAD_64_S) )
-
-#define is_operation_memory_store(x)                    \
-	((x == OPERATION_MEMORY_STORE_8      ) or	\
-	 (x == OPERATION_MEMORY_STORE_16     ) or	\
-	 (x == OPERATION_MEMORY_STORE_32     ) or	\
-	 (x == OPERATION_MEMORY_STORE_64     ) or	\
-	 (x == OPERATION_MEMORY_STORE_HEAD_OK) or	\
-	 (x == OPERATION_MEMORY_STORE_HEAD_KO))
-
-#define is_operation_memory_store_head(x)               \
-	((x == OPERATION_MEMORY_STORE_HEAD_OK) or	\
-	 (x == OPERATION_MEMORY_STORE_HEAD_KO))
-
+  ((x == OPERATION_MEMORY_LOAD_8_Z ) or		\
+   (x == OPERATION_MEMORY_LOAD_16_Z) or		\
+   (x == OPERATION_MEMORY_LOAD_32_Z) or		\
+   (x == OPERATION_MEMORY_LOAD_64_Z) or		\
+   (x == OPERATION_MEMORY_LOAD_8_S ) or		\
+   (x == OPERATION_MEMORY_LOAD_16_S) or		\
+   (x == OPERATION_MEMORY_LOAD_32_S) or		\
+   (x == OPERATION_MEMORY_LOAD_64_S) )
+  
+#define is_operation_memory_store(x)		\
+  ((x == OPERATION_MEMORY_STORE_8      ) or	\
+   (x == OPERATION_MEMORY_STORE_16     ) or	\
+   (x == OPERATION_MEMORY_STORE_32     ) or	\
+   (x == OPERATION_MEMORY_STORE_64     ) or	\
+   (x == OPERATION_MEMORY_STORE_HEAD_OK) or	\
+   (x == OPERATION_MEMORY_STORE_HEAD_KO))
+
+#define is_operation_memory_store_head(x)       \
+  ((x == OPERATION_MEMORY_STORE_HEAD_OK) or	\
+   (x == OPERATION_MEMORY_STORE_HEAD_KO))
+  
 #define is_operation_memory_load_signed(x)      \
-        ((x == OPERATION_MEMORY_LOAD_8_S ) or	\
-	 (x == OPERATION_MEMORY_LOAD_16_S) or	\
-	 (x == OPERATION_MEMORY_LOAD_32_S) or	\
-	 (x == OPERATION_MEMORY_LOAD_64_S) )
-
-#define MEMORY_ACCESS_8                          0x0
-#define MEMORY_ACCESS_16                         0x1
-#define MEMORY_ACCESS_32                         0x2
-#define MEMORY_ACCESS_64                         0x3
-
-#define MEMORY_SIZE_8                            8 
-#define MEMORY_SIZE_16                           16
-#define MEMORY_SIZE_32                           32
-#define MEMORY_SIZE_64                           64
-
-#define MASK_MEMORY_ACCESS_8                     0x0
-#define MASK_MEMORY_ACCESS_16                    0x1
-#define MASK_MEMORY_ACCESS_32                    0x3
-#define MASK_MEMORY_ACCESS_64                    0x7
-
-#define memory_size(x)                                                           \
-	(((x==OPERATION_MEMORY_LOAD_16_Z)or					 \
-	   (x==OPERATION_MEMORY_LOAD_16_S)or					 \
-	   (x==OPERATION_MEMORY_STORE_16 ))?MEMORY_SIZE_16:			 \
-	  (((x==OPERATION_MEMORY_LOAD_32_Z)or					 \
-	    (x==OPERATION_MEMORY_LOAD_32_S)or					 \
-	    (x==OPERATION_MEMORY_STORE_32 ))?MEMORY_SIZE_32:			 \
-	   (((x==OPERATION_MEMORY_LOAD_64_Z)or					 \
-	     (x==OPERATION_MEMORY_LOAD_64_S)or					 \
-	     (x==OPERATION_MEMORY_STORE_64 ))?MEMORY_SIZE_64:MEMORY_SIZE_8)))
-
-#define memory_access(x)                                                         \
-	(((x==OPERATION_MEMORY_LOAD_16_Z)or					 \
-	   (x==OPERATION_MEMORY_LOAD_16_S)or					 \
-	   (x==OPERATION_MEMORY_STORE_16 ))?MEMORY_ACCESS_16:			 \
-	  (((x==OPERATION_MEMORY_LOAD_32_Z)or					 \
-	    (x==OPERATION_MEMORY_LOAD_32_S)or					 \
-	    (x==OPERATION_MEMORY_STORE_32 ))?MEMORY_ACCESS_32:			 \
-	   (((x==OPERATION_MEMORY_LOAD_64_Z)or					 \
-	     (x==OPERATION_MEMORY_LOAD_64_S)or					 \
-	     (x==OPERATION_MEMORY_STORE_64 ))?MEMORY_ACCESS_64:MEMORY_ACCESS_8)))
-    
-#define mask_memory_access(x)                                                    \
-	(((x==OPERATION_MEMORY_LOAD_16_Z)or					 \
-	   (x==OPERATION_MEMORY_LOAD_16_S)or					 \
-	   (x==OPERATION_MEMORY_STORE_16 ))?MASK_MEMORY_ACCESS_16:	         \
-	  (((x==OPERATION_MEMORY_LOAD_32_Z)or					 \
-	    (x==OPERATION_MEMORY_LOAD_32_S)or					 \
-	    (x==OPERATION_MEMORY_STORE_32 ))?MASK_MEMORY_ACCESS_32:		 \
-	   (((x==OPERATION_MEMORY_LOAD_64_Z)or					 \
-	     (x==OPERATION_MEMORY_LOAD_64_S)or					 \
-	     (x==OPERATION_MEMORY_STORE_64 ))?MASK_MEMORY_ACCESS_64:MASK_MEMORY_ACCESS_8)))
-    
+  ((x == OPERATION_MEMORY_LOAD_8_S ) or		\
+   (x == OPERATION_MEMORY_LOAD_16_S) or		\
+   (x == OPERATION_MEMORY_LOAD_32_S) or		\
+   (x == OPERATION_MEMORY_LOAD_64_S) )
+
+#  define MEMORY_ACCESS_8                          0x0
+#  define MEMORY_ACCESS_16                         0x1
+#  define MEMORY_ACCESS_32                         0x2
+#  define MEMORY_ACCESS_64                         0x3
+
+#  define MEMORY_SIZE_8                            8 
+#  define MEMORY_SIZE_16                           16
+#  define MEMORY_SIZE_32                           32
+#  define MEMORY_SIZE_64                           64
+
+#  define MASK_MEMORY_ACCESS_8                     0x0
+#  define MASK_MEMORY_ACCESS_16                    0x1
+#  define MASK_MEMORY_ACCESS_32                    0x3
+#  define MASK_MEMORY_ACCESS_64                    0x7
+
+#define memory_size(x)							\
+  (((x==OPERATION_MEMORY_LOAD_16_Z)or					\
+    (x==OPERATION_MEMORY_LOAD_16_S)or					\
+    (x==OPERATION_MEMORY_STORE_16 ))?MEMORY_SIZE_16:			\
+   (((x==OPERATION_MEMORY_LOAD_32_Z)or					\
+     (x==OPERATION_MEMORY_LOAD_32_S)or					\
+     (x==OPERATION_MEMORY_STORE_32 ))?MEMORY_SIZE_32:			\
+    (((x==OPERATION_MEMORY_LOAD_64_Z)or					\
+      (x==OPERATION_MEMORY_LOAD_64_S)or					\
+      (x==OPERATION_MEMORY_STORE_64 ))?MEMORY_SIZE_64:MEMORY_SIZE_8)))
+  
+#define memory_access(x)						\
+  (((x==OPERATION_MEMORY_LOAD_16_Z)or					\
+    (x==OPERATION_MEMORY_LOAD_16_S)or					\
+    (x==OPERATION_MEMORY_STORE_16 ))?MEMORY_ACCESS_16:			\
+   (((x==OPERATION_MEMORY_LOAD_32_Z)or					\
+     (x==OPERATION_MEMORY_LOAD_32_S)or					\
+     (x==OPERATION_MEMORY_STORE_32 ))?MEMORY_ACCESS_32:			\
+    (((x==OPERATION_MEMORY_LOAD_64_Z)or					\
+      (x==OPERATION_MEMORY_LOAD_64_S)or					\
+      (x==OPERATION_MEMORY_STORE_64 ))?MEMORY_ACCESS_64:MEMORY_ACCESS_8)))
+  
+#define mask_memory_access(x)						\
+  (((x==OPERATION_MEMORY_LOAD_16_Z)or					\
+    (x==OPERATION_MEMORY_LOAD_16_S)or					\
+    (x==OPERATION_MEMORY_STORE_16 ))?MASK_MEMORY_ACCESS_16:		\
+   (((x==OPERATION_MEMORY_LOAD_32_Z)or					\
+     (x==OPERATION_MEMORY_LOAD_32_S)or					\
+     (x==OPERATION_MEMORY_STORE_32 ))?MASK_MEMORY_ACCESS_32:		\
+    (((x==OPERATION_MEMORY_LOAD_64_Z)or					\
+      (x==OPERATION_MEMORY_LOAD_64_S)or					\
+      (x==OPERATION_MEMORY_STORE_64 ))?MASK_MEMORY_ACCESS_64:MASK_MEMORY_ACCESS_8)))
+
+  //---------------------------------------------[ Functionnal Unit ]-----
+#  define OPERATION_ALU_L_ADD                      0x0        // 000_0000 l.add   , l.addi
+#  define OPERATION_ALU_L_ADDC                     0x1        // 000_0000 l.addc  , l.addic
+#  define OPERATION_ALU_L_SUB                      0x2        // 000_0000 l.sub
+#  define OPERATION_ALU_L_MUL                      0x3        // 000_0000 l.mul   , l.muli
+#  define OPERATION_ALU_L_MULU                     0x4        // 000_0000 l.mulu
+#  define OPERATION_ALU_L_DIV                      0x5        // 000_0000 l.div
+#  define OPERATION_ALU_L_DIVU                     0x6        // 000_0000 l.divu
+#  define OPERATION_ALU_L_AND                      0x7        // 000_0000 l.and   , l.andi
+#  define OPERATION_ALU_L_OR                       0x8        // 000_0000 l.or    , l.ori
+#  define OPERATION_ALU_L_XOR                      0x9        // 000_0000 l.xor   , l.xori
+#  define OPERATION_ALU_L_TEST_F                   0xa        // 000_0000 l.bf
+#  define OPERATION_ALU_L_TEST_NF                  0xb        // 000_0000 l.bnf
+#  define OPERATION_ALU_L_JALR                     0xc        // 000_0000 l.jal   , l.jalr , l.jr
+#  define OPERATION_ALU_L_SLL                      0xd        // 000_0000 l.sll   , l.slli
+#  define OPERATION_ALU_L_SRA                      0xe        // 000_0000 l.sra   , l.srai
+#  define OPERATION_ALU_L_SRL                      0xf        // 000_0000 l.srl   , l.srli
+#  define OPERATION_ALU_L_ROR                      0x10       // 000_0000 l.ror   , l.rori
+#  define OPERATION_ALU_L_MOVHI                    0x11       // 000_0000 l.movhi
+#  define OPERATION_ALU_L_EXTEND_S                 0x12       // 000_0000 l.extbs , l.exths, l.extws
+#  define OPERATION_ALU_L_EXTEND_Z                 0x13       // 000_0000 l.extbz , l.exthz, l.extwz
+#  define OPERATION_ALU_L_CMOV                     0x14       // 000_0000 l.cmov
+#  define OPERATION_ALU_L_FF1                      0x15       // 000_0000 l.ff1
+#  define OPERATION_ALU_L_FL1                      0x16       // 000_0000 l.fl1
+#  define OPERATION_ALU_L_MFSPR                    0x17       // 000_0000 l.mfspr
+#  define OPERATION_ALU_L_MTSPR                    0x18       // 000_0000 l.mtspr
+#  define OPERATION_ALU_L_SFGES                    0x19       // 000_0000 l.sfges , l.sfges
+#  define OPERATION_ALU_L_SFGEU                    0x1a       // 000_0000 l.sfgeu , l.sfgeu
+#  define OPERATION_ALU_L_SFGTS                    0x1b       // 000_0000 L.sfgts , l.sfgts
+#  define OPERATION_ALU_L_SFGTU                    0x1c       // 000_0000 l.sfgtu , l.sfgtu
+#  define OPERATION_ALU_L_SFLES                    0x1d       // 000_0000 l.sfles , l.sfles
+#  define OPERATION_ALU_L_SFLEU                    0x1e       // 000_0000 l.sfleu , l.sfleu
+#  define OPERATION_ALU_L_SFLTS                    0x1f       // 000_0000 l.sflts , l.sflts
+#  define OPERATION_ALU_L_SFLTU                    0x20       // 000_0000 l.sfltu , l.sfltu
+#  define OPERATION_ALU_L_SFEQ                     0x21       // 000_0000 l.sfeq  , l.sfeqi
+#  define OPERATION_ALU_L_SFNE                     0x22       // 000_0000 l.sfne  , l.sfnei
+#  define OPERATION_ALU_L_MAC                      0x23       // 000_0000 l.mac   , l.maci
+#  define OPERATION_ALU_L_MACRC                    0x24       // 000_0000 l.macrc
+#  define OPERATION_ALU_L_MSB                      0x25       // 000_0000 l.msb
+
+  //-------------------------------------------------------[ Custom ]-----
+
+#  define OPERATION_CUSTOM_L_1                     0x40       // 100_0000
+#  define OPERATION_CUSTOM_L_2                     0x41       // 100_0001
+#  define OPERATION_CUSTOM_L_3                     0x42       // 100_0010
+#  define OPERATION_CUSTOM_L_4                     0x43       // 100_0011
+#  define OPERATION_CUSTOM_L_5                     0x44       // 100_0100
+#  define OPERATION_CUSTOM_L_6                     0x45       // 100_0101
+#  define OPERATION_CUSTOM_L_7                     0x46       // 100_0110
+#  define OPERATION_CUSTOM_L_8                     0x47       // 100_0111
+#  define OPERATION_CUSTOM_LF_1_D                  0x48       // 100_1000
+#  define OPERATION_CUSTOM_LF_1_S                  0x49       // 100_1001
+#  define OPERATION_CUSTOM_LV_1                    0x4c       // 100_1100
+#  define OPERATION_CUSTOM_LV_2                    0x4d       // 100_1101
+#  define OPERATION_CUSTOM_LV_3                    0x4e       // 100_1110
+#  define OPERATION_CUSTOM_LV_4                    0x4f       // 100_1111
+
+#  define MAX_OPERATION                            0x80
+
   //====================================================[ Exception ]=====
   // Exception - OpenRISC
 
-#define EXCEPTION_NONE                           0x00 // none exception
-#define EXCEPTION_RESET                          0x01 // software or hardware reset
-#define EXCEPTION_BUS_ERROR                      0x02 // Access at a invalid physical adress
-#define EXCEPTION_DATA_PAGE                      0x03 // No matching or page violation protection in pages tables
-#define EXCEPTION_INSTRUCTION_PAGE               0x04 // No matching or page violation protection in pages tables
-#define EXCEPTION_TICK_TIMER                     0x05 // Tick timer interruption
-#define EXCEPTION_ALIGNMENT                      0x06 // Load/Store access is not aligned
-#define EXCEPTION_ILLEGAL_INSTRUCTION            0x07 // Instruction is illegal (no implemented)
-#define EXCEPTION_INTERRUPT                      0x08 // External interruption 
-#define EXCEPTION_DATA_TLB                       0x09 // DTLB miss
-#define EXCEPTION_INSTRUCTION_TLB                0x0a // ITLB miss
-#define EXCEPTION_RANGE                          0x0b // Overflow or access at a unimplemented register or context
-#define EXCEPTION_SYSCALL                        0x0c // System Call
-#define EXCEPTION_FLOATING_POINT                 0x0d // Caused by a floating instruction
-#define EXCEPTION_TRAP                           0x0e // L.trap or debug unit
-#define EXCEPTION_RESERVED_0                     0x0f // Reserved for a futur usage
-#define EXCEPTION_RESERVED_1                     0x10 // Reserved for a futur usage
-#define EXCEPTION_RESERVED_2                     0x11 // Reserved for a futur usage
-#define EXCEPTION_RESERVED_3                     0x12 // Reserved for a futur usage
-#define EXCEPTION_RESERVED_4                     0x13 // Reserved for a futur usage
-#define EXCEPTION_RESERVED_5                     0x14 // Reserved for a futur usage
-#define EXCEPTION_RESERVED_6                     0x15 // Reserved for implemented specific exceptions
-#define EXCEPTION_RESERVED_7                     0x16 // Reserved for implemented specific exceptions
-#define EXCEPTION_RESERVED_8                     0x17 // Reserved for implemented specific exceptions
-#define EXCEPTION_RESERVED_9                     0x18 // Reserved for implemented specific exceptions
-#define EXCEPTION_CUSTOM_0                       0x19 // Reserved for custom exceptions
-#define EXCEPTION_CUSTOM_1                       0x1a // Reserved for custom exceptions
-#define EXCEPTION_CUSTOM_2                       0x1b // Reserved for custom exceptions
-#define EXCEPTION_CUSTOM_3                       0x1c // Reserved for custom exceptions
-#define EXCEPTION_CUSTOM_4                       0x1d // Reserved for custom exceptions
-#define EXCEPTION_CUSTOM_5                       0x1e // Reserved for custom exceptions
-#define EXCEPTION_CUSTOM_6                       0x1f // Reserved for custom exceptions
+#  define SIZE_EXCEPTION                           5
+
+#  define EXCEPTION_NONE                           0x00       // none exception
+#  define EXCEPTION_RESET                          0x01       // software or hardware reset
+#  define EXCEPTION_BUS_ERROR                      0x02       // Access at a invalid physical adress
+#  define EXCEPTION_DATA_PAGE                      0x03       // No matching or page violation protection in pages tables
+#  define EXCEPTION_INSTRUCTION_PAGE               0x04       // No matching or page violation protection in pages tables
+#  define EXCEPTION_TICK_TIMER                     0x05       // Tick timer interruption
+#  define EXCEPTION_ALIGNMENT                      0x06       // Load/Store access is not aligned
+#  define EXCEPTION_ILLEGAL_INSTRUCTION            0x07       // Instruction is illegal (no implemented)
+#  define EXCEPTION_INTERRUPT                      0x08       // External interruption 
+#  define EXCEPTION_DATA_TLB                       0x09       // DTLB miss
+#  define EXCEPTION_INSTRUCTION_TLB                0x0a       // ITLB miss
+#  define EXCEPTION_RANGE                          0x0b       // Overflow or access at a unimplemented register or context
+#  define EXCEPTION_SYSCALL                        0x0c       // System Call
+#  define EXCEPTION_FLOATING_POINT                 0x0d       // Caused by a floating instruction
+#  define EXCEPTION_TRAP                           0x0e       // L.trap or debug unit
+#  define EXCEPTION_RESERVED_0                     0x0f       // Reserved for a futur usage
+#  define EXCEPTION_RESERVED_1                     0x10       // Reserved for a futur usage
+#  define EXCEPTION_RESERVED_2                     0x11       // Reserved for a futur usage
+#  define EXCEPTION_RESERVED_3                     0x12       // Reserved for a futur usage
+#  define EXCEPTION_RESERVED_4                     0x13       // Reserved for a futur usage
+#  define EXCEPTION_RESERVED_5                     0x14       // Reserved for a futur usage
+#  define EXCEPTION_RESERVED_6                     0x15       // Reserved for implemented specific exceptions
+#  define EXCEPTION_RESERVED_7                     0x16       // Reserved for implemented specific exceptions
+#  define EXCEPTION_RESERVED_8                     0x17       // Reserved for implemented specific exceptions
+#  define EXCEPTION_RESERVED_9                     0x18       // Reserved for implemented specific exceptions
+#  define EXCEPTION_CUSTOM_0                       0x19       // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_1                       0x1a       // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_2                       0x1b       // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_3                       0x1c       // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_4                       0x1d       // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_5                       0x1e       // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_6                       0x1f       // Reserved for custom exceptions
+
+#define exception_to_address(x) (x<<8)
 
   // Exception Execution
-#define EXCEPTION_MEMORY_NONE                    0x0  // Load/Store access is not aligned
-#define EXCEPTION_MEMORY_ALIGNMENT               0x1  // Load/Store access is not aligned
-#define EXCEPTION_MEMORY_DATA_TLB                0x2  // DTLB miss
-#define EXCEPTION_MEMORY_DATA_PAGE               0x3  // No matching or page violation protection in pages tables
-#define EXCEPTION_MEMORY_BUS_ERROR               0x4  // Access at a invalid physical address
-#define EXCEPTION_MEMORY_MISS_SPECULATION        0x5  // Load miss speculation
-#define EXCEPTION_MEMORY_LOAD_SPECULATIVE        0x6  // The load is speculative : write in register file, but don't commit
-
-  //==================================================[ dcache_type ]=====
-#  define DCACHE_LOAD                    0x0 // 0000
-#  define DCACHE_LOCK                    0x1 // 0001
-#  define DCACHE_INVALIDATE              0x2 // 0010
-#  define DCACHE_PREFETCH                0x3 // 0011
-//#define DCACHE_                        0x4 // 0100
-//#define DCACHE_                        0x5 // 0101
-#  define DCACHE_FLUSH                   0x6 // 0110
-#  define DCACHE_SYNCHRONIZATION         0x7 // 0111
-#  define DCACHE_STORE_8                 0x8 // 1000
-#  define DCACHE_STORE_16                0x9 // 1001
-#  define DCACHE_STORE_32                0xa // 1010
-#  define DCACHE_STORE_64                0xb // 1011
-//#define DCACHE_                        0xc // 1100
-//#define DCACHE_                        0xd // 1101
-//#define DCACHE_                        0xe // 1110
-//#define DCACHE_                        0xf // 1111
-
+#  define EXCEPTION_MEMORY_NONE                    0x0        // Load/Store generate none exception
+#  define EXCEPTION_MEMORY_ALIGNMENT               0x1        // Load/Store access is not aligned
+#  define EXCEPTION_MEMORY_DATA_TLB                0x2        // DTLB miss
+#  define EXCEPTION_MEMORY_DATA_PAGE               0x3        // No matching or page violation protection in pages tables
+#  define EXCEPTION_MEMORY_BUS_ERROR               0x4        // Access at a invalid physical address
+#  define EXCEPTION_MEMORY_MISS_SPECULATION        0x5        // Load miss speculation
+#  define EXCEPTION_MEMORY_LOAD_SPECULATIVE        0x6        // The load is speculative : write in register file, but don't commit
+
+#  define EXCEPTION_CUSTOM_NONE                    0x1        // Custom unit generate none exception
+#  define EXCEPTION_CUSTOM_CUST_0                  0x1        // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_CUST_1                  0x2        // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_CUST_2                  0x3        // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_CUST_3                  0x4        // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_CUST_4                  0x5        // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_CUST_5                  0x6        // Reserved for custom exceptions
+#  define EXCEPTION_CUSTOM_CUST_6                  0x7        // Reserved for custom exceptions
+
+#  define EXCEPTION_ALU_NONE                       0x0        // Functionnal unit generate none exception
+#  define EXCEPTION_ALU_RANGE                      0x1        // 
+#  define EXCEPTION_ALU_SPR_ACCESS_INVALID         0x2        // SPR     present in ALU but not compatible privilege
+#  define EXCEPTION_ALU_SPR_ACCESS_NOT_COMPLETE    0x3        // SPR not present in ALU
+
+  //=======================================================[ dcache ]=====
+
+  //--------------------------------------------------[ dcache_type ]-----
+
+#  define SIZE_DCACHE_TYPE                              4
+
+#  define DCACHE_TYPE_LOAD                              0x0        // 0000
+#  define DCACHE_TYPE_LOCK                              0x1        // 0001
+#  define DCACHE_TYPE_INVALIDATE                        0x2        // 0010
+#  define DCACHE_TYPE_PREFETCH                          0x3        // 0011
+//#define DCACHE_TYPE_                                  0x4        // 0100
+//#define DCACHE_TYPE_                                  0x5        // 0101
+#  define DCACHE_TYPE_FLUSH                             0x6        // 0110
+#  define DCACHE_TYPE_SYNCHRONIZATION                   0x7        // 0111
+#  define DCACHE_TYPE_STORE_8                           0x8        // 1000
+#  define DCACHE_TYPE_STORE_16                          0x9        // 1001
+#  define DCACHE_TYPE_STORE_32                          0xa        // 1010
+#  define DCACHE_TYPE_STORE_64                          0xb        // 1011
+//#define DCACHE_TYPE_                                  0xc        // 1100
+//#define DCACHE_TYPE_                                  0xd        // 1101
+//#define DCACHE_TYPE_                                  0xe        // 1110
+//#define DCACHE_TYPE_                                  0xf        // 1111
 
 // just take the 4 less significative bits.
 #define operation_to_dcache_type(x) (x&0xf)
+
+  //-------------------------------------------------[ dcache_error ]-----
+
+#  define SIZE_DCACHE_ERROR                             1
+
+#  define DCACHE_ERROR_NONE                             0x0
+#  define DCACHE_ERROR_BUS_ERROR                        0x1
+
+  //=================================================[ special_data ]=====
+
+#  define SIZE_SPECIAL_DATA                             2
+
+// Position of flag in "rename register SR" (NOT IN "SR")
+#  define FLAG_POSITION_F                               0x0         // Conditionnal branch flag
+#  define FLAG_POSITION_CY                              0x1         // Carry was produced by last arithmetic operation
+#  define FLAG_POSITION_OV                              0x0         // Overflow occured during last arithmetic operation
+
+#  define FLAG_F                                        (1<<FLAG_POSITION_F ) // Conditionnal branch flag
+#  define FLAG_CY                                       (1<<FLAG_POSITION_CY) // Carry was produced by last arithmetic operation
+#  define FLAG_OV                                       (1<<FLAG_POSITION_OV) // Overflow occured during last arithmetic operation
+
+  //==========================================================[ spr ]=====
+
+  enum
+    {
+      GROUP_SYSTEM_AND_CONTROL,  // 0
+      GROUP_DMMU,                // 1
+      GROUP_IMMU,                // 2
+      GROUP_DCACHE,              // 3
+      GROUP_ICACHE,              // 4
+      GROUP_MAC,                 // 5
+      GROUP_DEBUG,               // 6
+      GROUP_PERFORMANCE_COUNTER, // 7
+      GROUP_POWER_MANAGEMENT,    // 8
+      GROUP_PIC,                 // 9
+      GROUP_TICK_TIMER,          // 10
+      GROUP_FLOATING_POINT,      // 11
+      GROUP_RESERVED_1,          // 12     
+      GROUP_RESERVED_2,          // 13     
+      GROUP_RESERVED_3,          // 14     
+      GROUP_RESERVED_4,          // 15     
+      GROUP_RESERVED_5,          // 16     
+      GROUP_RESERVED_6,          // 17     
+      GROUP_RESERVED_7,          // 18     
+      GROUP_RESERVED_8,          // 19     
+      GROUP_RESERVED_9,          // 20     
+      GROUP_RESERVED_10,         // 21     
+      GROUP_RESERVED_11,         // 22     
+      GROUP_RESERVED_12,         // 23
+      GROUP_CUSTOM_1,            // 24     
+      GROUP_CUSTOM_2,            // 25     
+      GROUP_CUSTOM_3,            // 26     
+      GROUP_CUSTOM_4,            // 27     
+      GROUP_CUSTOM_5,            // 28     
+      GROUP_CUSTOM_6,            // 29     
+      GROUP_CUSTOM_7,            // 30     
+      GROUP_CUSTOM_8             // 31     
+    };
+
+#  define NB_GROUP                                 32
+#  define NB_REG_GROUP_SYSTEM_AND_CONTROL          1536
+#  define NB_REG_GROUP_DMMU                        1536
+#  define NB_REG_GROUP_IMMU                        1536
+#  define NB_REG_GROUP_DCACHE                      6
+#  define NB_REG_GROUP_ICACHE                      4
+#  define NB_REG_GROUP_MAC                         3
+#  define NB_REG_GROUP_DEBUG                       22
+#  define NB_REG_GROUP_PERFORMANCE_COUNTER         16
+#  define NB_REG_GROUP_POWER_MANAGEMENT            1
+#  define NB_REG_GROUP_PIC                         3
+#  define NB_REG_GROUP_TICK_TIMER                  2
+#  define NB_REG_GROUP_FLOATING_POINT              0
+#  define NB_REG_GROUP_RESERVED_1                  0
+#  define NB_REG_GROUP_RESERVED_2                  0
+#  define NB_REG_GROUP_RESERVED_3                  0
+#  define NB_REG_GROUP_RESERVED_4                  0
+#  define NB_REG_GROUP_RESERVED_5                  0
+#  define NB_REG_GROUP_RESERVED_6                  0
+#  define NB_REG_GROUP_RESERVED_7                  0
+#  define NB_REG_GROUP_RESERVED_8                  0
+#  define NB_REG_GROUP_RESERVED_9                  0
+#  define NB_REG_GROUP_RESERVED_10                 0
+#  define NB_REG_GROUP_RESERVED_11                 0
+#  define NB_REG_GROUP_RESERVED_12                 0
+#  define NB_REG_GROUP_CUSTOM_1                    0
+#  define NB_REG_GROUP_CUSTOM_2                    0
+#  define NB_REG_GROUP_CUSTOM_3                    0
+#  define NB_REG_GROUP_CUSTOM_4                    0
+#  define NB_REG_GROUP_CUSTOM_5                    0
+#  define NB_REG_GROUP_CUSTOM_6                    0
+#  define NB_REG_GROUP_CUSTOM_7                    0
+#  define NB_REG_GROUP_CUSTOM_8                    0
+					           
+					           
+  // GROUP_MAC				           
+#  define SPR_MACLO                                1          // MAC Low
+#  define SPR_MACHI                                2          // MAC High
+
+  //----------------------------------------------[ spr_mode_access ]-----
+
+#  define SPR_ACCESS_MODE_NONE                     0x0        // 000
+#  define SPR_ACCESS_MODE_READ_ONLY                0x1        // 001
+#  define SPR_ACCESS_MODE_WRITE_ONLY               0x2        // 010
+#  define SPR_ACCESS_MODE_READ_WRITE               0x3        // 011
+#  define SPR_ACCESS_MODE_READ_ONLY_COND           0x5        // 101 special read
 
   /*
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Debug_component.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Debug_component.h	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Debug_component.h	(revision 72)
@@ -21,5 +21,6 @@
 #define         DEBUG_Multi_Execute_unit                          false
 #define           DEBUG_Execute_unit                              false
-#define             DEBUG_Load_store_unit                         true 
+#define             DEBUG_Functionnal_unit                        true 
+#define             DEBUG_Load_store_unit                         false
 #define         DEBUG_Multi_Read_unit				  false
 #define           DEBUG_Read_unit				  false
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Parameters.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Parameters.h	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Parameters.h	(revision 72)
@@ -13,4 +13,5 @@
 #include <math.h>
 #include "Behavioural/include/Environnement.h"
+#include "Behavioural/include/Constants.h"
 #include "Common/include/ErrorMorpheo.h"
 #include "Common/include/ToString.h"
@@ -25,8 +26,7 @@
   {
     // -----[ fields ]----------------------------------------------------
-  public   : static const uint32_t   _size_exception      = 4 ;
-  public   : static const uint32_t   _size_dcache_address = 32;
-  public   : static const uint32_t   _size_dcache_type    = 4;
-  public   : static const uint32_t   _size_dcache_error   = 1;
+  public   : static const uint32_t   _size_exception      = SIZE_EXCEPTION;
+  public   : static const uint32_t   _size_dcache_type    = SIZE_DCACHE_TYPE;
+  public   : static const uint32_t   _size_dcache_error   = SIZE_DCACHE_ERROR;
 
     // -----[ methods ]---------------------------------------------------
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/SPR_access_mode.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/SPR_access_mode.h	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/SPR_access_mode.h	(revision 72)
@@ -0,0 +1,43 @@
+#ifndef morpheo_behavioural_SPR_access_mode_h
+#define morpheo_behavioural_SPR_access_mode_h
+
+#include "Common/include/BitManipulation.h"
+#include "Common/include/ErrorMorpheo.h"
+#include "Behavioural/include/Constants.h"
+#include "Behavioural/include/Types.h"
+
+namespace morpheo {
+namespace behavioural {
+
+  typedef struct
+  {
+    Tgeneral_data_t _group;
+    Tgeneral_data_t _register;
+  } spr_address_t;
+
+
+  class SPR_access_mode
+  {
+  private : spr_access_mode_t   ** _spr_generic;
+  private : uint32_t             * _max_register_by_group;
+
+  public  : SPR_access_mode();
+  public  : ~SPR_access_mode();
+
+  public  : spr_address_t translate_address (Tgeneral_data_t address);
+
+  public  : bool          valid (uint32_t num_group, uint32_t num_reg);
+  public  : bool          valid (spr_address_t address);
+  public  : bool          read  (spr_address_t address, Tcontrol_t SM, Tcontrol_t SUMRA);
+  public  : bool          write (spr_address_t address, Tcontrol_t SM, Tcontrol_t SUMRA);
+
+  public  : void          implement_group (uint32_t num_group, uint32_t nb_reg);
+  public  : uint32_t      implement_group (uint32_t num_group);
+  public  : void          change_mode     (uint32_t num_group, uint32_t num_reg, spr_access_mode_t new_mode);
+  };
+  
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
+
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Types.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Types.h	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/include/Types.h	(revision 72)
@@ -42,4 +42,19 @@
   typedef uint32_t      Tdcache_type_t;
 
+  //----------------------------------------------[ spr_mode_access ]-----
+  class spr_access_mode_t
+  {
+  public : uint8_t _user_access_mode      ;
+  public : uint8_t _supervisor_access_mode;
+    
+  public : spr_access_mode_t (uint32_t user_access_mode       = SPR_ACCESS_MODE_NONE,
+			      uint32_t supervisor_access_mode = SPR_ACCESS_MODE_NONE)
+    {
+      _user_access_mode       = user_access_mode      ;
+      _supervisor_access_mode = supervisor_access_mode;
+    }
+  };
+
+
 }; // end namespace behavioural
 }; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode.cpp	(revision 72)
@@ -0,0 +1,32 @@
+#include "Behavioural/include/SPR_access_mode.h"
+
+namespace morpheo {
+namespace behavioural {
+
+  SPR_access_mode::SPR_access_mode()
+  {
+    
+    _max_register_by_group = new uint32_t [NB_GROUP];
+
+    _spr_generic = new spr_access_mode_t * [NB_GROUP];
+
+    for (uint32_t i=0; i<NB_GROUP; i++)
+      {
+	_spr_generic [i] = NULL;
+	_max_register_by_group [i] = 0;
+      }
+  }
+
+  SPR_access_mode::~SPR_access_mode()
+  {
+    for (uint32_t i=0; i<NB_GROUP; i++)
+	if (_spr_generic [i] != NULL)
+	  delete _spr_generic [i];
+
+      delete [] _spr_generic;
+
+      delete _max_register_by_group;
+    }
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_change_mode.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_change_mode.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_change_mode.cpp	(revision 72)
@@ -0,0 +1,16 @@
+#include "Behavioural/include/SPR_access_mode.h"
+
+namespace morpheo {
+namespace behavioural {
+
+  void SPR_access_mode::change_mode (uint32_t num_group, uint32_t num_reg, spr_access_mode_t new_mode)
+    {
+      if (not valid (num_group, num_reg))
+	throw ERRORMORPHEO("SPR_access_mode::change_mode", "Invalid group number or register number.");
+
+      _spr_generic[num_group][num_reg] = new_mode;
+    }
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_implement_group.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_implement_group.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_implement_group.cpp	(revision 72)
@@ -0,0 +1,209 @@
+#include "Behavioural/include/SPR_access_mode.h"
+
+namespace morpheo {
+namespace behavioural {
+
+  void SPR_access_mode::implement_group (uint32_t num_group, uint32_t nb_reg )
+    {
+      if (_spr_generic[num_group] != NULL)
+	throw ERRORMORPHEO("SPR_access_mode::implement_group", "implement more once a group.");
+
+      _max_register_by_group[num_group] = nb_reg;
+      _spr_generic [num_group] = new spr_access_mode_t [nb_reg];
+    }
+
+  uint32_t SPR_access_mode::implement_group (uint32_t num_group)
+    {
+      if (_spr_generic[num_group] != NULL)
+	throw ERRORMORPHEO("SPR_access_mode::implement_group", "implement more once a group.");
+
+      switch (num_group)
+	{
+	case GROUP_SYSTEM_AND_CONTROL  : 
+	  {
+    	    implement_group(GROUP_SYSTEM_AND_CONTROL  ,NB_REG_GROUP_SYSTEM_AND_CONTROL  );
+
+    	    for (uint32_t i=0 ; i<=8 ; i++)
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_ONLY;
+    	    for (uint32_t i=16; i<=18; i++)
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][  20]._user_access_mode       = SPR_ACCESS_MODE_READ_ONLY_COND;
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][  20]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+    	    
+    	    const uint32_t nb_shadow = 1;
+    	    
+    	    for (uint32_t i=32; i<=32+nb_shadow; i++)
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+    	    for (uint32_t i=48; i<=48+nb_shadow; i++)
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+    	    for (uint32_t i=64; i<=64+nb_shadow; i++)
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+    	    for (uint32_t i=1024; i<=1024+32*nb_shadow; i++)
+    	    _spr_generic [GROUP_SYSTEM_AND_CONTROL ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+
+	    break;
+	  }
+	case GROUP_DMMU                :
+	  {
+	    implement_group(GROUP_DMMU                ,NB_REG_GROUP_DMMU                );
+
+	    for (uint32_t i=0; i<=2; i++)
+	    _spr_generic [GROUP_DMMU               ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    _spr_generic [GROUP_DMMU               ][   2]._supervisor_access_mode = SPR_ACCESS_MODE_WRITE_ONLY;
+	    for (uint32_t i=4; i<=11; i++)
+	    _spr_generic [GROUP_DMMU               ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    for (uint32_t i=512; i<=1535; i++)
+	    _spr_generic [GROUP_DMMU               ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+
+	    break;
+	  }
+	case GROUP_IMMU                :
+	  {
+	    implement_group(GROUP_IMMU                ,NB_REG_GROUP_IMMU                );
+
+	    for (uint32_t i=0; i<=2; i++)
+	    _spr_generic [GROUP_IMMU               ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    _spr_generic [GROUP_IMMU               ][   2]._supervisor_access_mode = SPR_ACCESS_MODE_WRITE_ONLY;
+	    for (uint32_t i=4; i<=11; i++)
+	    _spr_generic [GROUP_IMMU               ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    for (uint32_t i=512; i<=1536; i++)
+	    _spr_generic [GROUP_IMMU               ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    
+	    break;
+	  }
+	case GROUP_DCACHE              :
+	  {
+	    implement_group(GROUP_DCACHE              ,NB_REG_GROUP_DCACHE              );
+
+	    _spr_generic [GROUP_DCACHE             ][   0]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    for (uint32_t i=0; i<=5; i++)
+	    	{
+	    _spr_generic [GROUP_DCACHE             ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_WRITE_ONLY;
+	    _spr_generic [GROUP_DCACHE             ][   i]._user_access_mode       = SPR_ACCESS_MODE_WRITE_ONLY;
+	    	}
+	    _spr_generic [GROUP_DCACHE             ][   3]._user_access_mode       = SPR_ACCESS_MODE_NONE;
+	    
+	    break;
+	  }
+	case GROUP_ICACHE              :
+	  {
+	    implement_group(GROUP_ICACHE              ,NB_REG_GROUP_ICACHE              );
+
+	    _spr_generic [GROUP_ICACHE             ][   0]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    for (uint32_t i=0; i<=3; i++)
+	    	{
+	    _spr_generic [GROUP_ICACHE             ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_WRITE_ONLY;
+	    _spr_generic [GROUP_ICACHE             ][   i]._user_access_mode       = SPR_ACCESS_MODE_WRITE_ONLY;
+	    	}
+	    _spr_generic [GROUP_ICACHE             ][   2]._user_access_mode       = SPR_ACCESS_MODE_NONE;
+	    
+	    break;
+	  }
+	case GROUP_MAC                 :
+	  {
+	    implement_group(GROUP_MAC                 ,NB_REG_GROUP_MAC                 );
+
+	    for (uint32_t i=1; i<=2; i++)
+	    	{
+	    _spr_generic [GROUP_MAC                ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    _spr_generic [GROUP_MAC                ][   i]._user_access_mode       = SPR_ACCESS_MODE_READ_WRITE;
+	    	}
+	    
+	    break;
+	  }
+	case GROUP_DEBUG               :
+	  {
+	    implement_group(GROUP_DEBUG               ,NB_REG_GROUP_DEBUG               );
+
+	    for (uint32_t i=0; i<=21; i++)
+	    _spr_generic [GROUP_DEBUG              ][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    
+	    break;
+	  }
+	case GROUP_PERFORMANCE_COUNTER :
+	  {
+	    implement_group(GROUP_PERFORMANCE_COUNTER ,NB_REG_GROUP_PERFORMANCE_COUNTER );
+
+	    for (uint32_t i=0; i<=7; i++)
+	    	{
+	    _spr_generic [GROUP_PERFORMANCE_COUNTER][   i]._user_access_mode       = SPR_ACCESS_MODE_READ_ONLY_COND;
+	    _spr_generic [GROUP_PERFORMANCE_COUNTER][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    	}
+	    for (uint32_t i=8; i<=15; i++)
+	    _spr_generic [GROUP_PERFORMANCE_COUNTER][   i]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    
+	    break;
+	  }
+	case GROUP_POWER_MANAGEMENT    :
+	  {
+	    implement_group(GROUP_POWER_MANAGEMENT    ,NB_REG_GROUP_POWER_MANAGEMENT    );
+
+	    _spr_generic [GROUP_POWER_MANAGEMENT   ][   0]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    
+	    break;
+	  }
+	case GROUP_PIC                 :
+	  {
+	    implement_group(GROUP_PIC                 ,NB_REG_GROUP_PIC                 );
+
+	    _spr_generic [GROUP_PIC                ][   0]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    _spr_generic [GROUP_PIC                ][   2]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    
+	    break;
+	  }
+	case GROUP_TICK_TIMER          :
+	  {
+	    implement_group(GROUP_TICK_TIMER          ,NB_REG_GROUP_TICK_TIMER          );
+
+	    _spr_generic [GROUP_TICK_TIMER         ][   0]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    _spr_generic [GROUP_TICK_TIMER         ][   1]._supervisor_access_mode = SPR_ACCESS_MODE_READ_WRITE;
+	    _spr_generic [GROUP_TICK_TIMER         ][   1]._user_access_mode       = SPR_ACCESS_MODE_READ_ONLY_COND;
+	    
+	    break;
+	  }
+	case GROUP_FLOATING_POINT      :
+	  {
+	    implement_group(GROUP_FLOATING_POINT      ,NB_REG_GROUP_FLOATING_POINT      );
+	    break;
+	  }
+	case GROUP_RESERVED_1          : 
+	case GROUP_RESERVED_2          : 
+	case GROUP_RESERVED_3          : 
+	case GROUP_RESERVED_4          : 
+	case GROUP_RESERVED_5          : 
+	case GROUP_RESERVED_6          : 
+	case GROUP_RESERVED_7          : 
+	case GROUP_RESERVED_8          : 
+	case GROUP_RESERVED_9          : 
+	case GROUP_RESERVED_10         : 
+	case GROUP_RESERVED_11         : 
+	case GROUP_RESERVED_12         : 
+	  {
+	    throw ERRORMORPHEO("SPR_access_mode::implement_group", "group number is invalid : it's a reserved group.");
+	    break;
+	  }
+	case GROUP_CUSTOM_1            : 
+	case GROUP_CUSTOM_2            : 
+	case GROUP_CUSTOM_3            : 
+	case GROUP_CUSTOM_4            : 
+	case GROUP_CUSTOM_5            : 
+	case GROUP_CUSTOM_6            : 
+	case GROUP_CUSTOM_7            : 
+	case GROUP_CUSTOM_8            :
+	  {
+	    throw ERRORMORPHEO("SPR_access_mode::implement_group", "group number is invalid : it's a custom group.");
+	    break;
+	  }
+	default :
+	  {
+	    throw ERRORMORPHEO("SPR_access_mode::implement_group", "group number is invalid : it's a unknow group.");
+	    break;
+	  }
+	}
+
+      return _max_register_by_group[num_group];
+    }
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_read_write.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_read_write.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_read_write.cpp	(revision 72)
@@ -0,0 +1,43 @@
+#include "Behavioural/include/SPR_access_mode.h"
+
+namespace morpheo {
+namespace behavioural {
+
+
+    // SM    : Supervisor Mode
+    //           * 0 : User Mode
+    //           * 1 : Supervisor Mode
+    // SUMRA : SPRs User Mode Read Access
+    //           * 0 : All SPRs are inaccessible in user mode
+    //           * 1 : Certain SPRs can be read in user mode
+    
+  bool SPR_access_mode::read (spr_address_t address, Tcontrol_t SM, Tcontrol_t SUMRA)
+    {
+      if (not valid(address))
+	return false;
+
+      spr_access_mode_t mode = _spr_generic [address._group][address._register];
+
+      return (((SM == 1) and ( (mode._supervisor_access_mode == SPR_ACCESS_MODE_READ_ONLY     ) or
+			       (mode._supervisor_access_mode == SPR_ACCESS_MODE_READ_WRITE    ))) or
+	      ((SM == 0) and ( (mode._user_access_mode       == SPR_ACCESS_MODE_READ_ONLY     ) or
+			       (mode._user_access_mode       == SPR_ACCESS_MODE_READ_WRITE    ) or
+			      ((mode._user_access_mode       == SPR_ACCESS_MODE_READ_ONLY_COND) and (SUMRA == 1)))));
+    }
+
+  bool SPR_access_mode::write(spr_address_t address, Tcontrol_t SM, Tcontrol_t SUMRA)
+    {
+      if (not valid(address))
+	return false;
+
+      spr_access_mode_t mode = _spr_generic [address._group][address._register];
+      
+      return (((SM == 1) and ( (mode._supervisor_access_mode == SPR_ACCESS_MODE_WRITE_ONLY    ) or
+			       (mode._supervisor_access_mode == SPR_ACCESS_MODE_READ_WRITE    ))) or
+	      ((SM == 0) and ( (mode._user_access_mode       == SPR_ACCESS_MODE_WRITE_ONLY    ) or
+			       (mode._user_access_mode       == SPR_ACCESS_MODE_READ_WRITE    )))) ;
+    }
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_translate_address.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_translate_address.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_translate_address.cpp	(revision 72)
@@ -0,0 +1,18 @@
+#include "Behavioural/include/SPR_access_mode.h"
+
+namespace morpheo {
+namespace behavioural {
+
+  spr_address_t SPR_access_mode::translate_address (Tgeneral_data_t address)
+  {
+    spr_address_t addr;
+
+    addr._group    = range<Tgeneral_data_t>(address,15,11);
+    addr._register = range<Tgeneral_data_t>(address,10, 0);
+
+    return addr;
+  }
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
Index: /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_valid.cpp
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_valid.cpp	(revision 72)
+++ /trunk/IPs/systemC/processor/Morpheo/Behavioural/src/SPR_access_mode_valid.cpp	(revision 72)
@@ -0,0 +1,23 @@
+#include "Behavioural/include/SPR_access_mode.h"
+
+namespace morpheo {
+namespace behavioural {
+
+  bool SPR_access_mode::valid (spr_address_t address)
+  {
+    return valid(address._group, address._register);
+  }
+  
+  bool SPR_access_mode::valid (uint32_t num_group, uint32_t num_reg)
+  {
+//     std::cout << "<SPR_access_mode::valid>" << std::endl;
+//     std::cout << "  * num_group                         : " << num_group << std::endl;
+//     std::cout << "  * num_reg                           : " << num_reg   << std::endl;
+//     std::cout << "  * _spr_generic          [num_group] : " << _spr_generic[num_group] << std::endl;
+//     std::cout << "  * _max_register_by_group[num_group] : " << _max_register_by_group[num_group] << std::endl;
+    return ((num_group < NB_GROUP) and (_spr_generic[num_group] != NULL) and (num_reg < _max_register_by_group[num_group]));
+  }
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+
Index: /trunk/IPs/systemC/processor/Morpheo/Common/include/BitManipulation.h
===================================================================
--- /trunk/IPs/systemC/processor/Morpheo/Common/include/BitManipulation.h	(revision 71)
+++ /trunk/IPs/systemC/processor/Morpheo/Common/include/BitManipulation.h	(revision 72)
@@ -189,5 +189,5 @@
   T range          (T data, uint32_t index_max, uint32_t index_min)  
   {
-    return gen_mask<T>(index_max-index_min+1) & (data << index_min);
+    return (mask<T>(data,index_max,index_min) >> index_min);
   }
 
