Index: trunk/platforms/tsar_generic_iob/arch_info.py
===================================================================
--- trunk/platforms/tsar_generic_iob/arch_info.py	(revision 1050)
+++ trunk/platforms/tsar_generic_iob/arch_info.py	(revision 1051)
@@ -31,5 +31,4 @@
 #  - fbf_width      : frame_buffer width = frame_buffer heigth
 #  - ioc_type       : can be 'IOC_BDV','IOC_HBA','IOC_SDC', 'IOC_SPI','NONE'
-#  - mwr_type       : can be 'MWR_GCD','MWR_DCT','MWR_CPY','NONE'
 #  - io_cxy         : IO cluster identifier
 #  - boot_cxy       : boot cluster identifier
@@ -53,5 +52,4 @@
           fbf_width     = 128,
           ioc_type      = 'IOC_BDV',
-          mwr_type      = 'MWR_CPY',
           io_cxy        = 0,
           boot_cxy      = 0, 
@@ -83,6 +81,4 @@
     assert( ioc_type in ['IOC_BDV','IOC_HBA','IOC_SDC','IOC_SPI','IOC_RDK'] )
 
-    assert( mwr_type in ['MWR_GCD','MWR_DCT','MWR_CPY'] )
-
     assert( (io_cxy == 0) or (io_cxy == ((x_size-1)<<y_width) + (y_size-1)) ) 
 
@@ -103,6 +99,6 @@
     xcu_size = 0x1000                      # 4 Kbytes
 
-    mwr_base = 0x00B1000000
-    mwr_size = 0x1000                      # 4 Kbytes 
+    dma_base = 0x00B1000000
+    dma_size = 0x1000                      # 4 Kbytes 
 
     mmc_base = 0x00B2000000
@@ -170,8 +166,8 @@
                                    size     = xcu_size,
                                    channels = 1, 
