torus.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
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
00071
00072
00073
00074
00075
00076 return str.str();
00077 }
00078
00079 void
00080 Torus::connect_routers()
00081 {
00082 map<uint,uint>::iterator it;
00083
00084
00085
00086
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 )
00091 {
00092
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
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
00140
00141
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 )
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
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
00211
00212 return;
00213 }
00214
00215 void
00216 Torus::connect_interface_processor()
00217 {
00218
00219
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
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
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