mesh.cc
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
00083
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
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
00115
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 )
00120 {
00121
00122 link_a[last_link_id]->input_connection = NULL;
00123 link_a[last_link_id]->output_connection = routers[router_no];
00124
00125
00126
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
00151
00152
00153
00154
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
00175
00176
00177
00178
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 )
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
00216
00217
00218
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
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
00249
00250 return;
00251 }
00252
00253 void
00254 Mesh::setup()
00255 {
00256
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
00272