-                                   arg0     = 16, 
-                                   arg1     = 16,
-                                   arg2     = 16,
-                                   arg3     = 16 )
+                                   arg0     = 16,              # number of HWIs
+                                   arg1     = 16,              # number of WTIs
+                                   arg2     = 16,              # number of PTIs
+                                   arg3     = 16 )             # number of output IRQs
 
             mmc = archi.addDevice( ptype    = 'MMC_TSR',
@@ -181,36 +177,21 @@
             archi.addIrq( dstdev = xcu, port = 0, srcdev = mmc )
 
-            if ( mwr_type == 'MWR_GCD' ):
-                mwr = archi.addDevice( ptype = 'MWR_GCD',
-                                       base  = mwr_base + offset,
-                                       size  = mwr_size,
-                                       arg0  = 2, 
-                                       arg1  = 1,
-                                       arg2  = 1, 
-                                       arg3  = 0 )
-                archi.addIrq( dstdev = xcu, port = 1, srcdev = mwr )
-
-            if ( mwr_type == 'MWR_DCT' ):
-                mwr = archi.addDevice( ptype = 'MWR_DCT',
-                                       base  = mwr_base + offset,
-                                       size  = mwr_size,
-                                       arg0  = 1, 
-                                       arg1  = 1,
-                                       arg2  = 1, 
-                                       arg3  = 0 )
-                archi.addIrq( dstdev = xcu, port = 1, srcdev = mwr )
-
-            if ( mwr_type == 'MWR_CPY' ):
-                mwr = archi.addDevice( ptype = 'MWR_CPY',
-                                       base  = mwr_base + offset,
-                                       size  = mwr_size,
-                                       arg0  = 1, 
-                                       arg1  = 1,
-                                       arg2  = 1, 
-                                       arg3  = 0 )
-                archi.addIrq( dstdev = xcu, port = 1, srcdev = mwr )
+            dma = archi.addDevice( ptype    = 'DMA_SCL',
+                                   base     = dma_base + offset,
+                                   size     = dma_size,
+                                   channels = nb_cores )
+
+            archi.addIrq( dstdev = xcu, port = 1, srcdev = dma, channel = 0 )
+            archi.addIrq( dstdev = xcu, port = 2, srcdev = dma, channel = 1 )
+            archi.addIrq( dstdev = xcu, port = 3, srcdev = dma, channel = 2 )
+            archi.addIrq( dstdev = xcu, port = 4, srcdev = dma, channel = 3 )
 
             # define external devices
             if( cxy == io_cxy ):
+
+                pic = archi.addDevice( ptype    ='PIC_TSR',
+                                       base     = pic_base + offset,
+                                       size     = pic_size, 
+                                       arg0     = 32 )         # number of input IRQs
 
                 iob = archi.addDevice( ptype    = 'IOB_TSR', 
@@ -241,9 +222,4 @@
                                        base     = rom_base + offset, 
                                        size     = rom_size )
-
-                pic = archi.addDevice( ptype    ='PIC_TSR',
-                                       base     = pic_base + offset,
-                                       size     = pic_size, 
-                                       arg0     = 32 )
 
                 archi.addIrq( dstdev = pic, port = 0 , srcdev = nic, channel = 0 , is_rx = True )
Index: trunk/platforms/tsar_generic_iob/top.cpp
===================================================================
--- trunk/platforms/tsar_generic_iob/top.cpp	(revision 1050)
+++ trunk/platforms/tsar_generic_iob/top.cpp	(revision 1051)
@@ -50,10 +50,9 @@
 // - One L2 cache controller
 // - One XICU component,
-// - One - optional - single channel DMA controler,
-// - One - optional - hardware coprocessor 
+// - One multi channels DMA controler (number of channels is defined by nprocs)
 // The XICU component is mainly used to handle WTI IRQs, as at most 
-// 2 HWI IRQs are connected to XICU in each cluster:
+// (nprocs + 1) HWI IRQs are connected to XICU in each cluster:
 // - IRQ_IN[0]            : MMC
-// - IRQ_IN[1]            : MWR 
+// - IRQ_IN[1 to nprocs]  : DMA 
 //
 // All clusters are identical, but cluster(0,0) and cluster(XMAX-1,YMAX-1)
@@ -151,12 +150,4 @@
 
 //////////////////////////////////////////////////////////////////
-//    Coprocessor type (must be replicated in tsar_iob_cluster)
-//////////////////////////////////////////////////////////////////
-
-#define MWR_COPROC_CPY  0
-#define MWR_COPROC_DCT  1
-#define MWR_COPROC_GCD  2
-
-//////////////////////////////////////////////////////////////////
 //      Virtual disk selection => OS selection
 //////////////////////////////////////////////////////////////////
@@ -271,5 +262,5 @@
 // Two different initiators cannot have the same SRCID, but a given
 // initiator can have two alias SRCIDs:
-// - Internal initiators (procs, mwmr) are replicated in all clusters,
+// - Internal initiators (procs, mdma) are replicated in all clusters,
 //   and each initiator has one single SRCID.
 // - External initiators (disk, cdma) are not replicated, but can be
@@ -285,5 +276,5 @@
 
 #define PROC_LOCAL_SRCID             0x0    // from 0 to 7
-#define MWMR_LOCAL_SRCID             0x8
+#define MDMA_LOCAL_SRCID             0x8
 #define IOBX_LOCAL_SRCID             0x9
 #define MEMC_LOCAL_SRCID             0xA
@@ -299,9 +290,9 @@
 #define INT_MEMC_TGT_ID              0
 #define INT_XICU_TGT_ID              1
-#define INT_MWMR_TGT_ID              2
+#define INT_MDMA_TGT_ID              2
 #define INT_IOBX_TGT_ID              3
 
 #define INT_PROC_INI_ID              0   // from 0 to (NB_PROCS_MAX-1)
-#define INT_MWMR_INI_ID              (NB_PROCS_MAX)
+#define INT_MDMA_INI_ID              (NB_PROCS_MAX)
 #define INT_IOBX_INI_ID              (NB_PROCS_MAX+1)
 
@@ -478,7 +469,4 @@
    "Error in tsar_generic_iob : You must have X_WIDTH == Y_WIDTH == 4");
 
-   assert(  ((USE_MWR_CPY + USE_MWR_GCD + USE_MWR_DCT) == 1) and
-   "Error in tsar_generic_iob : No MWR coprocessor found in hard_config.h");
-
    assert(  ((USE_IOC_HBA + USE_IOC_BDV + USE_IOC_SDC) == 1) and
    "Error in tsar_generic_iob : NoIOC controller found in hard_config.h");
