diff options
| author | Myrice <[email protected]> | 2015-04-07 14:43:05 -0700 |
|---|---|---|
| committer | Myrice <[email protected]> | 2015-04-07 14:43:05 -0700 |
| commit | 6b9eb92bd0b03d69a2f2e9c075a8af99d860d4d1 (patch) | |
| tree | c741ac460cb86219446070765be97536143def55 /src/intersim2/.svn/pristine/de | |
| parent | 4dc9d53085b568aea0cefe75d599f87bb5e0841f (diff) | |
Booksim2 abandoned svn and moved to github (https://github.com/booksim/booksim2). This .svn folder is useless now and should be deleted.
For further integration, a git submodule/git subtree may be used. Since I modified their source code, we cannot use git submodule/git subtree easily.
Signed-off-by: Myrice <[email protected]>
Diffstat (limited to 'src/intersim2/.svn/pristine/de')
| -rw-r--r-- | src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base | 856 |
1 files changed, 0 insertions, 856 deletions
diff --git a/src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base b/src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base deleted file mode 100644 index 08bb021..0000000 --- a/src/intersim2/.svn/pristine/de/de391802bf06c5a01ef346b8b98d27244c296855.svn-base +++ /dev/null @@ -1,856 +0,0 @@ -// $Id$ - -/* - Copyright (c) 2007-2012, Trustees of The Leland Stanford Junior University - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -// ---------------------------------------------------------------------- -// -// CMesh: Network with <Int> Terminal Nodes arranged in a concentrated -// mesh topology -// -// ---------------------------------------------------------------------- - -// ---------------------------------------------------------------------- -// $Author: jbalfour $ -// $Date: 2007/06/28 17:24:35 $ -// $Id$ -// Modified 11/6/2007 by Ted Jiang -// Now handeling n = most power of 2: 16, 64, 256, 1024 -// ---------------------------------------------------------------------- -#include "booksim.hpp" -#include <vector> -#include <sstream> -#include <cassert> -#include "random_utils.hpp" -#include "misc_utils.hpp" -#include "cmesh.hpp" - -int CMesh::_cX = 0 ; -int CMesh::_cY = 0 ; -int CMesh::_memo_NodeShiftX = 0 ; -int CMesh::_memo_NodeShiftY = 0 ; -int CMesh::_memo_PortShiftY = 0 ; - -CMesh::CMesh( const Configuration& config, const string & name ) - : Network(config, name) -{ - _ComputeSize( config ); - _Alloc(); - _BuildNet(config); -} - -void CMesh::RegisterRoutingFunctions() { - gRoutingFunctionMap["dor_cmesh"] = &dor_cmesh; - gRoutingFunctionMap["dor_no_express_cmesh"] = &dor_no_express_cmesh; - gRoutingFunctionMap["xy_yx_cmesh"] = &xy_yx_cmesh; - gRoutingFunctionMap["xy_yx_no_express_cmesh"] = &xy_yx_no_express_cmesh; -} - -void CMesh::_ComputeSize( const Configuration &config ) { - - int k = config.GetInt( "k" ); - int n = config.GetInt( "n" ); - assert(n <= 2); // broken for n > 2 - int c = config.GetInt( "c" ); - assert(c == 4); // broken for c != 4 - - ostringstream router_name; - //how many routers in the x or y direction - _xcount = config.GetInt("x"); - _ycount = config.GetInt("y"); - assert(_xcount == _ycount); // broken for asymmetric topologies - //configuration of hohw many clients in X and Y per router - _xrouter = config.GetInt("xr"); - _yrouter = config.GetInt("yr"); - assert(_xrouter == _yrouter); // broken for asymmetric concentration - - gK = _k = k ; - gN = _n = n ; - gC = _c = c ; - - assert(c == _xrouter*_yrouter); - - _nodes = _c * powi( _k, _n); // Number of nodes in network - _size = powi( _k, _n); // Number of routers in network - _channels = 2 * _n * _size; // Number of channels in network - - _cX = _c / _n ; // Concentration in X Dimension - _cY = _c / _cX ; // Concentration in Y Dimension - - // - _memo_NodeShiftX = _cX >> 1 ; - _memo_NodeShiftY = log_two(gK * _cX) + ( _cY >> 1 ) ; - _memo_PortShiftY = log_two(gK * _cX) ; - -} - -void CMesh::_BuildNet( const Configuration& config ) { - - int x_index ; - int y_index ; - - //standard trace configuration - if(gTrace){ - cout<<"Setup Finished Router"<<endl; - } - - //latency type, noc or conventional network - bool use_noc_latency; - use_noc_latency = (config.GetInt("use_noc_latency")==1); - - ostringstream name; - // The following vector is used to check that every - // processor in the system is connected to the network - vector<bool> channel_vector(_nodes, false) ; - - // - // Routers and Channel - // - for (int node = 0; node < _size; ++node) { - - // Router index derived from mesh index - y_index = node / _k ; - x_index = node % _k ; - - const int degree_in = 2 *_n + _c ; - const int degree_out = 2 *_n + _c ; - - name << "router_" << y_index << '_' << x_index; - _routers[node] = Router::NewRouter( config, - this, - name.str(), - node, - degree_in, - degree_out); - _timed_modules.push_back(_routers[node]); - name.str(""); - - // - // Port Numbering: as best as I can determine, the order in - // which the input and output channels are added to the - // router determines the associated port number that must be - // used by the router. Output port number increases with - // each new channel - // - - // - // Processing node channels - // - for (int y = 0; y < _cY ; y++) { - for (int x = 0; x < _cX ; x++) { - int link = (_k * _cX) * (_cY * y_index + y) + (_cX * x_index + x) ; - assert( link >= 0 ) ; - assert( link < _nodes ) ; - assert( channel_vector[ link ] == false ) ; - channel_vector[link] = true ; - // Ingress Ports - _routers[node]->AddInputChannel(_inject[link], _inject_cred[link]); - // Egress Ports - _routers[node]->AddOutputChannel(_eject[link], _eject_cred[link]); - //injeciton ejection latency is 1 - _inject[link]->SetLatency( 1 ); - _eject[link]->SetLatency( 1 ); - } - } - - // - // router to router channels - // - const int x = node % _k ; - const int y = node / _k ; - const int offset = powi( _k, _n ) ; - - //the channel number of the input output channels. - int px_out = _k * y + x + 0 * offset ; - int nx_out = _k * y + x + 1 * offset ; - int py_out = _k * y + x + 2 * offset ; - int ny_out = _k * y + x + 3 * offset ; - int px_in = _k * y + ((x+1)) + 1 * offset ; - int nx_in = _k * y + ((x-1)) + 0 * offset ; - int py_in = _k * ((y+1)) + x + 3 * offset ; - int ny_in = _k * ((y-1)) + x + 2 * offset ; - - // Express Channels - if (x == 0){ - // Router on left edge of mesh. Connect to -x output of - // another router on the left edge of the mesh. - if (y < _k / 2 ) - nx_in = _k * (y + _k/2) + x + offset ; - else - nx_in = _k * (y - _k/2) + x + offset ; - } - - if (x == (_k-1)){ - // Router on right edge of mesh. Connect to +x output of - // another router on the right edge of the mesh. - if (y < _k / 2) - px_in = _k * (y + _k/2) + x ; - else - px_in = _k * (y - _k/2) + x ; - } - - if (y == 0) { - // Router on bottom edge of mesh. Connect to -y output of - // another router on the bottom edge of the mesh. - if (x < _k / 2) - ny_in = _k * y + (x + _k/2) + 3 * offset ; - else - ny_in = _k * y + (x - _k/2) + 3 * offset ; - } - - if (y == (_k-1)) { - // Router on top edge of mesh. Connect to +y output of - // another router on the top edge of the mesh - if (x < _k / 2) - py_in = _k * y + (x + _k/2) + 2 * offset ; - else - py_in = _k * y + (x - _k/2) + 2 * offset ; - } - - /*set latency and add the channels*/ - - // Port 0: +x channel - if(use_noc_latency) { - int const px_latency = (x == _k-1) ? (_cY*_k/2) : _cX; - _chan[px_out]->SetLatency( px_latency ); - _chan_cred[px_out]->SetLatency( px_latency ); - } else { - _chan[px_out]->SetLatency( 1 ); - _chan_cred[px_out]->SetLatency( 1 ); - } - _routers[node]->AddOutputChannel( _chan[px_out], _chan_cred[px_out] ); - _routers[node]->AddInputChannel( _chan[px_in], _chan_cred[px_in] ); - - if(gTrace) { - cout<<"Link "<<" "<<px_out<<" "<<px_in<<" "<<node<<" "<<_chan[px_out]->GetLatency()<<endl; - } - - // Port 1: -x channel - if(use_noc_latency) { - int const nx_latency = (x == 0) ? (_cY*_k/2) : _cX; - _chan[nx_out]->SetLatency( nx_latency ); - _chan_cred[nx_out]->SetLatency( nx_latency ); - } else { - _chan[nx_out]->SetLatency( 1 ); - _chan_cred[nx_out]->SetLatency( 1 ); - } - _routers[node]->AddOutputChannel( _chan[nx_out], _chan_cred[nx_out] ); - _routers[node]->AddInputChannel( _chan[nx_in], _chan_cred[nx_in] ); - - if(gTrace){ - cout<<"Link "<<" "<<nx_out<<" "<<nx_in<<" "<<node<<" "<<_chan[nx_out]->GetLatency()<<endl; - } - - // Port 2: +y channel - if(use_noc_latency) { - int const py_latency = (y == _k-1) ? (_cX*_k/2) : _cY; - _chan[py_out]->SetLatency( py_latency ); - _chan_cred[py_out]->SetLatency( py_latency ); - } else { - _chan[py_out]->SetLatency( 1 ); - _chan_cred[py_out]->SetLatency( 1 ); - } - _routers[node]->AddOutputChannel( _chan[py_out], _chan_cred[py_out] ); - _routers[node]->AddInputChannel( _chan[py_in], _chan_cred[py_in] ); - - if(gTrace){ - cout<<"Link "<<" "<<py_out<<" "<<py_in<<" "<<node<<" "<<_chan[py_out]->GetLatency()<<endl; - } - - // Port 3: -y channel - if(use_noc_latency){ - int const ny_latency = (y == 0) ? (_cX*_k/2) : _cY; - _chan[ny_out]->SetLatency( ny_latency ); - _chan_cred[ny_out]->SetLatency( ny_latency ); - } else { - _chan[ny_out]->SetLatency( 1 ); - _chan_cred[ny_out]->SetLatency( 1 ); - } - _routers[node]->AddOutputChannel( _chan[ny_out], _chan_cred[ny_out] ); - _routers[node]->AddInputChannel( _chan[ny_in], _chan_cred[ny_in] ); - - if(gTrace){ - cout<<"Link "<<" "<<ny_out<<" "<<ny_in<<" "<<node<<" "<<_chan[ny_out]->GetLatency()<<endl; - } - - } - - // Check that all processors were connected to the network - for ( int i = 0 ; i < _nodes ; i++ ) - assert( channel_vector[i] == true ) ; - - if(gTrace){ - cout<<"Setup Finished Link"<<endl; - } -} - - -// ---------------------------------------------------------------------- -// -// Routing Helper Functions -// -// ---------------------------------------------------------------------- - -int CMesh::NodeToRouter( int address ) { - - int y = (address / (_cX*gK))/_cY ; - int x = (address % (_cX*gK))/_cY ; - int router = y*gK + x ; - - return router ; -} - -int CMesh::NodeToPort( int address ) { - - const int maskX = _cX - 1 ; - const int maskY = _cY - 1 ; - - int x = address & maskX ; - int y = (int)(address/(2*gK)) & maskY ; - - return (gC / 2) * y + x; -} - -// ---------------------------------------------------------------------- -// -// Routing Functions -// -// ---------------------------------------------------------------------- - -// Concentrated Mesh: X-Y -int cmesh_xy( int cur, int dest ) { - - const int POSITIVE_X = 0 ; - const int NEGATIVE_X = 1 ; - const int POSITIVE_Y = 2 ; - const int NEGATIVE_Y = 3 ; - - int cur_y = cur / gK; - int cur_x = cur % gK; - int dest_y = dest / gK; - int dest_x = dest % gK; - - // Dimension-order Routing: x , y - if (cur_x < dest_x) { - // Express? - if ((dest_x - cur_x) > 1){ - if (cur_y == 0) - return gC + NEGATIVE_Y ; - if (cur_y == (gK-1)) - return gC + POSITIVE_Y ; - } - return gC + POSITIVE_X ; - } - if (cur_x > dest_x) { - // Express ? - if ((cur_x - dest_x) > 1){ - if (cur_y == 0) - return gC + NEGATIVE_Y ; - if (cur_y == (gK-1)) - return gC + POSITIVE_Y ; - } - return gC + NEGATIVE_X ; - } - if (cur_y < dest_y) { - // Express? - if ((dest_y - cur_y) > 1) { - if (cur_x == 0) - return gC + NEGATIVE_X ; - if (cur_x == (gK-1)) - return gC + POSITIVE_X ; - } - return gC + POSITIVE_Y ; - } - if (cur_y > dest_y) { - // Express ? - if ((cur_y - dest_y) > 1 ){ - if (cur_x == 0) - return gC + NEGATIVE_X ; - if (cur_x == (gK-1)) - return gC + POSITIVE_X ; - } - return gC + NEGATIVE_Y ; - } - return 0; -} - -// Concentrated Mesh: Y-X -int cmesh_yx( int cur, int dest ) { - const int POSITIVE_X = 0 ; - const int NEGATIVE_X = 1 ; - const int POSITIVE_Y = 2 ; - const int NEGATIVE_Y = 3 ; - - int cur_y = cur / gK ; - int cur_x = cur % gK ; - int dest_y = dest / gK ; - int dest_x = dest % gK ; - - // Dimension-order Routing: y, x - if (cur_y < dest_y) { - // Express? - if ((dest_y - cur_y) > 1) { - if (cur_x == 0) - return gC + NEGATIVE_X ; - if (cur_x == (gK-1)) - return gC + POSITIVE_X ; - } - return gC + POSITIVE_Y ; - } - if (cur_y > dest_y) { - // Express ? - if ((cur_y - dest_y) > 1 ){ - if (cur_x == 0) - return gC + NEGATIVE_X ; - if (cur_x == (gK-1)) - return gC + POSITIVE_X ; - } - return gC + NEGATIVE_Y ; - } - if (cur_x < dest_x) { - // Express? - if ((dest_x - cur_x) > 1){ - if (cur_y == 0) - return gC + NEGATIVE_Y ; - if (cur_y == (gK-1)) - return gC + POSITIVE_Y ; - } - return gC + POSITIVE_X ; - } - if (cur_x > dest_x) { - // Express ? - if ((cur_x - dest_x) > 1){ - if (cur_y == 0) - return gC + NEGATIVE_Y ; - if (cur_y == (gK-1)) - return gC + POSITIVE_Y ; - } - return gC + NEGATIVE_X ; - } - return 0; -} - -void xy_yx_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - - // ( Traffic Class , Routing Order ) -> Virtual Channel Range - int vcBegin = 0, vcEnd = gNumVCs-1; - if ( f->type == Flit::READ_REQUEST ) { - vcBegin = gReadReqBeginVC; - vcEnd = gReadReqEndVC; - } else if ( f->type == Flit::WRITE_REQUEST ) { - vcBegin = gWriteReqBeginVC; - vcEnd = gWriteReqEndVC; - } else if ( f->type == Flit::READ_REPLY ) { - vcBegin = gReadReplyBeginVC; - vcEnd = gReadReplyEndVC; - } else if ( f->type == Flit::WRITE_REPLY ) { - vcBegin = gWriteReplyBeginVC; - vcEnd = gWriteReplyEndVC; - } - assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0))); - - int out_port; - - if(inject) { - - out_port = -1; - - } else { - - // Current Router - int cur_router = r->GetID(); - - // Destination Router - int dest_router = CMesh::NodeToRouter( f->dest ) ; - - if (dest_router == cur_router) { - - // Forward to processing element - out_port = CMesh::NodeToPort( f->dest ); - - } else { - - // Forward to neighbouring router - - //each class must have at least 2 vcs assigned or else xy_yx will deadlock - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - - // randomly select dimension order at first hop - bool x_then_y = ((in_channel < gC) ? - (RandomInt(1) > 0) : - (f->vc < (vcBegin + available_vcs))); - - if(x_then_y) { - out_port = cmesh_xy( cur_router, dest_router ); - vcEnd -= available_vcs; - } else { - out_port = cmesh_yx( cur_router, dest_router ); - vcBegin += available_vcs; - } - } - - } - - outputs->Clear(); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - -// ---------------------------------------------------------------------- -// -// Concentrated Mesh: Random XY-YX w/o Express Links -// -// <int> cur: current router address -/// <int> dest: destination router address -// -// ---------------------------------------------------------------------- - -int cmesh_xy_no_express( int cur, int dest ) { - - const int POSITIVE_X = 0 ; - const int NEGATIVE_X = 1 ; - const int POSITIVE_Y = 2 ; - const int NEGATIVE_Y = 3 ; - - const int cur_y = cur / gK ; - const int cur_x = cur % gK ; - const int dest_y = dest / gK ; - const int dest_x = dest % gK ; - - - // Note: channel numbers bellow gC (degree of concentration) are - // injection and ejection links - - // Dimension-order Routing: X , Y - if (cur_x < dest_x) { - return gC + POSITIVE_X ; - } - if (cur_x > dest_x) { - return gC + NEGATIVE_X ; - } - if (cur_y < dest_y) { - return gC + POSITIVE_Y ; - } - if (cur_y > dest_y) { - return gC + NEGATIVE_Y ; - } - return 0; -} - -int cmesh_yx_no_express( int cur, int dest ) { - - const int POSITIVE_X = 0 ; - const int NEGATIVE_X = 1 ; - const int POSITIVE_Y = 2 ; - const int NEGATIVE_Y = 3 ; - - const int cur_y = cur / gK ; - const int cur_x = cur % gK ; - const int dest_y = dest / gK ; - const int dest_x = dest % gK ; - - // Note: channel numbers bellow gC (degree of concentration) are - // injection and ejection links - - // Dimension-order Routing: X , Y - if (cur_y < dest_y) { - return gC + POSITIVE_Y ; - } - if (cur_y > dest_y) { - return gC + NEGATIVE_Y ; - } - if (cur_x < dest_x) { - return gC + POSITIVE_X ; - } - if (cur_x > dest_x) { - return gC + NEGATIVE_X ; - } - return 0; -} - -void xy_yx_no_express_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - // ( Traffic Class , Routing Order ) -> Virtual Channel Range - int vcBegin = 0, vcEnd = gNumVCs-1; - if ( f->type == Flit::READ_REQUEST ) { - vcBegin = gReadReqBeginVC; - vcEnd = gReadReqEndVC; - } else if ( f->type == Flit::WRITE_REQUEST ) { - vcBegin = gWriteReqBeginVC; - vcEnd = gWriteReqEndVC; - } else if ( f->type == Flit::READ_REPLY ) { - vcBegin = gReadReplyBeginVC; - vcEnd = gReadReplyEndVC; - } else if ( f->type == Flit::WRITE_REPLY ) { - vcBegin = gWriteReplyBeginVC; - vcEnd = gWriteReplyEndVC; - } - assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0))); - - int out_port; - - if(inject) { - - out_port = -1; - - } else { - - // Current Router - int cur_router = r->GetID(); - - // Destination Router - int dest_router = CMesh::NodeToRouter( f->dest ); - - if (dest_router == cur_router) { - - // Forward to processing element - out_port = CMesh::NodeToPort( f->dest ); - - } else { - - // Forward to neighbouring router - - //each class must have at least 2 vcs assigned or else xy_yx will deadlock - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - - // randomly select dimension order at first hop - bool x_then_y = ((in_channel < gC) ? - (RandomInt(1) > 0) : - (f->vc < (vcBegin + available_vcs))); - - if(x_then_y) { - out_port = cmesh_xy_no_express( cur_router, dest_router ); - vcEnd -= available_vcs; - } else { - out_port = cmesh_yx_no_express( cur_router, dest_router ); - vcBegin += available_vcs; - } - } - } - - outputs->Clear(); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} -//============================================================ -// -//===== -int cmesh_next( int cur, int dest ) { - - const int POSITIVE_X = 0 ; - const int NEGATIVE_X = 1 ; - const int POSITIVE_Y = 2 ; - const int NEGATIVE_Y = 3 ; - - int cur_y = cur / gK ; - int cur_x = cur % gK ; - int dest_y = dest / gK ; - int dest_x = dest % gK ; - - // Dimension-order Routing: x , y - if (cur_x < dest_x) { - // Express? - if ((dest_x - cur_x) > gK/2-1){ - if (cur_y == 0) - return gC + NEGATIVE_Y ; - if (cur_y == (gK-1)) - return gC + POSITIVE_Y ; - } - return gC + POSITIVE_X ; - } - if (cur_x > dest_x) { - // Express ? - if ((cur_x - dest_x) > gK/2-1){ - if (cur_y == 0) - return gC + NEGATIVE_Y ; - if (cur_y == (gK-1)) - return gC + POSITIVE_Y ; - } - return gC + NEGATIVE_X ; - } - if (cur_y < dest_y) { - // Express? - if ((dest_y - cur_y) > gK/2-1) { - if (cur_x == 0) - return gC + NEGATIVE_X ; - if (cur_x == (gK-1)) - return gC + POSITIVE_X ; - } - return gC + POSITIVE_Y ; - } - if (cur_y > dest_y) { - // Express ? - if ((cur_y - dest_y) > gK/2-1){ - if (cur_x == 0) - return gC + NEGATIVE_X ; - if (cur_x == (gK-1)) - return gC + POSITIVE_X ; - } - return gC + NEGATIVE_Y ; - } - - assert(false); - return -1; -} - -void dor_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - // ( Traffic Class , Routing Order ) -> Virtual Channel Range - int vcBegin = 0, vcEnd = gNumVCs-1; - if ( f->type == Flit::READ_REQUEST ) { - vcBegin = gReadReqBeginVC; - vcEnd = gReadReqEndVC; - } else if ( f->type == Flit::WRITE_REQUEST ) { - vcBegin = gWriteReqBeginVC; - vcEnd = gWriteReqEndVC; - } else if ( f->type == Flit::READ_REPLY ) { - vcBegin = gReadReplyBeginVC; - vcEnd = gReadReplyEndVC; - } else if ( f->type == Flit::WRITE_REPLY ) { - vcBegin = gWriteReplyBeginVC; - vcEnd = gWriteReplyEndVC; - } - assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0))); - - int out_port; - - if(inject) { - - out_port = -1; - - } else { - - // Current Router - int cur_router = r->GetID(); - - // Destination Router - int dest_router = CMesh::NodeToRouter( f->dest ) ; - - if (dest_router == cur_router) { - - // Forward to processing element - out_port = CMesh::NodeToPort( f->dest ) ; - - } else { - - // Forward to neighbouring router - out_port = cmesh_next( cur_router, dest_router ); - } - } - - outputs->Clear(); - - outputs->AddRange( out_port, vcBegin, vcEnd); -} - -//============================================================ -// -//===== -int cmesh_next_no_express( int cur, int dest ) { - - const int POSITIVE_X = 0 ; - const int NEGATIVE_X = 1 ; - const int POSITIVE_Y = 2 ; - const int NEGATIVE_Y = 3 ; - - //magic constant 2, which is supose to be _cX and _cY - int cur_y = cur/gK ; - int cur_x = cur%gK ; - int dest_y = dest/gK; - int dest_x = dest%gK ; - - // Dimension-order Routing: x , y - if (cur_x < dest_x) { - return gC + POSITIVE_X ; - } - if (cur_x > dest_x) { - return gC + NEGATIVE_X ; - } - if (cur_y < dest_y) { - return gC + POSITIVE_Y ; - } - if (cur_y > dest_y) { - return gC + NEGATIVE_Y ; - } - assert(false); - return -1; -} - -void dor_no_express_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - // ( Traffic Class , Routing Order ) -> Virtual Channel Range - int vcBegin = 0, vcEnd = gNumVCs-1; - if ( f->type == Flit::READ_REQUEST ) { - vcBegin = gReadReqBeginVC; - vcEnd = gReadReqEndVC; - } else if ( f->type == Flit::WRITE_REQUEST ) { - vcBegin = gWriteReqBeginVC; - vcEnd = gWriteReqEndVC; - } else if ( f->type == Flit::READ_REPLY ) { - vcBegin = gReadReplyBeginVC; - vcEnd = gReadReplyEndVC; - } else if ( f->type == Flit::WRITE_REPLY ) { - vcBegin = gWriteReplyBeginVC; - vcEnd = gWriteReplyEndVC; - } - assert(((f->vc >= vcBegin) && (f->vc <= vcEnd)) || (inject && (f->vc < 0))); - - int out_port; - - if(inject) { - - out_port = -1; - - } else { - - // Current Router - int cur_router = r->GetID(); - - // Destination Router - int dest_router = CMesh::NodeToRouter( f->dest ) ; - - if (dest_router == cur_router) { - - // Forward to processing element - out_port = CMesh::NodeToPort( f->dest ); - - } else { - - // Forward to neighbouring router - out_port = cmesh_next_no_express( cur_router, dest_router ); - } - } - - outputs->Clear(); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} |
