torus.cc

Go to the documentation of this file.
00001 /*
00002  * =====================================================================================
00003  *
00004  *       Filename: torus.cc
00005  *
00006  *    Description:
00007  *
00008  *        Version:  1.0
00009  *        Created:  07/19/2010 11:47:17 AM
00010  *       Revision:  none
00011  *       Compiler:  gcc
00012  *
00013  *         Author:  Sharda Murthi, smurthi3@gatech.edu
00014  *        Company:  Georgia Institute of Technology
00015  *
00016  * =====================================================================================
00017  */
00018 
00019 
00020 #ifndef  _torus_cc_INC
00021 #define  _torus_cc_INC
00022 
00023 #include "torus.h"
00024 
00025 Torus::Torus()
00026 {
00027 
00028 }
00029 
00030 Torus::~Torus()
00031 {
00032     for ( uint i=0 ; i<no_nodes; i++ )
00033     {
00034         delete processors[i];
00035         delete interfaces[i];
00036         delete routers[i];
00037     }
00038 
00039     for ( uint i=0 ; i<links; i++ )
00040     {
00041         delete link_a[i];
00042         delete link_b[i];
00043     }
00044 
00045 }
00046 
00047 void
00048 Torus::init(uint p, uint v, uint c, uint bs, uint n, uint k, uint l)
00049 {
00050     ports = p;
00051     vcs = v;
00052     credits  = c;
00053     buffer_size = bs;
00054     no_nodes = n;
00055     grid_size = k;
00056     links = l;
00057 }
00058 
00059 string
00060 Torus::print_stats()
00061 {
00062     stringstream str;
00063     for ( uint i=0 ; i<no_nodes ; i++ )
00064     {
00065         str << routers[i]->print_stats()<< endl;
00066         str << interfaces[i]->print_stats()<< endl;
00067         str << processors[i]->print_stats()<< endl;
00068     }
00069 
00070    /* for ( uint i=0 ; i<links ; i++ )
00071     {
00072         str << link_a[i]->print_stats()<< endl;
00073         str << link_b[i]->print_stats()<< endl;
00074     } */
00075 
00076     return str.str();
00077 }
00078 
00079 void
00080 Torus::connect_routers()
00081 {
00082          map<uint,uint>::iterator it;
00083 
00084         //  Router input and output connections
00085 
00086    /* ------------- Configure east links for the router ----------- */
00087    uint last_link_id = no_nodes;
00088    for ( uint router_no=0 ; router_no<no_nodes; router_no++ )
00089    {
00090        if( (router_no%grid_size) == 0 ) /* Left side end node */
00091        {
00092            //east going link for router_no
00093            link_a[last_link_id]->input_connection = routers[router_no + grid_size - 1];
00094            link_a[last_link_id]->output_connection = routers[router_no];
00095            link_a[last_link_id]->is_dateline = true;
00096            //west going link for router_no
00097            link_b[last_link_id]->input_connection = routers[router_no];
00098            link_b[last_link_id]->output_connection = routers[router_no + grid_size - 1];
00099            link_b[last_link_id]->is_dateline = true;
00100            east_links.insert(make_pair(router_no, last_link_id));
00101            west_links.insert(make_pair(router_no + grid_size - 1, last_link_id));
00102            last_link_id++;
00103        }
00104        else
00105        {
00106            link_a[last_link_id]->input_connection = routers[router_no-1];
00107            link_a[last_link_id]->output_connection = routers[router_no];
00108            link_b[last_link_id]->input_connection = routers[router_no];
00109            link_b[last_link_id]->output_connection = routers[router_no-1];
00110            east_links.insert(make_pair(router_no, last_link_id));
00111            west_links.insert(make_pair(router_no-1, last_link_id));
00112            last_link_id++;
00113        }
00114    }
00115 
00116    for ( uint i=0 ; i<no_nodes; i++ )
00117    {
00118        map<uint,uint>::iterator link_id = east_links.find(i);
00119        routers[i]->input_connections.push_back(link_a[link_id->second]);
00120        routers[i]->output_connections.push_back(link_b[link_id->second]);
00121    }
00122 #ifdef DEBUG
00123    cout << "\n End East links " << last_link_id << endl;
00124    for ( it=east_links.begin() ; it != east_links.end(); it++ )
00125        cout << (*it).first << " => " << (*it).second << endl;
00126 #endif
00127 
00128    for ( uint i=0 ; i<no_nodes; i++ )
00129    {
00130        map<uint,uint>::iterator link_id = west_links.find(i);
00131        routers[i]->input_connections.push_back(link_b[link_id->second]);
00132        routers[i]->output_connections.push_back(link_a[link_id->second]);
00133    }
00134 #ifdef DEBUG
00135    cout << "\n End West links " << last_link_id << endl;
00136    for ( it=west_links.begin() ; it != west_links.end(); it++ )
00137        cout << (*it).first << " => " << (*it).second << endl;
00138 #endif
00139    /* ------------ End East/West links --------------------- */
00140 
00141    /* ------------ Begin North links --------------------- */
00142 
00143    map < uint, uint > col_major_ordering;
00144    for ( uint i=0; i<grid_size; i++)
00145        for ( uint j=0; j<grid_size; j++)
00146            col_major_ordering.insert(make_pair(i*grid_size+j, j*grid_size+i));
00147 
00148    for ( uint router_no=0 ; router_no<no_nodes; router_no++ )
00149    {
00150        map<uint,uint>::iterator iter = col_major_ordering.find(router_no);
00151        uint col_major_router_no = iter->second;
00152        if( (col_major_router_no%grid_size) == 0 ) /* Top end node */
00153        {
00154            link_a[last_link_id]->input_connection = routers[router_no + no_nodes - grid_size] ;
00155            link_a[last_link_id]->output_connection = routers[router_no];
00156            link_a[last_link_id]->is_dateline = true;
00157            link_b[last_link_id]->input_connection = routers[router_no];
00158            link_b[last_link_id]->output_connection = routers[router_no + no_nodes - grid_size] ;
00159            link_b[last_link_id]->is_dateline = true;
00160            north_links.insert(make_pair(router_no, last_link_id));
00161            south_links.insert(make_pair(router_no + no_nodes - grid_size, last_link_id));
00162            last_link_id++;
00163        }
00164        else
00165        {
00166            link_a[last_link_id]->input_connection = routers[router_no - grid_size];
00167            link_a[last_link_id]->output_connection = routers[router_no];
00168            link_b[last_link_id]->input_connection = routers[router_no];
00169            link_b[last_link_id]->output_connection = routers[router_no - grid_size];
00170            north_links.insert(make_pair(router_no, last_link_id));
00171            south_links.insert(make_pair(router_no - grid_size, last_link_id));
00172            last_link_id++;
00173        }
00174    }
00175 
00176    for ( uint i=0 ; i<no_nodes; i++ )
00177    {
00178        map<uint,uint>::iterator link_id = north_links.find(i);
00179        routers[i]->input_connections.push_back(link_a[link_id->second]);
00180        routers[i]->output_connections.push_back(link_b[link_id->second]);
00181    }
00182 
00183 #ifdef DEBUG
00184    cout << "\n End North links " << last_link_id << endl;
00185    for ( it=north_links.begin() ; it != north_links.end(); it++ )
00186        cout << (*it).first << " => " << (*it).second << endl;
00187 #endif
00188 
00189 
00190 
00191    for ( uint i=0 ; i<no_nodes; i++ )
00192    {
00193        map<uint,uint>::iterator link_id = south_links.find(i);
00194        routers[i]->input_connections.push_back(link_b[link_id->second]);
00195        routers[i]->output_connections.push_back(link_a[link_id->second]);
00196    }
00197 
00198 #ifdef DEBUG
00199    cout << "\n End South links " << last_link_id << endl;
00200    for ( it=south_links.begin() ; it != south_links.end(); it++ )
00201        cout << (*it).first << " => " << (*it).second << endl;
00202 #endif
00203    /* ------------ End North/South links --------------------- */
00204 
00205    if(last_link_id > links )
00206    {
00207        cout << "ERROR : incorrect topology last_link_id: " << last_link_id << " links: " << links <<endl;
00208        exit(1);
00209    }
00210    /* ------------ End South links --------------------- */
00211 
00212    return;
00213 }
00214 
00215 void
00216 Torus::connect_interface_processor()
00217 {
00218     /* Connect the interfaces and the processors. And set the links for the
00219      * interfaces */
00220     for ( uint i=0 ; i<no_nodes; i++ )
00221     {
00222         processors[i]->interface_connections.push_back(interfaces[i]);
00223         interfaces[i]->processor_connection = static_cast<NetworkComponent*>(processors[i]);
00224         interfaces[i]->input_connection = link_b[i];
00225         interfaces[i]->output_connection = link_a[i];
00226     }
00227     return;
00228 }
00229 
00230 void
00231 Torus::connect_interface_routers()
00232 {
00233     // Input and output link connections
00234     for ( uint i=0 ; i<no_nodes ; i++ )
00235     {
00236         link_a[i]->input_connection = interfaces[i];
00237         link_a[i]->output_connection = routers[i];
00238         link_b[i]->input_connection = routers[i];
00239         link_b[i]->output_connection = interfaces[i];
00240         routers[i]->input_connections.push_back(link_a[i]);
00241         routers[i]->output_connections.push_back(link_b[i]);
00242     }
00243     return;
00244 }
00245 
00246 void
00247 Torus::setup()
00248 {
00249     /* Call setup on all components */
00250     for ( uint i=0 ; i<no_nodes ; i++ )
00251     {
00252         processors[i]->setup( no_nodes, vcs, max_sim_time);
00253         interfaces[i]->setup(vcs, credits, buffer_size);
00254         routers[i]->init(ports, vcs, credits, buffer_size);
00255     }
00256 
00257     for ( uint i=0 ; i<links; i++ )
00258     {
00259         link_a[i]->setup();
00260         link_b[i]->setup();
00261     }
00262     return;
00263 }
00264 
00265 #endif
00266 

Generated on Tue Oct 19 17:22:01 2010 for IRIS by  doxygen 1.5.8