@@ -536,6 +524,6 @@
    // - two levels address decoding for commands
    // - two levels srcid decoding for responses
-   // - NB_PROCS_MAX + 2 (MWMR, IOBX) local initiators per cluster
-   // - 4 local targets (MEMC, XICU, MWMR, IOBX) per cluster
+   // - NB_PROCS_MAX + 2 (MDMA, IOBX) local initiators per cluster
+   // - 4 local targets (MEMC, XICU, MDMA, IOBX) per cluster
    /////////////////////////////////////////////////////////////////////
    MappingTable maptab_int( vci_address_width,
@@ -570,8 +558,8 @@
                      IntTab(cluster(x,y), INT_XICU_TGT_ID), not cacheable));
 
-         std::ostringstream    smwmr;
-         smwmr << "int_seg_mwmr_" << x << "_" << y;
-         maptab_int.add(Segment(smwmr.str(), SEG_MWR_BASE+offset, SEG_MWR_SIZE,
-                     IntTab(cluster(x,y), INT_MWMR_TGT_ID), not cacheable));
+         std::ostringstream    smdma;
+         smdma << "int_seg_mdma_" << x << "_" << y;
+         maptab_int.add(Segment(smdma.str(), SEG_DMA_BASE+offset, SEG_DMA_SIZE,
+                     IntTab(cluster(x,y), INT_MDMA_TGT_ID), not cacheable));
 
          // the following segments are only defined in cluster_iob0 or in cluster_iob1
@@ -618,6 +606,6 @@
          // and the port index on the local interconnect.
 
