mesh.cc

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

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