Ignore:
Timestamp:
Mar 2, 2014, 10:14:35 PM (10 years ago)
Author:
cfuguet
Message:

Introducing new platform with IO bridges in fault_tolerance
branch

Location:
branches/fault_tolerance/platform/tsar_generic_iob
Files:
1 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/fault_tolerance/platform/tsar_generic_iob/tsar_iob_cluster/caba/source/src/tsar_iob_cluster.cpp

    r607 r648  
    55// Date : april 2013
    66// This program is released under the GNU public license
     7//
     8// Modified by: Cesar Fuguet
     9// Modified on: mars 2014
    710//////////////////////////////////////////////////////////////////////////////
    811// Cluster(0,0) & Cluster(xmax-1,ymax-1) contains the IOB0 & IOB1 components.
     
    1518#include "../include/tsar_iob_cluster.h"
    1619
     20#define tmpl(x) \
     21   template<typename vci_param_int      , typename vci_param_ext,\
     22            size_t   dspin_int_cmd_width, size_t   dspin_int_rsp_width,\
     23            size_t   dspin_ram_cmd_width, size_t   dspin_ram_rsp_width>\
     24            x TsarIobCluster<\
     25                  vci_param_int      , vci_param_ext,\
     26                  dspin_int_cmd_width, dspin_int_rsp_width,\
     27                  dspin_ram_cmd_width, dspin_ram_rsp_width>
     28
    1729namespace soclib { namespace caba  {
    1830
     
    2032//                 Constructor
    2133//////////////////////////////////////////////////////////////////////////
    22 template<typename vci_param_int,
    23          typename vci_param_ext,
    24          size_t   dspin_int_cmd_width,
    25          size_t   dspin_int_rsp_width,
    26          size_t   dspin_ram_cmd_width,
    27          size_t   dspin_ram_rsp_width>
    28 TsarIobCluster<vci_param_int,
    29                vci_param_ext,
    30                dspin_int_cmd_width,
    31                dspin_int_rsp_width,
    32                dspin_ram_cmd_width,
    33                dspin_ram_rsp_width>::TsarIobCluster(
    34 //////////////////////////////////////////////////////////////////////////
    35                     sc_module_name                     insname,
    36                     size_t                             nb_procs,
    37                     size_t                             nb_dmas,
    38                     size_t                             x_id,
    39                     size_t                             y_id,
    40                     size_t                             xmax,
    41                     size_t                             ymax,
    42 
    43                     const soclib::common::MappingTable &mt_int,
    44                     const soclib::common::MappingTable &mt_ram,
    45                     const soclib::common::MappingTable &mt_iox,
    46 
    47                     size_t                             x_width,
    48                     size_t                             y_width,
    49                     size_t                             l_width,
    50 
    51                     size_t                             memc_int_tgtid,  // local index
    52                     size_t                             xicu_int_tgtid,  // local index
    53                     size_t                             mdma_int_tgtid,  // local index
    54                     size_t                             iobx_int_tgtid,  // local index
    55 
    56                     size_t                             proc_int_srcid,  // local index
    57                     size_t                             mdma_int_srcid,  // local index
    58                     size_t                             iobx_int_srcid,  // local index
    59 
    60                     size_t                             xram_ram_tgtid,  // local index
    61 
    62                     size_t                             memc_ram_srcid,  // local index
    63                     size_t                             iobx_ram_srcid,  // local index
    64 
    65                     size_t                             memc_ways,
    66                     size_t                             memc_sets,
    67                     size_t                             l1_i_ways,
    68                     size_t                             l1_i_sets,
    69                     size_t                             l1_d_ways,
    70                     size_t                             l1_d_sets,
    71                     size_t                             xram_latency,
    72 
    73                     const Loader                      &loader,
    74 
    75                     uint32_t                           frozen_cycles,
    76                     uint32_t                           debug_start_cycle,
    77                     bool                               memc_debug_ok,
    78                     bool                               proc_debug_ok,
    79                     bool                               iob_debug_ok )
    80     : soclib::caba::BaseModule(insname),
    81       p_clk("clk"),
    82       p_resetn("resetn")
     34tmpl(/**/)::TsarIobCluster(struct ClusterParams& params) :
     35   soclib::caba::BaseModule(params.insname), p_clk("clk"), p_resetn("resetn")
    8336{
    84     assert( (x_id < xmax) and (y_id < ymax) and "Illegal cluster coordinates");
    85 
    86     size_t cluster_id = (x_id<<4) + y_id;
    87 
    88     size_t cluster_iob0 = 0;                            // South-West cluster
    89     size_t cluster_iob1 = ((xmax-1)<<4) + ymax-1;       // North-East cluster
    90 
    91     // Vectors of DSPIN ports for inter-cluster communications
    92     p_dspin_int_cmd_in  = alloc_elems<DspinInput<dspin_int_cmd_width> >("p_int_cmd_in", 4, 3);
    93     p_dspin_int_cmd_out = alloc_elems<DspinOutput<dspin_int_cmd_width> >("p_int_cmd_out", 4, 3);
    94     p_dspin_int_rsp_in  = alloc_elems<DspinInput<dspin_int_rsp_width> >("p_int_rsp_in", 4, 2);
    95     p_dspin_int_rsp_out = alloc_elems<DspinOutput<dspin_int_rsp_width> >("p_int_rsp_out", 4, 2);
    96 
    97     p_dspin_ram_cmd_in  = alloc_elems<DspinInput<dspin_ram_cmd_width> >("p_ext_cmd_in", 4);
    98     p_dspin_ram_cmd_out = alloc_elems<DspinOutput<dspin_ram_cmd_width> >("p_ext_cmd_out", 4);
    99     p_dspin_ram_rsp_in  = alloc_elems<DspinInput<dspin_ram_rsp_width> >("p_ext_rsp_in", 4);
    100     p_dspin_ram_rsp_out = alloc_elems<DspinOutput<dspin_ram_rsp_width> >("p_ext_rsp_out", 4);
    101 
    102     // ports in cluster_iob0 and cluster_iob1 only
    103     if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
    104     {
    105         // VCI ports from IOB to IOX network
    106         p_vci_iob_iox_ini = new soclib::caba::VciInitiator<vci_param_ext>;
    107         p_vci_iob_iox_tgt = new soclib::caba::VciTarget<vci_param_ext>;
    108 
    109         // DSPIN ports from IOB to RAM network
    110         p_dspin_iob_cmd_out = new soclib::caba::DspinOutput<dspin_ram_cmd_width>;
    111         p_dspin_iob_rsp_in  = new soclib::caba::DspinInput<dspin_ram_rsp_width>;
    112     }
    113 
    114     // IRQ ports in cluster_iob0 only
    115     if ( cluster_id == cluster_iob0 )
    116     {
    117         for ( size_t n=0 ; n<32 ; n++ ) p_irq[n] = new sc_in<bool>;
    118     }
    119 
    120     /////////////////////////////////////////////////////////////////////////////
    121     //    Hardware components
    122     /////////////////////////////////////////////////////////////////////////////
    123 
    124     ////////////  PROCS
    125     for (size_t p = 0; p < nb_procs; p++)
    126     {
    127         std::ostringstream s_proc;
    128         s_proc << "proc_" << x_id << "_" << y_id << "_" << p;
    129         proc[p] = new VciCcVCacheWrapper<vci_param_int,
    130                                          dspin_int_cmd_width,
    131                                          dspin_int_rsp_width,
    132                                          GdbServer<Mips32ElIss> >(
    133                       s_proc.str().c_str(),
    134                       cluster_id*nb_procs + p,        // GLOBAL PROC_ID
    135                       mt_int,                         // Mapping Table INT network
    136                       IntTab(cluster_id,p),           // SRCID
    137                       (cluster_id << l_width) + p,    // CC_GLOBAL_ID
    138                       8,                              // ITLB ways
    139                       8,                              // ITLB sets
    140                       8,                              // DTLB ways
    141                       8,                              // DTLB sets
    142                       l1_i_ways,l1_i_sets,16,         // ICACHE size
    143                       l1_d_ways,l1_d_sets,16,         // DCACHE size
    144                       4,                              // WBUF nlines
    145                       4,                              // WBUF nwords
    146                       x_width,
    147                       y_width,
    148                       frozen_cycles,                  // max frozen cycles
    149                       debug_start_cycle,
    150                       proc_debug_ok);
    151 
    152         std::ostringstream s_wi_proc;
    153         s_wi_proc << "proc_wi_" << x_id << "_" << y_id << "_" << p;
    154         proc_wi[p] = new VciDspinInitiatorWrapper<vci_param_int,
    155                                                       dspin_int_cmd_width,
    156                                                       dspin_int_rsp_width>(
    157                      s_wi_proc.str().c_str(),
    158                      x_width + y_width + l_width);
    159     }
    160 
    161     ///////////  MEMC   
    162     std::ostringstream s_memc;
    163     s_memc << "memc_" << x_id << "_" << y_id;
    164     memc = new VciMemCache<vci_param_int,
    165                            vci_param_ext,
    166                            dspin_int_rsp_width,
    167                            dspin_int_cmd_width>(
    168                      s_memc.str().c_str(),
    169                      mt_int,                             // Mapping Table INT network
    170                      mt_ram,                             // Mapping Table RAM network
    171                      IntTab(cluster_id, memc_ram_srcid), // SRCID RAM network
    172                      IntTab(cluster_id, memc_int_tgtid), // TGTID INT network
    173                      x_width,                            // number of bits for x coordinate
    174                      y_width,                            // number of bits for y coordinate
    175                      memc_ways, memc_sets, 16,           // CACHE SIZE
    176                      3,                                  // MAX NUMBER OF COPIES
    177                      4096,                               // HEAP SIZE
    178                      8,                                  // TRANSACTION TABLE DEPTH
    179                      8,                                  // UPDATE TABLE DEPTH
    180                      8,                                  // INVALIDATE TABLE DEPTH
    181                      debug_start_cycle,
    182                      memc_debug_ok );
    183 
    184     std::ostringstream s_wt_memc;
    185     s_wt_memc << "memc_wt_" << x_id << "_" << y_id;
    186     memc_int_wt = new VciDspinTargetWrapper<vci_param_int,
    187                                             dspin_int_cmd_width,
    188                                             dspin_int_rsp_width>(
    189                      s_wt_memc.str().c_str(),
    190                      x_width + y_width + l_width);
    191 
    192     std::ostringstream s_wi_memc;
    193     s_wi_memc << "memc_wi_" << x_id << "_" << y_id;
    194     memc_ram_wi = new VciDspinInitiatorWrapper<vci_param_ext,
    195                                                dspin_ram_cmd_width,
    196                                                dspin_ram_rsp_width>(
    197                      s_wi_memc.str().c_str(),
    198                      x_width + y_width + l_width);
    199 
    200     ///////////   XICU
    201     std::ostringstream s_xicu;
    202     s_xicu << "xicu_" << x_id << "_" << y_id;
    203     xicu = new VciXicu<vci_param_int>(
    204                      s_xicu.str().c_str(),
    205                      mt_int,                            // mapping table INT network
    206                      IntTab(cluster_id,xicu_int_tgtid), // TGTID direct space
    207                      32,                                // number of timer IRQs
    208                      32,                                // number of hard IRQs
    209                      32,                                // number of soft IRQs
    210                      nb_procs);                         // number of output IRQs
    211 
    212     std::ostringstream s_wt_xicu;
    213     s_wt_xicu << "xicu_wt_" << x_id << "_" << y_id;
    214     xicu_int_wt = new VciDspinTargetWrapper<vci_param_int,
    215                                         dspin_int_cmd_width,
    216                                         dspin_int_rsp_width>(
    217                      s_wt_xicu.str().c_str(),
    218                      x_width + y_width + l_width);
    219 
    220     ////////////  MDMA
    221     std::ostringstream s_mdma;
    222     s_mdma << "mdma_" << x_id << "_" << y_id;
    223     mdma = new VciMultiDma<vci_param_int>(
    224                      s_mdma.str().c_str(),
    225                      mt_int,
    226                      IntTab(cluster_id, nb_procs),        // SRCID
    227                      IntTab(cluster_id, mdma_int_tgtid),  // TGTID
    228                      64,                                  // burst size
    229                      nb_dmas);                            // number of IRQs
    230 
    231     std::ostringstream s_wt_mdma;
    232     s_wt_mdma << "mdma_wt_" << x_id << "_" << y_id;
    233     mdma_int_wt = new VciDspinTargetWrapper<vci_param_int,
    234                                             dspin_int_cmd_width,
    235                                             dspin_int_rsp_width>(
    236                      s_wt_mdma.str().c_str(),
    237                      x_width + y_width + l_width);
    238 
    239     std::ostringstream s_wi_mdma;
    240     s_wi_mdma << "mdma_wi_" << x_id << "_" << y_id;
    241     mdma_int_wi = new VciDspinInitiatorWrapper<vci_param_int,
    242                                                dspin_int_cmd_width,
    243                                                dspin_int_rsp_width>(
    244                      s_wi_mdma.str().c_str(),
    245                      x_width + y_width + l_width);
    246 
    247     ///////////  Direct LOCAL_XBAR(S)
    248     size_t nb_direct_initiators      = nb_procs + 1;
    249     size_t nb_direct_targets         = 3;
    250     if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
    251     {
    252         nb_direct_initiators         = nb_procs + 2;
    253         nb_direct_targets            = 4;
    254     }
    255 
    256     std::ostringstream s_int_xbar_cmd_d;
    257     s_int_xbar_cmd_d << "int_xbar_cmd_d_" << x_id << "_" << y_id;
    258     int_xbar_cmd_d = new DspinLocalCrossbar<dspin_int_cmd_width>(
    259                      s_int_xbar_cmd_d.str().c_str(),
    260                      mt_int,                       // mapping table
    261                      x_id, y_id,                   // cluster coordinates
    262                      x_width, y_width, l_width,
    263                      nb_direct_initiators,         // number of local of sources
    264                      nb_direct_targets,            // number of local dests
    265                      2, 2,                         // fifo depths 
    266                      true,                         // CMD crossbar
    267                      true,                         // use routing table
    268                      false );                      // no broacast
    269 
    270     std::ostringstream s_int_xbar_rsp_d;
    271     s_int_xbar_rsp_d << "int_xbar_rsp_d_" << x_id << "_" << y_id;
    272     int_xbar_rsp_d = new DspinLocalCrossbar<dspin_int_rsp_width>(
    273                      s_int_xbar_rsp_d.str().c_str(),
    274                      mt_int,                       // mapping table
    275                      x_id, y_id,                   // cluster coordinates
    276                      x_width, y_width, l_width,
    277                      nb_direct_targets,            // number of local sources     
    278                      nb_direct_initiators,         // number of local dests
    279                      2, 2,                         // fifo depths
    280                      false,                        // RSP crossbar 
    281                      false,                        // don't use routing table
    282                      false );                      // no broacast
    283 
    284     ////////////  Coherence LOCAL_XBAR(S)
    285     std::ostringstream s_int_xbar_m2p_c;
    286     s_int_xbar_m2p_c << "int_xbar_m2p_c_" << x_id << "_" << y_id;
    287     int_xbar_m2p_c = new DspinLocalCrossbar<dspin_int_cmd_width>(
    288                      s_int_xbar_m2p_c.str().c_str(),
    289                      mt_int,                       // mapping table
    290                      x_id, y_id,                   // cluster coordinates
    291                      x_width, y_width, l_width,    // several dests
    292                      1,                            // number of local sources
    293                      nb_procs,                     // number of local dests
    294                      2, 2,                         // fifo depths 
    295                      true,                         // pseudo CMD
    296                      false,                        // no routing table
    297                      true );                       // broacast
    298 
    299     std::ostringstream s_int_xbar_p2m_c;
    300     s_int_xbar_p2m_c << "int_xbar_p2m_c_" << x_id << "_" << y_id;
    301     int_xbar_p2m_c = new DspinLocalCrossbar<dspin_int_rsp_width>(
    302                      s_int_xbar_p2m_c.str().c_str(),
    303                      mt_int,                       // mapping table
    304                      x_id, y_id,                   // cluster coordinates
    305                      x_width, y_width, 0,          // only one dest
    306                      nb_procs,                     // number of local sources
    307                      1,                            // number of local dests
    308                      2, 2,                         // fifo depths 
    309                      false,                        // pseudo RSP
    310                      false,                        // no routing table
    311                      false );                      // no broacast
    312 
    313     std::ostringstream s_int_xbar_clack_c;
    314     s_int_xbar_clack_c << "int_xbar_clack_c_" << x_id << "_" << y_id;
    315     int_xbar_clack_c = new DspinLocalCrossbar<dspin_int_cmd_width>(
    316                      s_int_xbar_clack_c.str().c_str(),
    317                      mt_int,                       // mapping table
    318                      x_id, y_id,                   // cluster coordinates
    319                      x_width, y_width, l_width,
    320                      1,                            // number of local sources
    321                      nb_procs,                     // number of local targets
    322                      1, 1,                         // fifo depths
    323                      true,                         // CMD
    324                      false,                        // don't use local routing table
    325                      false);                       // broadcast
    326 
    327     //////////////  INT ROUTER(S)
    328     std::ostringstream s_int_router_cmd;
    329     s_int_router_cmd << "router_cmd_" << x_id << "_" << y_id;
    330     int_router_cmd = new VirtualDspinRouter<dspin_int_cmd_width>(
    331                      s_int_router_cmd.str().c_str(),
    332                      x_id,y_id,                    // coordinate in the mesh
    333                      x_width, y_width,             // x & y fields width
    334                      3,                            // nb virtual channels
    335                      4,4);                         // input & output fifo depths
    336 
    337     std::ostringstream s_int_router_rsp;
    338     s_int_router_rsp << "router_rsp_" << x_id << "_" << y_id;
    339     int_router_rsp = new VirtualDspinRouter<dspin_int_rsp_width>(
    340                      s_int_router_rsp.str().c_str(),
    341                      x_id,y_id,                    // router coordinates in mesh
    342                      x_width, y_width,             // x & y fields width
    343                      2,                            // nb virtual channels
    344                      4,4);                         // input & output fifo depths
    345 
    346     //////////////  XRAM
    347     std::ostringstream s_xram;
    348     s_xram << "xram_" << x_id << "_" << y_id;
    349     xram = new VciSimpleRam<vci_param_ext>(
    350                      s_xram.str().c_str(),
    351                      IntTab(cluster_id, xram_ram_tgtid ),
    352                      mt_ram,
    353                      loader,
    354                      xram_latency);
    355 
    356     std::ostringstream s_wt_xram;
    357     s_wt_xram << "xram_wt_" << x_id << "_" << y_id;
    358     xram_ram_wt = new VciDspinTargetWrapper<vci_param_ext,
    359                                             dspin_ram_cmd_width,
    360                                             dspin_ram_rsp_width>(
    361                      s_wt_xram.str().c_str(),
    362                      x_width + y_width + l_width);
    363 
    364     /////////////  RAM ROUTER(S)
    365     std::ostringstream s_ram_router_cmd;
    366     s_ram_router_cmd << "ram_router_cmd_" << x_id << "_" << y_id;
    367     size_t is_iob0 = (x_id == 0) and (y_id == 0);
    368     size_t is_iob1 = (x_id == (xmax-1)) and (y_id == (ymax-1));
    369     ram_router_cmd = new DspinRouterTsar<dspin_ram_cmd_width>(
    370                      s_ram_router_cmd.str().c_str(),
    371                      x_id, y_id,                     // router coordinates in mesh
    372                      x_width,                        // x field width in first flit
    373                      y_width,                        // y field width in first flit
    374                      4, 4,                           // input & output fifo depths
    375                      is_iob0,                        // cluster contains IOB0
    376                      is_iob1,                        // cluster contains IOB1
    377                      false,                          // not a response router
    378                      l_width);                       // local field width in first flit
    379 
    380     std::ostringstream s_ram_router_rsp;
    381     s_ram_router_rsp << "ram_router_rsp_" << x_id << "_" << y_id;
    382     ram_router_rsp = new DspinRouterTsar<dspin_ram_rsp_width>(
    383                      s_ram_router_rsp.str().c_str(),
    384                      x_id, y_id,                     // coordinates in mesh
    385                      x_width,                        // x field width in first flit
    386                      y_width,                        // y field width in first flit
    387                      4, 4,                           // input & output fifo depths
    388                      is_iob0,                        // cluster contains IOB0
    389                      is_iob1,                        // cluster contains IOB1
    390                      true,                           // response router
    391                      l_width);                       // local field width in first flit
    392 
    393 
    394     ////////////////////// I/O  CLUSTER ONLY    ///////////////////////
    395     if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
    396     {
    397         ///////////  IO_BRIDGE
    398         size_t iox_local_id;
    399         size_t global_id;
    400         bool   has_irqs;
    401         if ( cluster_id == cluster_iob0 )
    402         {
    403             iox_local_id = 0;
    404             global_id    = cluster_iob0;
    405             has_irqs     = true;
    406         }
    407         else
    408         {
    409             iox_local_id = 1;
    410             global_id    = cluster_iob1;
    411             has_irqs     = false;
    412         }
    413 
    414         std::ostringstream s_iob;
    415         s_iob << "iob_" << x_id << "_" << y_id;   
    416         iob = new VciIoBridge<vci_param_int,
    417                               vci_param_ext>( 
    418                      s_iob.str().c_str(),
    419                      mt_ram,                               // EXT network maptab
    420                      mt_int,                               // INT network maptab
    421                      mt_iox,                               // IOX network maptab
    422                      IntTab( global_id, iobx_int_tgtid ),  // INT TGTID
    423                      IntTab( global_id, iobx_int_srcid ),  // INT SRCID
    424                      IntTab( global_id, iox_local_id   ),  // IOX TGTID
    425                      has_irqs,
    426                      16,                                   // cache line words
    427                      8,                                    // IOTLB ways
    428                      8,                                    // IOTLB sets
    429                      debug_start_cycle,
    430                      iob_debug_ok );
    431        
    432         std::ostringstream s_iob_int_wi;
    433         s_iob_int_wi << "iob_int_wi_" << x_id << "_" << y_id;   
    434         iob_int_wi = new VciDspinInitiatorWrapper<vci_param_int,
    435                                                   dspin_int_cmd_width,
    436                                                   dspin_int_rsp_width>(
    437                      s_iob_int_wi.str().c_str(),
    438                      x_width + y_width + l_width);
    439 
    440         std::ostringstream s_iob_int_wt;
    441         s_iob_int_wt << "iob_int_wt_" << x_id << "_" << y_id;   
    442         iob_int_wt = new VciDspinTargetWrapper<vci_param_int,
    443                                                dspin_int_cmd_width,
    444                                                dspin_int_rsp_width>(
    445                      s_iob_int_wt.str().c_str(),
    446                      x_width + y_width + l_width);
    447 
    448         std::ostringstream s_iob_ram_wi;
    449         s_iob_ram_wi << "iob_ram_wi_" << x_id << "_" << y_id;   
    450         iob_ram_wi = new VciDspinInitiatorWrapper<vci_param_ext,
    451                                                   dspin_ram_cmd_width,
    452                                                   dspin_ram_rsp_width>(
    453                      s_iob_ram_wi.str().c_str(),
    454                      x_width + y_width + l_width);
    455     } // end if IO
    456 
    457     ////////////////////////////////////
    458     // Connections are defined here
    459     ////////////////////////////////////
    460 
    461     // on coherence network : local srcid[proc] in [0...nb_procs-1]
    462     //                      : local srcid[memc] = nb_procs
    463     // In cluster_iob0, 32 HWI interrupts from external peripherals
    464     // are connected to the XICU ports p_hwi[0:31]
    465     // In other clusters, no HWI interrupts are connected to XICU
    466  
    467     //////////////////////// internal CMD & RSP routers
    468     int_router_cmd->p_clk                        (this->p_clk);
    469     int_router_cmd->p_resetn                     (this->p_resetn);
    470     int_router_rsp->p_clk                        (this->p_clk);
    471     int_router_rsp->p_resetn                     (this->p_resetn);
    472 
    473     for (int i = 0; i < 4; i++)
    474     {
    475         for(int k = 0; k < 3; k++)
    476         {
    477             int_router_cmd->p_out[i][k]          (this->p_dspin_int_cmd_out[i][k]);
    478             int_router_cmd->p_in[i][k]           (this->p_dspin_int_cmd_in[i][k]);
    479         }
    480 
    481         for(int k = 0; k < 2; k++)
    482         {
    483             int_router_rsp->p_out[i][k]          (this->p_dspin_int_rsp_out[i][k]);
    484             int_router_rsp->p_in[i][k]           (this->p_dspin_int_rsp_in[i][k]);
    485         }
    486     }
    487 
    488     // local ports
    489     int_router_cmd->p_out[4][0]                  (signal_int_dspin_cmd_g2l_d);
    490     int_router_cmd->p_out[4][1]                  (signal_int_dspin_m2p_g2l_c);
    491     int_router_cmd->p_out[4][2]                  (signal_int_dspin_clack_g2l_c);
    492     int_router_cmd->p_in[4][0]                   (signal_int_dspin_cmd_l2g_d);
    493     int_router_cmd->p_in[4][1]                   (signal_int_dspin_m2p_l2g_c);
    494     int_router_cmd->p_in[4][2]                   (signal_int_dspin_clack_l2g_c);
    495    
    496     int_router_rsp->p_out[4][0]                  (signal_int_dspin_rsp_g2l_d);
    497     int_router_rsp->p_out[4][1]                  (signal_int_dspin_p2m_g2l_c);
    498     int_router_rsp->p_in[4][0]                   (signal_int_dspin_rsp_l2g_d);
    499     int_router_rsp->p_in[4][1]                   (signal_int_dspin_p2m_l2g_c);
    500 
    501     ///////////////////// CMD DSPIN  local crossbar direct
    502     int_xbar_cmd_d->p_clk                        (this->p_clk);
    503     int_xbar_cmd_d->p_resetn                     (this->p_resetn);
    504     int_xbar_cmd_d->p_global_out                 (signal_int_dspin_cmd_l2g_d);
    505     int_xbar_cmd_d->p_global_in                  (signal_int_dspin_cmd_g2l_d);
    506 
    507     int_xbar_cmd_d->p_local_out[memc_int_tgtid]  (signal_int_dspin_cmd_memc_t);
    508     int_xbar_cmd_d->p_local_out[xicu_int_tgtid]  (signal_int_dspin_cmd_xicu_t);
    509     int_xbar_cmd_d->p_local_out[mdma_int_tgtid]  (signal_int_dspin_cmd_mdma_t);
    510 
    511     int_xbar_cmd_d->p_local_in[mdma_int_srcid]   (signal_int_dspin_cmd_mdma_i);
    512 
    513     for (size_t p = 0; p < nb_procs; p++)
    514     int_xbar_cmd_d->p_local_in[proc_int_srcid+p] (signal_int_dspin_cmd_proc_i[p]);
    515 
    516     if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
    517     {
    518     int_xbar_cmd_d->p_local_out[iobx_int_tgtid]  (signal_int_dspin_cmd_iobx_t);
    519     int_xbar_cmd_d->p_local_in[iobx_int_srcid]   (signal_int_dspin_cmd_iobx_i);
    520     }
    521 
    522     //////////////////////// RSP DSPIN  local crossbar direct
    523     int_xbar_rsp_d->p_clk                        (this->p_clk);
    524     int_xbar_rsp_d->p_resetn                     (this->p_resetn);
    525     int_xbar_rsp_d->p_global_out                 (signal_int_dspin_rsp_l2g_d);
    526     int_xbar_rsp_d->p_global_in                  (signal_int_dspin_rsp_g2l_d);
    527 
    528     int_xbar_rsp_d->p_local_in[memc_int_tgtid]   (signal_int_dspin_rsp_memc_t);
    529     int_xbar_rsp_d->p_local_in[xicu_int_tgtid]   (signal_int_dspin_rsp_xicu_t);
    530     int_xbar_rsp_d->p_local_in[mdma_int_tgtid]   (signal_int_dspin_rsp_mdma_t);
    531 
    532     int_xbar_rsp_d->p_local_out[mdma_int_srcid]  (signal_int_dspin_rsp_mdma_i);
    533 
    534     for (size_t p = 0; p < nb_procs; p++)
    535     int_xbar_rsp_d->p_local_out[proc_int_srcid+p] (signal_int_dspin_rsp_proc_i[p]);
    536 
    537     if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
    538     {
    539     int_xbar_rsp_d->p_local_in[iobx_int_tgtid]   (signal_int_dspin_rsp_iobx_t);
    540     int_xbar_rsp_d->p_local_out[iobx_int_srcid]  (signal_int_dspin_rsp_iobx_i);
    541     }
    542 
    543     ////////////////////// M2P DSPIN local crossbar coherence
    544     int_xbar_m2p_c->p_clk                        (this->p_clk);
    545     int_xbar_m2p_c->p_resetn                     (this->p_resetn);
    546     int_xbar_m2p_c->p_global_out                 (signal_int_dspin_m2p_l2g_c);
    547     int_xbar_m2p_c->p_global_in                  (signal_int_dspin_m2p_g2l_c);
    548     int_xbar_m2p_c->p_local_in[0]                (signal_int_dspin_m2p_memc);
    549     for (size_t p = 0; p < nb_procs; p++)
    550         int_xbar_m2p_c->p_local_out[p]           (signal_int_dspin_m2p_proc[p]);
    551 
    552     ////////////////////////// P2M DSPIN local crossbar coherence
    553     int_xbar_p2m_c->p_clk                        (this->p_clk);
    554     int_xbar_p2m_c->p_resetn                     (this->p_resetn);
    555     int_xbar_p2m_c->p_global_out                 (signal_int_dspin_p2m_l2g_c);
    556     int_xbar_p2m_c->p_global_in                  (signal_int_dspin_p2m_g2l_c);
    557     int_xbar_p2m_c->p_local_out[0]               (signal_int_dspin_p2m_memc);
    558     for (size_t p = 0; p < nb_procs; p++)
    559         int_xbar_p2m_c->p_local_in[p]            (signal_int_dspin_p2m_proc[p]);
    560 
    561     ////////////////////// CLACK DSPIN local crossbar coherence
    562     int_xbar_clack_c->p_clk                      (this->p_clk);
    563     int_xbar_clack_c->p_resetn                   (this->p_resetn);
    564     int_xbar_clack_c->p_global_out               (signal_int_dspin_clack_l2g_c);
    565     int_xbar_clack_c->p_global_in                (signal_int_dspin_clack_g2l_c);
    566     int_xbar_clack_c->p_local_in[0]              (signal_int_dspin_clack_memc);
    567     for (size_t p = 0; p < nb_procs; p++)
    568         int_xbar_clack_c->p_local_out[p]         (signal_int_dspin_clack_proc[p]);
    569 
    570     //////////////////////////////////// Processors
    571     for (size_t p = 0; p < nb_procs; p++)
    572     {
    573         proc[p]->p_clk                           (this->p_clk);
    574         proc[p]->p_resetn                        (this->p_resetn);
    575         proc[p]->p_vci                           (signal_int_vci_ini_proc[p]);
    576         proc[p]->p_dspin_m2p                     (signal_int_dspin_m2p_proc[p]);
    577         proc[p]->p_dspin_p2m                     (signal_int_dspin_p2m_proc[p]);
    578         proc[p]->p_dspin_clack                   (signal_int_dspin_clack_proc[p]);
    579         proc[p]->p_irq[0]                        (signal_proc_it[p]);
    580         for ( size_t j = 1 ; j < 6 ; j++)
    581         {
    582             proc[p]->p_irq[j]                    (signal_false);
    583         }
    584 
    585         proc_wi[p]->p_clk                        (this->p_clk);
    586         proc_wi[p]->p_resetn                     (this->p_resetn);
    587         proc_wi[p]->p_dspin_cmd                  (signal_int_dspin_cmd_proc_i[p]);
    588         proc_wi[p]->p_dspin_rsp                  (signal_int_dspin_rsp_proc_i[p]);
    589         proc_wi[p]->p_vci                        (signal_int_vci_ini_proc[p]);
    590     }
    591 
    592     ///////////////////////////////////// XICU
    593     xicu->p_clk                                  (this->p_clk);
    594     xicu->p_resetn                               (this->p_resetn);
    595     xicu->p_vci                                  (signal_int_vci_tgt_xicu);
    596     for ( size_t p=0 ; p<nb_procs ; p++)
    597     {
    598         xicu->p_irq[p]                           (signal_proc_it[p]);
    599     }
    600     for ( size_t i=0 ; i<32 ; i++)
    601     {
    602         if (cluster_id == cluster_iob0)
    603             xicu->p_hwi[i]                       (*(this->p_irq[i]));
    604         else 
    605             xicu->p_hwi[i]                       (signal_false);
    606     }                     
    607 
    608     // wrapper XICU
    609     xicu_int_wt->p_clk                           (this->p_clk);
    610     xicu_int_wt->p_resetn                        (this->p_resetn);
    611     xicu_int_wt->p_dspin_cmd                     (signal_int_dspin_cmd_xicu_t);
    612     xicu_int_wt->p_dspin_rsp                     (signal_int_dspin_rsp_xicu_t);
    613     xicu_int_wt->p_vci                           (signal_int_vci_tgt_xicu);
    614 
    615     ///////////////////////////////////// MEMC
    616     memc->p_clk                                  (this->p_clk);
    617     memc->p_resetn                               (this->p_resetn);
    618     memc->p_vci_ixr                              (signal_ram_vci_ini_memc);
    619     memc->p_vci_tgt                              (signal_int_vci_tgt_memc);
    620     memc->p_dspin_p2m                            (signal_int_dspin_p2m_memc);
    621     memc->p_dspin_m2p                            (signal_int_dspin_m2p_memc);
    622     memc->p_dspin_clack                          (signal_int_dspin_clack_memc);
    623     memc->p_irq                                  (signal_irq_memc);
    624 
    625     // wrapper to INT network
    626     memc_int_wt->p_clk                           (this->p_clk);
    627     memc_int_wt->p_resetn                        (this->p_resetn);
    628     memc_int_wt->p_dspin_cmd                     (signal_int_dspin_cmd_memc_t);
    629     memc_int_wt->p_dspin_rsp                     (signal_int_dspin_rsp_memc_t);
    630     memc_int_wt->p_vci                           (signal_int_vci_tgt_memc);
    631 
    632     // wrapper to RAM network
    633     memc_ram_wi->p_clk                           (this->p_clk);
    634     memc_ram_wi->p_resetn                        (this->p_resetn);
    635     memc_ram_wi->p_dspin_cmd                     (signal_ram_dspin_cmd_memc_i);
    636     memc_ram_wi->p_dspin_rsp                     (signal_ram_dspin_rsp_memc_i);
    637     memc_ram_wi->p_vci                           (signal_ram_vci_ini_memc);
    638 
    639     //////////////////////////////////// XRAM
    640     xram->p_clk                                  (this->p_clk);
    641     xram->p_resetn                               (this->p_resetn);
    642     xram->p_vci                                  (signal_ram_vci_tgt_xram);
    643 
    644     // wrapper to RAM network
    645     xram_ram_wt->p_clk                           (this->p_clk);
    646     xram_ram_wt->p_resetn                        (this->p_resetn);
    647     xram_ram_wt->p_dspin_cmd                     (signal_ram_dspin_cmd_xram_t);
    648     xram_ram_wt->p_dspin_rsp                     (signal_ram_dspin_rsp_xram_t);
    649     xram_ram_wt->p_vci                           (signal_ram_vci_tgt_xram);
    650 
    651     /////////////////////////////////// MDMA
    652     mdma->p_clk                                  (this->p_clk);
    653     mdma->p_resetn                               (this->p_resetn);
    654     mdma->p_vci_target                           (signal_int_vci_tgt_mdma);
    655     mdma->p_vci_initiator                        (signal_int_vci_ini_mdma);
    656     for (size_t i=0 ; i<nb_dmas ; i++)
    657         mdma->p_irq[i]                           (signal_irq_mdma[i]);
    658 
    659     // target wrapper
    660     mdma_int_wt->p_clk                           (this->p_clk);
    661     mdma_int_wt->p_resetn                        (this->p_resetn);
    662     mdma_int_wt->p_dspin_cmd                     (signal_int_dspin_cmd_mdma_t);
    663     mdma_int_wt->p_dspin_rsp                     (signal_int_dspin_rsp_mdma_t);
    664     mdma_int_wt->p_vci                           (signal_int_vci_tgt_mdma);
    665 
    666     // initiator wrapper
    667     mdma_int_wi->p_clk                           (this->p_clk);
    668     mdma_int_wi->p_resetn                        (this->p_resetn);
    669     mdma_int_wi->p_dspin_cmd                     (signal_int_dspin_cmd_mdma_i);
    670     mdma_int_wi->p_dspin_rsp                     (signal_int_dspin_rsp_mdma_i);
    671     mdma_int_wi->p_vci                           (signal_int_vci_ini_mdma);
    672 
    673     //////////////////////////// RAM network CMD & RSP routers
    674     ram_router_cmd->p_clk                    (this->p_clk);
    675     ram_router_cmd->p_resetn                 (this->p_resetn);
    676     ram_router_rsp->p_clk                    (this->p_clk);
    677     ram_router_rsp->p_resetn                 (this->p_resetn);
    678     for( size_t n=0 ; n<4 ; n++)
    679     {
    680         ram_router_cmd->p_out[n]             (this->p_dspin_ram_cmd_out[n]);
    681         ram_router_cmd->p_in[n]              (this->p_dspin_ram_cmd_in[n]);
    682         ram_router_rsp->p_out[n]             (this->p_dspin_ram_rsp_out[n]);
    683         ram_router_rsp->p_in[n]              (this->p_dspin_ram_rsp_in[n]);
    684     }
    685     ram_router_cmd->p_out[4]                 (signal_ram_dspin_cmd_xram_t);
    686     ram_router_cmd->p_in[4]                  (signal_ram_dspin_cmd_memc_i);
    687     ram_router_rsp->p_out[4]                 (signal_ram_dspin_rsp_memc_i);
    688     ram_router_rsp->p_in[4]                  (signal_ram_dspin_rsp_xram_t);
    689    
    690     ///////////////////////// IOB exists only in cluster_iob0 & cluster_iob1.
    691     if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
    692     {
    693         // IO bridge
    694         iob->p_clk                               (this->p_clk);
    695         iob->p_resetn                            (this->p_resetn);
    696         iob->p_vci_ini_iox                       (*(this->p_vci_iob_iox_ini));
    697         iob->p_vci_tgt_iox                       (*(this->p_vci_iob_iox_tgt));
    698         iob->p_vci_tgt_int                       (signal_int_vci_tgt_iobx);
    699         iob->p_vci_ini_int                       (signal_int_vci_ini_iobx);
    700         iob->p_vci_ini_ram                       (signal_ram_vci_ini_iobx);
    701 
    702         if ( cluster_id == cluster_iob0 )
    703                for ( size_t n=0 ; n<32 ; n++ )
    704                    (*iob->p_irq[n])                 (*(this->p_irq[n]));
    705 
    706         // initiator wrapper to RAM network
    707         iob_ram_wi->p_clk                        (this->p_clk);
    708         iob_ram_wi->p_resetn                     (this->p_resetn);
    709         iob_ram_wi->p_dspin_cmd                  (*(this->p_dspin_iob_cmd_out));
    710         iob_ram_wi->p_dspin_rsp                  (*(this->p_dspin_iob_rsp_in));
    711         iob_ram_wi->p_vci                        (signal_ram_vci_ini_iobx);
    712 
    713         // initiator wrapper to INT network
    714         iob_int_wi->p_clk                        (this->p_clk);
    715         iob_int_wi->p_resetn                     (this->p_resetn);
    716         iob_int_wi->p_dspin_cmd                  (signal_int_dspin_cmd_iobx_i);
    717         iob_int_wi->p_dspin_rsp                  (signal_int_dspin_rsp_iobx_i);
    718         iob_int_wi->p_vci                        (signal_int_vci_ini_iobx);
    719 
    720         // target wrapper to INT network
    721         iob_int_wt->p_clk                        (this->p_clk);
    722         iob_int_wt->p_resetn                     (this->p_resetn);
    723         iob_int_wt->p_dspin_cmd                  (signal_int_dspin_cmd_iobx_t);
    724         iob_int_wt->p_dspin_rsp                  (signal_int_dspin_rsp_iobx_t);
    725         iob_int_wt->p_vci                        (signal_int_vci_tgt_iobx);
    726     }
    727 
     37   assert((params.x_id < params.x_size) and (params.y_id < params.y_size));
     38
     39   this->m_procs = params.nb_procs;
     40   size_t cluster_id = (params.x_id << 4) + params.y_id;
     41
     42   size_t cluster_iob0 = 0;
     43   size_t cluster_iob1 = ((params.x_size - 1) << 4) + params.y_size - 1;
     44
     45   // Vectors of DSPIN ports for inter-cluster communications
     46   p_dspin_int_cmd_in =
     47      alloc_elems<DspinInput<dspin_int_cmd_width> >("p_int_cmd_in", 4, 3);
     48   p_dspin_int_cmd_out =
     49      alloc_elems<DspinOutput<dspin_int_cmd_width> >("p_int_cmd_out", 4, 3);
     50   p_dspin_int_rsp_in =
     51      alloc_elems<DspinInput<dspin_int_rsp_width> >("p_int_rsp_in", 4, 2);
     52   p_dspin_int_rsp_out =
     53      alloc_elems<DspinOutput<dspin_int_rsp_width> >("p_int_rsp_out", 4, 2);
     54
     55   p_dspin_ram_cmd_in =
     56      alloc_elems<DspinInput<dspin_ram_cmd_width> >("p_ext_cmd_in", 4);
     57   p_dspin_ram_cmd_out =
     58      alloc_elems<DspinOutput<dspin_ram_cmd_width> >("p_ext_cmd_out", 4);
     59   p_dspin_ram_rsp_in =
     60      alloc_elems<DspinInput<dspin_ram_rsp_width> >("p_ext_rsp_in", 4);
     61   p_dspin_ram_rsp_out =
     62      alloc_elems<DspinOutput<dspin_ram_rsp_width> >("p_ext_rsp_out", 4);
     63
     64   // ports in cluster_iob0 and cluster_iob1 only
     65   if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
     66   {
     67      // VCI ports from IOB to IOX network
     68      p_vci_iob_iox_ini = new soclib::caba::VciInitiator<vci_param_ext>;
     69      p_vci_iob_iox_tgt = new soclib::caba::VciTarget<vci_param_ext>;
     70
     71      // DSPIN ports from IOB to RAM network
     72      p_dspin_iob_cmd_out =
     73         new soclib::caba::DspinOutput<dspin_ram_cmd_width>;
     74      p_dspin_iob_rsp_in  =
     75         new soclib::caba::DspinInput<dspin_ram_rsp_width>;
     76   }
     77   else
     78   {
     79      p_vci_iob_iox_ini   = NULL;
     80      p_vci_iob_iox_tgt   = NULL;
     81      p_dspin_iob_cmd_out = NULL;
     82      p_dspin_iob_rsp_in  = NULL;
     83   }
     84
     85   // IRQ ports in cluster_iob0 only
     86   for ( size_t n = 0 ; n < 32 ; n++ )
     87   {
     88      if ( cluster_id == cluster_iob0 )
     89      {
     90         p_irq[n] = new sc_in<bool>;
     91      }
     92      else
     93      {
     94         p_irq[n] = NULL;
     95      }
     96   }
     97
     98   ///////////////////////////////////////////////////////////////////////////
     99   //    Hardware components
     100   ///////////////////////////////////////////////////////////////////////////
     101
     102   ////////////  PROCS
     103   for (size_t p = 0; p < params.nb_procs; p++)
     104   {
     105      std::ostringstream s_proc;
     106      s_proc << "proc_" << params.x_id << "_" << params.y_id << "_" << p;
     107      proc[p] = new VciCcVCacheWrapperType (
     108            s_proc.str().c_str(),
     109            cluster_id * params.nb_procs + p,
     110            params.mt_int,
     111            IntTab(cluster_id,p),
     112            (cluster_id << params.l_width) + p,
     113            8, 8,
     114            8, 8,
     115            params.l1_i_ways, params.l1_i_sets, 16,
     116            params.l1_d_ways, params.l1_d_sets, 16,
     117            4, 4,
     118            params.x_width, params.y_width,
     119            params.frozen_cycles,
     120            params.debug_start_cycle, params.proc_debug_ok);
     121
     122      std::ostringstream s_wi_proc;
     123      s_wi_proc << "proc_wi_" << params.x_id << "_" << params.y_id << "_"
     124         << p;
     125      proc_wi[p] = new VciIntDspinInitiatorWrapperType(
     126            s_wi_proc.str().c_str(),
     127            params.x_width + params.y_width + params.l_width);
     128   }
     129
     130   ///////////  MEMC   
     131   std::ostringstream s_memc;
     132   s_memc << "memc_" << params.x_id << "_" << params.y_id;
     133   memc = new VciMemCacheType (
     134         s_memc.str().c_str(),
     135         params.mt_int,
     136         params.mt_ext,
     137         IntTab(cluster_id, params.ext_memc_srcid),
     138         IntTab(cluster_id, params.int_memc_tgtid),
     139         params.x_width,
     140         params.y_width,
     141         params.memc_ways, params.memc_sets, 16,
     142         3,
     143         4096,
     144         8,
     145         8,
     146         8,
     147         params.debug_start_cycle,
     148         params.memc_debug_ok);
     149
     150   std::ostringstream s_wt_memc;
     151   s_wt_memc << "memc_wt_" << params.x_id << "_" << params.y_id;
     152   memc_int_wt = new VciIntDspinTargetWrapperType (
     153         s_wt_memc.str().c_str(),
     154         params.x_width + params.y_width + params.l_width);
     155
     156   std::ostringstream s_wi_memc;
     157   s_wi_memc << "memc_wi_" << params.x_id << "_" << params.y_id;
     158   memc_ram_wi = new VciExtDspinInitiatorWrapperType (
     159         s_wi_memc.str().c_str(),
     160         params.x_width + params.y_width + params.l_width);
     161
     162   ///////////   XICU
     163   std::ostringstream s_xicu;
     164   s_xicu << "xicu_" << params.x_id << "_" << params.y_id;
     165   xicu = new VciXicu<vci_param_int>(
     166         s_xicu.str().c_str(),
     167         params.mt_int,
     168         IntTab(cluster_id,params.int_xicu_tgtid),
     169         32, 32, 32,
     170         params.nb_procs);
     171
     172   std::ostringstream s_wt_xicu;
     173   s_wt_xicu << "xicu_wt_" << params.x_id << "_" << params.y_id;
     174   xicu_int_wt = new VciIntDspinTargetWrapperType (
     175         s_wt_xicu.str().c_str(),
     176         params.x_width + params.y_width + params.l_width);
     177
     178   ////////////  MDMA
     179   std::ostringstream s_mdma;
     180   s_mdma << "mdma_" << params.x_id << "_" << params.y_id;
     181   mdma = new VciMultiDma<vci_param_int>(
     182         s_mdma.str().c_str(),
     183         params.mt_int,
     184         IntTab(cluster_id, params.nb_procs),
     185         IntTab(cluster_id, params.int_mdma_tgtid),
     186         64,
     187         params.nb_dmas);
     188
     189   std::ostringstream s_wt_mdma;
     190   s_wt_mdma << "mdma_wt_" << params.x_id << "_" << params.y_id;
     191   mdma_int_wt = new VciIntDspinTargetWrapperType(
     192         s_wt_mdma.str().c_str(),
     193         params.x_width + params.y_width + params.l_width);
     194
     195   std::ostringstream s_wi_mdma;
     196   s_wi_mdma << "mdma_wi_" << params.x_id << "_" << params.y_id;
     197   mdma_int_wi = new VciIntDspinInitiatorWrapperType(
     198         s_wi_mdma.str().c_str(),
     199         params.x_width + params.y_width + params.l_width);
     200
     201   ///////////  Direct LOCAL_XBAR(S)
     202   size_t nb_direct_initiators = params.nb_procs + 1;
     203   size_t nb_direct_targets    = 3;
     204   if ((cluster_id == cluster_iob0) or (cluster_id == cluster_iob1))
     205   {
     206      nb_direct_initiators = params.nb_procs + 2;
     207      nb_direct_targets    = 4;
     208   }
     209
     210   std::ostringstream s_int_xbar_cmd_d;
     211   s_int_xbar_cmd_d << "int_xbar_cmd_d_" << params.x_id << "_" << params.y_id;
     212   int_xbar_cmd_d = new DspinLocalCrossbar<dspin_int_cmd_width>(
     213         s_int_xbar_cmd_d.str().c_str(),
     214         params.mt_int,
     215         params.x_id, params.y_id,
     216         params.x_width, params.y_width, params.l_width,
     217         nb_direct_initiators,
     218         nb_direct_targets,
     219         2, 2,
     220         true,
     221         true,
     222         false);
     223
     224   std::ostringstream s_int_xbar_rsp_d;
     225   s_int_xbar_rsp_d << "int_xbar_rsp_d_" << params.x_id << "_" << params.y_id;
     226   int_xbar_rsp_d = new DspinLocalCrossbar<dspin_int_rsp_width>(
     227         s_int_xbar_rsp_d.str().c_str(),
     228         params.mt_int,
     229         params.x_id, params.y_id,
     230         params.x_width, params.y_width, params.l_width,
     231         nb_direct_targets,
     232         nb_direct_initiators,
     233         2, 2,
     234         false,
     235         false,
     236         false);
     237
     238   ////////////  Coherence LOCAL_XBAR(S)
     239   std::ostringstream s_int_xbar_m2p_c;
     240   s_int_xbar_m2p_c << "int_xbar_m2p_c_" << params.x_id << "_" << params.y_id;
     241   int_xbar_m2p_c = new DspinLocalCrossbar<dspin_int_cmd_width>(
     242         s_int_xbar_m2p_c.str().c_str(),
     243         params.mt_int,
     244         params.x_id, params.y_id,
     245         params.x_width, params.y_width, params.l_width,
     246         1,
     247         params.nb_procs,
     248         2, 2,
     249         true,
     250         false,
     251         true);
     252
     253   std::ostringstream s_int_xbar_p2m_c;
     254   s_int_xbar_p2m_c << "int_xbar_p2m_c_" << params.x_id << "_" << params.y_id;
     255   int_xbar_p2m_c = new DspinLocalCrossbar<dspin_int_rsp_width>(
     256         s_int_xbar_p2m_c.str().c_str(),
     257         params.mt_int,
     258         params.x_id, params.y_id,
     259         params.x_width, params.y_width, 0,
     260         params.nb_procs,
     261         1,
     262         2, 2,
     263         false,
     264         false,
     265         false);
     266
     267   std::ostringstream s_int_xbar_clack_c;
     268   s_int_xbar_clack_c << "int_xbar_clack_c_" << params.x_id << "_"
     269      << params.y_id;
     270   int_xbar_clack_c = new DspinLocalCrossbar<dspin_int_cmd_width>(
     271         s_int_xbar_clack_c.str().c_str(),
     272         params.mt_int,
     273         params.x_id, params.y_id,
     274         params.x_width, params.y_width, params.l_width,
     275         1,
     276         params.nb_procs,
     277         1, 1,
     278         true,
     279         false,
     280         false);
     281
     282   //////////////  INT ROUTER(S)
     283   std::ostringstream s_int_router_cmd;
     284   s_int_router_cmd << "router_cmd_" << params.x_id << "_" << params.y_id;
     285   int_router_cmd = new VirtualDspinRouter<dspin_int_cmd_width>(
     286         s_int_router_cmd.str().c_str(),
     287         params.x_id,params.y_id,
     288         params.x_width, params.y_width,
     289         3,
     290         4,4);
     291
     292   std::ostringstream s_int_router_rsp;
     293   s_int_router_rsp << "router_rsp_" << params.x_id << "_" << params.y_id;
     294   int_router_rsp = new VirtualDspinRouter<dspin_int_rsp_width>(
     295         s_int_router_rsp.str().c_str(),
     296         params.x_id,params.y_id,
     297         params.x_width, params.y_width,
     298         2,
     299         4,4);
     300
     301   //////////////  XRAM
     302   std::ostringstream s_xram;
     303   s_xram << "xram_" << params.x_id << "_" << params.y_id;
     304   xram = new VciSimpleRam<vci_param_ext>(
     305         s_xram.str().c_str(),
     306         IntTab(cluster_id, params.ext_xram_tgtid),
     307         params.mt_ext,
     308         params.loader,
     309         params.xram_latency);
     310
     311   std::ostringstream s_wt_xram;
     312   s_wt_xram << "xram_wt_" << params.x_id << "_" << params.y_id;
     313   xram_ram_wt = new VciExtDspinTargetWrapperType(
     314         s_wt_xram.str().c_str(),
     315         params.x_width + params.y_width + params.l_width);
     316
     317   /////////////  RAM ROUTER(S)
     318   std::ostringstream s_ram_router_cmd;
     319   s_ram_router_cmd << "ram_router_cmd_" << params.x_id << "_" << params.y_id;
     320   size_t is_iob0 = (params.x_id == 0) and (params.y_id == 0);
     321   size_t is_iob1 = (params.x_id == (params.x_size-1)) and
     322      (params.y_id == (params.y_size-1));
     323   ram_router_cmd = new DspinRouterTsar<dspin_ram_cmd_width>(
     324         s_ram_router_cmd.str().c_str(),
     325         params.x_id, params.y_id,
     326         params.x_width,
     327         params.y_width,
     328         4, 4,
     329         is_iob0,
     330         is_iob1,
     331         false,
     332         params.l_width);
     333
     334   std::ostringstream s_ram_router_rsp;
     335   s_ram_router_rsp << "ram_router_rsp_" << params.x_id << "_" << params.y_id;
     336   ram_router_rsp = new DspinRouterTsar<dspin_ram_rsp_width>(
     337         s_ram_router_rsp.str().c_str(),
     338         params.x_id, params.y_id,
     339         params.x_width,
     340         params.y_width,
     341         4, 4,
     342         is_iob0,
     343         is_iob1,
     344         true,
     345         params.l_width);
     346
     347   ////////////////////// I/O  CLUSTER ONLY ///////////////////////
     348   if ((cluster_id == cluster_iob0) or (cluster_id == cluster_iob1))
     349   {
     350      ///////////  IO_BRIDGE
     351      size_t iox_local_id;
     352      size_t global_id;
     353      bool   has_irqs;
     354      if (cluster_id == cluster_iob0 )
     355      {
     356         iox_local_id = 0;
     357         global_id    = cluster_iob0;
     358         has_irqs     = true;
     359      }
     360      else
     361      {
     362         iox_local_id = 1;
     363         global_id    = cluster_iob1;
     364         has_irqs     = false;
     365      }
     366
     367      std::ostringstream s_iob;
     368      s_iob << "iob_" << params.x_id << "_" << params.y_id;   
     369      iob = new VciIoBridge<vci_param_int, vci_param_ext>( 
     370            s_iob.str().c_str(),
     371            params.mt_ext,
     372            params.mt_int,
     373            params.mt_iox,
     374            IntTab( global_id, params.int_iobx_tgtid),
     375            IntTab( global_id, params.int_iobx_srcid),
     376            IntTab( global_id, iox_local_id ),
     377            has_irqs,
     378            16,
     379            8,
     380            8,
     381            params.debug_start_cycle,
     382            params.iob_debug_ok );
     383
     384      std::ostringstream s_iob_int_wi;
     385      s_iob_int_wi << "iob_int_wi_" << params.x_id << "_" << params.y_id;   
     386      iob_int_wi = new VciIntDspinInitiatorWrapperType(
     387            s_iob_int_wi.str().c_str(),
     388            params.x_width + params.y_width + params.l_width);
     389
     390      std::ostringstream s_iob_int_wt;
     391      s_iob_int_wt << "iob_int_wt_" << params.x_id << "_" << params.y_id;   
     392      iob_int_wt = new VciIntDspinTargetWrapperType(
     393            s_iob_int_wt.str().c_str(),
     394            params.x_width + params.y_width + params.l_width);
     395
     396      std::ostringstream s_iob_ram_wi;
     397      s_iob_ram_wi << "iob_ram_wi_" << params.x_id << "_" << params.y_id;   
     398      iob_ram_wi = new VciExtDspinInitiatorWrapperType(
     399            s_iob_ram_wi.str().c_str(),
     400            params.x_width + params.y_width + params.l_width);
     401   }
     402   else
     403   {
     404      iob        = NULL;
     405      iob_int_wi = NULL;
     406      iob_int_wt = NULL;
     407      iob_ram_wi = NULL;
     408   }
     409
     410   ////////////////////////////////////
     411   // Connections are defined here
     412   ////////////////////////////////////
     413
     414   // on coherence network : local srcid[proc] in [0...nb_procs-1]
     415   //                      : local srcid[memc] = nb_procs
     416   // In cluster_iob0, 32 HWI interrupts from external peripherals
     417   // are connected to the XICU ports p_hwi[0:31]
     418   // In other clusters, no HWI interrupts are connected to XICU
     419
     420   //////////////////////// internal CMD & RSP routers
     421   int_router_cmd->p_clk    (this->p_clk);
     422   int_router_cmd->p_resetn (this->p_resetn);
     423   int_router_rsp->p_clk    (this->p_clk);
     424   int_router_rsp->p_resetn (this->p_resetn);
     425
     426   for (int i = 0; i < 4; i++)
     427   {
     428      for(int k = 0; k < 3; k++)
     429      {
     430         int_router_cmd->p_out[i][k] (this->p_dspin_int_cmd_out[i][k]);
     431         int_router_cmd->p_in[i][k]  (this->p_dspin_int_cmd_in[i][k]);
     432      }
     433
     434      for(int k = 0; k < 2; k++)
     435      {
     436         int_router_rsp->p_out[i][k] (this->p_dspin_int_rsp_out[i][k]);
     437         int_router_rsp->p_in[i][k]  (this->p_dspin_int_rsp_in[i][k]);
     438      }
     439   }
     440
     441   // local ports
     442   int_router_cmd->p_out[4][0] (signal_int_dspin_cmd_g2l_d);
     443   int_router_cmd->p_out[4][1] (signal_int_dspin_m2p_g2l_c);
     444   int_router_cmd->p_out[4][2] (signal_int_dspin_clack_g2l_c);
     445   int_router_cmd->p_in[4][0]  (signal_int_dspin_cmd_l2g_d);
     446   int_router_cmd->p_in[4][1]  (signal_int_dspin_m2p_l2g_c);
     447   int_router_cmd->p_in[4][2]  (signal_int_dspin_clack_l2g_c);
     448
     449   int_router_rsp->p_out[4][0] (signal_int_dspin_rsp_g2l_d);
     450   int_router_rsp->p_out[4][1] (signal_int_dspin_p2m_g2l_c);
     451   int_router_rsp->p_in[4][0]  (signal_int_dspin_rsp_l2g_d);
     452   int_router_rsp->p_in[4][1]  (signal_int_dspin_p2m_l2g_c);
     453
     454   ///////////////////// CMD DSPIN  local crossbar direct
     455   int_xbar_cmd_d->p_clk        (this->p_clk);
     456   int_xbar_cmd_d->p_resetn     (this->p_resetn);
     457   int_xbar_cmd_d->p_global_out (signal_int_dspin_cmd_l2g_d);
     458   int_xbar_cmd_d->p_global_in  (signal_int_dspin_cmd_g2l_d);
     459
     460   int_xbar_cmd_d->p_local_out[params.int_memc_tgtid](
     461         signal_int_dspin_cmd_memc_t);
     462   int_xbar_cmd_d->p_local_out[params.int_xicu_tgtid](
     463         signal_int_dspin_cmd_xicu_t);
     464   int_xbar_cmd_d->p_local_out[params.int_mdma_tgtid](
     465         signal_int_dspin_cmd_mdma_t);
     466   int_xbar_cmd_d->p_local_in[params.int_mdma_srcid](
     467         signal_int_dspin_cmd_mdma_i);
     468
     469   for (size_t p = 0; p < params.nb_procs; p++) {
     470      int_xbar_cmd_d->p_local_in[params.int_proc_srcid + p](
     471            signal_int_dspin_cmd_proc_i[p]);
     472   }
     473
     474   if ((cluster_id == cluster_iob0) or (cluster_id == cluster_iob1))
     475   {
     476      int_xbar_cmd_d->p_local_out[params.int_iobx_tgtid](
     477            signal_int_dspin_cmd_iobx_t);
     478      int_xbar_cmd_d->p_local_in[params.int_iobx_srcid](
     479            signal_int_dspin_cmd_iobx_i);
     480   }
     481
     482   //////////////////////// RSP DSPIN  local crossbar direct
     483   int_xbar_rsp_d->p_clk        (this->p_clk);
     484   int_xbar_rsp_d->p_resetn     (this->p_resetn);
     485   int_xbar_rsp_d->p_global_out (signal_int_dspin_rsp_l2g_d);
     486   int_xbar_rsp_d->p_global_in  (signal_int_dspin_rsp_g2l_d);
     487
     488   int_xbar_rsp_d->p_local_in[params.int_memc_tgtid](
     489         signal_int_dspin_rsp_memc_t);
     490   int_xbar_rsp_d->p_local_in[params.int_xicu_tgtid](
     491         signal_int_dspin_rsp_xicu_t);
     492   int_xbar_rsp_d->p_local_in[params.int_mdma_tgtid](
     493         signal_int_dspin_rsp_mdma_t);
     494
     495   int_xbar_rsp_d->p_local_out[params.int_mdma_srcid](
     496         signal_int_dspin_rsp_mdma_i);
     497   for (size_t p = 0; p < params.nb_procs; p++)
     498      int_xbar_rsp_d->p_local_out[params.int_proc_srcid + p](
     499            signal_int_dspin_rsp_proc_i[p]);
     500
     501   if ((cluster_id == cluster_iob0) or (cluster_id == cluster_iob1))
     502   {
     503      int_xbar_rsp_d->p_local_in[params.int_iobx_tgtid](
     504            signal_int_dspin_rsp_iobx_t);
     505      int_xbar_rsp_d->p_local_out[params.int_iobx_srcid](
     506            signal_int_dspin_rsp_iobx_i);
     507   }
     508
     509   ////////////////////// M2P DSPIN local crossbar coherence
     510   int_xbar_m2p_c->p_clk              (this->p_clk);
     511   int_xbar_m2p_c->p_resetn           (this->p_resetn);
     512   int_xbar_m2p_c->p_global_out       (signal_int_dspin_m2p_l2g_c);
     513   int_xbar_m2p_c->p_global_in        (signal_int_dspin_m2p_g2l_c);
     514   int_xbar_m2p_c->p_local_in[0]      (signal_int_dspin_m2p_memc);
     515   for (size_t p = 0; p < params.nb_procs; p++)
     516   {
     517      int_xbar_m2p_c->p_local_out[p] (signal_int_dspin_m2p_proc[p]);
     518   }
     519
     520   ////////////////////////// P2M DSPIN local crossbar coherence
     521   int_xbar_p2m_c->p_clk             (this->p_clk);
     522   int_xbar_p2m_c->p_resetn          (this->p_resetn);
     523   int_xbar_p2m_c->p_global_out      (signal_int_dspin_p2m_l2g_c);
     524   int_xbar_p2m_c->p_global_in       (signal_int_dspin_p2m_g2l_c);
     525   int_xbar_p2m_c->p_local_out[0]    (signal_int_dspin_p2m_memc);
     526   for (size_t p = 0; p < params.nb_procs; p++)
     527   {
     528      int_xbar_p2m_c->p_local_in[p]   (signal_int_dspin_p2m_proc[p]);
     529   }
     530                                     
     531   ////////////////////// CLACK DSPIN  local crossbar coherence
     532   int_xbar_clack_c->p_clk             (this->p_clk);
     533   int_xbar_clack_c->p_resetn          (this->p_resetn);
     534   int_xbar_clack_c->p_global_out      (signal_int_dspin_clack_l2g_c);
     535   int_xbar_clack_c->p_global_in       (signal_int_dspin_clack_g2l_c);
     536   int_xbar_clack_c->p_local_in[0]     (signal_int_dspin_clack_memc);
     537   for (size_t p = 0; p < params.nb_procs; p++)
     538   {
     539      int_xbar_clack_c->p_local_out[p] (signal_int_dspin_clack_proc[p]);
     540   }
     541
     542   //////////////////////////////////// Processors
     543   for (size_t p = 0; p < params.nb_procs; p++)
     544   {
     545      proc[p]->p_clk          (this->p_clk);
     546      proc[p]->p_resetn       (this->p_resetn);
     547      proc[p]->p_vci          (signal_int_vci_ini_proc[p]);
     548      proc[p]->p_dspin_m2p    (signal_int_dspin_m2p_proc[p]);
     549      proc[p]->p_dspin_p2m    (signal_int_dspin_p2m_proc[p]);
     550      proc[p]->p_dspin_clack  (signal_int_dspin_clack_proc[p]);
     551      proc[p]->p_irq[0]       (signal_proc_it[p]);
     552      for ( size_t j = 1 ; j < 6 ; j++)
     553      {
     554         proc[p]->p_irq[j]    (signal_false);
     555      }
     556
     557      proc_wi[p]->p_clk       (this->p_clk);
     558      proc_wi[p]->p_resetn    (this->p_resetn);
     559      proc_wi[p]->p_dspin_cmd (signal_int_dspin_cmd_proc_i[p]);
     560      proc_wi[p]->p_dspin_rsp (signal_int_dspin_rsp_proc_i[p]);
     561      proc_wi[p]->p_vci       (signal_int_vci_ini_proc[p]);
     562   }
     563
     564   ///////////////////////////////////// XICU
     565   xicu->p_clk    (this->p_clk);
     566   xicu->p_resetn (this->p_resetn);
     567   xicu->p_vci    (signal_int_vci_tgt_xicu);
     568   for ( size_t p = 0 ; p < params.nb_procs ; p++)
     569   {
     570      xicu->p_irq[p] (signal_proc_it[p]);
     571   }
     572   for ( size_t i=0 ; i<32 ; i++)
     573   {
     574      if (cluster_id == cluster_iob0)
     575         xicu->p_hwi[i] (*(this->p_irq[i]));
     576      else 
     577         xicu->p_hwi[i] (signal_false);
     578   }                     
     579
     580   // wrapper XICU
     581   xicu_int_wt->p_clk       (this->p_clk);
     582   xicu_int_wt->p_resetn    (this->p_resetn);
     583   xicu_int_wt->p_dspin_cmd (signal_int_dspin_cmd_xicu_t);
     584   xicu_int_wt->p_dspin_rsp (signal_int_dspin_rsp_xicu_t);
     585   xicu_int_wt->p_vci       (signal_int_vci_tgt_xicu);
     586
     587   ///////////////////////////////////// MEMC
     588   memc->p_clk              (this->p_clk);
     589   memc->p_resetn           (this->p_resetn);
     590   memc->p_vci_ixr          (signal_ram_vci_ini_memc);
     591   memc->p_vci_tgt          (signal_int_vci_tgt_memc);
     592   memc->p_dspin_p2m        (signal_int_dspin_p2m_memc);
     593   memc->p_dspin_m2p        (signal_int_dspin_m2p_memc);
     594   memc->p_dspin_clack      (signal_int_dspin_clack_memc);
     595   memc->p_irq              (signal_irq_memc);
     596
     597   // wrapper to INT network
     598   memc_int_wt->p_clk       (this->p_clk);
     599   memc_int_wt->p_resetn    (this->p_resetn);
     600   memc_int_wt->p_dspin_cmd (signal_int_dspin_cmd_memc_t);
     601   memc_int_wt->p_dspin_rsp (signal_int_dspin_rsp_memc_t);
     602   memc_int_wt->p_vci       (signal_int_vci_tgt_memc);
     603
     604   // wrapper to RAM network
     605   memc_ram_wi->p_clk       (this->p_clk);
     606   memc_ram_wi->p_resetn    (this->p_resetn);
     607   memc_ram_wi->p_dspin_cmd (signal_ram_dspin_cmd_memc_i);
     608   memc_ram_wi->p_dspin_rsp (signal_ram_dspin_rsp_memc_i);
     609   memc_ram_wi->p_vci       (signal_ram_vci_ini_memc);
     610
     611   //////////////////////////////////// XRAM
     612   xram->p_clk              (this->p_clk);
     613   xram->p_resetn           (this->p_resetn);
     614   xram->p_vci              (signal_ram_vci_tgt_xram);
     615
     616   // wrapper to RAM network
     617   xram_ram_wt->p_clk       (this->p_clk);
     618   xram_ram_wt->p_resetn    (this->p_resetn);
     619   xram_ram_wt->p_dspin_cmd (signal_ram_dspin_cmd_xram_t);
     620   xram_ram_wt->p_dspin_rsp (signal_ram_dspin_rsp_xram_t);
     621   xram_ram_wt->p_vci       (signal_ram_vci_tgt_xram);
     622
     623   /////////////////////////////////// MDMA
     624   mdma->p_clk              (this->p_clk);
     625   mdma->p_resetn           (this->p_resetn);
     626   mdma->p_vci_target       (signal_int_vci_tgt_mdma);
     627   mdma->p_vci_initiator    (signal_int_vci_ini_mdma);
     628   for (size_t i = 0 ; i < params.nb_dmas ; i++)
     629      mdma->p_irq[i]        (signal_irq_mdma[i]);
     630
     631   // target wrapper
     632   mdma_int_wt->p_clk       (this->p_clk);
     633   mdma_int_wt->p_resetn    (this->p_resetn);
     634   mdma_int_wt->p_dspin_cmd (signal_int_dspin_cmd_mdma_t);
     635   mdma_int_wt->p_dspin_rsp (signal_int_dspin_rsp_mdma_t);
     636   mdma_int_wt->p_vci       (signal_int_vci_tgt_mdma);
     637
     638   // initiator wrapper
     639   mdma_int_wi->p_clk       (this->p_clk);
     640   mdma_int_wi->p_resetn    (this->p_resetn);
     641   mdma_int_wi->p_dspin_cmd (signal_int_dspin_cmd_mdma_i);
     642   mdma_int_wi->p_dspin_rsp (signal_int_dspin_rsp_mdma_i);
     643   mdma_int_wi->p_vci       (signal_int_vci_ini_mdma);
     644
     645   //////////////////////////// RAM network CMD & RSP routers
     646   ram_router_cmd->p_clk       (this->p_clk);
     647   ram_router_cmd->p_resetn    (this->p_resetn);
     648   ram_router_rsp->p_clk       (this->p_clk);
     649   ram_router_rsp->p_resetn    (this->p_resetn);
     650   for( size_t n=0 ; n<4 ; n++)
     651   {
     652      ram_router_cmd->p_out[n] (this->p_dspin_ram_cmd_out[n]);
     653      ram_router_cmd->p_in[n]  (this->p_dspin_ram_cmd_in[n]);
     654      ram_router_rsp->p_out[n] (this->p_dspin_ram_rsp_out[n]);
     655      ram_router_rsp->p_in[n]  (this->p_dspin_ram_rsp_in[n]);
     656   }
     657   ram_router_cmd->p_out[4]    (signal_ram_dspin_cmd_xram_t);
     658   ram_router_cmd->p_in[4]     (signal_ram_dspin_cmd_memc_i);
     659   ram_router_rsp->p_out[4]    (signal_ram_dspin_rsp_memc_i);
     660   ram_router_rsp->p_in[4]     (signal_ram_dspin_rsp_xram_t);
     661
     662   ///////////////////////// IOB exists only in cluster_iob0 & cluster_iob1.
     663   if ( (cluster_id == cluster_iob0) or (cluster_id == cluster_iob1) )
     664   {
     665      // IO bridge
     666      iob->p_clk         (this->p_clk);
     667      iob->p_resetn      (this->p_resetn);
     668      iob->p_vci_ini_iox (*(this->p_vci_iob_iox_ini));
     669      iob->p_vci_tgt_iox (*(this->p_vci_iob_iox_tgt));
     670      iob->p_vci_tgt_int (signal_int_vci_tgt_iobx);
     671      iob->p_vci_ini_int (signal_int_vci_ini_iobx);
     672      iob->p_vci_ini_ram (signal_ram_vci_ini_iobx);
     673
     674      if ( cluster_id == cluster_iob0 )
     675         for ( size_t n = 0 ; n < 32 ; n++ )
     676            (*iob->p_irq[n]) (*(this->p_irq[n]));
     677
     678      // initiator wrapper to RAM network
     679      iob_ram_wi->p_clk       (this->p_clk);
     680      iob_ram_wi->p_resetn    (this->p_resetn);
     681      iob_ram_wi->p_dspin_cmd (*(this->p_dspin_iob_cmd_out));
     682      iob_ram_wi->p_dspin_rsp (*(this->p_dspin_iob_rsp_in));
     683      iob_ram_wi->p_vci       (signal_ram_vci_ini_iobx);
     684
     685      // initiator wrapper to INT network
     686      iob_int_wi->p_clk       (this->p_clk);
     687      iob_int_wi->p_resetn    (this->p_resetn);
     688      iob_int_wi->p_dspin_cmd (signal_int_dspin_cmd_iobx_i);
     689      iob_int_wi->p_dspin_rsp (signal_int_dspin_rsp_iobx_i);
     690      iob_int_wi->p_vci       (signal_int_vci_ini_iobx);
     691
     692      // target wrapper to INT network
     693      iob_int_wt->p_clk       (this->p_clk);
     694      iob_int_wt->p_resetn    (this->p_resetn);
     695      iob_int_wt->p_dspin_cmd (signal_int_dspin_cmd_iobx_t);
     696      iob_int_wt->p_dspin_rsp (signal_int_dspin_rsp_iobx_t);
     697      iob_int_wt->p_vci       (signal_int_vci_tgt_iobx);
     698   }
    728699} // end constructor
     700
     701tmpl(/**/)::~TsarIobCluster()
     702{
     703   if (p_vci_iob_iox_ini)   delete p_vci_iob_iox_ini;
     704   if (p_vci_iob_iox_tgt)   delete p_vci_iob_iox_tgt;
     705   if (p_dspin_iob_cmd_out) delete p_dspin_iob_cmd_out;
     706   if (p_dspin_iob_rsp_in)  delete p_dspin_iob_rsp_in;
     707   if (iob)                 delete iob;
     708   if (iob_int_wi)          delete iob_int_wi;
     709   if (iob_int_wt)          delete iob_int_wt;
     710   if (iob_ram_wi)          delete iob_ram_wi;
     711
     712   for (size_t n = 0 ; n < 32 ; n++)
     713   {
     714      if (p_irq[n]) delete p_irq[n];
     715   }
     716
     717   for (size_t p = 0; p < m_procs; p++)
     718   {
     719      delete proc[p];
     720      delete proc_wi[p];
     721   }
     722
     723   delete memc;
     724   delete memc_int_wt;
     725   delete memc_ram_wi;
     726   delete xicu;
     727   delete xicu_int_wt;
     728   delete mdma;
     729   delete mdma_int_wt;
     730   delete mdma_int_wi;
     731   delete int_xbar_cmd_d;
     732   delete int_xbar_rsp_d;
     733   delete int_xbar_m2p_c;
     734   delete int_xbar_p2m_c;
     735   delete int_xbar_clack_c;
     736   delete int_router_cmd;
     737   delete int_router_rsp;
     738   delete xram;
     739   delete xram_ram_wt;
     740   delete ram_router_cmd;
     741   delete ram_router_rsp;
     742}
    729743
    730744}}
     
    740754// vim: filetype=cpp:expandtab:shiftwidth=3:tabstop=3:softtabstop=3
    741755
    742 
    743 
Note: See TracChangeset for help on using the changeset viewer.