Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit.cpp	(revision 88)
@@ -39,4 +39,10 @@
     log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
 
+#if DEBUG_Free_List_unit == true
+    log_printf(INFO,Free_List_unit,FUNCTION,_("<%s> Parameters"),_name.c_str());
+
+    std::cout << *param << std::endl;
+#endif    
+
     log_printf(INFO,Free_List_unit,FUNCTION,"Allocation");
 
@@ -48,5 +54,5 @@
 
 #ifdef STATISTICS
-    if (_usage & USE_STATISTICS)
+    if (usage_is_set(_usage,USE_STATISTICS))
       {	
 	log_printf(INFO,Free_List_unit,FUNCTION,"Allocation of statistics");
@@ -57,5 +63,5 @@
 
 #ifdef VHDL
-    if (_usage & USE_VHDL)
+    if (usage_is_set(_usage,USE_VHDL))
       {
 	// generate the vhdl
@@ -67,5 +73,5 @@
 
 #ifdef SYSTEMC
-    if (_usage & USE_SYSTEMC)
+    if (usage_is_set(_usage,USE_SYSTEMC))
       {
 	log_printf(INFO,Free_List_unit,FUNCTION,"Method - transition");
@@ -83,5 +89,5 @@
 	SC_METHOD (genMealy_pop);
 	dont_initialize ();
-	sensitive << (*(in_CLOCK)).neg();
+	sensitive << (*(in_CLOCK)).neg(); // need internal register
 	for (uint32_t i=0; i<_param->_nb_pop; i++)
 	  sensitive << (*(in_POP_GPR_VAL[i]))
@@ -104,5 +110,5 @@
 	SC_METHOD (genMealy_push_gpr);
 	dont_initialize ();
-	sensitive << (*(in_CLOCK)).neg();
+	sensitive << (*(in_CLOCK)).neg(); // need internal register
 	for (uint32_t i=0; i<_param->_nb_push; i++)
 	  sensitive << (*(in_PUSH_GPR_VAL    [i]))
@@ -123,5 +129,5 @@
 	SC_METHOD (genMealy_push_spr);
 	dont_initialize ();
-	sensitive << (*(in_CLOCK)).neg();
+	sensitive << (*(in_CLOCK)).neg(); // need internal register
 	for (uint32_t i=0; i<_param->_nb_push; i++)
 	  sensitive << (*(in_PUSH_SPR_VAL    [i]))
@@ -150,5 +156,5 @@
 
 #ifdef STATISTICS
-    if (_usage & USE_STATISTICS)
+    if (usage_is_set(_usage,USE_STATISTICS))
       {
 	log_printf(INFO,Free_List_unit,FUNCTION,"Generate Statistics file");
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_allocation.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_allocation.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_allocation.cpp	(revision 88)
@@ -86,5 +86,6 @@
      }
 
-    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+     if (usage_is_set(_usage,USE_SYSTEMC))
+       {
      _gpr_list = new std::list<uint32_t> [_param->_nb_bank];
      _spr_list = new std::list<uint32_t> [_param->_nb_bank];
@@ -98,7 +99,10 @@
      internal_PUSH_GPR_BANK = new uint32_t   [_param->_nb_push];
      internal_PUSH_SPR_BANK = new uint32_t   [_param->_nb_push];
+       }
+    // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
 
 #ifdef POSITION
-    _component->generate_file();
+     if (usage_is_set(_usage,USE_POSITION))
+       _component->generate_file();
 #endif
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_deallocation.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_deallocation.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_deallocation.cpp	(revision 88)
@@ -24,5 +24,5 @@
     log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
 
-    if (_usage & USE_SYSTEMC)
+    if (usage_is_set(_usage,USE_SYSTEMC))
       {
 	delete    in_CLOCK ;
@@ -43,17 +43,19 @@
 	delete [] out_PUSH_SPR_ACK    ;
 	delete []  in_PUSH_SPR_NUM_REG;
+
+        delete [] _gpr_list;
+        delete [] _spr_list;
+        
+        delete [] internal_POP_ACK     ;
+        delete [] internal_POP_GPR_BANK;
+        delete [] internal_POP_SPR_BANK;
+        
+        delete [] internal_PUSH_GPR_ACK ;
+        delete [] internal_PUSH_SPR_ACK ;
+        delete [] internal_PUSH_GPR_BANK;
+        delete [] internal_PUSH_SPR_BANK;
       }
+
     // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
-     delete [] _gpr_list;
-     delete [] _spr_list;
-
-     delete [] internal_POP_ACK     ;
-     delete [] internal_POP_GPR_BANK;
-     delete [] internal_POP_SPR_BANK;
-
-     delete [] internal_PUSH_GPR_ACK ;
-     delete [] internal_PUSH_SPR_ACK ;
-     delete [] internal_PUSH_GPR_BANK;
-     delete [] internal_PUSH_SPR_BANK;
 
      delete _component;
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_end_cycle.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_end_cycle.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_end_cycle.cpp	(revision 88)
@@ -26,5 +26,6 @@
 
 #ifdef STATISTICS
-    _stat->end_cycle();
+    if (usage_is_set(_usage,USE_STATISTICS))
+      _stat->end_cycle();
 #endif    
 
@@ -32,5 +33,6 @@
     // Evaluation before read the ouput signal
 //  sc_start(0);
-    _interfaces->testbench();
+    if (usage_is_set(_usage,USE_VHDL_TESTBENCH))
+      _interfaces->testbench();
 #endif
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_pop.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_pop.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_pop.cpp	(revision 88)
@@ -23,5 +23,6 @@
   void Free_List_unit::genMealy_pop (void)
   {
-    log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
+    log_begin(Free_List_unit,FUNCTION);
+    log_function(Free_List_unit,FUNCTION,_name.c_str());
 
     for (uint32_t i=0; i<_param->_nb_pop; i++)
@@ -77,5 +78,5 @@
     
 
-    log_printf(FUNC,Free_List_unit,FUNCTION,"End");
+    log_end(Free_List_unit,FUNCTION);
   };
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_push_gpr.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_push_gpr.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_push_gpr.cpp	(revision 88)
@@ -23,5 +23,6 @@
   void Free_List_unit::genMealy_push_gpr (void)
   {
-    log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
+    log_begin(Free_List_unit,FUNCTION);
+    log_function(Free_List_unit,FUNCTION,_name.c_str());
 
     bool bank_use [_param->_nb_bank];
@@ -51,5 +52,5 @@
       }
     
-    log_printf(FUNC,Free_List_unit,FUNCTION,"End");
+    log_end(Free_List_unit,FUNCTION);
   };
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_push_spr.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_push_spr.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_genMealy_push_spr.cpp	(revision 88)
@@ -23,5 +23,6 @@
   void Free_List_unit::genMealy_push_spr (void)
   {
-    log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
+    log_begin(Free_List_unit,FUNCTION);
+    log_function(Free_List_unit,FUNCTION,_name.c_str());
 
     bool bank_use [_param->_nb_bank];
@@ -51,5 +52,5 @@
       }
     
-    log_printf(FUNC,Free_List_unit,FUNCTION,"End");
+    log_end(Free_List_unit,FUNCTION);
   };
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_transition.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_transition.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Free_List_unit_transition.cpp	(revision 88)
@@ -23,5 +23,6 @@
   void Free_List_unit::transition (void)
   {
-    log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
+    log_begin(Free_List_unit,FUNCTION);
+    log_function(Free_List_unit,FUNCTION,_name.c_str());
 
     if (PORT_READ(in_NRESET) == 0)
@@ -39,8 +40,9 @@
 	// =====[ POP ]======================================
 	// ==================================================
-// 	log_printf(TRACE,Free_List_unit,FUNCTION,"Test transaction POP");
 	for (uint32_t i=0; i<_param->_nb_pop; i++)
 	  if (PORT_READ(in_POP_VAL[i]) and internal_POP_ACK [i])
 	    {
+              log_printf(TRACE,Free_List_unit,FUNCTION,"  * POP [%d]",i);
+
 	      if (PORT_READ(in_POP_GPR_VAL [i]))
 		_gpr_list [internal_POP_GPR_BANK[i]].pop_front();
@@ -53,21 +55,54 @@
 	// =====[ PUSH_GPR ]=================================
 	// ==================================================
-// 	log_printf(TRACE,Free_List_unit,FUNCTION,"Test transaction PUSH_GPR");
 	for (uint32_t i=0; i<_param->_nb_push; i++)
 	  if (PORT_READ(in_PUSH_GPR_VAL[i]) and internal_PUSH_GPR_ACK [i])
-	    _gpr_list [internal_PUSH_GPR_BANK[i]].push_back(//_param->_mask_gpr &
-							    PORT_READ(in_PUSH_GPR_NUM_REG [i]));
+            {
+              log_printf(TRACE,Free_List_unit,FUNCTION,"  * PUSH_GPR[%d]",i);
 
+              _gpr_list [internal_PUSH_GPR_BANK[i]].push_back(//_param->_mask_gpr &
+                                                              PORT_READ(in_PUSH_GPR_NUM_REG [i]));
+            }
 	// ==================================================
 	// =====[ PUSH_SPR ]=================================
 	// ==================================================
-// 	log_printf(TRACE,Free_List_unit,FUNCTION,"Test transaction PUSH_SPR");
 	for (uint32_t i=0; i<_param->_nb_push; i++)
 	  if (PORT_READ(in_PUSH_SPR_VAL[i]) and internal_PUSH_SPR_ACK [i])
-	    _spr_list [internal_PUSH_SPR_BANK[i]].push_back(//_param->_mask_spr &
-							    PORT_READ(in_PUSH_SPR_NUM_REG [i]));
+            {
+              log_printf(TRACE,Free_List_unit,FUNCTION,"  * PUSH_SPR[%d]",i);
+
+              _spr_list [internal_PUSH_SPR_BANK[i]].push_back(//_param->_mask_spr &
+                                                              PORT_READ(in_PUSH_SPR_NUM_REG [i]));
+            }
 
 	if (_param->_priority == PRIORITY_ROUND_ROBIN)
 	  internal_BANK_PRIORITY = (internal_BANK_PRIORITY+1)%_param->_nb_bank_by_pop;
+
+#if (DEBUG >= DEBUG_TRACE) and (DEBUG_Free_List_unit == true)
+        log_printf(TRACE,Free_List_unit,FUNCTION,"  * Dump Free List");
+
+        for (uint32_t i=0; i<_param->_nb_bank; ++i)
+          {
+            uint32_t j=0;
+            for (std::list<Tgeneral_address_t>::iterator it=_gpr_list->begin();
+                 it!=_gpr_list->end();
+                 ++it)
+              {
+                log_printf(TRACE,Free_List_unit,FUNCTION,"    * GPR_LIST[%.5d][%.5d] : %.5d",i,j,*it);
+                ++j;
+              }
+          }
+        for (uint32_t i=0; i<_param->_nb_bank; ++i)
+          {
+            uint32_t j=0;
+            for (std::list<Tspecial_address_t>::iterator it=_spr_list->begin();
+                 it!=_spr_list->end();
+                 ++it)
+              {
+                log_printf(TRACE,Free_List_unit,FUNCTION,"    * SPR_LIST[%.5d][%.5d] : %.5d",i,j,*it);
+                ++j;
+              }
+          }
+
+#endif
       }
 
@@ -76,5 +111,5 @@
 #endif
 
-    log_printf(FUNC,Free_List_unit,FUNCTION,"End");
+    log_end(Free_List_unit,FUNCTION);
   };
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Parameters.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Parameters.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Parameters.cpp	(revision 88)
@@ -27,5 +27,6 @@
 			  uint32_t    nb_pop             ,
 			  uint32_t    nb_push            ,
-			  Tpriority_t priority           )
+			  Tpriority_t priority           ,
+                          bool        is_toplevel        )
   {
     log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
@@ -41,6 +42,6 @@
     test();
 
-    _size_general_register = log2(nb_general_register);
-    _size_special_register = log2(nb_special_register);
+    uint32_t size_general_register = log2(nb_general_register);
+    uint32_t size_special_register = log2(nb_special_register);
 
     _nb_bank_by_pop        = _nb_bank / _nb_pop;
@@ -49,5 +50,5 @@
 
     _bank_gpr_nb_slot      = gpr_nb_slot/nb_bank;
-    _bank_gpr_size_slot    = _size_general_register-log2(nb_bank);
+    _bank_gpr_size_slot    = size_general_register-log2(nb_bank);
 
     _mask_gpr              = gen_mask<Tgeneral_address_t> (_bank_gpr_size_slot);
@@ -56,7 +57,15 @@
 
     _bank_spr_nb_slot      = spr_nb_slot/nb_bank;
-    _bank_spr_size_slot    = _size_special_register-log2(nb_bank);
+    _bank_spr_size_slot    = size_special_register-log2(nb_bank);
 
     _mask_spr              = gen_mask<Tspecial_address_t> (_bank_spr_size_slot);
+
+    if (is_toplevel)
+      {
+        _size_general_register = size_general_register;
+        _size_special_register = size_special_register;
+
+        copy();
+      }
 
     log_printf(FUNC,Free_List_unit,FUNCTION,"End");
@@ -74,5 +83,13 @@
 #undef  FUNCTION
 #define FUNCTION "Free_List_unit::~Parameters"
-  Parameters::~Parameters () 
+  Parameters::~Parameters (void) 
+  {
+    log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
+    log_printf(FUNC,Free_List_unit,FUNCTION,"End");
+  };
+
+#undef  FUNCTION
+#define FUNCTION "Free_List_unit::copy"
+  void Parameters::copy (void) 
   {
     log_printf(FUNC,Free_List_unit,FUNCTION,"Begin");
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Parameters_msg_error.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Parameters_msg_error.cpp	(revision 82)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/src/Parameters_msg_error.cpp	(revision 88)
@@ -29,11 +29,15 @@
 
     if (_nb_general_register <= _nb_thread*_nb_general_register_logic)
-      test.error(_("The number of physical general register is insufficient.\n"));
+      test.error(toString(_("The number of physical general register is insufficient. (Minimum : %d)\n"),_nb_thread*_nb_general_register_logic+1));
     if (_nb_special_register <= _nb_thread*_nb_special_register_logic)
-      test.error(_("The number of physical special register is insufficient.\n"));
+      test.error(toString(_("The number of physical special register is insufficient. (Minimum : %d)\n"),_nb_thread*_nb_special_register_logic+1));
     if (not is_multiple (_nb_bank, _nb_pop))
       test.error(_("Number of pop must be a multiple of number of bank.\n"));
     if (not is_power2 (_nb_bank))
       test.error(_("Number of bank must be a power of 2.\n"));
+    if (_nb_general_register < _nb_bank)
+      test.error(_("The number of physical general register must be >= nb_bank.\n"));
+    if (_nb_special_register < _nb_bank)
+      test.error(_("The number of physical special register must be >= nb_bank.\n"));
 
     if ((_priority != PRIORITY_STATIC) and