-         maptab_int.srcid_map( IntTab( cluster(x,y), MWMR_LOCAL_SRCID ),
-                               IntTab( cluster(x,y), INT_MWMR_INI_ID ) );
+         maptab_int.srcid_map( IntTab( cluster(x,y), MDMA_LOCAL_SRCID ),
+                               IntTab( cluster(x,y), INT_MDMA_INI_ID ) );
 
          maptab_int.srcid_map( IntTab( cluster(x,y), IOBX_LOCAL_SRCID ),
@@ -1114,8 +1102,5 @@
                    dspin_ram_rsp_width>* clusters[XMAX][YMAX];
 
-    unsigned int coproc_type;
-    if ( USE_MWR_CPY ) coproc_type = MWR_COPROC_CPY;
-    if ( USE_MWR_DCT ) coproc_type = MWR_COPROC_DCT;
-    if ( USE_MWR_GCD ) coproc_type = MWR_COPROC_GCD;
+    unsigned int coproc_type = 0;
 
 #if USE_OPENMP
@@ -1176,9 +1161,9 @@
                 INT_MEMC_TGT_ID,
                 INT_XICU_TGT_ID,
-                INT_MWMR_TGT_ID,
+                INT_MDMA_TGT_ID,
                 INT_IOBX_TGT_ID,
 
                 INT_PROC_INI_ID,
-                INT_MWMR_INI_ID,
+                INT_MDMA_INI_ID,
                 INT_IOBX_INI_ID,
 
@@ -1692,4 +1677,5 @@
                 clusters[x][y]->signal_int_vci_ini_proc[l].print_trace(proc_signame.str());
 
+                // XICU
                 clusters[x][y]->xicu->print_trace(1);
                 std::ostringstream xicu_signame;
@@ -1697,15 +1683,12 @@
                 clusters[x][y]->signal_int_vci_tgt_xicu.print_trace(xicu_signame.str());
 
-                // coprocessor in cluster(x,y)
-//              clusters[x][y]->mwmr->print_trace();
-//              std::ostringstream mwmr_tgt_signame;
-//              mwmr_tgt_signame << "[SIG]MWMR_TGT_" << x << "_" << y;
-//              clusters[x][y]->signal_int_vci_tgt_mwmr.print_trace(mwmr_tgt_signame.str());
-//              std::ostringstream mwmr_ini_signame;
-//              mwmr_ini_signame << "[SIG]MWMR_INI_" << x << "_" << y;
-//              clusters[x][y]->signal_int_vci_ini_mwmr.print_trace(mwmr_ini_signame.str());
-//              if ( USE_MWR_CPY ) clusters[x][y]->cpy->print_trace();
-//              if ( USE_MWR_DCT ) clusters[x][y]->dct->print_trace();
-//              if ( USE_MWR_GCD ) clusters[x][y]->gcd->print_trace();
+                // MDMA
+//              clusters[x][y]->mdma->print_trace();
+//              std::ostringstream mdma_tgt_signame;
+//              mdma_tgt_signame << "[SIG]MDMA_TGT_" << x << "_" << y;
+//              clusters[x][y]->signal_int_vci_tgt_mdma.print_trace(mdma_tgt_signame.str());
+//              std::ostringstream mdma_ini_signame;
+//              mdma_ini_signame << "[SIG]MDMA_INI_" << x << "_" << y;
+//              clusters[x][y]->signal_int_vci_ini_mdma.print_trace(mdma_ini_signame.str());
 
                 // local interrupts in cluster(x,y)
@@ -1714,12 +1697,12 @@
                           << " ACTIVE" << std::endl;
 
-                if( clusters[x][y]->signal_irq_mwmr.read() )
-                std::cout << "### IRQ_MWR_" << std::dec << x << "_" << y 
-                          << " ACTIVE" << std::endl;
-
-                for ( size_t c = 0 ; c < NB_PROCS_MAX ; c++ )
+                for( size_t i = 0 ; i < NB_PROCS_MAX ; i++ )
                 {
-                    if( clusters[x][y]->signal_proc_it[c<<2].read() )
-                    std::cout << "### IRQ_PROC_" << std::dec << x << "_" << y << "_" << c
+                    if( clusters[x][y]->signal_irq_mdma[i].read() )
+                    std::cout << "### IRQ_DMA_" << std::dec << x << "_" << y << "_" << i 
+                              << " ACTIVE" << std::endl;
+
+                    if( clusters[x][y]->signal_proc_it[i<<2].read() )
+                    std::cout << "### IRQ_PROC_" << std::dec << x << "_" << y << "_" << i
                               << " ACTIVE" << std::endl;
                 }
Index: trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/metadata/tsar_iob_cluster.sd
===================================================================
--- trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/metadata/tsar_iob_cluster.sd	(revision 1050)
+++ trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/metadata/tsar_iob_cluster.sd	(revision 1051)
@@ -29,5 +29,4 @@
         Uses('common:iss2'),
         Uses('common:elf_file_loader'),
-        Uses('caba:coproc_signals'),
 
         # internal network components
@@ -48,10 +47,6 @@
               cell_size          = parameter.Reference('vci_data_width_int')),
 
