Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/configuration.cfg
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/configuration.cfg	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/configuration.cfg	(revision 116)
@@ -1,1 +1,5 @@
 Multiplier
+16       32     *2      #size_data
+0        1      +1      #sign
+6       32      *3      #latency
+1        1      +1      #delay
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/include/test.h
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/include/test.h	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/include/test.h	(revision 116)
@@ -11,5 +11,5 @@
 #endif
 
-#define NB_ITERATION  1
+#define NB_ITERATION  128
 #define CYCLE_MAX     (1024*NB_ITERATION)
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/src/main.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/src/main.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/src/main.cpp	(revision 116)
@@ -7,6 +7,7 @@
 
 #include "Behavioural/Generic/Multiplier/SelfTest/include/test.h"
+#include "Behavioural/include/Selftest.h"
 
-#define NB_PARAMS 0
+#define NB_PARAMS 4
 
 void usage (int argc, char * argv[])
@@ -14,5 +15,8 @@
   err (_("<Usage> %s name_instance list_params.\n"),argv[0]);
   err (_("list_params is :\n"));
-  err (_(" *  ()\n"));
+  err (_(" * size_data (uint32_t)\n"));
+  err (_(" * sign      (bool    )\n"));
+  err (_(" * latency   (uint32_t)\n"));
+  err (_(" * delay     (uint32_t)\n"));
 
   exit (1);
@@ -30,5 +34,15 @@
   uint32_t x = 1;
 
+  uint32_t             _size_data;
+  bool                 _sign     ;
+  uint32_t             _latency  ;
+  uint32_t             _delay    ;
+  
   string name = argv[x++];
+
+  SELFTEST0(_size_data,uint32_t,argv,x);
+  SELFTEST0(_sign     ,bool    ,argv,x);
+  SELFTEST0(_latency  ,uint32_t,argv,x);
+  SELFTEST0(_delay    ,uint32_t,argv,x);
 
   int _return = EXIT_SUCCESS;
@@ -37,4 +51,8 @@
       morpheo::behavioural::generic::multiplier::Parameters * param = new morpheo::behavioural::generic::multiplier::Parameters
 	(
+         _size_data,
+         _sign     ,
+         _latency  ,
+         _delay    ,
          true //is_toplevel
         );
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/src/test.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/src/test.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/SelfTest/src/test.cpp	(revision 116)
@@ -9,4 +9,5 @@
 #include "Behavioural/Generic/Multiplier/SelfTest/include/test.h"
 #include "Behavioural/include/Allocation.h"