-        Uses('caba:vci_mwmr_dma',
+        Uses('caba:vci_multi_dma',
               cell_size          = parameter.Reference('vci_data_width_int')),
-
-        Uses('caba:coproc_gcd'),
-        Uses('caba:coproc_dct'),
-        Uses('caba:coproc_cpy'),
 
         Uses('caba:vci_local_crossbar', 
Index: trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h
===================================================================
--- trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h	(revision 1050)
+++ trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/include/tsar_iob_cluster.h	(revision 1051)
@@ -27,12 +27,8 @@
 #include "vci_dspin_target_wrapper.h"
 #include "dspin_router.h"
-#include "vci_mwmr_dma.h"
+#include "vci_multi_dma.h"
 #include "vci_mem_cache.h"
 #include "vci_cc_vcache_wrapper.h"
 #include "vci_io_bridge.h"
-#include "coproc_signals.h"
-#include "coproc_gcd.h"
-#include "coproc_dct.h"
-#include "coproc_cpy.h"
 
 namespace soclib { namespace caba   {
@@ -80,13 +76,7 @@
     sc_signal<bool>                       signal_false;
     sc_signal<bool>                       signal_proc_it[32];
-    sc_signal<bool>                       signal_irq_mwmr;
+    sc_signal<bool>                       signal_irq_mdma[8];
     sc_signal<bool>                       signal_irq_memc;
     
-    // Coprocessor signals
-    CoprocSignals<uint32_t,uint8_t>       signal_to_coproc[8];
-    CoprocSignals<uint32_t,uint8_t>       signal_from_coproc[8];
-    sc_signal<uint32_t>                   signal_config_coproc[8];
-    sc_signal<uint32_t>                   signal_status_coproc[8];
-
     // INT network DSPIN signals between DSPIN routers and DSPIN local_crossbars
     DspinSignals<dspin_int_cmd_width>     signal_int_dspin_cmd_l2g_d; 
@@ -107,10 +97,10 @@
     // INT network VCI signals between VCI components and VCI local crossbar
     VciSignals<vci_param_int>             signal_int_vci_ini_proc[8]; 
-    VciSignals<vci_param_int>             signal_int_vci_ini_mwmr; 
+    VciSignals<vci_param_int>             signal_int_vci_ini_mdma; 
     VciSignals<vci_param_int>             signal_int_vci_ini_iobx; 
 
     VciSignals<vci_param_int>             signal_int_vci_tgt_memc;
     VciSignals<vci_param_int>             signal_int_vci_tgt_xicu;
-    VciSignals<vci_param_int>             signal_int_vci_tgt_mwmr;
+    VciSignals<vci_param_int>             signal_int_vci_tgt_mdma;
     VciSignals<vci_param_int>             signal_int_vci_tgt_iobx;
 
@@ -163,9 +153,5 @@
     VciXicu<vci_param_int>*                           xicu;
 
-    VciMwmrDma<vci_param_int>*                        mwmr;
-
-    CoprocGcd*                                        gcd;
-    CoprocDct*                                        dct;
-    CoprocCpy*                                        cpy;
+    VciMultiDma<vci_param_int>*                       mdma;
 
     VciLocalCrossbar<vci_param_int>*                  int_xbar_d;
@@ -229,8 +215,8 @@
                     size_t                             int_memc_tgt_id,
                     size_t                             int_xicu_tgt_id,
-                    size_t                             int_mwmr_tgt_id,
+                    size_t                             int_mdma_tgt_id,
                     size_t                             int_iobx_tgt_id,
                     size_t                             int_proc_ini_id,
-                    size_t                             int_mwmr_ini_id,
+                    size_t                             int_mdma_ini_id,
                     size_t                             int_iobx_ini_id,
 
Index: trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp
===================================================================
--- trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp	(revision 1050)
+++ trunk/platforms/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp	(revision 1051)
@@ -15,8 +15,4 @@
 #include "../include/tsar_iob_cluster.h"
 
-#define MWR_COPROC_CPY  0
-#define MWR_COPROC_DCT  1
-#define MWR_COPROC_GCD  2
-
 #define tmpl(x) \
    template<typename vci_param_int      , typename vci_param_ext,\
@@ -51,9 +47,9 @@
                     size_t                             int_memc_tgt_id, // local index
                     size_t                             int_xicu_tgt_id, // local index
-                    size_t                             int_mwmr_tgt_id, // local index
+                    size_t                             int_mdma_tgt_id, // local index
                     size_t                             int_iobx_tgt_id, // local index
 
                     size_t                             int_proc_ini_id, // local index
-                    size_t                             int_mwmr_ini_id, // local index
+                    size_t                             int_mdma_ini_id, // local index
                     size_t                             int_iobx_ini_id, // local index
 
@@ -62,5 +58,5 @@
                     size_t                             ram_iobx_ini_id, // local index
 
-                    bool                               is_io,           // is IO cluster (IOB)?
+                    bool                               is_io,           // is IO cluster (
                     size_t                             iox_iobx_tgt_id, // local_index
                     size_t                             iox_iobx_ini_id, // local index
@@ -213,57 +209,14 @@
                      xcu_nb_out);                         // number of output IRQs
 
-    ////////////  MWMR controller and COPROC  ////////////////////////////////////////
-    std::ostringstream s_mwmr;
-    std::ostringstream s_copro;
-    s_mwmr << "mwmr_" << x_id << "_" << y_id;
-
-    if ( coproc_type ==  MWR_COPROC_CPY) 
-    {
-        s_copro << "cpy_" << x_id << "_" << y_id;
-        cpy = new CoprocCpy( s_copro.str().c_str(), 64 );       // burst size
-
-        mwmr = new VciMwmrDma<vci_param_int>(
-                     s_mwmr.str().c_str(),
+    ////////////  MDMA  //////////////////////////////////////////////////////////////
+    std::ostringstream s_mdma;
+    s_mdma << "mdma_" << x_id << "_" << y_id;
+    mdma = new VciMultiDma<vci_param_int>(
+                     s_mdma.str().c_str(),
                      mt_int,
-                     IntTab(cluster_id, int_mwmr_ini_id), // SRCID
-                     IntTab(cluster_id, int_mwmr_tgt_id), // TGTID
-                     1,                                   // nb to_coproc ports
-                     1,                                   // nb from_coproc ports
-                     1,                                   // nb config registers
-                     0,                                   // nb status registers
-                     64 );                                // burst size (bytes)
-    }
-    if ( coproc_type == MWR_COPROC_DCT ) 
-    {
-        s_copro << "dct_" << x_id << "_" << y_id;
-        dct = new CoprocDct( s_copro.str().c_str(), 64 , 16 );  // burst size / latency
-
-        mwmr = new VciMwmrDma<vci_param_int>(
-                     s_mwmr.str().c_str(),
-                     mt_int,
-                     IntTab(cluster_id, int_mwmr_ini_id), // SRCID
-                     IntTab(cluster_id, int_mwmr_tgt_id), // TGTID
-                     1,                                   // nb to_coproc ports
-                     1,                                   // nb from_coproc ports
-                     1,                                   // nb config registers
-                     0,                                   // nb status registers
-                     64 );                                // burst size (bytes)
-    }
-    if ( coproc_type == MWR_COPROC_GCD ) 
-    {
-        s_copro << "gcd_" << x_id << "_" << y_id;
-        gcd = new CoprocGcd( s_copro.str().c_str(), 64 );       // burst size
-
-        mwmr = new VciMwmrDma<vci_param_int>(
-                     s_mwmr.str().c_str(),
-                     mt_int,
-                     IntTab(cluster_id, int_mwmr_ini_id), // SRCID
-                     IntTab(cluster_id, int_mwmr_tgt_id), // TGTID
-                     2,                                   // nb to_coproc ports
-                     1,                                   // nb from_coproc ports
-                     1,                                   // nb config registers
-                     0,                                   // nb status registers
-                     64 );                                // burst size (bytes)
-    }
+                     IntTab(cluster_id, int_mdma_ini_id), // SRCID
+                     IntTab(cluster_id, int_mdma_tgt_id), // TGTID
+                     64,                                  // burst size
+                     nb_procs );                          // number of channels
 
     ///////////  VCI INT_CMD/RSP LOCAL_XBAR  ////////////////////////////////////// 
@@ -526,7 +479,7 @@
     for ( size_t i=0 ; i < xcu_nb_hwi ; i++)
     {
-        if      ( i == 0 )       xicu->p_hwi[i]  (signal_irq_memc);
-        else if ( i == 1 )       xicu->p_hwi[i]  (signal_irq_mwmr);
-        else                     xicu->p_hwi[i]  (signal_false);
+        if      ( i == 0 )           xicu->p_hwi[i]  (signal_irq_memc);
+        else if ( i < (nb_procs+1) ) xicu->p_hwi[i]  (signal_irq_mdma[i-1]);
+        else                         xicu->p_hwi[i]  (signal_false);
     }
 
@@ -566,64 +519,15 @@
     std::cout << "  - xram connected" << std::endl;
 
-    /////////////////////////////////// GCD coprocessor
-    if ( coproc_type == MWR_COPROC_GCD )
-    {
-        gcd->p_clk                               (this->p_clk);
-        gcd->p_resetn                            (this->p_resetn);
-        gcd->p_opa                               (signal_to_coproc[0]);
-        gcd->p_opb                               (signal_to_coproc[1]);
-        gcd->p_res                               (signal_from_coproc[0]);
-        gcd->p_config                            (signal_config_coproc[0]);
-
-        mwmr->p_clk                              (this->p_clk);
-        mwmr->p_resetn                           (this->p_resetn);
-        mwmr->p_vci_target                       (signal_int_vci_tgt_mwmr);
-        mwmr->p_vci_initiator                    (signal_int_vci_ini_mwmr);
-        mwmr->p_to_coproc[0]                     (signal_to_coproc[0]);
-        mwmr->p_to_coproc[1]                     (signal_to_coproc[1]);
-        mwmr->p_from_coproc[0]                   (signal_from_coproc[0]);
-        mwmr->p_config[0]                        (signal_config_coproc[0]);
-        mwmr->p_irq                              (signal_irq_mwmr);
-    }
-
-    /////////////////////////////////// DCT coprocessor
-    if ( coproc_type == MWR_COPROC_DCT )
-    {
-        dct->p_clk                               (this->p_clk);
-        dct->p_resetn                            (this->p_resetn);
-        dct->p_in                                (signal_to_coproc[0]);
-        dct->p_out                               (signal_from_coproc[0]);
-        dct->p_config                            (signal_config_coproc[0]);
-
-        mwmr->p_clk                              (this->p_clk);
-        mwmr->p_resetn                           (this->p_resetn);
-        mwmr->p_vci_target                       (signal_int_vci_tgt_mwmr);
-        mwmr->p_vci_initiator                    (signal_int_vci_ini_mwmr);
-        mwmr->p_to_coproc[0]                     (signal_to_coproc[0]);
-        mwmr->p_from_coproc[0]                   (signal_from_coproc[0]);
-        mwmr->p_config[0]                        (signal_config_coproc[0]);
-        mwmr->p_irq                              (signal_irq_mwmr);
-    }
-
-    std::cout << "  - coproc connected" << std::endl;
-
-    /////////////////////////////////// CPY coprocessor
-    if ( coproc_type == MWR_COPROC_CPY )
-    {
-        cpy->p_clk                               (this->p_clk);
-        cpy->p_resetn                            (this->p_resetn);
-        cpy->p_load                              (signal_to_coproc[0]);
-        cpy->p_store                             (signal_from_coproc[0]);
-        cpy->p_config                            (signal_config_coproc[0]);
-
-        mwmr->p_clk                              (this->p_clk);
-        mwmr->p_resetn                           (this->p_resetn);
-        mwmr->p_vci_target                       (signal_int_vci_tgt_mwmr);
-        mwmr->p_vci_initiator                    (signal_int_vci_ini_mwmr);
-        mwmr->p_to_coproc[0]                     (signal_to_coproc[0]);
-        mwmr->p_from_coproc[0]                   (signal_from_coproc[0]);
-        mwmr->p_config[0]                        (signal_config_coproc[0]);
-        mwmr->p_irq                              (signal_irq_mwmr);
-    }
+    /////////////////////////////////// MDMA 
+    mdma->p_clk                                  (this->p_clk);
+    mdma->p_resetn                               (this->p_resetn);
+    mdma->p_vci_target                           (signal_int_vci_tgt_mdma);
+    mdma->p_vci_initiator                        (signal_int_vci_ini_mdma);
+    for( size_t i = 0 ; i < nb_procs ; i++ )
+    {
+        mdma->p_irq[i]                           (signal_irq_mdma[i]);
+    }
+
+    std::cout << "  - mdma connected" << std::endl;
 
     //////////////////////////// RAM NETWORK ROUTERS
@@ -712,6 +616,6 @@
     int_xbar_d->p_to_target[int_memc_tgt_id]     (signal_int_vci_tgt_memc);
     int_xbar_d->p_to_target[int_xicu_tgt_id]     (signal_int_vci_tgt_xicu);
-    int_xbar_d->p_to_target[int_mwmr_tgt_id]     (signal_int_vci_tgt_mwmr);
-    int_xbar_d->p_to_initiator[int_mwmr_ini_id]  (signal_int_vci_ini_mwmr);
+    int_xbar_d->p_to_target[int_mdma_tgt_id]     (signal_int_vci_tgt_mdma);
+    int_xbar_d->p_to_initiator[int_mdma_ini_id]  (signal_int_vci_ini_mdma);
     for (size_t p = 0; p < nb_procs; p++)
        int_xbar_d->p_to_initiator[int_proc_ini_id + p] (signal_int_vci_ini_proc[p]);