+#include "Common/include/BitManipulation.h"
 
 void test (string name,
@@ -50,5 +51,20 @@
   sc_clock              *  in_CLOCK  = new sc_clock ("clock", 1.0, 0.5);	 
   sc_signal<Tcontrol_t> *  in_NRESET = new sc_signal<Tcontrol_t> ("NRESET");
-  
+
+  sc_signal<Tdata_t   > *  in_MULTIPLIER_DATA_IN_0;
+  sc_signal<Tdata_t   > *  in_MULTIPLIER_DATA_IN_1;
+  sc_signal<Tcontrol_t> *  in_MULTIPLIER_NSTALL   ;
+
+  sc_signal<Tdata_t   > * out_MULTIPLIER_DATA_LSB_OUT;
+  sc_signal<Tdata_t   > * out_MULTIPLIER_DATA_MSB_OUT;
+
+
+  ALLOC0_SC_SIGNAL( in_MULTIPLIER_DATA_IN_0,"in_MULTIPLIER_DATA_IN_0",Tdata_t   );
+  ALLOC0_SC_SIGNAL( in_MULTIPLIER_DATA_IN_1,"in_MULTIPLIER_DATA_IN_1",Tdata_t   );
+  ALLOC0_SC_SIGNAL( in_MULTIPLIER_NSTALL   ,"in_MULTIPLIER_NSTALL   ",Tcontrol_t);
+
+  ALLOC0_SC_SIGNAL(out_MULTIPLIER_DATA_LSB_OUT,"out_MULTIPLIER_DATA_LSB_OUT",Tdata_t   );
+  ALLOC0_SC_SIGNAL(out_MULTIPLIER_DATA_MSB_OUT,"out_MULTIPLIER_DATA_MSB_OUT",Tdata_t   );
+
   /********************************************************
    * Instanciation
@@ -60,4 +76,10 @@
   (*(_Multiplier->in_NRESET))       (*(in_NRESET));
 
+  INSTANCE0_SC_SIGNAL(_Multiplier, in_MULTIPLIER_DATA_IN_0);
+  INSTANCE0_SC_SIGNAL(_Multiplier, in_MULTIPLIER_DATA_IN_1);
+  INSTANCE0_SC_SIGNAL(_Multiplier, in_MULTIPLIER_NSTALL);
+
+  INSTANCE0_SC_SIGNAL(_Multiplier,out_MULTIPLIER_DATA_LSB_OUT);
+  INSTANCE0_SC_SIGNAL(_Multiplier,out_MULTIPLIER_DATA_MSB_OUT);
 
   msg(_("<%s> : Start Simulation ............\n"),name.c_str());
@@ -89,4 +111,107 @@
     {
       LABEL("Iteration %d",iteration);
+      
+      uint64_t data0 = range<uint64_t>(rand(),_param->_size_data);
+      uint64_t data1 = range<uint64_t>(rand(),_param->_size_data);
+      
+      in_MULTIPLIER_DATA_IN_0->write(static_cast<Tdata_t>(data0));
+      in_MULTIPLIER_DATA_IN_1->write(static_cast<Tdata_t>(data1));
+      in_MULTIPLIER_NSTALL->write(static_cast<Tcontrol_t>(1));
+      
+      sc_uint<32> res_lsb = 0;
+      sc_uint<32> res_msb = 0;
+      
+      switch (_param->_size_data)
+        {
+        case 8 :
+          {
+            if (_param->_sign){ // 0 = signed, 1 = unsigned
+              sc_uint<16> mask = 0xff;
+              sc_uint<16> tmp = (static_cast<sc_uint<16> >(data0)) * (static_cast<sc_uint<16> >(data1));
+              res_lsb = tmp.range(7,0);
+              res_msb = tmp.range(15,8);
+            }
+            else{
+              sc_int<8> data_0 = static_cast<sc_int<8> >(data0);
+              sc_int<8> data_1 = static_cast<sc_int<8> >(data1);
+              sc_int<16> tmp   = (static_cast<sc_int<16> >(data_0) * 
+                                  static_cast<sc_int<16> >(data_1));
+              res_lsb = static_cast<Tdata_t>(_param->_mask &  tmp);
+              res_msb = static_cast<Tdata_t>(_param->_mask &  (tmp>>8));
+            }
+            break;
+          }
+        case 16 :
+          {
+            if (_param->_sign){ // 0 = signed, 1 = unsigned
+              sc_uint<32> mask = 0xffff;
+              sc_uint<32> tmp = (static_cast<sc_uint<32> >(data0)) * (static_cast<sc_uint<32> >(data1));
+              res_lsb = tmp.range(15,0);
+              res_msb = tmp.range(31,16);
+            }
+            else{
+              sc_int<16> data_0 = static_cast<sc_int<16> >(data0);
+              sc_int<16> data_1 = static_cast<sc_int<16> >(data1);
+              sc_int<32> tmp    = (static_cast<sc_int<32> >(data_0) * 
+                                   static_cast<sc_int<32> >(data_1));
+              res_lsb = static_cast<Tdata_t>(_param->_mask &  tmp);
+              res_msb = static_cast<Tdata_t>(_param->_mask &  (tmp>>16));
+              
+              cout << "data_0  : " << std::hex << data_0 << std::dec << " - dec : " << data_0<< endl;
+              cout << "data_1  : " << std::hex << data_1 << std::dec << " - dec : " << data_1<< endl;
+              cout << "tmp     : " << std::hex << tmp    << std::dec << " - dec : " << tmp   << endl;
+              cout << "res_lsb : " << std::hex << res_lsb << std::dec << endl;
+              cout << "res_msb : " << std::hex << res_msb << std::dec << endl;
+            }
+            break;
+          }
+        case 32 :
+          {
+            if (_param->_sign){ // 0 = signed, 1 = unsigned
+              sc_uint<32> data_0 = static_cast<sc_uint<32> >(data0);
+              sc_uint<32> data_1 = static_cast<sc_uint<32> >(data1);
+              sc_uint<64> tmp = (data0) * (data1);
+              res_lsb = static_cast<Tdata_t>(_param->_mask &  tmp);
+              res_msb = static_cast<Tdata_t>(_param->_mask &  (tmp>>32));
+
+              cout << "tmp : " << std::hex << tmp << std::dec << endl;
+            }
+            else{
+              sc_int<32> data_0 = static_cast<sc_int<32> >(data0);
+              sc_int<32> data_1 = static_cast<sc_int<32> >(data1);
+              sc_int<64> tmp = (data0) * (data1);
+              res_lsb = static_cast<Tdata_t>(_param->_mask &  tmp);
+              res_msb = static_cast<Tdata_t>(_param->_mask &  (tmp>>32));
+
+              cout << "data_0  : " << std::hex << data_0 << std::dec << endl;
+              cout << "data_1  : " << std::hex << data_1 << std::dec << endl;
+              cout << "tmp     : " << std::hex << tmp << std::dec << endl;
+              cout << "res_lsb : " << std::hex << res_lsb << std::dec << endl;
+              cout << "res_msb : " << std::hex << res_msb << std::dec << endl;
+
+
+            }
+            break;
+          }
+//         case 64 :
+//           {
+//             if (_param->_sign){ 0 = signed, 1 = unsigned
+//               uint64_t tmp = static_cast<uint64_t>(data0) * static_cast<uint64_t>(data1);
+//               res_lsb = tmp;
+//             }
+//             else{
+//               int64_t tmp = static_cast< int64_t>(data0) * static_cast< int64_t>(data1);
+//               res_lsb = 0xffffffffffffffff&tmp;
+//             }
+//             break;
+//           }
+        default :
+          {
+            TEST_KO("Invalid size for the test.");
+          }
+        }
+      SC_START(_param->_latency);
+      TEST(Tdata_t,out_MULTIPLIER_DATA_LSB_OUT->read(),res_lsb);
+      TEST(Tdata_t,out_MULTIPLIER_DATA_MSB_OUT->read(),res_msb);
 
       SC_START(1);
@@ -104,4 +229,11 @@
   delete in_CLOCK;
   delete in_NRESET;
+
+  DELETE0_SC_SIGNAL( in_MULTIPLIER_DATA_IN_0);
+  DELETE0_SC_SIGNAL( in_MULTIPLIER_DATA_IN_1);
+  DELETE0_SC_SIGNAL( in_MULTIPLIER_NSTALL);
+  DELETE0_SC_SIGNAL(out_MULTIPLIER_DATA_LSB_OUT);
+  DELETE0_SC_SIGNAL(out_MULTIPLIER_DATA_MSB_OUT);
+
     }
 #endif
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Multiplier.h
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Multiplier.h	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Multiplier.h	(revision 116)
@@ -29,4 +29,5 @@
 
 #include <iostream>
+#include <vector>
 
 namespace morpheo {
@@ -57,13 +58,25 @@
 #ifdef SYSTEMC
     // ~~~~~[ Interface ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
     // ~~~~~[ Interface : "" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   public    : SC_CLOCK                      *  in_CLOCK        ;
   public    : SC_IN (Tcontrol_t)            *  in_NRESET       ;
 
+    // ~~~~~[ Interface : "multiplier" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  public    : SC_IN (Tdata_t)               *   in_MULTIPLIER_DATA_IN_0;
+  public    : SC_IN (Tdata_t)               *   in_MULTIPLIER_DATA_IN_1;
+  public    : SC_IN (Tcontrol_t)            *   in_MULTIPLIER_NSTALL;
+
+  public    : SC_OUT(Tdata_t)               *  out_MULTIPLIER_DATA_LSB_OUT;
+  public    : SC_OUT(Tdata_t)               *  out_MULTIPLIER_DATA_MSB_OUT;
+    
+
     // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
 
     // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
-
+  private   : std::vector<result_t> * _pipeline;
     // ~~~~~[ Internal ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  private   : Tdata_t                       sig_MULTIPLIER_DATA_IN_0;
+  private   : Tdata_t                       sig_MULTIPLIER_DATA_IN_1;
 #endif
 
@@ -99,5 +112,5 @@
 #ifdef SYSTEMC				       
   public  : void        transition                (void);
-//public  : void        genMoore                  (void);
+  public  : void        genMealy                  (void);
 #endif					       
 
@@ -106,4 +119,7 @@
   private : void        vhdl_declaration          (Vhdl * & vhdl);
   private : void        vhdl_body                 (Vhdl * & vhdl);
+
+  private : void        vhdl_xilinx_declaration   (Vhdl * & vhdl);
+  private : void        vhdl_xilinx_body          (Vhdl * & vhdl);
 #endif					       
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Parameters.h
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Parameters.h	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Parameters.h	(revision 116)
@@ -11,4 +11,5 @@
 #include "Behavioural/include/Parameters.h"
 #include "Common/include/Debug.h"
+#include "Behavioural/Generic/Multiplier/include/Types.h"
 
 namespace morpheo {
@@ -21,7 +22,18 @@
   {
     //-----[ fields ]------------------------------------------------------------
+  public : uint32_t             _size_data;
+  public : bool                 _sign     ;
+  public : uint32_t             _latency  ;
+  public : uint32_t             _delay    ;
+
+  public : Tdata_t              _mask     ;
+//   public : Tdata_t              _shift_sign;
 
     //-----[ methods ]-----------------------------------------------------------
-  public : Parameters  (bool is_toplevel=false);
+  public : Parameters  (uint32_t             size_data,
+                        bool                 sign     ,
+                        uint32_t             latency  ,
+                        uint32_t             delay    ,
+                        bool is_toplevel=false);
 //public : Parameters  (Parameters & param) ;
   public : ~Parameters (void);
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Types.h
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Types.h	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/include/Types.h	(revision 116)
@@ -16,4 +16,11 @@
 namespace multiplier {
 
+  typedef Tgeneral_data_t Tdata_t;
+
+  typedef struct 
+  {
+    Tdata_t MSB;
+    Tdata_t LSB;
+  } result_t;
 
 }; // end namespace multiplier
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier.cpp	(revision 116)
@@ -77,13 +77,17 @@
 # endif    
 
-// 	log_printf(INFO,Multiplier,FUNCTION,_("<%s> : Method - genMoore"),_name.c_str());
+	log_printf(INFO,Multiplier,FUNCTION,_("<%s> : Method - genMealy"),_name.c_str());
 
-// 	SC_METHOD (genMoore);
-// 	dont_initialize ();
-// 	sensitive << (*(in_CLOCK)).neg(); // need internal register
+	SC_METHOD (genMealy);
+	dont_initialize ();
+	sensitive << (*(in_CLOCK)).neg(); // need internal register
+
+        if (_param->_latency == 0)
+          sensitive << (*(in_MULTIPLIER_DATA_IN_0))
+                    << (*(in_MULTIPLIER_DATA_IN_1));
 	
-// # ifdef SYSTEMCASS_SPECIFIC
-// 	// List dependency information
-// # endif    
+# ifdef SYSTEMCASS_SPECIFIC
+	// List dependency information
+# endif    
 	
 #endif
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_allocation.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_allocation.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_allocation.cpp	(revision 116)
@@ -53,4 +53,26 @@
       in_NRESET       = interface->set_signal_in  <Tcontrol_t> ("nreset",1, RESET_VHDL_YES);
     }
+
+    // ~~~~~[ Interface "multiplier" ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+    {
+      ALLOC0_INTERFACE_BEGIN("multiplier", IN, WEST, _("Multiplier's interface."));
+      
+      ALLOC0_SIGNAL_IN ( in_MULTIPLIER_DATA_IN_0,"data_in_0",Tdata_t   ,_param->_size_data);
+      ALLOC0_SIGNAL_IN ( in_MULTIPLIER_DATA_IN_1,"data_in_1",Tdata_t   ,_param->_size_data);
+      ALLOC0_SIGNAL_IN ( in_MULTIPLIER_NSTALL   ,"nstall"   ,Tcontrol_t,1);
+      ALLOC0_SIGNAL_OUT(out_MULTIPLIER_DATA_LSB_OUT ,"data_lsb_out" ,Tdata_t   ,_param->_size_data);
+      ALLOC0_SIGNAL_OUT(out_MULTIPLIER_DATA_MSB_OUT ,"data_msb_out" ,Tdata_t   ,_param->_size_data);
+
+      ALLOC0_INTERFACE_END();
+    }
+
+     // ~~~~~[ Register ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+#ifdef SYSTEMC
+    if (usage_is_set(_usage,USE_SYSTEMC_BODY))
+      {
+        _pipeline = new std::vector<result_t>(_param->_latency+1);
+      }
+#endif
+
     // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
 
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_deallocation.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_deallocation.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_deallocation.cpp	(revision 116)
@@ -25,6 +25,20 @@
 	delete    in_CLOCK ;
 	delete    in_NRESET;
+
+        DELETE0_SIGNAL(in_MULTIPLIER_DATA_IN_0,_param->_size_data);
+        DELETE0_SIGNAL(in_MULTIPLIER_DATA_IN_1,_param->_size_data);
+        DELETE0_SIGNAL(in_MULTIPLIER_NSTALL   ,1);
+                                              
+        DELETE0_SIGNAL(out_MULTIPLIER_DATA_LSB_OUT,_param->_size_data);
+        DELETE0_SIGNAL(out_MULTIPLIER_DATA_MSB_OUT,_param->_size_data);
+
       }
     // ~~~~~[ Component ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
+#ifdef SYSTEMC
+    if (usage_is_set(_usage,USE_SYSTEMC_BODY))
+      {
+        delete _pipeline;
+      }
+#endif
 
     delete _component;
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_genMealy.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_genMealy.cpp	(revision 116)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_genMealy.cpp	(revision 116)
@@ -0,0 +1,34 @@
+#ifdef SYSTEMC
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Generic/Multiplier/include/Multiplier.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace generic {
+namespace multiplier {
+
+
+#undef  FUNCTION
+#define FUNCTION "Multiplier::genMealy"
+  void Multiplier::genMealy (void)
+  {
+    log_begin(Multiplier,FUNCTION);
+
+    PORT_WRITE(out_MULTIPLIER_DATA_LSB_OUT, _pipeline->at(0).LSB);
+    PORT_WRITE(out_MULTIPLIER_DATA_MSB_OUT, _pipeline->at(0).MSB);
+
+    log_end(Multiplier,FUNCTION);
+  };
+
+}; // end namespace multiplier
+}; // end namespace generic
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_transition.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_transition.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_transition.cpp	(revision 116)
@@ -20,9 +20,180 @@
   {
     log_begin(Multiplier,FUNCTION);
-
+    
+    // Test if stall
+    if (PORT_READ(in_MULTIPLIER_NSTALL))
+      {
+        // Pop a slot of array
+        for (uint32_t i=1;i<_pipeline->size();i++)
+          _pipeline->at(i-1)=_pipeline->at(i);
+
+        result_t data;
+        
+        switch (_param->_size_data)
+          {
+          case 8 :
+            {
+              if (_param->_sign) // 0 = signed, 1 = unsigned
+                {
+                  sc_uint<8> data_0 = static_cast<sc_uint<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
+                  sc_uint<8> data_1 = static_cast<sc_uint<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
+                  sc_uint<16> tmp    = (static_cast<sc_uint<16> >(data_0) * 
+                                        static_cast<sc_uint<16> >(data_1));
+                  
+                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
+                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>8));
+                  
+//                   std::cout << "uint8 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
+//                   std::cout << "uint8 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
+//                   std::cout << "uint8 : tmp    : " << std::hex << tmp << std::dec << std::endl;
+//                   std::cout << "uint8 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
+//                   std::cout << "uint8 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
+                  
+//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
+                }
+              else
+                {
+                  sc_int<8> data_0 = static_cast<sc_int<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
+                  sc_int<8> data_1 = static_cast<sc_int<8> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
+                  sc_int<16> tmp    = (static_cast<sc_int<16> >(data_0) * 
+                                       static_cast<sc_int<16> >(data_1));
+                  
+                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
+                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>8));
+                  
+//                   std::cout << "int8 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
+//                   std::cout << "int8 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
+//                   std::cout << "int8 : tmp    : " << std::hex << tmp << std::dec << std::endl;
+//                   std::cout << "int8 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
+//                   std::cout << "int8 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
+                  
+//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
+                }
+              break;
+            }
+          case 16 :
+            {
+              if (_param->_sign) // 0 = signed, 1 = unsigned
+                {
+                  sc_uint<16> data_0 = static_cast<sc_uint<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
+                  sc_uint<16> data_1 = static_cast<sc_uint<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
+                  sc_uint<32> tmp    = (static_cast<sc_uint<32> >(data_0) * 
+                                        static_cast<sc_uint<32> >(data_1));
+                  
+                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
+                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>16));
+                  
+//                   std::cout << "uint16 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
+//                   std::cout << "uint16 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
+//                   std::cout << "uint16 : tmp    : " << std::hex << tmp << std::dec << std::endl;
+//                   std::cout << "uint16 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
+//                   std::cout << "uint16 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
+                  
+//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
+                }
+              else
+                {
+                  sc_int<16> data_0 = static_cast<sc_int<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
+                  sc_int<16> data_1 = static_cast<sc_int<16> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
+                  sc_int<32> tmp    = (static_cast<sc_int<32> >(data_0) * 
+                                       static_cast<sc_int<32> >(data_1));
+                  
+                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
+                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>16));
+                  
+                  std::cout << "int16 : data_0 : " << std::hex << data_0   << std::dec << " - dec : " << data_0 << std::endl;
+                  std::cout << "int16 : data_1 : " << std::hex << data_1   << std::dec << " - dec : " << data_1 << std::endl;
+                  std::cout << "int16 : tmp    : " << std::hex << tmp      << std::dec << " - dec : " << tmp    << std::endl;
+                  std::cout << "int16 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
+                  std::cout << "int16 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
+                  
+//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
+                }
+              break;
+            }
+          case 32 :
+            {
+              if (_param->_sign) // 0 = signed, 1 = unsigned
+                {
+                  sc_uint<32> data_0 = static_cast<sc_uint<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
+                  sc_uint<32> data_1 = static_cast<sc_uint<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
+                  sc_uint<64> tmp    = (static_cast<sc_uint<64> >(data_0) * 
+                                        static_cast<sc_uint<64> >(data_1));
+                  
+                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
+                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>32));
+                  
+//                   std::cout << "uint32 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
+//                   std::cout << "uint32 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
+//                   std::cout << "uint32 : tmp    : " << std::hex << tmp << std::dec << std::endl;
+//                   std::cout << "uint32 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
+//                   std::cout << "uint32 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
+                  
+//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
+                }
+              else
+                {
+                  sc_int<32> data_0 = static_cast<sc_int<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_0));
+                  sc_int<32> data_1 = static_cast<sc_int<32> >(PORT_READ(in_MULTIPLIER_DATA_IN_1));
+                  sc_int<64> tmp    = (static_cast<sc_int<64> >(data_0) * 
+                                       static_cast<sc_int<64> >(data_1));
+                  
+                  data.LSB = static_cast<Tdata_t>(_param->_mask &  tmp);
+                  data.MSB = static_cast<Tdata_t>(_param->_mask & (tmp>>32));
+                  
+//                   std::cout << "int32 : data_0 : " << std::hex << data_0 << std::dec << std::endl;
+//                   std::cout << "int32 : data_1 : " << std::hex << data_1 << std::dec << std::endl;
+//                   std::cout << "int32 : tmp    : " << std::hex << tmp << std::dec << std::endl;
+//                   std::cout << "int32 : lsb    : " << std::hex << data.LSB << std::dec << std::endl;
+//                   std::cout << "int32 : msb    : " << std::hex << data.MSB << std::dec << std::endl;
+                  
+//                   log_printf(TRACE,Multiplier,FUNCTION,"  * signed");
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data0 = %llx(%lld)",data_0, data_0);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * data1 = %llx(%lld)",data_1, data_1);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * res   = %llx(%lld)",tmp, tmp);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * LSB   = %x (%d)",data.LSB, data.LSB);
+//                   log_printf(TRACE,Multiplier,FUNCTION,"    * MSB   = %x (%d)",data.MSB, data.MSB);
+                }
+              break;
+            }
+          default :
+            {
+              break;
+            }
+          }
+        
+        _pipeline->at(_param->_latency-1) = data;
+        
+      }
+    
 #if defined(STATISTICS) or defined(VHDL_TESTBENCH)
     end_cycle ();
 #endif
-
+    
     log_end(Multiplier,FUNCTION);
   };
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl.cpp	(revision 116)
@@ -27,6 +27,12 @@
     _component->vhdl_instance(vhdl);
 
+    // default architecture
     vhdl_declaration (vhdl);
     vhdl_body        (vhdl);
+
+    // Xilinx architecture
+    vhdl->set_architecture("xilinx");
+    vhdl_xilinx_declaration (vhdl);
+    vhdl_xilinx_body        (vhdl);
 
     vhdl->generate_file();
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl_xilinx_body.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl_xilinx_body.cpp	(revision 116)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl_xilinx_body.cpp	(revision 116)
@@ -0,0 +1,53 @@
+#ifdef VHDL
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Generic/Multiplier/include/Multiplier.h"
+
+namespace morpheo                    {
+namespace behavioural {
+namespace generic {
+namespace multiplier {
+
+#undef  FUNCTION
+#define FUNCTION "Multiplier::vhdl_xilinx_body"
+  void Multiplier::vhdl_xilinx_body (Vhdl * & vhdl)
+  {
+
+    log_begin(Multiplier,FUNCTION);
+    vhdl->set_body (0,"ins_mult_gen_v9_0 : mult_gen_v9_0");
+    vhdl->set_body (1,"generic map (");
+    vhdl->set_body (2,"  c_xdevicefamily => \"virtex4\",  -- specifies target Xilinx FPGA name");
+    vhdl->set_body (2,"  c_a_width       => "+toString(_param->_size_data)+",         -- width of A port");
+    vhdl->set_body (2,"  c_a_type        => "+toString(_param->_sign)+",          -- datatype of A port");
+    vhdl->set_body (2,"  c_b_width       => "+toString(_param->_size_data)+",         -- width of B port");
+    vhdl->set_body (2,"  c_b_type        => "+toString(_param->_sign)+",          -- datatype of B port");
+    vhdl->set_body (2,"  c_out_high      => "+toString((_param->_size_data*2)-1)+",         -- MSB of P output port (N-1 downto 0 convention)");
+    vhdl->set_body (2,"  c_mult_type     => 1,          -- Type of multiplier to implement");
+    vhdl->set_body (2,"  c_opt_goal      => 1,          -- Optimization of multiplier");
+    vhdl->set_body (2,"  c_has_ce        => 1,          -- Use clock enable on all registers");
+    vhdl->set_body (2,"  c_pipe_stages   => "+toString(_param->_latency)+")          -- Number of register stages required");
+    
+    vhdl->set_body (1,"port map (");
+    vhdl->set_body (2,"clk =>  in_CLOCK               ,");
+    vhdl->set_body (2,"a   =>  in_MULTIPLIER_DATA_IN_0,");
+    vhdl->set_body (2,"b   =>  in_MULTIPLIER_DATA_IN_1,");
+    vhdl->set_body (2,"ce  =>  in_MULTIPLIER_NSTALL   ,");
+    vhdl->set_body (2,"p   => sig_MULTIPLIER_DATA_OUT);");
+
+    vhdl->set_body (0,"out_MULTIPLIER_DATA_LSB_OUT <= sig_MULTIPLIER_DATA_OUT("+toString(_param->_size_data-1)+" downto 0);");
+    vhdl->set_body (0,"out_MULTIPLIER_DATA_MSB_OUT <= sig_MULTIPLIER_DATA_OUT("+toString((_param->_size_data*2)-1)+" downto "+toString(_param->_size_data)+");");
+
+    log_end(Multiplier,FUNCTION);
+  };
+
+}; // end namespace multiplier
+}; // end namespace generic
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl_xilinx_declaration.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl_xilinx_declaration.cpp	(revision 116)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Multiplier_vhdl_xilinx_declaration.cpp	(revision 116)
@@ -0,0 +1,34 @@
+#ifdef VHDL
+/*
+ * $Id$
+ *
+ * [ Description ]
+ * 
+ */
+
+#include "Behavioural/Generic/Multiplier/include/Multiplier.h"
+
+namespace morpheo {
+namespace behavioural {
+namespace generic {
+namespace multiplier {
+
+#undef  FUNCTION
+#define FUNCTION "Multiplier::vhdl_xilinx_declaration"
+  void Multiplier::vhdl_xilinx_declaration (Vhdl * & vhdl)
+  {
+    log_begin(Multiplier,FUNCTION);
+
+    vhdl->set_library("XilinxCoreLib","mult_gen_v9_0_comp","all");
+
+    vhdl->set_signal  ("sig_MULTIPLIER_DATA_OUT", _param->_size_data*2);
+
+    log_end(Multiplier,FUNCTION);
+  };
+
+}; // end namespace multiplier
+}; // end namespace generic
+
+}; // end namespace behavioural
+}; // end namespace morpheo              
+#endif
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters.cpp	(revision 116)
@@ -7,4 +7,5 @@
 
 #include "Behavioural/Generic/Multiplier/include/Parameters.h"
+#include "Common/include/BitManipulation.h"
 
 namespace morpheo {
@@ -16,7 +17,19 @@
 #undef  FUNCTION
 #define FUNCTION "Multiplier::Parameters"
-  Parameters::Parameters (bool is_toplevel)
+  Parameters::Parameters (uint32_t             size_data,
+                          bool                 sign     ,
+                          uint32_t             latency  ,
+                          uint32_t             delay    ,
+                          bool is_toplevel)
   {
+
     log_begin(Multiplier,FUNCTION);
+
+    _size_data  = size_data;
+    _sign       = sign     ;
+    _latency    = latency  ;
+    _delay      = delay    ;
+    _mask       = gen_mask<Tdata_t>(_size_data);
+//     _shift_sign = size_data-1;
 
     test();
@@ -35,5 +48,5 @@
 //   {
 //     log_begin(Multiplier,FUNCTION);
-//     test();
+//     test();x
 //     log_end(Multiplier,FUNCTION);
 //   };
Index: trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters_msg_error.cpp
===================================================================
--- trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters_msg_error.cpp	(revision 113)
+++ trunk/IPs/systemC/processor/Morpheo/Behavioural/Generic/Multiplier/src/Parameters_msg_error.cpp	(revision 116)
@@ -24,4 +24,13 @@
     Parameters_test test ("Multiplier");
 
+    if ((_size_data < 2) or (_size_data > 64))
+      test.error(toString(_("size_data (%d) 's valid range is 2 to 64.\n"),_size_data));
+
+    if (_delay > 1)
+      test.error(toString(_("delay must be set at 1\n")));
+
+    if (_latency > 32)
+      test.error(toString(_("latency's valid range is 0 to 32\n")));
+
     log_end(Multiplier,FUNCTION);
 
