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 | |
| 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]>
126 files changed, 0 insertions, 26051 deletions
@@ -339,30 +339,3 @@ the applications you care about (implying these applications worked for you before you did the merge). You want to do this before making further changes to identify any compile time or runtime errors that occur due to the code merging process. - -3.2 (OPTIONAL) Updating Intersim2 (ADVANCED USERS ONLY) - -Booksim 2.0 is maintained by the Concurrent VLSI Architecture group at Stanford -(https://nocs.stanford.edu/cgi-bin/trac.cgi/wiki/Resources/BookSim). Intersim2 -is Booksim 2.0 with extentions. Booksim 2.0 is still under active development, -with updates that usually bring cutting edge features and bug fixes. If you want -these new features or bug fixes, it is possible to pull updates from Booksim 2.0 - server and apply the updates to Intersim2. You can follow the instructions -below to update Intersim2 with the new Booksim 2.0. - -As above, YOU SHOULD BACKUP YOUR CHANGES BEFORE PROCEEDING. - -The Booksim 2.0 uses svn source control. First, go to the Intersim2 root -directory($GPGPUSIM_ROOT/src/intersim2) in the terminal. Then, run the -following command in terminal: - -svn update - -While svn is updating your local copy of Intersim2 with the latest changes from -the Booksim 2.0 svn server, conflicts might arise due to changes that either we -or you made that conflict with the latest updates. In this case, svn will prompt -you to edit conflict files using default text editor or you can postpone it and -then using your favorite merge tool to resolve conflict files. - -After you updated Intersim2, you should test the merged version through the -instructions described in Section 3.1. diff --git a/src/intersim2/.svn/entries b/src/intersim2/.svn/entries deleted file mode 100644 index 48082f7..0000000 --- a/src/intersim2/.svn/entries +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/src/intersim2/.svn/format b/src/intersim2/.svn/format deleted file mode 100644 index 48082f7..0000000 --- a/src/intersim2/.svn/format +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/src/intersim2/.svn/pristine/04/043985cd8560fd203de2c2d82735f1e5ecf3783d.svn-base b/src/intersim2/.svn/pristine/04/043985cd8560fd203de2c2d82735f1e5ecf3783d.svn-base deleted file mode 100644 index bccc4db..0000000 --- a/src/intersim2/.svn/pristine/04/043985cd8560fd203de2c2d82735f1e5ecf3783d.svn-base +++ /dev/null @@ -1,79 +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. - -// Dragonfly -// - - - - -vc_buf_size = 256; - - -wait_for_tail_credit = 0; - -// -// Router architecture -// -vc_allocator = separable_input_first; -sw_allocator = separable_input_first; -alloc_iters = 1; - -credit_delay = 2; -routing_delay = 0; -vc_alloc_delay = 1; -sw_alloc_delay = 1; -st_final_delay = 1; - -input_speedup = 1; -output_speedup = 1; -internal_speedup = 2.0; - - -warmup_periods = 3; -sim_count = 1; - -sample_period = 10000; - - - -routing_function = min; -num_vcs = 2; - -priority = none; -traffic = uniform; - -injection_rate = 0.8; -packet_size = 10; -injection_rate_uses_flits=1; - -topology = dragonflynew; - -k = 4; -n = 1; - -watch_out=-; - diff --git a/src/intersim2/.svn/pristine/05/05a079244c124bc5d781812aac07878c6956ef46.svn-base b/src/intersim2/.svn/pristine/05/05a079244c124bc5d781812aac07878c6956ef46.svn-base deleted file mode 100644 index 168d973..0000000 --- a/src/intersim2/.svn/pristine/05/05a079244c124bc5d781812aac07878c6956ef46.svn-base +++ /dev/null @@ -1,1331 +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. -*/ - -//Flattened butterfly simulator -//Created by John Kim -// -//Updated 11/6/2007 by Ted Jiang, now scales -//with any n such that N = K^3, k is a power of 2 -//however, the change restrict it to a 2D FBfly -// -//updated sometimes in december by Ted Jiang, now works for updat to 4 -//dimension. -// -//Updated 2/4/08 by Ted Jiang disabling partial networks -//change concentrations -// -//More update 3/31/08 to correctly assign the nodes to the routers -//UGAL now has added a "mapping" to account for this new assignment -//of the nodes to the routers -// -//Updated by mihelog 27 Aug to add progressive choice of intermediate destination. -//Also, half of the total vcs are used for non-minimal routing, others for minimal (for UGAL and valiant). - - -#include "booksim.hpp" -#include <vector> -#include <sstream> -#include <limits> -#include <cmath> -#include "flatfly_onchip.hpp" -#include "random_utils.hpp" -#include "misc_utils.hpp" -#include "globals.hpp" - - - -//#define DEBUG_FLATFLY - -static int _xcount; -static int _ycount; -static int _xrouter; -static int _yrouter; - -FlatFlyOnChip::FlatFlyOnChip( const Configuration &config, const string & name ) : - Network( config, name ) -{ - - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); -} - -void FlatFlyOnChip::_ComputeSize( const Configuration &config ) -{ - _k = config.GetInt( "k" ); // # of routers per dimension - _n = config.GetInt( "n" ); // dimension - _c = config.GetInt( "c" ); //concentration, may be different from k - _r = _c + (_k-1)*_n ; // total radix of the switch ( # of inputs/outputs) - - //how many routers in the x or y direction - _xcount = config.GetInt("x"); - _ycount = config.GetInt("y"); - assert(_xcount == _ycount); - //configuration of hohw many clients in X and Y per router - _xrouter = config.GetInt("xr"); - _yrouter = config.GetInt("yr"); - assert(_xrouter == _yrouter); - gK = _k; - gN = _n; - gC = _c; - - assert(_c == _xrouter*_yrouter); - - _nodes = powi( _k, _n )*_c; //network size - - _num_of_switch = _nodes / _c; - _channels = _num_of_switch * (_r - _c); - _size = _num_of_switch; - -} - -void FlatFlyOnChip::_BuildNet( const Configuration &config ) -{ - int _output; - - ostringstream router_name; - - - 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); - - cout << " Flat Bufferfly " << endl; - cout << " k = " << _k << " n = " << _n << " c = "<<_c<< endl; - cout << " each switch - total radix = "<< _r << endl; - cout << " # of switches = "<< _num_of_switch << endl; - cout << " # of channels = "<< _channels << endl; - cout << " # of nodes ( size of network ) = " << _nodes << endl; - - for ( int node = 0; node < _num_of_switch; ++node ) { - - router_name << "router"; - router_name << "_" << node ; - - _routers[node] = Router::NewRouter( config, this, router_name.str( ), - node, _r, _r ); - _timed_modules.push_back(_routers[node]); - - -#ifdef DEBUG_FLATFLY - cout << " ======== router node : " << node << " ======== " << " router_" << router_name.str() << " router node # : " << node << endl; -#endif - - router_name.str(""); - - //****************************************************************** - // add inject/eject channels connected to the processor nodes - //****************************************************************** - - //as accurately model the length of these channels as possible - int yleng = -_yrouter/2; - int xleng = -_xrouter/2; - bool yodd = _yrouter%2==1; - bool xodd = _xrouter%2==1; - - int y_index = node/(_xcount); - int x_index = node%(_xcount); - //estimating distance from client to router - for (int y = 0; y < _yrouter ; y++) { - for (int x = 0; x < _xrouter ; x++) { - //Zero is a naughty number - if(yleng == 0 && !yodd){ - yleng++; - } - if(xleng == 0 && !xodd){ - xleng++; - } - int ileng = 1; //at least 1 away - //measure distance in the y direction - if(abs(yleng)>1){ - ileng+=(abs(yleng)-1); - } - //measure distance in the x direction - if(abs(xleng)>1){ - ileng+=(abs(xleng)-1); - } - //increment for the next client, add Y, if full, reset y add x - yleng++; - if(yleng>_yrouter/2){ - yleng= -_yrouter/2; - xleng++; - } - //adopted from the CMESH, the first node has 0,1,8,9 (as an example) - int link = (_xcount * _xrouter) * (_yrouter * y_index + y) + (_xrouter * x_index + x) ; - - if(use_noc_latency){ - _inject[link]->SetLatency(ileng); - _inject_cred[link]->SetLatency(ileng); - _eject[link] ->SetLatency(ileng); - _eject_cred[link]->SetLatency(ileng); - } else { - _inject[link]->SetLatency(1); - _inject_cred[link]->SetLatency(1); - _eject[link] ->SetLatency(1); - _eject_cred[link]->SetLatency(1); - } - _routers[node]->AddInputChannel( _inject[link], _inject_cred[link] ); - -#ifdef DEBUG_FLATFLY - cout << " Adding injection channel " << link << endl; -#endif - - _routers[node]->AddOutputChannel( _eject[link], _eject_cred[link] ); -#ifdef DEBUG_FLATFLY - cout << " Adding ejection channel " << link << endl; -#endif - } - } - } - //****************************************************************** - // add output inter-router channels - //****************************************************************** - - //for every router, in every dimension - for ( int node = 0; node < _num_of_switch; ++node ) { - for ( int dim = 0; dim < _n; ++dim ) { - - //locate itself in every dimension - int xcurr = node%_k; - int ycurr = (int)(node/_k); - int curr3 = node%(_k*_k); - int curr4 = (int)(node/(_k*_k)); - int curr5 = (int)(node/(_k*_k*_k));//mmm didn't mean to be racist - int curr6 = (node%(_k*_k*_k));//mmm didn't mean to be racist - - //for every other router in the dimension - for ( int cnt = 0; cnt < (_k ); ++cnt ) { - int other=0; //the other router that we are trying to connect - int offset = 0; //silly ness when node< other or when node>other - //if xdimension - if(dim == 0){ - other = ycurr * _k +cnt; - } else if (dim ==1){ - other = cnt * _k + xcurr; - if(_n==3){ - other+= curr4*_k*_k; - } - if(_n==4){ - curr4=((int)(node/(_k*_k)))%_k; - other+= curr4*_k*_k+curr5*_k*_k*_k; - } - }else if (dim ==2){ - other = cnt*_k*_k + curr3; - if(_n==4){ - other+= curr5*_k*_k*_k; - } - }else if (dim ==3){ - other = cnt*_k*_k*_k+curr6; - } - assert(dim < 4); - if(other == node){ -#ifdef DEBUG_FLATFLY - cout << "ignore channel : " << _output << " to node " << node <<" and "<<other<<endl; -#endif - continue; - } - //calculate channel length - int length = 0; - int oned = abs((node%_xcount)-(other%_xcount)); - int twod = abs(node/_xcount-other/_xcount); - length = _xrouter*oned + _yrouter *twod; - //oh the node<other silly ness - if(node<other){ - offset = -1; - } - //node, dimension, router within dimension. Good luck understanding this - _output = (_k-1) * _n * node + (_k-1) * dim + cnt+offset; - - -#ifdef DEBUG_FLATFLY - cout << "Adding channel : " << _output << " to node " << node <<" and "<<other<<" with length "<<length<<endl; -#endif - if(use_noc_latency){ - _chan[_output]->SetLatency(length); - _chan_cred[_output]->SetLatency(length); - } else { - _chan[_output]->SetLatency(1); - _chan_cred[_output]->SetLatency(1); - } - _routers[node]->AddOutputChannel( _chan[_output], _chan_cred[_output] ); - - _routers[other]->AddInputChannel( _chan[_output], _chan_cred[_output]); - - if(gTrace){ - cout<<"Link "<<_output<<" "<<node<<" "<<other<<" "<<length<<endl; - } - - } - } - } - if(gTrace){ - cout<<"Setup Finished Link"<<endl; - } -} - - -int FlatFlyOnChip::GetN( ) const -{ - return _n; -} - -int FlatFlyOnChip::GetK( ) const -{ - return _k; -} - -void FlatFlyOnChip::InsertRandomFaults( const Configuration &config ) -{ - -} - -double FlatFlyOnChip::Capacity( ) const -{ - return (double)_k / 8.0; -} - - -void FlatFlyOnChip::RegisterRoutingFunctions(){ - - - gRoutingFunctionMap["ran_min_flatfly"] = &min_flatfly; - gRoutingFunctionMap["adaptive_xyyx_flatfly"] = &adaptive_xyyx_flatfly; - gRoutingFunctionMap["xyyx_flatfly"] = &xyyx_flatfly; - gRoutingFunctionMap["valiant_flatfly"] = &valiant_flatfly; - gRoutingFunctionMap["ugal_flatfly"] = &ugal_flatfly_onchip; - gRoutingFunctionMap["ugal_pni_flatfly"] = &ugal_pni_flatfly_onchip; - gRoutingFunctionMap["ugal_xyyx_flatfly"] = &ugal_xyyx_flatfly_onchip; - -} - -//The initial XY or YX minimal routing direction is chosen adaptively -void adaptive_xyyx_flatfly( 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 { - - int dest = flatfly_transformation(f->dest); - int targetr = (int)(dest/gC); - - if(targetr==r->GetID()){ //if we are at the final router, yay, output to client - out_port = dest % gC; - - } else { - - //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); - - int out_port_xy = flatfly_outport(dest, r->GetID()); - int out_port_yx = flatfly_outport_yx(dest, r->GetID()); - - // Route order (XY or YX) determined when packet is injected - // into the network, adaptively - bool x_then_y; - if(in_channel < gC){ - int credit_xy = r->GetUsedCredit(out_port_xy); - int credit_yx = r->GetUsedCredit(out_port_yx); - if(credit_xy > credit_yx) { - x_then_y = false; - } else if(credit_xy < credit_yx) { - x_then_y = true; - } else { - x_then_y = (RandomInt(1) > 0); - } - } else { - x_then_y = (f->vc < (vcBegin + available_vcs)); - } - - if(x_then_y) { - out_port = out_port_xy; - vcEnd -= available_vcs; - } else { - out_port = out_port_yx; - vcBegin += available_vcs; - } - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - -//The initial XY or YX minimal routing direction is chosen randomly -void xyyx_flatfly( 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 { - - int dest = flatfly_transformation(f->dest); - int targetr = (int)(dest/gC); - - if(targetr==r->GetID()){ //if we are at the final router, yay, output to client - out_port = dest % gC; - - } else { - - //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 = flatfly_outport(dest, r->GetID()); - vcEnd -= available_vcs; - } else { - out_port = flatfly_outport_yx(dest, r->GetID()); - vcBegin += available_vcs; - } - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - -int flatfly_outport_yx(int dest, int rID) { - int dest_rID = (int) (dest / gC); - int _dim = gN; - int output = -1, dID, sID; - - if(dest_rID==rID){ - return dest % gC; - } - - for (int d=_dim-1;d >= 0; d--) { - int power = powi(gK,d); - dID = int(dest_rID / power); - sID = int(rID / power); - if ( dID != sID ) { - output = gC + ((gK-1)*d) - 1; - if (dID > sID) { - output += dID; - } else { - output += dID + 1; - } - return output; - } - dest_rID = (int) (dest_rID %power); - rID = (int) (rID %power); - } - if (output == -1) { - cout << " ERROR ---- FLATFLY_OUTPORT function : output not found yx" << endl; - exit(-1); - } - return -1; -} - -void valiant_flatfly( 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 { - - if ( in_channel < gC ){ - f->ph = 0; - f->intm = RandomInt( powi( gK, gN )*gC-1); - } - - int intm = flatfly_transformation(f->intm); - int dest = flatfly_transformation(f->dest); - - if((int)(intm/gC) == r->GetID() || (int)(dest/gC)== r->GetID()){ - f->ph = 1; - } - - if(f->ph == 0) { - out_port = flatfly_outport(intm, r->GetID()); - } else { - assert(f->ph == 1); - out_port = flatfly_outport(dest, r->GetID()); - } - - if((int)(dest/gC) != r->GetID()) { - - //each class must have at least 2 vcs assigned or else valiant valiant will deadlock - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - - if(f->ph == 0) { - vcEnd -= available_vcs; - } else { - // If routing to final destination use the second half of the VCs. - assert(f->ph == 1); - vcBegin += available_vcs; - } - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - -void min_flatfly( 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 { - - int dest = flatfly_transformation(f->dest); - int targetr= (int)(dest/gC); - //int xdest = ((int)(dest/gC)) % gK; - //int xcurr = ((r->GetID())) % gK; - - //int ydest = ((int)(dest/gC)) / gK; - //int ycurr = ((r->GetID())) / gK; - - if(targetr==r->GetID()){ //if we are at the final router, yay, output to client - out_port = dest % gC; - } else{ //else select a dimension at random - out_port = flatfly_outport(dest, r->GetID()); - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - -//=============================================================^M -// route UGAL in the flattened butterfly -//=============================================================^M - - -//same as ugal except uses xyyx routing -void ugal_xyyx_flatfly_onchip( 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 { - - int dest = flatfly_transformation(f->dest); - - int rID = r->GetID(); - int _concentration = gC; - int found; - int debug = 0; - int tmp_out_port, _ran_intm; - int _min_hop, _nonmin_hop, _min_queucnt, _nonmin_queucnt; - int threshold = 2; - - - if ( in_channel < gC ){ - if(gTrace){ - cout<<"New Flit "<<f->src<<endl; - } - f->ph = 0; - } - - if(gTrace){ - int load = 0; - cout<<"Router "<<rID<<endl; - cout<<"Input Channel "<<in_channel<<endl; - //need to modify router to report the buffere depth - load +=r->GetBufferOccupancy(in_channel); - cout<<"Rload "<<load<<endl; - } - - if (debug){ - cout << " FLIT ID: " << f->id << " Router: " << rID << " routing from src : " << f->src << " to dest : " << dest << " f->ph: " <<f->ph << " intm: " << f->intm << endl; - } - // f->ph == 0 ==> make initial global adaptive decision - // f->ph == 1 ==> route nonminimaly to random intermediate node - // f->ph == 2 ==> route minimally to destination - - found = 0; - - if (f->ph == 1){ - dest = f->intm; - } - - if (dest >= rID*_concentration && dest < (rID+1)*_concentration) { - if (f->ph == 1) { - f->ph = 2; - dest = flatfly_transformation(f->dest); - if (debug) cout << " done routing to intermediate "; - } - else { - found = 1; - out_port = dest % gC; - if (debug) cout << " final routing to destination "; - } - } - - if (!found) { - - int const xy_available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(xy_available_vcs > 0); - - // randomly select dimension order at first hop - bool x_then_y = ((in_channel < gC) ? - (RandomInt(1) > 0) : - (f->vc < (vcBegin + xy_available_vcs))); - - if (f->ph == 0) { - //find the min port and min distance - _min_hop = find_distance(flatfly_transformation(f->src),dest); - if(x_then_y){ - tmp_out_port = flatfly_outport(dest, rID); - } else { - tmp_out_port = flatfly_outport_yx(dest, rID); - } - if (f->watch){ - cout << " MIN tmp_out_port: " << tmp_out_port; - } - //sum over all vcs of that port - _min_queucnt = r->GetUsedCredit(tmp_out_port); - - //find the nonmin router, nonmin port, nonmin count - _ran_intm = find_ran_intm(flatfly_transformation(f->src), dest); - _nonmin_hop = find_distance(flatfly_transformation(f->src),_ran_intm) + find_distance(_ran_intm, dest); - if(x_then_y){ - tmp_out_port = flatfly_outport(_ran_intm, rID); - } else { - tmp_out_port = flatfly_outport_yx(_ran_intm, rID); - } - - if (f->watch){ - cout << " NONMIN tmp_out_port: " << tmp_out_port << endl; - } - if (_ran_intm >= rID*_concentration && _ran_intm < (rID+1)*_concentration) { - _nonmin_queucnt = numeric_limits<int>::max(); - } else { - _nonmin_queucnt = r->GetUsedCredit(tmp_out_port); - } - - if (debug){ - cout << " _min_hop " << _min_hop << " _min_queucnt: " <<_min_queucnt << " _nonmin_hop: " << _nonmin_hop << " _nonmin_queucnt :" << _nonmin_queucnt << endl; - } - - if (_min_hop * _min_queucnt <= _nonmin_hop * _nonmin_queucnt +threshold) { - - if (debug) cout << " Route MINIMALLY " << endl; - f->ph = 2; - } else { - // route non-minimally - if (debug) { cout << " Route NONMINIMALLY int node: " <<_ran_intm << endl; } - f->ph = 1; - f->intm = _ran_intm; - dest = f->intm; - if (dest >= rID*_concentration && dest < (rID+1)*_concentration) { - f->ph = 2; - dest = flatfly_transformation(f->dest); - } - } - } - - //dest here should be == intm if ph==1, or dest == dest if ph == 2 - if(x_then_y){ - out_port = flatfly_outport(dest, rID); - if(out_port >= gC) { - vcEnd -= xy_available_vcs; - } - } else { - out_port = flatfly_outport_yx(dest, rID); - if(out_port >= gC) { - vcBegin += xy_available_vcs; - } - } - - // if we haven't reached our destination, restrict VCs appropriately to avoid routing deadlock - if(out_port >= gC) { - - int const ph_available_vcs = xy_available_vcs / 2; - assert(ph_available_vcs > 0); - - if(f->ph == 1) { - vcEnd -= ph_available_vcs; - } else { - assert(f->ph == 2); - vcBegin += ph_available_vcs; - } - } - - found = 1; - } - - if (!found) { - cout << " ERROR: output not found in routing. " << endl; - cout << *f; exit (-1); - } - - if (out_port >= gN*(gK-1) + gC) { - cout << " ERROR: output port too big! " << endl; - cout << " OUTPUT select: " << out_port << endl; - cout << " router radix: " << gN*(gK-1) + gK << endl; - exit (-1); - } - - if (debug) cout << " through output port : " << out_port << endl; - if(gTrace){cout<<"Outport "<<out_port<<endl;cout<<"Stop Mark"<<endl;} - - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - - - -//ugal now uses modified comparison, modefied getcredit -void ugal_flatfly_onchip( 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 { - - int dest = flatfly_transformation(f->dest); - - int rID = r->GetID(); - int _concentration = gC; - int found; - int debug = 0; - int tmp_out_port, _ran_intm; - int _min_hop, _nonmin_hop, _min_queucnt, _nonmin_queucnt; - int threshold = 2; - - if ( in_channel < gC ){ - if(gTrace){ - cout<<"New Flit "<<f->src<<endl; - } - f->ph = 0; - } - - if(gTrace){ - int load = 0; - cout<<"Router "<<rID<<endl; - cout<<"Input Channel "<<in_channel<<endl; - //need to modify router to report the buffere depth - load +=r->GetBufferOccupancy(in_channel); - cout<<"Rload "<<load<<endl; - } - - if (debug){ - cout << " FLIT ID: " << f->id << " Router: " << rID << " routing from src : " << f->src << " to dest : " << dest << " f->ph: " <<f->ph << " intm: " << f->intm << endl; - } - // f->ph == 0 ==> make initial global adaptive decision - // f->ph == 1 ==> route nonminimaly to random intermediate node - // f->ph == 2 ==> route minimally to destination - - found = 0; - - if (f->ph == 1){ - dest = f->intm; - } - - - if (dest >= rID*_concentration && dest < (rID+1)*_concentration) { - - if (f->ph == 1) { - f->ph = 2; - dest = flatfly_transformation(f->dest); - if (debug) cout << " done routing to intermediate "; - } - else { - found = 1; - out_port = dest % gC; - if (debug) cout << " final routing to destination "; - } - } - - if (!found) { - - if (f->ph == 0) { - _min_hop = find_distance(flatfly_transformation(f->src),dest); - _ran_intm = find_ran_intm(flatfly_transformation(f->src), dest); - tmp_out_port = flatfly_outport(dest, rID); - if (f->watch){ - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << " MIN tmp_out_port: " << tmp_out_port; - } - - _min_queucnt = r->GetUsedCredit(tmp_out_port); - - _nonmin_hop = find_distance(flatfly_transformation(f->src),_ran_intm) + find_distance(_ran_intm, dest); - tmp_out_port = flatfly_outport(_ran_intm, rID); - - if (f->watch){ - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << " NONMIN tmp_out_port: " << tmp_out_port << endl; - } - if (_ran_intm >= rID*_concentration && _ran_intm < (rID+1)*_concentration) { - _nonmin_queucnt = numeric_limits<int>::max(); - } else { - _nonmin_queucnt = r->GetUsedCredit(tmp_out_port); - } - - if (debug){ - cout << " _min_hop " << _min_hop << " _min_queucnt: " <<_min_queucnt << " _nonmin_hop: " << _nonmin_hop << " _nonmin_queucnt :" << _nonmin_queucnt << endl; - } - - if (_min_hop * _min_queucnt <= _nonmin_hop * _nonmin_queucnt +threshold) { - - if (debug) cout << " Route MINIMALLY " << endl; - f->ph = 2; - } else { - // route non-minimally - if (debug) { cout << " Route NONMINIMALLY int node: " <<_ran_intm << endl; } - f->ph = 1; - f->intm = _ran_intm; - dest = f->intm; - if (dest >= rID*_concentration && dest < (rID+1)*_concentration) { - f->ph = 2; - dest = flatfly_transformation(f->dest); - } - } - } - - // find minimal correct dimension to route through - out_port = flatfly_outport(dest, rID); - - // if we haven't reached our destination, restrict VCs appropriately to avoid routing deadlock - if(out_port >= gC) { - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - if(f->ph == 1) { - vcEnd -= available_vcs; - } else { - assert(f->ph == 2); - vcBegin += available_vcs; - } - } - - found = 1; - } - - if (!found) { - cout << " ERROR: output not found in routing. " << endl; - cout << *f; exit (-1); - } - - if (out_port >= gN*(gK-1) + gC) { - cout << " ERROR: output port too big! " << endl; - cout << " OUTPUT select: " << out_port << endl; - cout << " router radix: " << gN*(gK-1) + gK << endl; - exit (-1); - } - - if (debug) cout << " through output port : " << out_port << endl; - if(gTrace) { - cout<<"Outport "<<out_port<<endl; - cout<<"Stop Mark"<<endl; - } - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - - -// partially non-interfering (i.e., packets ordered by hash of destination) UGAL -void ugal_pni_flatfly_onchip( 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 { - - int dest = flatfly_transformation(f->dest); - - int rID = r->GetID(); - int _concentration = gC; - int found; - int debug = 0; - int tmp_out_port, _ran_intm; - int _min_hop, _nonmin_hop, _min_queucnt, _nonmin_queucnt; - int threshold = 2; - - if ( in_channel < gC ){ - if(gTrace){ - cout<<"New Flit "<<f->src<<endl; - } - f->ph = 0; - } - - if(gTrace){ - int load = 0; - cout<<"Router "<<rID<<endl; - cout<<"Input Channel "<<in_channel<<endl; - //need to modify router to report the buffere depth - load +=r->GetBufferOccupancy(in_channel); - cout<<"Rload "<<load<<endl; - } - - if (debug){ - cout << " FLIT ID: " << f->id << " Router: " << rID << " routing from src : " << f->src << " to dest : " << dest << " f->ph: " <<f->ph << " intm: " << f->intm << endl; - } - // f->ph == 0 ==> make initial global adaptive decision - // f->ph == 1 ==> route nonminimaly to random intermediate node - // f->ph == 2 ==> route minimally to destination - - found = 0; - - if (f->ph == 1){ - dest = f->intm; - } - - - if (dest >= rID*_concentration && dest < (rID+1)*_concentration) { - - if (f->ph == 1) { - f->ph = 2; - dest = flatfly_transformation(f->dest); - if (debug) cout << " done routing to intermediate "; - } - else { - found = 1; - out_port = dest % gC; - if (debug) cout << " final routing to destination "; - } - } - - if (!found) { - - if (f->ph == 0) { - _min_hop = find_distance(flatfly_transformation(f->src),dest); - _ran_intm = find_ran_intm(flatfly_transformation(f->src), dest); - tmp_out_port = flatfly_outport(dest, rID); - if (f->watch){ - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << " MIN tmp_out_port: " << tmp_out_port; - } - - _min_queucnt = r->GetUsedCredit(tmp_out_port); - - _nonmin_hop = find_distance(flatfly_transformation(f->src),_ran_intm) + find_distance(_ran_intm, dest); - tmp_out_port = flatfly_outport(_ran_intm, rID); - - if (f->watch){ - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << " NONMIN tmp_out_port: " << tmp_out_port << endl; - } - if (_ran_intm >= rID*_concentration && _ran_intm < (rID+1)*_concentration) { - _nonmin_queucnt = numeric_limits<int>::max(); - } else { - _nonmin_queucnt = r->GetUsedCredit(tmp_out_port); - } - - if (debug){ - cout << " _min_hop " << _min_hop << " _min_queucnt: " <<_min_queucnt << " _nonmin_hop: " << _nonmin_hop << " _nonmin_queucnt :" << _nonmin_queucnt << endl; - } - - if (_min_hop * _min_queucnt <= _nonmin_hop * _nonmin_queucnt +threshold) { - - if (debug) cout << " Route MINIMALLY " << endl; - f->ph = 2; - } else { - // route non-minimally - if (debug) { cout << " Route NONMINIMALLY int node: " <<_ran_intm << endl; } - f->ph = 1; - f->intm = _ran_intm; - dest = f->intm; - if (dest >= rID*_concentration && dest < (rID+1)*_concentration) { - f->ph = 2; - dest = flatfly_transformation(f->dest); - } - } - } - - // find minimal correct dimension to route through - out_port = flatfly_outport(dest, rID); - - // if we haven't reached our destination, restrict VCs appropriately to avoid routing deadlock - if(out_port >= gC) { - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - if(f->ph == 1) { - vcEnd -= available_vcs; - } else { - assert(f->ph == 2); - vcBegin += available_vcs; - } - } - - found = 1; - } - - if (!found) { - cout << " ERROR: output not found in routing. " << endl; - cout << *f; exit (-1); - } - - if (out_port >= gN*(gK-1) + gC) { - cout << " ERROR: output port too big! " << endl; - cout << " OUTPUT select: " << out_port << endl; - cout << " router radix: " << gN*(gK-1) + gK << endl; - exit (-1); - } - - if (debug) cout << " through output port : " << out_port << endl; - if(gTrace) { - cout<<"Outport "<<out_port<<endl; - cout<<"Stop Mark"<<endl; - } - } - - if(inject || (out_port >= gC)) { - - // NOTE: for "proper" flattened butterfly configurations (i.e., ones - // derived from flattening an actual butterfly), gK and gC are the same! - assert(gK == gC); - - assert(inject ? (f->ph == -1) : (f->ph == 1 || f->ph == 2)); - - int next_coord = flatfly_transformation(f->dest); - if(inject) { - next_coord /= gC; - next_coord %= gK; - } else { - int next_dim = (out_port - gC) / (gK - 1) + 1; - if(next_dim == gN) { - next_coord %= gC; - } else { - next_coord /= gC; - for(int d = 0; d < next_dim; ++d) { - next_coord /= gK; - } - next_coord %= gK; - } - } - assert(next_coord >= 0 && next_coord < gK); - int vcs_per_dest = (vcEnd - vcBegin + 1) / gK; - assert(vcs_per_dest > 0); - vcBegin += next_coord * vcs_per_dest; - vcEnd = vcBegin + vcs_per_dest - 1; - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - - -//=============================================================^M -// UGAL : calculate distance (hop cnt) between src and destination -//=============================================================^M -int find_distance (int src, int dest) { - int dist = 0; - int _dim = gN; - int _dim_size; - - int src_tmp= (int) src / gC; - int dest_tmp = (int) dest / gC; - int src_id, dest_id; - - // cout << " HOP CNT between src: " << src << " dest: " << dest; - for (int d=0;d < _dim; d++) { - _dim_size = powi(gK, d )*gC; - //if ((int)(src / _dim_size) != (int)(dest / _dim_size)) - // dist++; - src_id = src_tmp % gK; - dest_id = dest_tmp % gK; - if (src_id != dest_id) - dist++; - src_tmp = (int) (src_tmp / gK); - dest_tmp = (int) (dest_tmp / gK); - } - - // cout << " : " << dist << endl; - - return dist; -} - -//=============================================================^M -// UGAL : find random node for load balancing -//=============================================================^M -int find_ran_intm (int src, int dest) { - int _dim = gN; - int _dim_size; - int _ran_dest = 0; - int debug = 0; - - if (debug) - cout << " INTM node for src: " << src << " dest: " <<dest << endl; - - src = (int) (src / gC); - dest = (int) (dest / gC); - - _ran_dest = RandomInt(gC - 1); - if (debug) cout << " ............ _ran_dest : " << _ran_dest << endl; - for (int d=0;d < _dim; d++) { - - _dim_size = powi(gK, d)*gC; - if ((src % gK) == (dest % gK)) { - _ran_dest += (src % gK) * _dim_size; - if (debug) - cout << " share same dimension : " << d << " int node : " << _ran_dest << " src ID : " << src % gK << endl; - } else { - // src and dest are in the same dimension "d" + 1 - // ==> thus generate a random destination within - _ran_dest += RandomInt(gK - 1) * _dim_size; - if (debug) - cout << " different dimension : " << d << " int node : " << _ran_dest << " _dim_size: " << _dim_size << endl; - } - src = (int) (src / gK); - dest = (int) (dest / gK); - } - - if (debug) cout << " intermediate destination NODE: " << _ran_dest << endl; - return _ran_dest; -} - - - -//============================================================= -// UGAL : calculated minimum distance output port for flatfly -// given the dimension and destination -//============================================================= -// starting from DIM 0 (x first) -int flatfly_outport(int dest, int rID) { - int dest_rID = (int) (dest / gC); - int _dim = gN; - int output = -1, dID, sID; - - if(dest_rID==rID){ - return dest % gC; - } - - - for (int d=0;d < _dim; d++) { - dID = (dest_rID % gK); - sID = (rID % gK); - if ( dID != sID ) { - output = gC + ((gK-1)*d) - 1; - if (dID > sID) { - - output += dID; - } else { - output += dID + 1; - } - - return output; - } - dest_rID = (int) (dest_rID / gK); - rID = (int) (rID / gK); - } - if (output == -1) { - cout << " ERROR ---- FLATFLY_OUTPORT function : output not found " << endl; - exit(-1); - } - return -1; -} - -int flatfly_transformation(int dest){ - //the magic of destination transformation - - //destination transformation, translate how the nodes are actually arranged - //to the easier way of routing - //this transformation only support 64 nodes - - //cout<<"ORiginal destination "<<dest<<endl; - //router in the x direction = find which column, and then mod by cY to find - //which horizontal router - int horizontal = (dest%(_xcount*_xrouter))/(_xrouter); - int horizontal_rem = (dest%(_xcount*_xrouter))%(_xrouter); - //router in the y direction = find which row, and then divided by cX to find - //vertical router - int vertical = (dest/(_xcount*_xrouter))/(_yrouter); - int vertical_rem = (dest/(_xcount*_xrouter))%(_yrouter); - //transform the destination to as if node0 was 0,1,2,3 and so forth - dest = (vertical*_xcount + horizontal)*gC+_xrouter*vertical_rem+horizontal_rem; - //cout<<"Transformed destination "<<dest<<endl<<endl; - return dest; -} diff --git a/src/intersim2/.svn/pristine/0a/0a776321c5f55776af796ce2c5543f562d751c17.svn-base b/src/intersim2/.svn/pristine/0a/0a776321c5f55776af796ce2c5543f562d751c17.svn-base deleted file mode 100644 index 9f8df51..0000000 --- a/src/intersim2/.svn/pristine/0a/0a776321c5f55776af796ce2c5543f562d751c17.svn-base +++ /dev/null @@ -1,270 +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. -*/ - -//////////////////////////////////////////////////////////////////////// -// -// FatTree -// -// Each level of the hierarchical indirect Network has -// k^(n-1) Routers. The Routers are organized such that -// each node has k descendents, and each parent is -// replicated k times. -// most routers has 2K ports, excep the top level has only K -//////////////////////////////////////////////////////////////////////// -// -// RCS Information: -// $Author: jbalfour $ -// $Date: 2007/06/26 22:50:48 $ -// $Id$ -// -//////////////////////////////////////////////////////////////////////// - - -#include "booksim.hpp" -#include <vector> -#include <sstream> -#include <cmath> - -#include "fattree.hpp" -#include "misc_utils.hpp" - - - //#define FATTREE_DEBUG - -FatTree::FatTree( const Configuration& config,const string & name ) - : Network( config ,name) -{ - - - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); - -} - -void FatTree::_ComputeSize( const Configuration& config ) -{ - - _k = config.GetInt( "k" ); - _n = config.GetInt( "n" ); - - gK = _k; gN = _n; - - _nodes = powi( _k, _n ); - - //levels * routers_per_level - _size = _n * powi( _k , _n - 1 ); - - //(channels per level = k*routers_per_level* up/down) * (levels-1) - _channels = (2*_k * powi( _k , _n-1 ))*(_n-1); - - -} - - -void FatTree::RegisterRoutingFunctions() { - -} - -void FatTree::_BuildNet( const Configuration& config ) -{ - cout << "Fat Tree" << endl; - cout << " k = " << _k << " levels = " << _n << endl; - cout << " each switch - total radix = "<< 2*_k << endl; - cout << " # of switches = "<< _size << endl; - cout << " # of channels = "<< _channels << endl; - cout << " # of nodes ( size of network ) = " << _nodes << endl; - - - // Number of router positions at each depth of the network - const int nPos = powi( _k, _n-1); - - // - // Allocate Routers - // - ostringstream name; - int level, pos, id, degree, port; - for ( level = 0 ; level < _n ; ++level ) { - for ( pos = 0 ; pos < nPos ; ++pos ) { - - if ( level == 0 ) //top routers is zero - degree = _k; - else - degree = 2 * _k; - - id = level * nPos + pos; - - name.str(""); - name << "router_level" << level << "_" << pos; - Router * r = Router::NewRouter( config, this, name.str( ), id, - degree, degree ); - _Router( level, pos ) = r; - _timed_modules.push_back(r); - } - } - - // - // Connect Channels to Routers - // - - // - // Router Connection Rule: Output Ports <gK Move DOWN Network - // Output Ports >=gK Move UP Network - // Input Ports <gK from DOWN Network - // Input Ports >=gK from up Network - - // Connecting Injection & Ejection Channels - for ( pos = 0 ; pos < nPos ; ++pos ) { - for(int index = 0; index<_k; index++){ - int link = pos*_k + index; - _Router( _n-1, pos)->AddInputChannel( _inject[link], - _inject_cred[link]); - _Router( _n-1, pos)->AddOutputChannel( _eject[link], - _eject_cred[link]); - _inject[link]->SetLatency( 1 ); - _inject_cred[link]->SetLatency( 1 ); - _eject[link]->SetLatency( 1 ); - _eject_cred[link]->SetLatency( 1 ); - } - } - -#ifdef FATTREE_DEBUG - cout<<"\nAssigning output\n"; -#endif - - //channels are numbered sequentially from an output channel perspective - int chan_per_direction = (_k * powi( _k , _n-1 )); //up or down - int chan_per_level = 2*(_k * powi( _k , _n-1 )); //up+down - - //connect all down output channels - //level n-1's down channel are injection channels - for (level = 0; level<_n-1; level++){ - for ( pos = 0; pos < nPos; ++pos ) { - for ( port = 0; port < _k; ++port ) { - int link = (level*chan_per_level) + pos*_k + port; - _Router(level, pos)->AddOutputChannel( _chan[link], - _chan_cred[link] ); - _chan[link]->SetLatency( 1 ); - _chan_cred[link]->SetLatency( 1 ); -#ifdef FATTREE_DEBUG - cout<<_Router(level, pos)->Name()<<" " - <<"down output "<<port<<" " - <<"channel_id "<<link<<endl; -#endif - - } - } - } - //connect all up output channels - //level 0 has no up chnanels - for (level = 1; level<_n; level++){ - for ( pos = 0; pos < nPos; ++pos ) { - for ( port = 0; port < _k; ++port ) { - int link = (level*chan_per_level - chan_per_direction) + pos*_k + port ; - _Router(level, pos)->AddOutputChannel( _chan[link], - _chan_cred[link] ); - _chan[link]->SetLatency( 1 ); - _chan_cred[link]->SetLatency( 1 ); -#ifdef FATTREE_DEBUG - cout<<_Router(level, pos)->Name()<<" " - <<"up output "<<port<<" " - <<"channel_id "<<link<<endl; -#endif - } - } - } - -#ifdef FATTREE_DEBUG - cout<<"\nAssigning Input\n"; -#endif - - //connect all down input channels - for (level = 0; level<_n-1; level++){ - //input channel are numbered interleavely, the interleaev depends on level - int routers_per_neighborhood = powi(_k,_n-1-(level)); - int routers_per_branch = powi(_k,_n-1-(level+1)); - int level_offset = routers_per_neighborhood*_k; - for ( pos = 0; pos < nPos; ++pos ) { - int neighborhood = pos/routers_per_neighborhood; - int neighborhood_pos = pos%routers_per_neighborhood; - for ( port = 0; port < _k; ++port ) { - int link = - ((level+1)*chan_per_level - chan_per_direction) //which levellevel - +neighborhood*level_offset //region in level - +port*routers_per_branch*gK //sub region in region - +(neighborhood_pos)%routers_per_branch*gK //router in subregion - +(neighborhood_pos)/routers_per_branch; //port on router - - _Router(level, pos)->AddInputChannel( _chan[link], - _chan_cred[link] ); -#ifdef FATTREE_DEBUG - cout<<_Router(level, pos)->Name()<<" " - <<"down input "<<port<<" " - <<"channel_id "<<link<<endl; -#endif - } - } - } - - - //connect all up input channels - for (level = 1; level<_n; level++){ - //input channel are numbered interleavely, the interleaev depends on level - int routers_per_neighborhood = powi(_k,_n-1-(level-1)); - int routers_per_branch = powi(_k,_n-1-(level)); - int level_offset = routers_per_neighborhood*_k; - for ( pos = 0; pos < nPos; ++pos ) { - int neighborhood = pos/routers_per_neighborhood; - int neighborhood_pos = pos%routers_per_neighborhood; - for ( port = 0; port < _k; ++port ) { - int link = - ((level-1)*chan_per_level) //which levellevel - +neighborhood*level_offset //region in level - +port*routers_per_branch*gK //sub region in region - +(neighborhood_pos)%routers_per_branch*gK //router in subregion - +(neighborhood_pos)/routers_per_branch; //port on router - - _Router(level, pos)->AddInputChannel( _chan[link], - _chan_cred[link] ); -#ifdef FATTREE_DEBUG - cout<<_Router(level, pos)->Name()<<" " - <<"up input "<<port<<" " - <<"channel_id "<<link<<endl; -#endif - } - } - } -#ifdef FATTREE_DEBUG - cout<<"\nChannel assigned\n"; -#endif -} - -Router*& FatTree::_Router( int depth, int pos ) -{ - assert( depth < _n && pos < powi( _k, _n-1) ); - return _routers[depth * powi( _k, _n-1) + pos]; -} diff --git a/src/intersim2/.svn/pristine/0b/0b0c41499a28f0b7c2fccd583db339989d665677.svn-base b/src/intersim2/.svn/pristine/0b/0b0c41499a28f0b7c2fccd583db339989d665677.svn-base deleted file mode 100644 index 1f15857..0000000 --- a/src/intersim2/.svn/pristine/0b/0b0c41499a28f0b7c2fccd583db339989d665677.svn-base +++ /dev/null @@ -1,155 +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. -*/ - -/*router.cpp - * - *The base class of either iq router or event router - *contains a list of channels and other router configuration variables - * - *The older version of the simulator uses an array of flits and credit to - *simulate the channels. Newer version ueses flitchannel and credit channel - *which can better model channel delay - * - *The older version of the simulator also uses vc_router and chaos router - *which are replaced by iq rotuer and event router in the present form - */ - -#include "booksim.hpp" -#include <iostream> -#include <cassert> -#include "router.hpp" - -//////////////////Sub router types////////////////////// -#include "iq_router.hpp" -#include "event_router.hpp" -#include "chaos_router.hpp" -/////////////////////////////////////////////////////// - -int const Router::STALL_BUFFER_BUSY = -2; -int const Router::STALL_BUFFER_CONFLICT = -3; -int const Router::STALL_BUFFER_FULL = -4; -int const Router::STALL_BUFFER_RESERVED = -5; -int const Router::STALL_CROSSBAR_CONFLICT = -6; - -Router::Router( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ) : -TimedModule( parent, name ), _id( id ), _inputs( inputs ), _outputs( outputs ), - _partial_internal_cycles(0.0) -{ - _crossbar_delay = ( config.GetInt( "st_prepare_delay" ) + - config.GetInt( "st_final_delay" ) ); - _credit_delay = config.GetInt( "credit_delay" ); - _input_speedup = config.GetInt( "input_speedup" ); - _output_speedup = config.GetInt( "output_speedup" ); - _internal_speedup = config.GetFloat( "internal_speedup" ); - _classes = config.GetInt( "classes" ); - -#ifdef TRACK_FLOWS - _received_flits.resize(_classes, vector<int>(_inputs, 0)); - _stored_flits.resize(_classes); - _sent_flits.resize(_classes, vector<int>(_outputs, 0)); - _active_packets.resize(_classes); - _outstanding_credits.resize(_classes, vector<int>(_outputs, 0)); -#endif - -#ifdef TRACK_STALLS - _buffer_busy_stalls.resize(_classes, 0); - _buffer_conflict_stalls.resize(_classes, 0); - _buffer_full_stalls.resize(_classes, 0); - _buffer_reserved_stalls.resize(_classes, 0); - _crossbar_conflict_stalls.resize(_classes, 0); -#endif - -} - -void Router::AddInputChannel( FlitChannel *channel, CreditChannel *backchannel ) -{ - _input_channels.push_back( channel ); - _input_credits.push_back( backchannel ); - channel->SetSink( this, _input_channels.size() - 1 ) ; -} - -void Router::AddOutputChannel( FlitChannel *channel, CreditChannel *backchannel ) -{ - _output_channels.push_back( channel ); - _output_credits.push_back( backchannel ); - _channel_faults.push_back( false ); - channel->SetSource( this, _output_channels.size() - 1 ) ; -} - -void Router::Evaluate( ) -{ - _partial_internal_cycles += _internal_speedup; - while( _partial_internal_cycles >= 1.0 ) { - _InternalStep( ); - _partial_internal_cycles -= 1.0; - } -} - -void Router::OutChannelFault( int c, bool fault ) -{ - assert( ( c >= 0 ) && ( (size_t)c < _channel_faults.size( ) ) ); - - _channel_faults[c] = fault; -} - -bool Router::IsFaultyOutput( int c ) const -{ - assert( ( c >= 0 ) && ( (size_t)c < _channel_faults.size( ) ) ); - - return _channel_faults[c]; -} - -/*Router constructor*/ -Router *Router::NewRouter( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ) -{ - const string type = config.GetStr( "router" ); - Router *r = NULL; - if ( type == "iq" ) { - r = new IQRouter( config, parent, name, id, inputs, outputs ); - } else if ( type == "event" ) { - r = new EventRouter( config, parent, name, id, inputs, outputs ); - } else if ( type == "chaos" ) { - r = new ChaosRouter( config, parent, name, id, inputs, outputs ); - } else { - cerr << "Unknown router type: " << type << endl; - } - /*For additional router, add another else if statement*/ - /*Original booksim specifies the router using "flow_control" - *we now simply call these types. - */ - - return r; -} - - - - - diff --git a/src/intersim2/.svn/pristine/0e/0eae5ca5351f1f31915bc0c3da4a3a1ae19e21c4.svn-base b/src/intersim2/.svn/pristine/0e/0eae5ca5351f1f31915bc0c3da4a3a1ae19e21c4.svn-base deleted file mode 100644 index 5c54228..0000000 --- a/src/intersim2/.svn/pristine/0e/0eae5ca5351f1f31915bc0c3da4a3a1ae19e21c4.svn-base +++ /dev/null @@ -1,57 +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. -*/ - -#ifndef _PACKET_REPLY_INFO_HPP_ -#define _PACKET_REPLY_INFO_HPP_ - -#include <stack> - -#include "flit.hpp" - -//register the requests to a node -class PacketReplyInfo { - -public: - int source; - int time; - bool record; - Flit::FlitType type; - - static PacketReplyInfo* New(); - void Free(); - static void FreeAll(); - -private: - - static stack<PacketReplyInfo*> _all; - static stack<PacketReplyInfo*> _free; - - PacketReplyInfo() {} - ~PacketReplyInfo() {} -}; - -#endif diff --git a/src/intersim2/.svn/pristine/0f/0fa9e6ee8d633c141585cd663a6307195b79db63.svn-base b/src/intersim2/.svn/pristine/0f/0fa9e6ee8d633c141585cd663a6307195b79db63.svn-base deleted file mode 100644 index a7b540b..0000000 --- a/src/intersim2/.svn/pristine/0f/0fa9e6ee8d633c141585cd663a6307195b79db63.svn-base +++ /dev/null @@ -1,532 +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. -*/ - -#include "power_module.hpp" -#include "booksim_config.hpp" -#include "buffer_monitor.hpp" -#include "switch_monitor.hpp" -#include "iq_router.hpp" - -Power_Module::Power_Module(Network * n , const Configuration &config) - : Module( 0, "power_module" ){ - - - string pfile = config.GetStr("tech_file"); - PowerConfig pconfig; - pconfig.ParseFile(pfile); - - net = n; - output_file_name = config.GetStr("power_output_file"); - classes = config.GetInt("classes"); - channel_width = (double)config.GetInt("channel_width"); - channel_sweep = (double)config.GetInt("channel_sweep"); - - numVC = (double)config.GetInt("num_vcs"); - depthVC = (double)config.GetInt("vc_buf_size"); - - //////////////////////////////////Constants///////////////////////////// - //wire length in (mm) - wire_length = pconfig.GetFloat("wire_length"); - //////////Metal Parameters//////////// - // Wire left/right coupling capacitance [ F/mm ] - Cw_cpl = pconfig.GetFloat("Cw_cpl"); - // Wire up/down groudn capacitance [ F/mm ] - Cw_gnd = pconfig.GetFloat("Cw_gnd"); - Cw = 2.0 * Cw_cpl + 2.0 * Cw_gnd ; - Rw = pconfig.GetFloat("Rw"); - // metal pitch [mm] - MetalPitch = pconfig.GetFloat("MetalPitch"); - - //////////Device Parameters//////////// - - LAMBDA = pconfig.GetFloat("LAMBDA") ; // [um/LAMBDA] - Cd = pconfig.GetFloat("Cd"); // [F/um] (for Delay) - Cg = pconfig.GetFloat("Cg"); // [F/um] (for Delay) - Cgdl = pconfig.GetFloat("Cgdl"); // [F/um] (for Delay) - - Cd_pwr = pconfig.GetFloat("Cd_pwr") ; // [F/um] (for Power) - Cg_pwr = pconfig.GetFloat("Cg_pwr") ; // [F/um] (for Power) - - IoffN = pconfig.GetFloat("IoffN"); // [A/um] - IoffP = pconfig.GetFloat("IoffP"); // [A/um] - // Leakage from bitlines, two-port cell [A] - IoffSRAM = pconfig.GetFloat("IoffSRAM"); - // [Ohm] ( D1=1um Inverter) - R = pconfig.GetFloat("R"); - // [F] ( D1=1um Inverter - for Power ) - Ci_delay = (1.0 + 2.0) * ( Cg + Cgdl ); - // [F] ( D1=1um Inverter - for Power ) - Co_delay = (1.0 + 2.0) * Cd ; - - - Ci = (1.0 + 2.0) * Cg_pwr ; - Co = (1.0 + 2.0) * Cd_pwr ; - - Vdd = pconfig.GetFloat("Vdd"); - FO4 = R * ( 3.0 * Cd + 12 * Cg + 12 * Cgdl); - tCLK = 20 * FO4; - fCLK = 1.0 / tCLK; - - H_INVD2=(double)pconfig.GetInt("H_INVD2"); - W_INVD2=(double)pconfig.GetInt("W_INVD2") ; - H_DFQD1=(double)pconfig.GetInt("H_DFQD1"); - W_DFQD1= (double)pconfig.GetInt("W_DFQD1"); - H_ND2D1= (double)pconfig.GetInt("H_ND2D1"); - W_ND2D1=(double)pconfig.GetInt("W_ND2D1"); - H_SRAM=(double)pconfig.GetInt("H_SRAM"); - W_SRAM=(double)pconfig.GetInt("W_SRAM"); - - ChannelPitch = 2.0 * MetalPitch ; - CrossbarPitch = 2.0 * MetalPitch ; -} - -Power_Module::~Power_Module(){ - - -} - - -////////////////////////////////////////////// -//Channels -////////////////////////////////////////////// - -void Power_Module::calcChannel(const FlitChannel* f){ - double channelLength = f->GetLatency()* wire_length; - wire const this_wire = wireOptimize(channelLength); - double const & K = this_wire.K; - double const & N = this_wire.N; - double const & M = this_wire.M; - //area - channelArea += areaChannel(K,N,M); - - //activity factor; - const vector<int> temp = f->GetActivity(); - vector<double> a(classes); - for(int i = 0; i< classes; i++){ - - a[i] = ((double)temp[i])/totalTime; - } - - //power calculation - double const bitPower = powerRepeatedWire(channelLength, K,M,N); - - channelClkPower += powerWireClk(M,channel_width); - for(int i = 0; i< classes; i++){ - channelWirePower += bitPower * a[i]*channel_width; - channelDFFPower += powerWireDFF(M, channel_width, a[i]); - } - channelLeakPower+= powerRepeatedWireLeak(K,M,N)*channel_width; -} - -wire const & Power_Module::wireOptimize(double L){ - map<double, wire>::iterator iter = wire_map.find(L); - if(iter == wire_map.end()){ - - double W = 64; - double bestMetric = 100000000 ; - double bestK = -1; - double bestM = -1; - double bestN = -1; - for (double K = 1.0 ; K < 10 ; K+=0.1 ) { - for (double N = 1.0 ; N < 40 ; N += 1.0 ) { - for (double M = 1.0 ; M < 40.0 ; M +=1.0 ) { - double l = 1.0 * L/( N * M) ; - - double k0 = R * (Co_delay + Ci_delay) ; - double k1 = R/K * Cw + K * Rw * Ci_delay ; - double k2 = 0.5 * Rw * Cw ; - double Tw = k0 + (k1 * l) + k2 * (l * l) ; - double alpha = 0.2 ; - double power = alpha * W * powerRepeatedWire( L, K, M, N) + powerWireDFF( M, W, alpha ) ; - double metric = M * M * M * M * power ; - if ( (N*Tw) < (0.8 * tCLK) ) { - if ( metric < bestMetric ) { - bestMetric = metric ; - bestK = K ; - bestM = M ; - bestN = N ; - } - } - } - } - } - cout<<"L = "<<L<<" K = "<<bestK<<" M = "<<bestM<<" N = "<<bestN<<endl; - - wire const temp = {L, bestK, bestM, bestN}; - iter = wire_map.insert(make_pair(L, temp)).first; - } - return iter->second; -} - -double Power_Module::powerRepeatedWire(double L, double K, double M, double N){ - - double segments = 1.0 * M * N ; - double Ca = K * (Ci + Co) + Cw * (L/segments) ; - double Pa = 0.5 * Ca * Vdd * Vdd * fCLK; - return Pa * M * N ; - -} - -double Power_Module::powerRepeatedWireLeak (double K, double M, double N){ - double Pl = K * 0.5 * ( IoffN + 2.0 * IoffP ) * Vdd ; - return Pl * M * N ; - -} - -double Power_Module:: powerWireClk (double M, double W){ - // number of clock wires running down one repeater bank - double columns = H_DFQD1 * MetalPitch / ChannelPitch ; - - // length of clock wire - double clockLength = W * ChannelPitch ; - double Cclk = (1 + 5.0/16.0 * (1+Co_delay/Ci_delay)) * (clockLength * Cw * columns +W * Ci_delay); - - return M * Cclk * (Vdd * Vdd) * fCLK ; - -} - -double Power_Module::powerWireDFF(double M, double W, double alpha){ - double Cdin = 2 * 0.8 * (Ci + Co) + 2 * ( 2.0/3.0 * 0.8 * Co ) ; - double Cclk = 2 * 0.8 * (Ci + Co) + 2 * ( 2.0/3.0 * 0.8 * Cg_pwr) ; - double Cint = (alpha * 0.5) * Cdin + alpha * Cclk ; - - return Cint * M * W * (Vdd*Vdd) * fCLK ; -} - - -/////////////////////////////////////////////////////////////// -//Memory -////////////////////////////////////////////////////////////// -void Power_Module::calcBuffer(const BufferMonitor *bm){ - double depth = numVC * depthVC ; - double Pleak = powerMemoryBitLeak( depth ) * channel_width ; - //area - - const vector<int> reads = bm->GetReads(); - const vector<int> writes = bm->GetWrites(); - for(int i = 0; i<bm->NumInputs(); i++){ - inputArea += areaInputModule( depth ); - inputLeakagePower += Pleak ; - for(int j = 0; j< classes; j++){ - double ar = ((double)reads[i* classes+j])/totalTime; - double aw = ((double)writes[i* classes+j])/totalTime; - if(ar>1 ||aw >1){ - cout<<"activity factor is greater than one, soemthing is stomping memory\n"; exit(-1); - } - double Pwl = powerWordLine( channel_width, depth) ; - double Prd = powerMemoryBitRead( depth ) * channel_width ; - double Pwr = powerMemoryBitWrite( depth ) * channel_width ; - inputReadPower += ar * ( Pwl + Prd ) ; - inputWritePower += aw * ( Pwl + Pwr ) ; - } - } -} - - -double Power_Module::powerWordLine(double memoryWidth, double memoryDepth){ - // wordline capacitance - double Ccell = 2 * ( 4.0 * LAMBDA ) * Cg_pwr + 6 * MetalPitch * Cw ; - double Cwl = memoryWidth * Ccell ; - - // wordline circuits - double Warray = 8 * MetalPitch + memoryDepth ; - double x = 1.0 + (5.0/16.0) * (1 + Co/Ci) ; - double Cpredecode = x * (Cw * Warray * Ci) ; - double Cdecode = x * Cwl ; - - // bitline circuits - double Harray = 6 * memoryWidth * MetalPitch ; - double y = (1 + 0.25) * (1 + Co/Ci) ; - double Cprecharge = y * ( Cw * Harray + 3 * channel_width * Ci ) ; - double Cwren = y * ( Cw * Harray + 2 * channel_width * Ci ) ; - - double Cbd = Cprecharge + Cwren ; - double Cwd = 2 * Cpredecode + Cdecode ; - - return ( Cbd + Cwd ) * Vdd * Vdd * fCLK ; - -} - -double Power_Module::powerMemoryBitRead(double memoryDepth){ - // bitline capacitance - double Ccell = 4.0 * LAMBDA * Cd_pwr + 8 * MetalPitch * Cw ; - double Cbl = memoryDepth * Ccell ; - double Vswing = Vdd ; - return ( Cbl ) * ( Vdd * Vswing ) * fCLK ; -} - -double Power_Module:: powerMemoryBitWrite(double memoryDepth){ - // bitline capacitance - double Ccell = 4.0 * LAMBDA * Cd_pwr + 8 * MetalPitch * Cw ; - double Cbl = memoryDepth * Ccell ; - - // internal capacitance - double Ccc = 2 * (Co + Ci) ; - - return (0.5 * Ccc * (Vdd*Vdd)) + ( Cbl ) * ( Vdd * Vdd ) * fCLK ; -} - -double Power_Module::powerMemoryBitLeak(double memoryDepth ){ - - return memoryDepth * IoffSRAM * Vdd ; -} - -/////////////////////////////////////////////////////////////// -//switch -////////////////////////////////////////////////////////////// - -void Power_Module::calcSwitch(const SwitchMonitor* sm){ - - switchArea += areaCrossbar(sm->NumInputs(), sm->NumOutputs()); - outputArea += areaOutputModule(sm->NumOutputs()); - switchPowerLeak += powerCrossbarLeak(channel_width, sm->NumInputs(), sm->NumOutputs()); - - const vector<int> activity = sm->GetActivity(); - vector<double> type_activity(classes); - - for(int i = 0; i<sm->NumOutputs(); i++){ - for(int k = 0; k<classes; k++){ - type_activity[k] = 0; - } - for(int j = 0; j<sm->NumInputs(); j++){ - for(int k = 0; k<classes; k++){ - double a = activity[k+classes*(i+sm->NumOutputs()*j)]; - a = a/totalTime; - if(a>1){ - cout<<"Switcht activity factor is greater than 1!!!\n";exit(-1); - } - double Px = powerCrossbar(channel_width, sm->NumInputs(),sm->NumOutputs(),j,i); - switchPower += a*channel_width*Px; - switchPowerCtrl += a *powerCrossbarCtrl(channel_width, sm->NumInputs(),sm->NumOutputs()); - type_activity[k]+=a; - } - } - outputPowerClk += powerWireClk( 1, channel_width ) ; - for(int k = 0; k<classes; k++){ - outputPower += type_activity[k] * powerWireDFF( 1, channel_width, 1.0 ) ; - outputCtrlPower += type_activity[k] * powerOutputCtrl(channel_width ) ; - } - } - -} - -double Power_Module::powerCrossbar(double width, double inputs, double outputs, double from, double to){ - // datapath traversal power - double Wxbar = width * outputs * CrossbarPitch ; - double Hxbar = width * inputs * CrossbarPitch ; - - // wires - double CwIn = Wxbar * Cw ; - double CwOut = Hxbar * Cw ; - - // cross-points - double Cxi = (1.0/16.0) * CwOut ; - double Cxo = 4.0 * Cxi * (Co_delay/Ci_delay) ; - - // drivers - double Cti = (1.0/16.0) * CwIn ; - double Cto = 4.0 * Cti * (Co_delay/Ci_delay) ; - - double CinputDriver = 5.0/16.0 * (1 + Co_delay/Ci_delay) * (0.5 * Cw * Wxbar + Cti) ; - - // total switched capacitance - - //this maybe missing +Cto - double Cin = CinputDriver + CwIn + Cti + (outputs * Cxi) ; - if ( to < outputs/2 ) { - Cin -= ( 0.5 * CwIn + outputs/2 * Cxi) ; - } - //this maybe missing +cti - double Cout = CwOut + Cto + (inputs * Cxo) ; - if ( from < inputs/2) { - Cout -= ( 0.5 * CwOut + (inputs/2 * Cxo)) ; - } - return 0.5 * (Cin + Cout) * (Vdd * Vdd * fCLK) ; -} - - -double Power_Module::powerCrossbarCtrl(double width, double inputs, double outputs){ - - // datapath traversal power - double Wxbar = width * outputs * CrossbarPitch ; - double Hxbar = width * inputs * CrossbarPitch ; - - // wires - double CwIn = Wxbar * Cw ; - - // drivers - double Cti = (5.0/16.0) * CwIn ; - - // need some estimate of how many control wires are required - double Cctrl = width * Cti + (Wxbar + Hxbar) * Cw ; - double Cdrive = (5.0/16.0) * (1 + Co_delay/Ci_delay) * Cctrl ; - - return (Cdrive + Cctrl) * (Vdd*Vdd) * fCLK ; - -} - -double Power_Module::powerCrossbarLeak (double width, double inputs, double outputs){ - // datapath traversal power - double Wxbar = width * outputs * CrossbarPitch ; - double Hxbar = width * inputs * CrossbarPitch ; - - // wires - double CwIn = Wxbar * Cw ; - double CwOut = Hxbar * Cw ; - // cross-points - double Cxi = (1.0/16.0) * CwOut ; - // drivers - double Cti = (1.0/16.0) * CwIn ; - - return 0.5 * (IoffN + 2 * IoffP)*width*(inputs*outputs*Cxi+inputs*Cti+outputs*Cti)/Ci; -} - -////////////////////////////////////////////////////////////////// -//output module -////////////////////////////////////////////////////////////////// -double Power_Module:: powerOutputCtrl(double width) { - - double Woutmod = channel_width * ChannelPitch ; - double Cen = Ci ; - - double Cenable = (1 + 5.0/16.0)*(1.0+Co/Ci)*(Woutmod* Cw + width* Cen) ; - - return Cenable * (Vdd*Vdd) * fCLK ; - -} - -////////////////////////////////////////////////////////////////// -//area -////////////////////////////////////////////////////////////////// - -double Power_Module:: areaChannel (double K, double N, double M){ - - double Adff = M * W_DFQD1 * H_DFQD1 ; - double Ainv = M * N * ( W_INVD2 + 3 * K) * H_INVD2 ; - - return channel_width * (Adff + Ainv) * MetalPitch * MetalPitch ; -} - -double Power_Module:: areaCrossbar(double Inputs, double Outputs) { - return (Inputs * channel_width * CrossbarPitch) * (Outputs * channel_width * CrossbarPitch) ; -} - -double Power_Module:: areaInputModule(double Words) { - double Asram = ( channel_width * H_SRAM ) * (Words * W_SRAM) ; - return Asram * (MetalPitch * MetalPitch) ; -} - -double Power_Module:: areaOutputModule(double Outputs) { - double Adff = Outputs * W_DFQD1 * H_DFQD1 ; - return channel_width * Adff * MetalPitch * MetalPitch ; -} - -void Power_Module::run(){ - totalTime = GetSimTime(); - channelWirePower=0; - channelClkPower=0; - channelDFFPower=0; - channelLeakPower=0; - inputReadPower=0; - inputWritePower=0; - inputLeakagePower=0; - switchPower=0; - switchPowerCtrl=0; - switchPowerLeak=0; - outputPower=0; - outputPowerClk=0; - outputCtrlPower=0; - channelArea=0; - switchArea=0; - inputArea=0; - outputArea=0; - maxInputPort = 0; - maxOutputPort = 0; - - vector<FlitChannel *> inject = net->GetInject(); - vector<FlitChannel *> eject = net->GetEject(); - vector<FlitChannel *> chan = net->GetChannels(); - - for(int i = 0; i<net->NumNodes(); i++){ - calcChannel(inject[i]); - } - - for(int i = 0; i<net->NumNodes(); i++){ - calcChannel(eject[i]); - } - - for(int i = 0; i<net->NumChannels();i++){ - calcChannel(chan[i]); - } - - vector<Router*> routers = net->GetRouters(); - for(size_t i = 0; i < routers.size(); i++){ - IQRouter* temp = dynamic_cast<IQRouter*>(routers[i]); - const BufferMonitor * bm = temp->GetBufferMonitor(); - calcBuffer(bm); - const SwitchMonitor * sm = temp->GetSwitchMonitor(); - calcSwitch(sm); - } - - double totalpower = channelWirePower+channelClkPower+channelDFFPower+channelLeakPower+ inputReadPower+inputWritePower+inputLeakagePower+ switchPower+switchPowerCtrl+switchPowerLeak+outputPower+outputPowerClk+outputCtrlPower; - double totalarea = channelArea+switchArea+inputArea+outputArea; - cout<< "-----------------------------------------\n" ; - cout<< "- OCN Power Summary\n" ; - cout<< "- Completion Time: "<<totalTime <<"\n" ; - cout<< "- Flit Widths: "<<channel_width<<"\n" ; - cout<< "- Channel Wire Power: "<<channelWirePower <<"\n" ; - cout<< "- Channel Clock Power: "<<channelClkPower <<"\n" ; - cout<< "- Channel Retiming Power: "<<channelDFFPower <<"\n" ; - cout<< "- Channel Leakage Power: "<<channelLeakPower <<"\n" ; - - cout<< "- Input Read Power: "<<inputReadPower <<"\n" ; - cout<< "- Input Write Power: "<<inputWritePower <<"\n" ; - cout<< "- Input Leakage Power: "<<inputLeakagePower <<"\n" ; - - cout<< "- Switch Power: "<<switchPower <<"\n" ; - cout<< "- Switch Control Power: "<<switchPowerCtrl <<"\n" ; - cout<< "- Switch Leakage Power: "<<switchPowerLeak <<"\n" ; - - cout<< "- Output DFF Power: "<<outputPower <<"\n" ; - cout<< "- Output Clk Power: "<<outputPowerClk <<"\n" ; - cout<< "- Output Control Power: "<<outputCtrlPower <<"\n" ; - cout<< "- Total Power: "<<totalpower <<"\n"; - cout<< "-----------------------------------------\n" ; - cout<< "\n" ; - cout<< "-----------------------------------------\n" ; - cout<< "- OCN Area Summary\n" ; - cout<< "- Channel Area: "<<channelArea<<"\n" ; - cout<< "- Switch Area: "<<switchArea<<"\n" ; - cout<< "- Input Area: "<<inputArea<<"\n" ; - cout<< "- Output Area: "<<outputArea<<"\n" ; - cout<< "- Total Area: "<<totalarea<<endl; - cout<< "-----------------------------------------\n" ; - - - - -} diff --git a/src/intersim2/.svn/pristine/10/1008fe454a2dfea0e03f6ab28358479e94cdb719.svn-base b/src/intersim2/.svn/pristine/10/1008fe454a2dfea0e03f6ab28358479e94cdb719.svn-base deleted file mode 100644 index 96083c5..0000000 --- a/src/intersim2/.svn/pristine/10/1008fe454a2dfea0e03f6ab28358479e94cdb719.svn-base +++ /dev/null @@ -1,61 +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. -*/ - -// ---------------------------------------------------------------------- -// -// SeparableAllocator: Separable Allocator Base Class -// -// ---------------------------------------------------------------------- - -#ifndef _SEPARABLE_HPP_ -#define _SEPARABLE_HPP_ - -#include <vector> - -#include "allocator.hpp" - -class Arbiter; - -class SeparableAllocator : public SparseAllocator { - -protected: - - vector<Arbiter*> _input_arb ; - vector<Arbiter*> _output_arb ; - -public: - - SeparableAllocator( Module* parent, const string& name, int inputs, - int outputs, const string& arb_type ) ; - - virtual ~SeparableAllocator() ; - - virtual void Clear() ; - -} ; - -#endif diff --git a/src/intersim2/.svn/pristine/12/125686d82b0fb03524a1bd1dc36fd9172006e780.svn-base b/src/intersim2/.svn/pristine/12/125686d82b0fb03524a1bd1dc36fd9172006e780.svn-base deleted file mode 100644 index f7e44a8..0000000 --- a/src/intersim2/.svn/pristine/12/125686d82b0fb03524a1bd1dc36fd9172006e780.svn-base +++ /dev/null @@ -1,673 +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. -*/ - -#include "booksim.hpp" -#include <string> -#include <sstream> -#include <iostream> -#include <cstdlib> - -#include "chaos_router.hpp" -#include "random_utils.hpp" -#include "globals.hpp" - -ChaosRouter::ChaosRouter( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ) - : Router( config, - parent, name, - id, - inputs, outputs ) -{ - int i; - - if ( inputs != outputs ) { - Error( "Chaos router must have equal number of input and output ports" ); - } - - _buffer_size = config.GetInt( "vc_buf_size" ); - assert(_buffer_size >= config.GetInt( "const_flits_per_packet" )); - - _multi_queue_size = config.GetInt( "multi_queue_size" ); - - _cur_channel = 0; - _read_stall = 0; - - // Routing - - string rf = config.GetStr("routing_function") + "_" + config.GetStr("topology"); - map<string, tRoutingFunction>::iterator rf_iter = gRoutingFunctionMap.find(rf); - if(rf_iter == gRoutingFunctionMap.end()) { - Error("Invalid routing function: " + rf); - } - _rf = rf_iter->second; - - _input_route.resize(_inputs); - - for ( i = 0; i < _inputs; ++i ) { - _input_route[i] = new OutputSet( ); - } - - _mq_route.resize(_multi_queue_size); - - for ( i = 0; i < _multi_queue_size; ++i ) { - _mq_route[i] = new OutputSet( ); - } - - // Alloc pipelines (to simulate processing/transmission delays) - - _crossbar_pipe = - new PipelineFIFO<Flit>( this, "crossbar_pipeline", _outputs, - _crossbar_delay ); - - // Input and output queues - - _input_frame.resize(_inputs); - _output_frame.resize(_outputs); - _multi_queue.resize(_multi_queue_size); - - _credit_queue.resize(_inputs); - - _input_state.resize(_inputs, empty); - _input_output_match.resize(_inputs, -1); - _input_mq_match.resize(_inputs, -1); - - _output_matched.resize(_outputs, false); - _next_queue_cnt.resize(_outputs, 0); - - _multi_match.resize(_multi_queue_size, -1); - _mq_age.resize(_multi_queue_size); - _mq_matched.resize(_multi_queue_size, false); - _multi_state.resize(_multi_queue_size, empty); - - for ( i = 0; i < _multi_queue_size; ++i ) { - _multi_state[i] = empty; - _multi_match[i] = -1; - _mq_matched[i] = false; - } -} - -ChaosRouter::~ChaosRouter( ) -{ - int i; - - delete _crossbar_pipe; - - for ( i = 0; i < _inputs; ++i ) { - delete _input_route[i]; - } - - for ( i = 0; i < _multi_queue_size; ++i ) { - delete _mq_route[i]; - } -} - -void ChaosRouter::ReadInputs( ) -{ - Flit *f; - Credit *c; - - for ( int input = 0; input < _inputs; ++input ) { - f = _input_channels[input]->Receive(); - - if ( f ) { - _input_frame[input].push( f ); - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Flit arriving at " << FullName() - << " on channel " << input << endl - << *f; - } - - switch( _input_state[input] ) { - case empty: - if ( f->head ) { - if ( f->tail ) { - _input_state[input] = full; - } else { - _input_state[input] = filling; - } - _rf( this, f, input, _input_route[input], false ); - } else { - cout << *f; - Error( "Empty buffer received non-head flit!" ); - } - break; - - case filling: - if ( f->tail ) { - _input_state[input] = full; - } else if ( f->head ) { - Error( "Input buffer received another head before previous tail!" ); - } - break; - - case full: - Error( "Received flit while full!" ); - break; - - case leaving: - if ( f->head ) { - _input_state[input] = shared; - - if ( f->tail ) { - Error( "Received single-flit packet in leaving state!" ); - } - } else { - cout << *f; - Error( "Received non-head flit while packet leaving!" ); - } - break; - - case cut_through: - if ( f->tail ) { - _input_state[input] = leaving; - } - if ( f->head ) { - cout << *f; - Error( "Received head flit in cut through buffer!" ); - } - break; - - case shared: - if ( f->head ) { - Error( "Shared buffer received another head!" ); - } else if ( f->tail ) { - cout << "Input " << input << endl; - cout << *f; - Error( "Shared buffer received another tail!" ); - } - break; - } - } - } - - // Process incoming credits - - for ( int output = 0; output < _outputs; ++output ) { - c = _output_credits[output]->Receive(); - - if ( c ) { - _next_queue_cnt[output]--; - - if ( _next_queue_cnt[output] < 0 ) { - Error( "Next queue count fell below zero!" ); - } - - c->Free(); - } - } -} - -void ChaosRouter::_InternalStep( ) -{ - _NextInterestingChannel( ); - _OutputAdvance( ); - - _crossbar_pipe->Advance( ); -} - -void ChaosRouter::WriteOutputs( ) -{ - _SendFlits( ); - _SendCredits( ); -} - -bool ChaosRouter::_IsInjectionChan( int chan ) const -{ - return ( chan == _inputs - 1 ); -} - -bool ChaosRouter::_IsEjectionChan( int chan ) const -{ - return ( chan == _outputs - 1 ); -} - -bool ChaosRouter::_InputReady( int input ) const -{ - bool ready = false; - - if ( ( _input_state[input] == filling ) || - ( _input_state[input] == full ) ) { - ready = true; - } - - return ready; -} - -bool ChaosRouter::_OutputFull( int out ) const -{ - return ( _output_frame[out].size( ) >= (size_t)_buffer_size ); -} - -bool ChaosRouter::_OutputAvail( int out ) const -{ - return ( ( !_output_matched[out] ) && ( _output_frame[out].empty( ) ) ); - //&& ( _next_queue_cnt[out] == 0 ) ); - //return ( ( !_output_matched[out] ) && !_OutputFull( out ) ); -} - -bool ChaosRouter::_MultiQueueFull( int mq ) const -{ - return ( _multi_queue[mq].size( ) >= (size_t)_buffer_size ); -} - -int ChaosRouter::_InputForOutput( int output ) const -{ - // return an input that prefers this output - - int input; - int offset = RandomInt( _inputs - 1 ); - bool match = false; - - for ( int i = 0; ( i < _inputs ) && ( !match ); ++i ) { - input = ( i + offset ) % _inputs; - - if ( _InputReady( input ) && - ( ! _input_route[input]->OutputEmpty( output ) ) ) { - match = true; - } - } - - return match ? input : -1; -} - -int ChaosRouter::_MultiQueueForOutput( int output ) const -{ - // return oldest multi queue that prefers the output, - // or if none prefer and the multi queue is full, - // return a random entry - - int mq_oldest = -1; - int mq_age; - - int m, r; - - bool isfull = true; - - for ( int i = 0; i < _multi_queue_size; ++i ) { - if ( ( _multi_match[i] == -1 ) && - ( ( _multi_state[i] == full ) || - ( _multi_state[i] == filling ) ) ) { - - if ( ( !_mq_route[i]->OutputEmpty( output ) ) && - ( ( mq_oldest == -1 ) || ( _mq_age[i] > mq_age ) ) ) { - mq_oldest = i; - mq_age = _mq_age[i]; - } - } - - // deroute only if all queues contain head flits ... - - if ( ( _multi_state[i] != full ) && - ( _multi_state[i] != filling ) && - ( _multi_state[i] != shared ) ) { - isfull = false; - } - } - - // Don't deroute MQs to the ejection channel - if ( ( mq_oldest == -1 ) && isfull && - ( !_IsEjectionChan( output ) ) ) { - r = RandomInt( _multi_queue_size - 1 ); - - // Find first routable multi-queue - for ( int i = 0; i < _multi_queue_size; ++i ) { - m = ( i + r ) % _multi_queue_size; - if ( ( _multi_state[m] == filling ) || - ( _multi_state[m] == full ) ) { - mq_oldest = m; - //cout << "DEROUTING at " << FullName() << endl; - break; - } - } - - if ( mq_oldest == -1 ) { - cout << "write stall" << endl; - } - } - - return mq_oldest; -} - -int ChaosRouter::_FindAvailMultiQueue( ) const -{ - // return any empty multi queue slot - - int avail = -1; - - for ( int i = 0; i < _multi_queue_size; ++i ) { - if ( ( !_MultiQueueFull( i ) ) && - ( !_mq_matched[i] ) ) { - avail = i; - break; - } - } - - return avail; -} - -void ChaosRouter::_NextInterestingChannel( ) -{ - bool interesting; - - int mq_index; - int in_index; - int mq_avail; - - int c; - - interesting = false; - mq_index = -1; - in_index = -1; - - // A channel is interesting if - // - // ( output frame available and - // ( ( a multiqueue packet wants output channel ) or - // ( an input packet wants output channel ) or - // ( the multiqueue is full ) ) ) - // or - // ( the packet at the input channel is stalled ) - - for ( c = 0; ( c < _inputs ) && ( !interesting ); ++c ) { - if ( _OutputAvail( _cur_channel ) ) { - mq_index = _MultiQueueForOutput( _cur_channel ); - in_index = _InputForOutput( _cur_channel ); - - if ( ( mq_index != -1 ) || ( in_index != -1 ) ) { - interesting = true; - } - } - - if ( _input_state[_cur_channel] == full ) { - interesting = true; - } - - if ( !interesting ) { - _cur_channel = ( _cur_channel + 1 ) % _inputs; - } - } - - if ( interesting ) { - //cout << _cur_channel << " is interesting at " << FullName() << endl; - - if ( mq_index != -1 ) { - //cout << "Match for multi-queue " << mq_index << " at " << FullName() - // << ", output matched = " << _output_matched[_cur_channel] << endl; - - _output_matched[_cur_channel] = true; - _multi_match[mq_index] = _cur_channel; - } else if ( in_index != -1 ) { - _output_matched[_cur_channel] = true; - _input_output_match[in_index] = _cur_channel; - - //cout << "Match for input " << in_index << " at " << FullName() << endl; - - if ( _input_state[in_index] == full ) { - _input_state[in_index] = leaving; - } else if ( _input_state[in_index] == filling ) { - _input_state[in_index] = cut_through; - } else { - Error( "Tried to route input through crossbar that was not full or filling!" ); - } - } - - // Any non-injection channel that is routable is - // directed to the multi-queue - if ( ( ( _input_state[_cur_channel] == filling ) || - ( _input_state[_cur_channel] == full ) ) && - ( !_IsInjectionChan( _cur_channel ) ) ) { - ++_read_stall; - } else { - // go to next channel for the next cycle - _cur_channel = ( _cur_channel + 1 ) % _inputs; - _read_stall = 0; - } - } - - if ( _read_stall > 0 ) { - mq_avail = _FindAvailMultiQueue( ); - - if ( mq_avail != -1 ) { - if ( _input_state[_cur_channel] == full ) { - _input_state[_cur_channel] = leaving; - } else if ( _input_state[_cur_channel] == filling ) { - _input_state[_cur_channel] = cut_through; - } else { - cout << "Input " << _cur_channel << " state = " - << _input_state[_cur_channel] << endl; - Error( "Tried to route input throught multi-queue that was not full or filling!" ); - } - - _input_mq_match[_cur_channel] = mq_avail; - _mq_matched[mq_avail] = true; - - // go to next channel for the next cycle - _cur_channel = ( _cur_channel + 1 ) % _inputs; - _read_stall = 0; - } else { - ++_read_stall; - //cout << "stalling at input " << _cur_channel << " (count = " << _read_stall << ")" << endl; - } - } -} - -void ChaosRouter::_OutputAdvance( ) -{ - Flit *f, *f2; - Credit *c; - bool advanced; - int mq; - - _crossbar_pipe->WriteAll( 0 ); - - for ( int i = 0; i < _inputs; ++i ) { - if ( ( ( _input_output_match[i] != -1 ) || - ( _input_mq_match[i] != -1 ) ) && - ( !_input_frame[i].empty( ) ) ) { - - advanced = false; - f = _input_frame[i].front( ); - - /*if ( ! ) { - - } else { - cout << "Input = " << i - << ", input_output_match = " << _input_output_match[i] - << ", input_mq_match = " << _input_mq_match[i] << endl; - Error( "Input queue empty, but matched!" ); - }*/ - - if ( _input_output_match[i] != -1 ) { - if ( f->tail ) { - _output_matched[_input_output_match[i]] = false; - } - - _crossbar_pipe->Write( f, _input_output_match[i] ); - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Flit traversing crossbar from input queue " - << i << " at " - << FullName() << endl - << *f; - } - - advanced = true; - - } else if ( !_MultiQueueFull( _input_mq_match[i] ) ) { - - mq = _input_mq_match[i]; - - if ( f->head ) { - _rf( this, f, i, _mq_route[mq], false ); - _mq_age[mq] = 0; - - if ( _multi_state[mq] == empty ) { - _multi_state[mq] = filling; - } else if ( _multi_state[mq] == leaving ) { - _multi_state[mq] = shared; - } else { - Error( "Multi-queue received head while not empty or leaving!" ); - } - } - - if ( f->tail ) { - _mq_matched[mq] = false; - - if ( _multi_state[mq] == filling ) { - _multi_state[mq] = full; - } else if ( _multi_state[mq] == cut_through ) { - _multi_state[mq] = leaving; - } else { - Error( "Multi-queue received tail while not filling or cutting-through!" ); - } - } - - _multi_queue[mq].push( f ); - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Flit stored in multiqueue at " - << FullName() << endl - << "State = " << _multi_state[mq] << endl - << *f; - } - - advanced = true; - } - - if ( advanced ) { - _input_frame[i].pop( ); - - if ( f->tail ) { // last in packet, update state - if ( _input_state[i] == leaving ) { - _input_state[i] = empty; - } else if ( _input_state[i] == shared ) { - _input_state[i] = filling; - f2 = _input_frame[i].front( ); - // update routes - _rf( this, f2, i, _input_route[i], false ); - } - - _input_output_match[i] = -1; - _input_mq_match[i] = -1; - } - - c = Credit::New( ); - c->vc.insert(0); - _credit_queue[i].push( c ); - } - } - } - - for ( int m = 0; m < _multi_queue_size; ++m ) { - if ( _multi_match[m] != -1 ) { - if ( _multi_queue[m].empty( ) ) { - cout << "State = " << _multi_state[m] << endl; - Error( "Multi queue empty, but matched!" ); - } - assert( !_multi_queue[m].empty( ) ); - f = _multi_queue[m].front( ); - _multi_queue[m].pop( ); - - _crossbar_pipe->Write( f, _multi_match[m] ); - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Flit traversing crossbar from multiqueue slot " - << m << " at " - << FullName() << endl - << *f; - } - - if ( f->head ) { - if ( _multi_state[m] == filling ) { - _multi_state[m] = cut_through; - } else if ( _multi_state[m] == full ) { - _multi_state[m] = leaving; - } else { - Error( "Multi-queue sent head while not filling or full!" ); - } - } - - if ( f->tail ) { - _output_matched[_multi_match[m]] = false; - _multi_match[m] = -1; - - if ( _multi_state[m] == shared ) { - _multi_state[m] = filling; - } else if ( _multi_state[m] == leaving ) { - _multi_state[m] = empty; - } else { - cout << "State = " << _multi_state[m] << endl; - cout << *f; - Error( "Multi-queue sent tail while not leaving or shared!" ); - } - } - } - - _mq_age[m]++; - } -} - - -void ChaosRouter::_SendFlits( ) -{ - for ( int output = 0; output < _outputs; ++output ) { - Flit *f = _crossbar_pipe->Read( output ); - - if ( f ) { - _output_frame[output].push( f ); - f->hops++; - } - - if ( ( _next_queue_cnt[output] < _buffer_size ) && - ( !_output_frame[output].empty( ) ) ) { - _output_channels[output]->Send( _output_frame[output].front( ) ); - _output_frame[output].pop( ); - ++_next_queue_cnt[output]; - } - } -} - -void ChaosRouter::_SendCredits( ) -{ - for ( int input = 0; input < _inputs; ++input ) { - if ( !_credit_queue[input].empty( ) ) { - Credit *c = _credit_queue[input].front( ); - _credit_queue[input].pop( ); - _input_credits[input]->Send( c ); - } - } -} - -void ChaosRouter::Display( ostream & os ) const -{ -} diff --git a/src/intersim2/.svn/pristine/12/1260dd25f0b77d1694bc40d60681090fdb77e795.svn-base b/src/intersim2/.svn/pristine/12/1260dd25f0b77d1694bc40d60681090fdb77e795.svn-base deleted file mode 100644 index 6488ea4..0000000 --- a/src/intersim2/.svn/pristine/12/1260dd25f0b77d1694bc40d60681090fdb77e795.svn-base +++ /dev/null @@ -1,186 +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. -*/ - -#ifndef _POWER_MODULE_HPP_ -#define _POWER_MODULE_HPP_ - -#include <map> - -#include "module.hpp" -#include "network.hpp" -#include "config_utils.hpp" -#include "flitchannel.hpp" -#include "switch_monitor.hpp" -#include "buffer_monitor.hpp" - -struct wire{ - double L; - double K; - double M; - double N; -}; - -class Power_Module : public Module { - -protected: - //network undersimulation - Network * net; - int classes; - //all channels are this width - double channel_width; - //resimulate all with channel_width decremented by channel_sweep until 0 - double channel_sweep; - //write result to a tabbed format to file - string output_file_name; - - //buffer depth - double depthVC; - //vcs - double numVC; - - //store the property of wires based on length - map<double, wire> wire_map; - - //////////////////////////////////Constants///////////////////////////// - //wire length in (mm) - double wire_length; - //////////Metal Parameters//////////// - // Wire left/right coupling capacitance [ F/mm ] - double Cw_cpl ; - // Wire up/down groudn capacitance [ F/mm ] - double Cw_gnd ; - double Cw ; - double Rw ; - // metal pitch [mm] - double MetalPitch ; - - - //////////Device Parameters//////////// - - double LAMBDA ; // [um/LAMBDA] - double Cd ; // [F/um] (for Delay) - double Cg ; // [F/um] (for Delay) - double Cgdl ; // [F/um] (for Delay) - - double Cd_pwr; // [F/um] (for Power) - double Cg_pwr ; // [F/um] (for Power) - - double IoffN ; // [A/um] - double IoffP ; // [A/um] - // Leakage from bitlines, two-port cell [A] - double IoffSRAM; - // [Ohm] ( D1=1um Inverter) - double R ; - // [F] ( D1=1um Inverter - for Power ) - double Ci_delay; - // [F] ( D1=1um Inverter - for Power ) - double Co_delay ; - - double Ci ; - double Co ; - double Vdd ; - double FO4 ; - double tCLK ; - double fCLK ; - - double H_INVD2; - double W_INVD2; - double H_DFQD1; - double W_DFQD1; - double H_ND2D1; - double W_ND2D1; - double H_SRAM; - double W_SRAM; - double ChannelPitch ; - double CrossbarPitch; - ////////////////////////////////End of Constants///////////////////////////// - - /////////////results/////////////////// - double totalTime; - double channelWirePower; - double channelClkPower; - double channelDFFPower; - double channelLeakPower; - double inputReadPower; - double inputWritePower; - double inputLeakagePower; - double switchPower; - double switchPowerCtrl; - double switchPowerLeak; - double outputPower; - double outputPowerClk; - double outputCtrlPower; - double channelArea; - double switchArea; - double inputArea; - double outputArea; - double maxInputPort; - double maxOutputPort; - - - //////////////////////// - - //channels - void calcChannel(const FlitChannel * f); - wire const & wireOptimize(double l); - double powerRepeatedWire(double L, double K, double M, double N); - double powerRepeatedWireLeak (double K, double M, double N); - double powerWireClk (double M, double W); - double powerWireDFF(double M, double W, double alpha); - - //memory - void calcBuffer(const BufferMonitor *bm); - double powerWordLine(double memoryWidth, double memoryDepth); - double powerMemoryBitRead(double memoryDepth); - double powerMemoryBitWrite(double memoryDepth); - double powerMemoryBitLeak(double memoryDepth ); - - //switch - void calcSwitch(const SwitchMonitor *sm); - double powerCrossbar(double width, double inputs, double outputs, double from, double to); - double powerCrossbarCtrl(double width, double inputs, double outputs); - double powerCrossbarLeak (double width, double inputs, double outputs); - - //output - double powerOutputCtrl(double width); - - //area - - double areaChannel (double K, double N, double M); - double areaCrossbar(double Inputs, double Outputs) ; - double areaInputModule(double Words) ; - double areaOutputModule(double Outputs); - -public: - Power_Module(Network * net, const Configuration &config); - ~Power_Module(); - - void run(); - - -}; -#endif diff --git a/src/intersim2/.svn/pristine/12/129d383ada436691b3879ee38f72c6420d1b3b86.svn-base b/src/intersim2/.svn/pristine/12/129d383ada436691b3879ee38f72c6420d1b3b86.svn-base deleted file mode 100644 index 6aa2d53..0000000 --- a/src/intersim2/.svn/pristine/12/129d383ada436691b3879ee38f72c6420d1b3b86.svn-base +++ /dev/null @@ -1,481 +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. -*/ - -#include "booksim.hpp" -#include <iostream> -#include <sstream> -#include <cassert> -#include "allocator.hpp" - -///////////////////////////////////////////////////////////////////////// -//Allocator types -#include "maxsize.hpp" -#include "pim.hpp" -#include "islip.hpp" -#include "loa.hpp" -#include "wavefront.hpp" -#include "selalloc.hpp" -#include "separable_input_first.hpp" -#include "separable_output_first.hpp" -// -///////////////////////////////////////////////////////////////////////// - -//================================================== -// Allocator base class -//================================================== - -Allocator::Allocator( Module *parent, const string& name, - int inputs, int outputs ) : -Module( parent, name ), _inputs( inputs ), _outputs( outputs ), _dirty( false ) -{ - _inmatch.resize(_inputs, -1); - _outmatch.resize(_outputs, -1); -} - -void Allocator::Clear( ) -{ - if(_dirty) { - _inmatch.assign(_inputs, -1); - _outmatch.assign(_outputs, -1); - _dirty = false; - } -} - -void Allocator::AddRequest( int in, int out, int label, int in_pri, - int out_pri ) { - - assert( ( in >= 0 ) && ( in < _inputs ) ); - assert( ( out >= 0 ) && ( out < _outputs ) ); - assert( label >= 0 ); - _dirty = true; -} - -int Allocator::OutputAssigned( int in ) const -{ - assert( ( in >= 0 ) && ( in < _inputs ) ); - - return _inmatch[in]; -} - -int Allocator::InputAssigned( int out ) const -{ - assert( ( out >= 0 ) && ( out < _outputs ) ); - - return _outmatch[out]; -} - -void Allocator::PrintGrants( ostream * os ) const -{ - if(!os) os = &cout; - - *os << "Input grants = [ "; - for ( int input = 0; input < _inputs; ++input ) { - if(_inmatch[input] >= 0) { - *os << input << " -> " << _inmatch[input] << " "; - } - } - *os << "], output grants = [ "; - for ( int output = 0; output < _outputs; ++output ) { - if(_outmatch[output] >= 0) { - *os << output << " -> " << _outmatch[output] << " "; - } - } - *os << "]." << endl; -} - -//================================================== -// DenseAllocator -//================================================== - -DenseAllocator::DenseAllocator( Module *parent, const string& name, - int inputs, int outputs ) : - Allocator( parent, name, inputs, outputs ) -{ - _request.resize(_inputs); - - for ( int i = 0; i < _inputs; ++i ) { - _request[i].resize(_outputs); - for ( int j = 0; j < _outputs; ++j ) { - _request[i][j].label = -1; - } - } -} - -void DenseAllocator::Clear( ) -{ - for ( int i = 0; i < _inputs; ++i ) { - for ( int j = 0; j < _outputs; ++j ) { - _request[i][j].label = -1; - } - } - Allocator::Clear(); -} - -int DenseAllocator::ReadRequest( int in, int out ) const -{ - assert( ( in >= 0 ) && ( in < _inputs ) ); - assert( ( out >= 0 ) && ( out < _outputs ) ); - - return _request[in][out].label; -} - -bool DenseAllocator::ReadRequest( sRequest &req, int in, int out ) const -{ - assert( ( in >= 0 ) && ( in < _inputs ) ); - assert( ( out >= 0 ) && ( out < _outputs ) ); - - req = _request[in][out]; - - return ( req.label >= 0 ); -} - -void DenseAllocator::AddRequest( int in, int out, int label, - int in_pri, int out_pri ) -{ - Allocator::AddRequest(in, out, label, in_pri, out_pri); - assert( _request[in][out].label == -1 ); - - _request[in][out].label = label; - _request[in][out].in_pri = in_pri; - _request[in][out].out_pri = out_pri; -} - -void DenseAllocator::RemoveRequest( int in, int out, int label ) -{ - assert( ( in >= 0 ) && ( in < _inputs ) ); - assert( ( out >= 0 ) && ( out < _outputs ) ); - - _request[in][out].label = -1; -} - -bool DenseAllocator::InputHasRequests( int in ) const -{ - for(int out = 0; out < _outputs; ++out) { - if(_request[in][out].label >= 0) { - return true; - } - } - return false; -} - -bool DenseAllocator::OutputHasRequests( int out ) const -{ - for(int in = 0; in < _inputs; ++in) { - if(_request[in][out].label >= 0) { - return true; - } - } - return false; -} - -int DenseAllocator::NumInputRequests( int in ) const -{ - int result = 0; - for(int out = 0; out < _outputs; ++out) { - if(_request[in][out].label >= 0) { - ++result; - } - } - return result; -} - -int DenseAllocator::NumOutputRequests( int out ) const -{ - int result = 0; - for(int in = 0; in < _inputs; ++in) { - if(_request[in][out].label >= 0) { - ++result; - } - } - return result; -} - -void DenseAllocator::PrintRequests( ostream * os ) const -{ - if(!os) os = &cout; - - *os << "Input requests = [ "; - for ( int input = 0; input < _inputs; ++input ) { - bool print = false; - ostringstream ss; - for ( int output = 0; output < _outputs; ++output ) { - const sRequest & req = _request[input][output]; - if ( req.label >= 0 ) { - print = true; - ss << output << "@" << req.in_pri << " "; - } - } - if(print) { - *os << input << " -> [ " << ss.str() << "] "; - } - } - *os << "], output requests = [ "; - for ( int output = 0; output < _outputs; ++output ) { - bool print = false; - ostringstream ss; - for ( int input = 0; input < _inputs; ++input ) { - const sRequest & req = _request[input][output]; - if ( req.label >= 0 ) { - print = true; - ss << input << "@" << req.out_pri << " "; - } - } - if(print) { - *os << output << " -> [ " << ss.str() << "] "; - } - } - *os << "]." << endl; -} - -//================================================== -// SparseAllocator -//================================================== - -SparseAllocator::SparseAllocator( Module *parent, const string& name, - int inputs, int outputs ) : - Allocator( parent, name, inputs, outputs ) -{ - _in_req.resize(_inputs); - _out_req.resize(_outputs); -} - - -void SparseAllocator::Clear( ) -{ - for ( int i = 0; i < _inputs; ++i ) { - if(!_in_req[i].empty()) - _in_req[i].clear( ); - } - - for ( int j = 0; j < _outputs; ++j ) { - if(!_out_req[j].empty()) - _out_req[j].clear( ); - } - - _in_occ.clear( ); - _out_occ.clear( ); - - Allocator::Clear(); -} - -int SparseAllocator::ReadRequest( int in, int out ) const -{ - sRequest r; - - if ( ! ReadRequest( r, in, out ) ) { - r.label = -1; - } - - return r.label; -} - -bool SparseAllocator::ReadRequest( sRequest &req, int in, int out ) const -{ - bool found; - - assert( ( in >= 0 ) && ( in < _inputs ) ); - assert( ( out >= 0 ) && ( out < _outputs ) ); - - map<int, sRequest>::const_iterator match = _in_req[in].find(out); - if ( match != _in_req[in].end( ) ) { - req = match->second; - found = true; - } else { - found = false; - } - - return found; -} - -void SparseAllocator::AddRequest( int in, int out, int label, - int in_pri, int out_pri ) -{ - Allocator::AddRequest(in, out, label, in_pri, out_pri); - assert( _in_req[in].count(out) == 0 ); - assert( _out_req[out].count(in) == 0 ); - - // insert into occupied inputs set if - // input is currently empty - if ( _in_req[in].empty( ) ) { - _in_occ.insert(in); - } - - // similarly for the output - if ( _out_req[out].empty( ) ) { - _out_occ.insert(out); - } - - sRequest req; - req.port = out; - req.label = label; - req.in_pri = in_pri; - req.out_pri = out_pri; - - _in_req[in][out] = req; - - req.port = in; - - _out_req[out][in] = req; -} - -void SparseAllocator::RemoveRequest( int in, int out, int label ) -{ - assert( ( in >= 0 ) && ( in < _inputs ) ); - assert( ( out >= 0 ) && ( out < _outputs ) ); - - assert( _in_req[in].count( out ) > 0 ); - assert( _in_req[in][out].label == label ); - _in_req[in].erase( out ); - - // remove from occupied inputs list if - // input is now empty - if ( _in_req[in].empty( ) ) { - _in_occ.erase(in); - } - - // similarly for the output - assert( _out_req[out].count( in ) > 0 ); - assert( _out_req[out][in].label == label ); - _out_req[out].erase( in ); - - if ( _out_req[out].empty( ) ) { - _out_occ.erase(out); - } -} - -bool SparseAllocator::InputHasRequests( int in ) const -{ - return _in_occ.count(in) > 0; -} - -bool SparseAllocator::OutputHasRequests( int out ) const -{ - return _out_occ.count(out) > 0; -} - -int SparseAllocator::NumInputRequests( int in ) const -{ - return _in_occ.count(in); -} - -int SparseAllocator::NumOutputRequests( int out ) const -{ - return _out_occ.count(out); -} - -void SparseAllocator::PrintRequests( ostream * os ) const -{ - map<int, sRequest>::const_iterator iter; - - if(!os) os = &cout; - - *os << "Input requests = [ "; - for ( int input = 0; input < _inputs; ++input ) { - if(!_in_req[input].empty()) { - *os << input << " -> [ "; - for ( iter = _in_req[input].begin( ); - iter != _in_req[input].end( ); iter++ ) { - *os << iter->second.port << "@" << iter->second.in_pri << " "; - } - *os << "] "; - } - } - *os << "], output requests = [ "; - for ( int output = 0; output < _outputs; ++output ) { - if(!_out_req[output].empty()) { - *os << output << " -> "; - *os << "[ "; - for ( iter = _out_req[output].begin( ); - iter != _out_req[output].end( ); iter++ ) { - *os << iter->second.port << "@" << iter->second.out_pri << " "; - } - *os << "] "; - } - } - *os << "]." << endl; -} - -//================================================== -// Global allocator allocation function -//================================================== - -Allocator *Allocator::NewAllocator( Module *parent, const string& name, - const string &alloc_type, - int inputs, int outputs, - Configuration const * const config ) -{ - Allocator *a = 0; - - string alloc_name; - string param_str; - size_t left = alloc_type.find_first_of('('); - if(left == string::npos) { - alloc_name = alloc_type; - } else { - alloc_name = alloc_type.substr(0, left); - size_t right = alloc_type.find_last_of(')'); - if(right == string::npos) { - param_str = alloc_type.substr(left+1); - } else { - param_str = alloc_type.substr(left+1, right-left-1); - } - } - if ( alloc_name == "max_size" ) { - a = new MaxSizeMatch( parent, name, inputs, outputs ); - } else if ( alloc_name == "pim" ) { - int iters = param_str.empty() ? (config ? config->GetInt("alloc_iters") : 1) : atoi(param_str.c_str()); - a = new PIM( parent, name, inputs, outputs, iters ); - } else if ( alloc_name == "islip" ) { - int iters = param_str.empty() ? (config ? config->GetInt("alloc_iters") : 1) : atoi(param_str.c_str()); - a = new iSLIP_Sparse( parent, name, inputs, outputs, iters ); - } else if ( alloc_name == "loa" ) { - a = new LOA( parent, name, inputs, outputs ); - } else if ( alloc_name == "wavefront" ) { - a = new Wavefront( parent, name, inputs, outputs ); - } else if ( alloc_name == "rr_wavefront" ) { - a = new Wavefront( parent, name, inputs, outputs, true ); - } else if ( alloc_name == "select" ) { - int iters = param_str.empty() ? (config ? config->GetInt("alloc_iters") : 1) : atoi(param_str.c_str()); - a = new SelAlloc( parent, name, inputs, outputs, iters ); - } else if (alloc_name == "separable_input_first") { - string arb_type = param_str.empty() ? (config ? config->GetStr("arb_type") : "round_robin") : param_str; - a = new SeparableInputFirstAllocator( parent, name, inputs, outputs, - arb_type ); - } else if (alloc_name == "separable_output_first") { - string arb_type = param_str.empty() ? (config ? config->GetStr("arb_type") : "round_robin") : param_str; - a = new SeparableOutputFirstAllocator( parent, name, inputs, outputs, - arb_type ); - } - -//================================================== -// Insert new allocators here, add another else if -//================================================== - - - return a; -} - diff --git a/src/intersim2/.svn/pristine/13/135d8312fc0bb109518f6bfc62cbbf814c7d587c.svn-base b/src/intersim2/.svn/pristine/13/135d8312fc0bb109518f6bfc62cbbf814c7d587c.svn-base deleted file mode 100644 index 27428d9..0000000 --- a/src/intersim2/.svn/pristine/13/135d8312fc0bb109518f6bfc62cbbf814c7d587c.svn-base +++ /dev/null @@ -1,112 +0,0 @@ -/* This program by D E Knuth is in the public domain and freely copyable. - * It is explained in Seminumerical Algorithms, 3rd edition, Section 3.6 - * (or in the errata to the 2nd edition --- see - * http://www-cs-faculty.stanford.edu/~knuth/taocp.html - * in the changes to Volume 2 on pages 171 and following). */ - -/* N.B. The MODIFICATIONS introduced in the 9th printing (2002) are - included here; there's no backwards compatibility with the original. */ - -/* This version also adopts Brendan McKay's suggestion to - accommodate naive users who forget to call ranf_start(seed). */ - -/* If you find any bugs, please report them immediately to - * (and you will be rewarded if the bug is genuine). Thanks! */ - -/************ see the book for explanations and caveats! *******************/ -/************ in particular, you need two's complement arithmetic **********/ - -#define KK 100 /* the long lag */ -#define LL 37 /* the short lag */ -#define mod_sum(x,y) (((x)+(y))-(int)((x)+(y))) /* (x+y) mod 1.0 */ - -double ran_u[KK]; /* the generator state */ - -#ifdef __STDC__ -void ranf_array(double aa[], int n) -#else -void ranf_array(aa,n) /* put n new random fractions in aa */ - double *aa; /* destination */ - int n; /* array length (must be at least KK) */ -#endif -{ - register int i,j; - for (j=0;j<KK;j++) aa[j]=ran_u[j]; - for (;j<n;j++) aa[j]=mod_sum(aa[j-KK],aa[j-LL]); - for (i=0;i<LL;i++,j++) ran_u[i]=mod_sum(aa[j-KK],aa[j-LL]); - for (;i<KK;i++,j++) ran_u[i]=mod_sum(aa[j-KK],ran_u[i-LL]); -} - -/* the following routines are adapted from exercise 3.6--15 */ -/* after calling ranf_start, get new randoms by, e.g., "x=ranf_arr_next()" */ - -#define QUALITY 1009 /* recommended quality level for high-res use */ -double ranf_arr_buf[QUALITY]; -double ranf_arr_dummy=-1.0, ranf_arr_started=-1.0; -double *ranf_arr_ptr=&ranf_arr_dummy; /* the next random fraction, or -1 */ - -#define TT 70 /* guaranteed separation between streams */ -#define is_odd(s) ((s)&1) - -#ifdef __STDC__ -void ranf_start(long seed) -#else -void ranf_start(seed) /* do this before using ranf_array */ - long seed; /* selector for different streams */ -#endif -{ - register int t,s,j; - double u[KK+KK-1]; - double ulp=(1.0/(1L<<30))/(1L<<22); /* 2 to the -52 */ - double ss=2.0*ulp*((seed&0x3fffffff)+2); - - for (j=0;j<KK;j++) { - u[j]=ss; /* bootstrap the buffer */ - ss+=ss; if (ss>=1.0) ss-=1.0-2*ulp; /* cyclic shift of 51 bits */ - } - u[1]+=ulp; /* make u[1] (and only u[1]) "odd" */ - for (s=seed&0x3fffffff,t=TT-1; t; ) { - for (j=KK-1;j>0;j--) - u[j+j]=u[j],u[j+j-1]=0.0; /* "square" */ - for (j=KK+KK-2;j>=KK;j--) { - u[j-(KK-LL)]=mod_sum(u[j-(KK-LL)],u[j]); - u[j-KK]=mod_sum(u[j-KK],u[j]); - } - if (is_odd(s)) { /* "multiply by z" */ - for (j=KK;j>0;j--) u[j]=u[j-1]; - u[0]=u[KK]; /* shift the buffer cyclically */ - u[LL]=mod_sum(u[LL],u[KK]); - } - if (s) s>>=1; else t--; - } - for (j=0;j<LL;j++) ran_u[j+KK-LL]=u[j]; - for (;j<KK;j++) ran_u[j-LL]=u[j]; - for (j=0;j<10;j++) ranf_array(u,KK+KK-1); /* warm things up */ - ranf_arr_ptr=&ranf_arr_started; -} - -#define ranf_arr_next() (*ranf_arr_ptr>=0? *ranf_arr_ptr++: ranf_arr_cycle()) -double ranf_arr_cycle() -{ - if (ranf_arr_ptr==&ranf_arr_dummy) - ranf_start(314159L); /* the user forgot to initialize */ - ranf_array(ranf_arr_buf,QUALITY); - ranf_arr_buf[KK]=-1; - ranf_arr_ptr=ranf_arr_buf+1; - return ranf_arr_buf[0]; -} - -#include <stdio.h> -int main() -{ - register int m; double a[2009]; /* a rudimentary test */ - ranf_start(310952); - for (m=0;m<2009;m++) ranf_array(a,1009); - printf("%.20f\n", ran_u[0]); /* 0.36410514377569680455 */ - /* beware of buggy printf routines that do not give full accuracy here! */ - ranf_start(310952); - for (m=0;m<1009;m++) ranf_array(a,2009); - printf("%.20f\n", ran_u[0]); /* 0.36410514377569680455 */ - return 0; -} diff --git a/src/intersim2/.svn/pristine/13/13e96ce60fa5bdc9726f48b5186ae562fcd4bbeb.svn-base b/src/intersim2/.svn/pristine/13/13e96ce60fa5bdc9726f48b5186ae562fcd4bbeb.svn-base deleted file mode 100644 index 42bee23..0000000 --- a/src/intersim2/.svn/pristine/13/13e96ce60fa5bdc9726f48b5186ae562fcd4bbeb.svn-base +++ /dev/null @@ -1,53 +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. -*/ - -#ifndef _BOOKSIM_CONFIG_HPP_ -#define _BOOKSIM_CONFIG_HPP_ - -#include "config_utils.hpp" - -class BookSimConfig : public Configuration { -protected: - -public: - BookSimConfig( ); -}; - -#endif - -#ifndef _POWER_CONFIG_HPP_ -#define _POWER_CONFIG_HPP_ - -#include "config_utils.hpp" - -class PowerConfig : public Configuration { -public: - PowerConfig( ); - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/14/14292d017cd222997f376c20ca99e10a17cb7e0c.svn-base b/src/intersim2/.svn/pristine/14/14292d017cd222997f376c20ca99e10a17cb7e0c.svn-base deleted file mode 100644 index 07259a3..0000000 --- a/src/intersim2/.svn/pristine/14/14292d017cd222997f376c20ca99e10a17cb7e0c.svn-base +++ /dev/null @@ -1,319 +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. -*/ - -/*kn.cpp - * - *Meshs, cube, torus - * - */ - -#include "booksim.hpp" -#include <vector> -#include <sstream> -#include "kncube.hpp" -#include "random_utils.hpp" -#include "misc_utils.hpp" - //#include "iq_router.hpp" - - -KNCube::KNCube( const Configuration &config, const string & name, bool mesh ) : -Network( config, name ) -{ - _mesh = mesh; - - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); -} - -void KNCube::_ComputeSize( const Configuration &config ) -{ - _k = config.GetInt( "k" ); - _n = config.GetInt( "n" ); - - gK = _k; gN = _n; - _size = powi( _k, _n ); - _channels = 2*_n*_size; - - _nodes = _size; -} - -void KNCube::RegisterRoutingFunctions() { - -} -void KNCube::_BuildNet( const Configuration &config ) -{ - int left_node; - int right_node; - - int right_input; - int left_input; - - int right_output; - int left_output; - - ostringstream router_name; - - //latency type, noc or conventional network - bool use_noc_latency; - use_noc_latency = (config.GetInt("use_noc_latency")==1); - - for ( int node = 0; node < _size; ++node ) { - - router_name << "router"; - - if ( _k > 1 ) { - for ( int dim_offset = _size / _k; dim_offset >= 1; dim_offset /= _k ) { - router_name << "_" << ( node / dim_offset ) % _k; - } - } - - _routers[node] = Router::NewRouter( config, this, router_name.str( ), - node, 2*_n + 1, 2*_n + 1 ); - _timed_modules.push_back(_routers[node]); - - router_name.str(""); - - for ( int dim = 0; dim < _n; ++dim ) { - - //find the neighbor - left_node = _LeftNode( node, dim ); - right_node = _RightNode( node, dim ); - - // - // Current (N)ode - // (L)eft node - // (R)ight node - // - // L--->N<---R - // L<---N--->R - // - - // torus channel is longer due to wrap around - int latency = _mesh ? 1 : 2 ; - - //get the input channel number - right_input = _LeftChannel( right_node, dim ); - left_input = _RightChannel( left_node, dim ); - - //add the input channel - _routers[node]->AddInputChannel( _chan[right_input], _chan_cred[right_input] ); - _routers[node]->AddInputChannel( _chan[left_input], _chan_cred[left_input] ); - - //set input channel latency - if(use_noc_latency){ - _chan[right_input]->SetLatency( latency ); - _chan[left_input]->SetLatency( latency ); - _chan_cred[right_input]->SetLatency( latency ); - _chan_cred[left_input]->SetLatency( latency ); - } else { - _chan[left_input]->SetLatency( 1 ); - _chan_cred[right_input]->SetLatency( 1 ); - _chan_cred[left_input]->SetLatency( 1 ); - _chan[right_input]->SetLatency( 1 ); - } - //get the output channel number - right_output = _RightChannel( node, dim ); - left_output = _LeftChannel( node, dim ); - - //add the output channel - _routers[node]->AddOutputChannel( _chan[right_output], _chan_cred[right_output] ); - _routers[node]->AddOutputChannel( _chan[left_output], _chan_cred[left_output] ); - - //set output channel latency - if(use_noc_latency){ - _chan[right_output]->SetLatency( latency ); - _chan[left_output]->SetLatency( latency ); - _chan_cred[right_output]->SetLatency( latency ); - _chan_cred[left_output]->SetLatency( latency ); - } else { - _chan[right_output]->SetLatency( 1 ); - _chan[left_output]->SetLatency( 1 ); - _chan_cred[right_output]->SetLatency( 1 ); - _chan_cred[left_output]->SetLatency( 1 ); - - } - } - //injection and ejection channel, always 1 latency - _routers[node]->AddInputChannel( _inject[node], _inject_cred[node] ); - _routers[node]->AddOutputChannel( _eject[node], _eject_cred[node] ); - _inject[node]->SetLatency( 1 ); - _eject[node]->SetLatency( 1 ); - } -} - -int KNCube::_LeftChannel( int node, int dim ) -{ - // The base channel for a node is 2*_n*node - int base = 2*_n*node; - // The offset for a left channel is 2*dim + 1 - int off = 2*dim + 1; - - return ( base + off ); -} - -int KNCube::_RightChannel( int node, int dim ) -{ - // The base channel for a node is 2*_n*node - int base = 2*_n*node; - // The offset for a right channel is 2*dim - int off = 2*dim; - return ( base + off ); -} - -int KNCube::_LeftNode( int node, int dim ) -{ - int k_to_dim = powi( _k, dim ); - int loc_in_dim = ( node / k_to_dim ) % _k; - int left_node; - // if at the left edge of the dimension, wraparound - if ( loc_in_dim == 0 ) { - left_node = node + (_k-1)*k_to_dim; - } else { - left_node = node - k_to_dim; - } - - return left_node; -} - -int KNCube::_RightNode( int node, int dim ) -{ - int k_to_dim = powi( _k, dim ); - int loc_in_dim = ( node / k_to_dim ) % _k; - int right_node; - // if at the right edge of the dimension, wraparound - if ( loc_in_dim == ( _k-1 ) ) { - right_node = node - (_k-1)*k_to_dim; - } else { - right_node = node + k_to_dim; - } - - return right_node; -} - -int KNCube::GetN( ) const -{ - return _n; -} - -int KNCube::GetK( ) const -{ - return _k; -} - -/*legacy, not sure how this fits into the own scheme of things*/ -void KNCube::InsertRandomFaults( const Configuration &config ) -{ - int num_fails; - unsigned long prev_seed; - - int node, chan; - int i, j, t, n, c; - bool available; - - bool edge; - - num_fails = config.GetInt( "link_failures" ); - - if ( _size && num_fails ) { - prev_seed = RandomIntLong( ); - RandomSeed( config.GetInt( "fail_seed" ) ); - - vector<bool> fail_nodes(_size); - - for ( i = 0; i < _size; ++i ) { - node = i; - - // edge test - edge = false; - for ( n = 0; n < _n; ++n ) { - if ( ( ( node % _k ) == 0 ) || - ( ( node % _k ) == _k - 1 ) ) { - edge = true; - } - node /= _k; - } - - if ( edge ) { - fail_nodes[i] = true; - } else { - fail_nodes[i] = false; - } - } - - for ( i = 0; i < num_fails; ++i ) { - j = RandomInt( _size - 1 ); - available = false; - - for ( t = 0; ( t < _size ) && (!available); ++t ) { - node = ( j + t ) % _size; - - if ( !fail_nodes[node] ) { - // check neighbors - c = RandomInt( 2*_n - 1 ); - - for ( n = 0; ( n < 2*_n ) && (!available); ++n ) { - chan = ( n + c ) % 2*_n; - - if ( chan % 1 ) { - available = fail_nodes[_LeftNode( node, chan/2 )]; - } else { - available = fail_nodes[_RightNode( node, chan/2 )]; - } - } - } - - if ( !available ) { - cout << "skipping " << node << endl; - } - } - - if ( t == _size ) { - Error( "Could not find another possible fault channel" ); - } - - - OutChannelFault( node, chan ); - fail_nodes[node] = true; - - for ( n = 0; ( n < _n ) && available ; ++n ) { - fail_nodes[_LeftNode( node, n )] = true; - fail_nodes[_RightNode( node, n )] = true; - } - - cout << "failure at node " << node << ", channel " - << chan << endl; - } - - RandomSeed( prev_seed ); - } -} - -double KNCube::Capacity( ) const -{ - return (double)_k / ( _mesh ? 8.0 : 4.0 ); -} diff --git a/src/intersim2/.svn/pristine/14/14cfb5d4ea815b6697d047697a25ef8cfb9e17de.svn-base b/src/intersim2/.svn/pristine/14/14cfb5d4ea815b6697d047697a25ef8cfb9e17de.svn-base deleted file mode 100644 index ba64824..0000000 --- a/src/intersim2/.svn/pristine/14/14cfb5d4ea815b6697d047697a25ef8cfb9e17de.svn-base +++ /dev/null @@ -1,57 +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. - -//A single cross 10X10 cross bar under injection mode - -topology = fly; - -k = 10; -n = 1; - -num_vcs = 8; - -vc_buf_size = 8; - -vc_allocator = separable_input_first; -sw_allocator = separable_input_first; - -routing_function = dest_tag; - -traffic = uniform; - -use_read_write = 0; - -injection_rate = 1.0; - - - - -sample_period = 100000; - -routing_delay = 0; -vc_alloc_delay = 1; -sw_alloc_delay = 1; -st_final_delay = 1; diff --git a/src/intersim2/.svn/pristine/15/1567f00df3a29e4f360b35e014b1f69cf281f55a.svn-base b/src/intersim2/.svn/pristine/15/1567f00df3a29e4f360b35e014b1f69cf281f55a.svn-base deleted file mode 100644 index 5a20263..0000000 --- a/src/intersim2/.svn/pristine/15/1567f00df3a29e4f360b35e014b1f69cf281f55a.svn-base +++ /dev/null @@ -1,68 +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. -*/ - -#ifndef _PRIO_ARB_HPP_ -#define _PRIO_ARB_HPP_ - -#include <list> - -#include "module.hpp" -#include "config_utils.hpp" - -class PriorityArbiter : public Module { - int _rr_ptr; - -protected: - const int _inputs; - - struct sRequest { - int in; - int label; - int pri; - }; - - list<sRequest> _requests; - - int _match; - -public: - PriorityArbiter( const Configuration &config, - Module *parent, const string& name, - int inputs ); - - void Clear( ); - - void AddRequest( int in, int label = 0, int pri = 0 ); - void RemoveRequest( int in, int label = 0 ); - - int Match( ) const; - - void Arbitrate( ); - void Update( ); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/1a/1abf005acda7eb93dad10f55694f27a84ba74f91.svn-base b/src/intersim2/.svn/pristine/1a/1abf005acda7eb93dad10f55694f27a84ba74f91.svn-base deleted file mode 100644 index cae1e45..0000000 --- a/src/intersim2/.svn/pristine/1a/1abf005acda7eb93dad10f55694f27a84ba74f91.svn-base +++ /dev/null @@ -1,111 +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. -*/ - -/*wavefront.cpp - * - *The wave front allocator - * - */ -#include "booksim.hpp" - -#include "wavefront.hpp" - -Wavefront::Wavefront( Module *parent, const string& name, - int inputs, int outputs, bool skip_diags ) : - DenseAllocator( parent, name, inputs, outputs ), - _last_in(-1), _last_out(-1), _skip_diags(skip_diags), - _square(max(inputs, outputs)), _pri(0), _num_requests(0) -{ -} - -void Wavefront::AddRequest( int in, int out, int label, - int in_pri, int out_pri ) -{ - DenseAllocator::AddRequest(in, out, label, in_pri, out_pri); - _num_requests++; - _last_in = in; - _last_out = out; - _priorities.insert(make_pair(out_pri, in_pri)); -} - -void Wavefront::Allocate( ) -{ - - int first_diag = -1; - - if(_num_requests == 0) - - // bypass allocator completely if there were no requests - return; - - if(_num_requests == 1) { - - // if we only had a single request, we can immediately grant it - _inmatch[_last_in] = _last_out; - _outmatch[_last_out] = _last_in; - first_diag = _last_in + _last_out; - - } else { - - // otherwise we have to loop through the diagonals of request matrix - - for(set<pair<int, int> >::const_reverse_iterator iter = - _priorities.rbegin(); - iter != _priorities.rend(); ++iter) { - - for ( int p = 0; p < _square; ++p ) { - for ( int output = 0; output < _square; ++output ) { - int input = ( ( _pri + p ) + ( _square - output ) ) % _square; - if ( ( input < _inputs ) && ( output < _outputs ) && - ( _inmatch[input] == -1 ) && ( _outmatch[output] == -1 ) && - ( _request[input][output].label != -1 ) && - ( _request[input][output].in_pri == iter->second ) && - ( _request[input][output].out_pri == iter->first ) ) { - // Grant! - _inmatch[input] = output; - _outmatch[output] = input; - if(first_diag < 0) { - first_diag = input + output; - } - } - } - } - } - } - - _num_requests = 0; - _last_in = -1; - _last_out = -1; - _priorities.clear(); - - assert(first_diag >= 0); - - // Round-robin the priority diagonal - _pri = ( ( _skip_diags ? first_diag : _pri ) + 1 ) % _square; -} - - diff --git a/src/intersim2/.svn/pristine/1a/1afc46cd26811b568cd238a5bb6cf4a3e9687edf.svn-base b/src/intersim2/.svn/pristine/1a/1afc46cd26811b568cd238a5bb6cf4a3e9687edf.svn-base deleted file mode 100644 index 4df14c7..0000000 --- a/src/intersim2/.svn/pristine/1a/1afc46cd26811b568cd238a5bb6cf4a3e9687edf.svn-base +++ /dev/null @@ -1,54 +0,0 @@ -%{ - -#include "y.tab.h" - -static unsigned int lineno = 1; - -void config_error(char * msg, int lineno); -void yyerror(char * msg); - -extern int config_input(char *, int); -#undef YY_INPUT -#define YY_INPUT(b, r, ms) (r = config_input(b, ms)) - -%} - -Digit [0-9] -Exponent [eE][+-]?{Digit}+ -DblConst ({Digit}*\.)?{Digit}+{Exponent}? -StrConst [A-Za-z_\-/\.][A-Za-z0-9_\-/\.\+(\{\,)\}]* - -%% - - /* Ignore comments and all spaces */ - -\/\/[^\n]* ; -[ \t\r]* ; - -\n { lineno++; } - - /* Commands */ - -\{[A-Za-z0-9_\-\.(\{\,)\}]+(\,[A-Za-z0-9_\-\.(\{\,)\}]+)*\} { yylval.name = strdup( yytext ); return STR; } - --?[0-9]+ { yylval.num = atoi( yytext ); return NUM; } - --?[0-9]*\.[0-9]+ { yylval.fnum = atof( yytext ); return FNUM; } - --?{DblConst} { yylval.fnum = atof( yytext ); return FNUM;} - -{StrConst} { yylval.name = strdup( yytext ); return STR; } - -. { return yytext[0]; } - -%% - -void yyerror( char * msg ) -{ - config_error( msg, lineno ); -} - -int yywrap() -{ - return 1; -} diff --git a/src/intersim2/.svn/pristine/1e/1e4194e8f6ff3aacdde8d0caf868ab69490d6a6c.svn-base b/src/intersim2/.svn/pristine/1e/1e4194e8f6ff3aacdde8d0caf868ab69490d6a6c.svn-base deleted file mode 100644 index f1ad2fd..0000000 --- a/src/intersim2/.svn/pristine/1e/1e4194e8f6ff3aacdde8d0caf868ab69490d6a6c.svn-base +++ /dev/null @@ -1,447 +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. -*/ - -/*config_utils.cpp - * - *The configuration object which contained the parsed data from the - *configuration file - */ - -#include "booksim.hpp" -#include <iostream> -#include <cstring> -#include <sstream> -#include <fstream> -#include <cstdlib> - -#include "config_utils.hpp" - -Configuration *Configuration::theConfig = 0; - -Configuration::Configuration() -{ - theConfig = this; - _config_file = 0; -} - -void Configuration::AddStrField(string const & field, string const & value) -{ - _str_map[field] = value; -} - -void Configuration::Assign(string const & field, string const & value) -{ - map<string, string>::const_iterator match; - - match = _str_map.find(field); - if(match != _str_map.end()) { - _str_map[field] = value; - } else { - ParseError("Unknown string field: " + field); - } -} - -void Configuration::Assign(string const & field, int value) -{ - map<string, int>::const_iterator match; - - match = _int_map.find(field); - if(match != _int_map.end()) { - _int_map[field] = value; - } else { - ParseError("Unknown integer field: " + field); - } -} - -void Configuration::Assign(string const & field, double value) -{ - map<string, double>::const_iterator match; - - match = _float_map.find(field); - if(match != _float_map.end()) { - _float_map[field] = value; - } else { - ParseError("Unknown double field: " + field); - } -} - -string Configuration::GetStr(string const & field) const -{ - map<string, string>::const_iterator match; - - match = _str_map.find(field); - if(match != _str_map.end()) { - return match->second; - } else { - ParseError("Unknown string field: " + field); - exit(-1); - } -} - -int Configuration::GetInt(string const & field) const -{ - map<string, int>::const_iterator match; - - match = _int_map.find(field); - if(match != _int_map.end()) { - return match->second; - } else { - ParseError("Unknown integer field: " + field); - exit(-1); - } -} - -double Configuration::GetFloat(string const & field) const -{ - map<string,double>::const_iterator match; - - match = _float_map.find(field); - if(match != _float_map.end()) { - return match->second; - } else { - ParseError("Unknown double field: " + field); - exit(-1); - } -} - -vector<string> Configuration::GetStrArray(string const & field) const -{ - string const param_str = GetStr(field); - return tokenize_str(param_str); -} - -vector<int> Configuration::GetIntArray(string const & field) const -{ - string const param_str = GetStr(field); - return tokenize_int(param_str); -} - -vector<double> Configuration::GetFloatArray(string const & field) const -{ - string const param_str = GetStr(field); - return tokenize_float(param_str); -} - -void Configuration::ParseFile(string const & filename) -{ - if((_config_file = fopen(filename.c_str(), "r")) == 0) { - cerr << "Could not open configuration file " << filename << endl; - exit(-1); - } - - yyparse(); - - fclose(_config_file); - _config_file = 0; -} - -void Configuration::ParseString(string const & str) -{ - _config_string = str + ';'; - yyparse(); - _config_string = ""; -} - -int Configuration::Input(char * line, int max_size) -{ - int length = 0; - - if(_config_file) { - length = fread(line, 1, max_size, _config_file); - } else { - length = _config_string.length(); - _config_string.copy(line, max_size); - _config_string.clear(); - } - - return length; -} - -void Configuration::ParseError(string const & msg, unsigned int lineno) const -{ - if(lineno) { - cerr << "Parse error on line " << lineno << " : " << msg << endl; - } else { - cerr << "Parse error : " << msg << endl; - } - - - exit( -1 ); -} - -Configuration * Configuration::GetTheConfig() -{ - return theConfig; -} - -//============================================================ - -extern "C" void config_error( char const * msg, int lineno ) -{ - Configuration::GetTheConfig( )->ParseError( msg, lineno ); -} - -extern "C" void config_assign_string( char const * field, char const * value ) -{ - Configuration::GetTheConfig()->Assign(field, value); -} - -extern "C" void config_assign_int( char const * field, int value ) -{ - Configuration::GetTheConfig()->Assign(field, value); -} - -extern "C" void config_assign_float( char const * field, double value ) -{ - Configuration::GetTheConfig()->Assign(field, value); -} - -extern "C" int config_input(char * line, int max_size) -{ - return Configuration::GetTheConfig()->Input(line, max_size); -} - -bool ParseArgs(Configuration * cf, int argc, char * * argv) -{ - bool rc = false; - - //all dashed variables are ignored by the arg parser - for(int i = 1; i < argc; ++i) { - string arg(argv[i]); - size_t pos = arg.find('='); - bool dash = (argv[i][0] =='-'); - if(pos == string::npos && !dash) { - // parse config file - cf->ParseFile( argv[i] ); - ifstream in(argv[i]); - cout << "BEGIN Configuration File: " << argv[i] << endl; - while (!in.eof()) { - char c; - in.get(c); - cout << c ; - } - cout << "END Configuration File: " << argv[i] << endl; - rc = true; - } else if(pos != string::npos) { - // override individual parameter - cout << "OVERRIDE Parameter: " << arg << endl; - cf->ParseString(argv[i]); - } - } - - return rc; -} - - -//helpful for the GUI, write out nearly all variables contained in a config file. -//However, it can't and won't write out empty strings since the booksim yacc -//parser won't be abled to parse blank strings -void Configuration::WriteFile(string const & filename) { - - ostream *config_out= new ofstream(filename.c_str()); - - - for(map<string,string>::const_iterator i = _str_map.begin(); - i!=_str_map.end(); - i++){ - //the parser won't read empty strings - if(i->second[0]!='\0'){ - *config_out<<i->first<<" = "<<i->second<<";"<<endl; - } - } - - for(map<string, int>::const_iterator i = _int_map.begin(); - i!=_int_map.end(); - i++){ - *config_out<<i->first<<" = "<<i->second<<";"<<endl; - - } - - for(map<string, double>::const_iterator i = _float_map.begin(); - i!=_float_map.end(); - i++){ - *config_out<<i->first<<" = "<<i->second<<";"<<endl; - - } - config_out->flush(); - delete config_out; - -} - - - -void Configuration::WriteMatlabFile(ostream * config_out) const { - - - - for(map<string,string>::const_iterator i = _str_map.begin(); - i!=_str_map.end(); - i++){ - //the parser won't read blanks lolz - if(i->second[0]!='\0'){ - *config_out<<"%"<<i->first<<" = \'"<<i->second<<"\';"<<endl; - } - } - - for(map<string, int>::const_iterator i = _int_map.begin(); - i!=_int_map.end(); - i++){ - *config_out<<"%"<<i->first<<" = "<<i->second<<";"<<endl; - - } - - for(map<string, double>::const_iterator i = _float_map.begin(); - i!=_float_map.end(); - i++){ - *config_out<<"%"<<i->first<<" = "<<i->second<<";"<<endl; - - } - config_out->flush(); - -} - -vector<string> tokenize_str(string const & data) -{ - vector<string> values; - - // no elements, no braces --> empty list - if(data.empty()) { - return values; - } - - // doesn't start with an opening brace --> treat as single element - // note that this element can potentially contain nested lists - if(data[0] != '{') { - values.push_back(data); - return values; - } - - size_t start = 1; - int nested = 0; - - size_t curr = start; - - while(string::npos != (curr = data.find_first_of("{,}", curr))) { - - if(data[curr] == '{') { - ++nested; - } else if((data[curr] == '}') && nested) { - --nested; - } else if(!nested) { - if(curr > start) { - string token = data.substr(start, curr - start); - values.push_back(token); - } - start = curr + 1; - } - ++curr; - } - assert(!nested); - - return values; -} - -vector<int> tokenize_int(string const & data) -{ - vector<int> values; - - // no elements, no braces --> empty list - if(data.empty()) { - return values; - } - - // doesn't start with an opening brace --> treat as single element - // note that this element can potentially contain nested lists - if(data[0] != '{') { - values.push_back(atoi(data.c_str())); - return values; - } - - size_t start = 1; - int nested = 0; - - size_t curr = start; - - while(string::npos != (curr = data.find_first_of("{,}", curr))) { - - if(data[curr] == '{') { - ++nested; - } else if((data[curr] == '}') && nested) { - --nested; - } else if(!nested) { - if(curr > start) { - string token = data.substr(start, curr - start); - values.push_back(atoi(token.c_str())); - } - start = curr + 1; - } - ++curr; - } - assert(!nested); - - return values; -} - -vector<double> tokenize_float(string const & data) -{ - vector<double> values; - - // no elements, no braces --> empty list - if(data.empty()) { - return values; - } - - // doesn't start with an opening brace --> treat as single element - // note that this element can potentially contain nested lists - if(data[0] != '{') { - values.push_back(atof(data.c_str())); - return values; - } - - size_t start = 1; - int nested = 0; - - size_t curr = start; - - while(string::npos != (curr = data.find_first_of("{,}", curr))) { - - if(data[curr] == '{') { - ++nested; - } else if((data[curr] == '}') && nested) { - --nested; - } else if(!nested) { - if(curr > start) { - string token = data.substr(start, curr - start); - values.push_back(atof(token.c_str())); - } - start = curr + 1; - } - ++curr; - } - assert(!nested); - - return values; -} diff --git a/src/intersim2/.svn/pristine/1f/1f35cbdd9ebe1ee0a41e949e03d51d268ac55bad.svn-base b/src/intersim2/.svn/pristine/1f/1f35cbdd9ebe1ee0a41e949e03d51d268ac55bad.svn-base deleted file mode 100644 index 9ac579a..0000000 --- a/src/intersim2/.svn/pristine/1f/1f35cbdd9ebe1ee0a41e949e03d51d268ac55bad.svn-base +++ /dev/null @@ -1,97 +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. -*/ - -#ifndef _PIPEFIFO_HPP_ -#define _PIPEFIFO_HPP_ - -#include <vector> - -#include "module.hpp" - -template<class T> class PipelineFIFO : public Module { - int _lanes; - int _depth; - - int _pipe_len; - int _pipe_ptr; - - vector<vector<T*> > _data; - -public: - PipelineFIFO( Module *parent, const string& name, int lanes, int depth ); - ~PipelineFIFO( ); - - void Write( T* val, int lane = 0 ); - void WriteAll( T* val ); - - T* Read( int lane = 0 ); - - void Advance( ); -}; - -template<class T> PipelineFIFO<T>::PipelineFIFO( Module *parent, - const string& name, - int lanes, int depth ) : - Module( parent, name ), - _lanes( lanes ), _depth( depth ) -{ - _pipe_len = depth + 1; - _pipe_ptr = 0; - - _data.resize(_lanes); - for ( int l = 0; l < _lanes; ++l ) { - _data[l].resize(_pipe_len, 0); - } -} - -template<class T> PipelineFIFO<T>::~PipelineFIFO( ) -{ -} - -template<class T> void PipelineFIFO<T>::Write( T* val, int lane ) -{ - _data[lane][_pipe_ptr] = val; -} - -template<class T> void PipelineFIFO<T>::WriteAll( T* val ) -{ - for ( int l = 0; l < _lanes; ++l ) { - _data[l][_pipe_ptr] = val; - } -} - -template<class T> T* PipelineFIFO<T>::Read( int lane ) -{ - return _data[lane][_pipe_ptr]; -} - -template<class T> void PipelineFIFO<T>::Advance( ) -{ - _pipe_ptr = ( _pipe_ptr + 1 ) % _pipe_len; -} - -#endif diff --git a/src/intersim2/.svn/pristine/1f/1f6b483285599def0e7fea5379c0af7a176d2736.svn-base b/src/intersim2/.svn/pristine/1f/1f6b483285599def0e7fea5379c0af7a176d2736.svn-base deleted file mode 100644 index baded43..0000000 --- a/src/intersim2/.svn/pristine/1f/1f6b483285599def0e7fea5379c0af7a176d2736.svn-base +++ /dev/null @@ -1,223 +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. -*/ - -/*vc.cpp - * - *this class describes a virtual channel in a router - *it includes buffers and virtual channel state and controls - * - *This class calls the routing functions - */ - -#include <limits> -#include <sstream> - -#include "globals.hpp" -#include "booksim.hpp" -#include "vc.hpp" - -const char * const VC::VCSTATE[] = {"idle", - "routing", - "vc_alloc", - "active"}; - -VC::VC( const Configuration& config, int outputs, - Module *parent, const string& name ) - : Module( parent, name ), - _state(idle), _out_port(-1), _out_vc(-1), _pri(0), _watched(false), - _expected_pid(-1), _last_id(-1), _last_pid(-1) -{ - _lookahead_routing = !config.GetInt("routing_delay"); - _route_set = _lookahead_routing ? NULL : new OutputSet( ); - - string priority = config.GetStr( "priority" ); - if ( priority == "local_age" ) { - _pri_type = local_age_based; - } else if ( priority == "queue_length" ) { - _pri_type = queue_length_based; - } else if ( priority == "hop_count" ) { - _pri_type = hop_count_based; - } else if ( priority == "none" ) { - _pri_type = none; - } else { - _pri_type = other; - } - - _priority_donation = config.GetInt("vc_priority_donation"); -} - -VC::~VC() -{ - if(!_lookahead_routing) { - delete _route_set; - } -} - -void VC::AddFlit( Flit *f ) -{ - assert(f); - - if(_expected_pid >= 0) { - if(f->pid != _expected_pid) { - ostringstream err; - err << "Received flit " << f->id << " with unexpected packet ID: " << f->pid - << " (expected: " << _expected_pid << ")"; - Error(err.str()); - } else if(f->tail) { - _expected_pid = -1; - } - } else if(!f->tail) { - _expected_pid = f->pid; - } - - // update flit priority before adding to VC buffer - if(_pri_type == local_age_based) { - f->pri = numeric_limits<int>::max() - GetSimTime(); - assert(f->pri >= 0); - } else if(_pri_type == hop_count_based) { - f->pri = f->hops; - assert(f->pri >= 0); - } - - _buffer.push_back(f); - UpdatePriority(); -} - -Flit *VC::RemoveFlit( ) -{ - Flit *f = NULL; - if ( !_buffer.empty( ) ) { - f = _buffer.front( ); - _buffer.pop_front( ); - _last_id = f->id; - _last_pid = f->pid; - UpdatePriority(); - } else { - Error("Trying to remove flit from empty buffer."); - } - return f; -} - - - -void VC::SetState( eVCState s ) -{ - Flit * f = FrontFlit(); - - if(f && f->watch) - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Changing state from " << VC::VCSTATE[_state] - << " to " << VC::VCSTATE[s] << "." << endl; - - _state = s; -} - -const OutputSet *VC::GetRouteSet( ) const -{ - return _route_set; -} - -void VC::SetRouteSet( OutputSet * output_set ) -{ - _route_set = output_set; - _out_port = -1; - _out_vc = -1; -} - -void VC::SetOutput( int port, int vc ) -{ - _out_port = port; - _out_vc = vc; -} - -void VC::UpdatePriority() -{ - if(_buffer.empty()) return; - if(_pri_type == queue_length_based) { - _pri = _buffer.size(); - } else if(_pri_type != none) { - Flit * f = _buffer.front(); - if((_pri_type != local_age_based) && _priority_donation) { - Flit * df = f; - for(size_t i = 1; i < _buffer.size(); ++i) { - Flit * bf = _buffer[i]; - if(bf->pri > df->pri) df = bf; - } - if((df != f) && (df->watch || f->watch)) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Flit " << df->id - << " donates priority to flit " << f->id - << "." << endl; - } - f = df; - } - if(f->watch) - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Flit " << f->id - << " sets priority to " << f->pri - << "." << endl; - _pri = f->pri; - } -} - - -void VC::Route( tRoutingFunction rf, const Router* router, const Flit* f, int in_channel ) -{ - rf( router, f, in_channel, _route_set, false ); - _out_port = -1; - _out_vc = -1; -} - -// ==== Debug functions ==== - -void VC::SetWatch( bool watch ) -{ - _watched = watch; -} - -bool VC::IsWatched( ) const -{ - return _watched; -} - -void VC::Display( ostream & os ) const -{ - if ( _state != VC::idle ) { - os << FullName() << ": " - << " state: " << VCSTATE[_state]; - if(_state == VC::active) { - os << " out_port: " << _out_port - << " out_vc: " << _out_vc; - } - os << " fill: " << _buffer.size(); - if(!_buffer.empty()) { - os << " front: " << _buffer.front()->id; - } - os << " pri: " << _pri; - os << endl; - } -} diff --git a/src/intersim2/.svn/pristine/23/235d7e656a8ce9818d81cd7eb47ca78febbe438a.svn-base b/src/intersim2/.svn/pristine/23/235d7e656a8ce9818d81cd7eb47ca78febbe438a.svn-base deleted file mode 100644 index ef62dfd..0000000 --- a/src/intersim2/.svn/pristine/23/235d7e656a8ce9818d81cd7eb47ca78febbe438a.svn-base +++ /dev/null @@ -1,62 +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. -*/ - -#ifndef _KNCUBE_HPP_ -#define _KNCUBE_HPP_ - -#include "network.hpp" - -class KNCube : public Network { - - bool _mesh; - - int _k; - int _n; - - void _ComputeSize( const Configuration &config ); - void _BuildNet( const Configuration &config ); - - int _LeftChannel( int node, int dim ); - int _RightChannel( int node, int dim ); - - int _LeftNode( int node, int dim ); - int _RightNode( int node, int dim ); - -public: - KNCube( const Configuration &config, const string & name, bool mesh ); - static void RegisterRoutingFunctions(); - - int GetN( ) const; - int GetK( ) const; - - double Capacity( ) const; - - void InsertRandomFaults( const Configuration &config ); - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/24/244c1dc93f9a90c660c06c653d3809b739d40458.svn-base b/src/intersim2/.svn/pristine/24/244c1dc93f9a90c660c06c653d3809b739d40458.svn-base deleted file mode 100644 index 7c6ade8..0000000 --- a/src/intersim2/.svn/pristine/24/244c1dc93f9a90c660c06c653d3809b739d40458.svn-base +++ /dev/null @@ -1,68 +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. -*/ - -#ifndef _BUFFER_MONITOR_HPP_ -#define _BUFFER_MONITOR_HPP_ - -#include <vector> -#include <iostream> - -using namespace std; - -class Flit; - -class BufferMonitor { - int _cycles ; - int _inputs ; - int _classes ; - vector<int> _reads ; - vector<int> _writes ; - int index( int input, int cl ) const ; -public: - BufferMonitor( int inputs, int classes ) ; - void cycle() ; - void write( int input, Flit const * f ) ; - void read( int input, Flit const * f ) ; - inline const vector<int> & GetReads() const { - return _reads; - } - inline const vector<int> & GetWrites() const { - return _writes; - } - inline int NumInputs() const { - return _inputs; - } - inline int NumClasses() const { - return _classes; - } - void display(ostream & os) const; - -} ; - -ostream & operator<<( ostream & os, BufferMonitor const & obj ) ; - -#endif diff --git a/src/intersim2/.svn/pristine/2a/2a04a186dfedaa33f2a0336556c086868dd6ccfc.svn-base b/src/intersim2/.svn/pristine/2a/2a04a186dfedaa33f2a0336556c086868dd6ccfc.svn-base deleted file mode 100644 index 3bdbd7b..0000000 --- a/src/intersim2/.svn/pristine/2a/2a04a186dfedaa33f2a0336556c086868dd6ccfc.svn-base +++ /dev/null @@ -1,174 +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. -*/ - -#ifndef _TRAFFIC_HPP_ -#define _TRAFFIC_HPP_ - -#include <vector> -#include <set> -#include "config_utils.hpp" - -using namespace std; - -class TrafficPattern { -protected: - int _nodes; - TrafficPattern(int nodes); -public: - virtual ~TrafficPattern() {} - virtual void reset(); - virtual int dest(int source) = 0; - static TrafficPattern * New(string const & pattern, int nodes, - Configuration const * const config = NULL); -}; - -class PermutationTrafficPattern : public TrafficPattern { -protected: - PermutationTrafficPattern(int nodes); -}; - -class BitPermutationTrafficPattern : public PermutationTrafficPattern { -protected: - BitPermutationTrafficPattern(int nodes); -}; - -class BitCompTrafficPattern : public BitPermutationTrafficPattern { -public: - BitCompTrafficPattern(int nodes); - virtual int dest(int source); -}; - -class TransposeTrafficPattern : public BitPermutationTrafficPattern { -protected: - int _shift; -public: - TransposeTrafficPattern(int nodes); - virtual int dest(int source); -}; - -class BitRevTrafficPattern : public BitPermutationTrafficPattern { -public: - BitRevTrafficPattern(int nodes); - virtual int dest(int source); -}; - -class ShuffleTrafficPattern : public BitPermutationTrafficPattern { -public: - ShuffleTrafficPattern(int nodes); - virtual int dest(int source); -}; - -class DigitPermutationTrafficPattern : public PermutationTrafficPattern { -protected: - int _k; - int _n; - int _xr; - DigitPermutationTrafficPattern(int nodes, int k, int n, int xr = 1); -}; - -class TornadoTrafficPattern : public DigitPermutationTrafficPattern { -public: - TornadoTrafficPattern(int nodes, int k, int n, int xr = 1); - virtual int dest(int source); -}; - -class NeighborTrafficPattern : public DigitPermutationTrafficPattern { -public: - NeighborTrafficPattern(int nodes, int k, int n, int xr = 1); - virtual int dest(int source); -}; - -class RandomPermutationTrafficPattern : public TrafficPattern { -private: - vector<int> _dest; - inline void randomize(int seed); -public: - RandomPermutationTrafficPattern(int nodes, int seed); - virtual int dest(int source); -}; - -class RandomTrafficPattern : public TrafficPattern { -protected: - RandomTrafficPattern(int nodes); -}; - -class UniformRandomTrafficPattern : public RandomTrafficPattern { -public: - UniformRandomTrafficPattern(int nodes); - virtual int dest(int source); -}; - -class UniformBackgroundTrafficPattern : public RandomTrafficPattern { -private: - set<int> _excluded; -public: - UniformBackgroundTrafficPattern(int nodes, vector<int> excluded_nodes); - virtual int dest(int source); -}; - -class DiagonalTrafficPattern : public RandomTrafficPattern { -public: - DiagonalTrafficPattern(int nodes); - virtual int dest(int source); -}; - -class AsymmetricTrafficPattern : public RandomTrafficPattern { -public: - AsymmetricTrafficPattern(int nodes); - virtual int dest(int source); -}; - -class Taper64TrafficPattern : public RandomTrafficPattern { -public: - Taper64TrafficPattern(int nodes); - virtual int dest(int source); -}; - -class BadPermDFlyTrafficPattern : public DigitPermutationTrafficPattern { -public: - BadPermDFlyTrafficPattern(int nodes, int k, int n); - virtual int dest(int source); -}; - -class BadPermYarcTrafficPattern : public DigitPermutationTrafficPattern { -public: - BadPermYarcTrafficPattern(int nodes, int k, int n, int xr = 1); - virtual int dest(int source); -}; - -class HotSpotTrafficPattern : public TrafficPattern { -private: - vector<int> _hotspots; - vector<int> _rates; - int _max_val; -public: - HotSpotTrafficPattern(int nodes, vector<int> hotspots, - vector<int> rates = vector<int>()); - virtual int dest(int source); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/2c/2ca444c5a28eb3f8aaffcf0702edd18d4fe31fad.svn-base b/src/intersim2/.svn/pristine/2c/2ca444c5a28eb3f8aaffcf0702edd18d4fe31fad.svn-base deleted file mode 100644 index 9ee46ab..0000000 --- a/src/intersim2/.svn/pristine/2c/2ca444c5a28eb3f8aaffcf0702edd18d4fe31fad.svn-base +++ /dev/null @@ -1,61 +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. -*/ - -#ifndef _RANDOM_UTILS_HPP_ -#define _RANDOM_UTILS_HPP_ - - // interface to Knuth's RANARRAY RNG -void ran_start(long seed); -long ran_next( ); -void ranf_start(long seed); -double ranf_next( ); - -inline void RandomSeed( long seed ) { - ran_start( seed ); - ranf_start( seed ); -} - -inline unsigned long RandomIntLong( ) { - return ran_next( ); -} - -// Returns a random integer in the range [0,max] -inline int RandomInt( int max ) { - return ( ran_next( ) % (max+1) ); -} - -// Returns a random floating-point value in the rage [0,1] -inline double RandomFloat( ) { - return ranf_next( ); -} - -// Returns a random floating-point value in the rage [0,max] -inline double RandomFloat( double max ) { - return ( ranf_next( ) * max ); -} - -#endif diff --git a/src/intersim2/.svn/pristine/2e/2e9094d44209e8c6464b2834012a6dc9dd860340.svn-base b/src/intersim2/.svn/pristine/2e/2e9094d44209e8c6464b2834012a6dc9dd860340.svn-base deleted file mode 100644 index 006b06b..0000000 --- a/src/intersim2/.svn/pristine/2e/2e9094d44209e8c6464b2834012a6dc9dd860340.svn-base +++ /dev/null @@ -1,501 +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. -*/ - -/*anynet - * - *Network setup file format - *example 1: - *router 0 router 1 15 router 2 - * - *Router 0 is connect to router 1 with a 15-cycle channel, and router 0 is connected to - * router 2 with a 1-cycle channel, the channels latency are unidirectional, so channel - * from router 1 back to router 0 is only single-cycle because it was not specified - * - *example 2: - *router 0 node 0 node 1 5 node 2 5 - * - *Router 0 is directly connected to node 0-2. Channel latency is 5cycles for 1 and 2. In - * this case the latency specification is bidirectional, the injeciton and ejection lat - * for node 1 and 2 are 5-cycle - * - *other notes: - * - *Router and node numbers must be sequential starting with 0 - *Credit channel latency follows the channel latency, even though it travels in revse - * direction this might not be desired - * - */ - -#include "anynet.hpp" -#include <fstream> -#include <sstream> -#include <limits> -#include <algorithm> -//this is a hack, I can't easily get the routing talbe out of the network -map<int, int>* global_routing_table; - -AnyNet::AnyNet( const Configuration &config, const string & name ) - : Network( config, name ){ - - router_list.resize(2); - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); -} - -AnyNet::~AnyNet(){ - for(int i = 0; i < 2; ++i) { - for(map<int, map<int, pair<int,int> > >::iterator iter = router_list[i].begin(); - iter != router_list[i].end(); - ++iter) { - iter->second.clear(); - } - } -} - -void AnyNet::_ComputeSize( const Configuration &config ){ - file_name = config.GetStr("network_file"); - if(file_name==""){ - cout<<"No network file name provided"<<endl; - exit(-1); - } - //parse the network description file - readFile(); - - _channels =0; - cout<<"========================Network File Parsed=================\n"; - cout<<"******************node listing**********************\n"; - map<int, int >::iterator iter; - for(iter = node_list.begin(); iter!=node_list.end(); iter++){ - cout<<"Node "<<iter->first; - cout<<"\tRouter "<<iter->second<<endl; - } - - map<int, map<int, pair<int,int> > >::iterator iter3; - cout<<"\n****************router to node listing*************\n"; - for(iter3 = router_list[0].begin(); iter3!=router_list[0].end(); iter3++){ - cout<<"Router "<<iter3->first<<endl; - map<int, pair<int,int> >::iterator iter2; - for(iter2 = iter3->second.begin(); - iter2!=iter3->second.end(); - iter2++){ - cout<<"\t Node "<<iter2->first<<" lat "<<iter2->second.second<<endl; - } - } - - cout<<"\n*****************router to router listing************\n"; - for(iter3 = router_list[1].begin(); iter3!=router_list[1].end(); iter3++){ - cout<<"Router "<<iter3->first<<endl; - map<int, pair<int,int> >::iterator iter2; - if(iter3->second.size() == 0){ - cout<<"Caution Router "<<iter3->first - <<" is not connected to any other Router\n"<<endl; - } - for(iter2 = iter3->second.begin(); - iter2!=iter3->second.end(); - iter2++){ - cout<<"\t Router "<<iter2->first<<" lat "<<iter2->second.second<<endl; - _channels++; - } - } - - _size = router_list[1].size(); - _nodes = node_list.size(); - -} - - - -void AnyNet::_BuildNet( const Configuration &config ){ - - - //I need to keep track the output ports for each router during build - int * outport = (int*)malloc(sizeof(int)*_size); - for(int i = 0; i<_size; i++){outport[i] = 0;} - - cout<<"==========================Node to Router =====================\n"; - //adding the injection/ejection chanenls first - map<int, map<int, pair<int,int> > >::iterator niter; - for(niter = router_list[0].begin(); niter!=router_list[0].end(); niter++){ - map<int, map<int, pair<int,int> > >::iterator riter = router_list[1].find(niter->first); - //calculate radix - int radix = niter->second.size()+riter->second.size(); - int node = niter->first; - cout<<"router "<<node<<" radix "<<radix<<endl; - //decalre the routers - ostringstream router_name; - router_name << "router"; - router_name << "_" << node ; - _routers[node] = Router::NewRouter( config, this, router_name.str( ), - node, radix, radix ); - _timed_modules.push_back(_routers[node]); - //add injeciton ejection channels - map<int, pair<int,int> >::iterator nniter; - for(nniter = niter->second.begin();nniter!=niter->second.end(); nniter++){ - int link = nniter->first; - //add the outport port assined to the map - (niter->second)[link].first = outport[node]; - outport[node]++; - cout<<"\t connected to node "<<link<<" at outport "<<nniter->second.first - <<" lat "<<nniter->second.second<<endl; - _inject[link]->SetLatency(nniter->second.second); - _inject_cred[link]->SetLatency(nniter->second.second); - _eject[link]->SetLatency(nniter->second.second); - _eject_cred[link]->SetLatency(nniter->second.second); - - _routers[node]->AddInputChannel( _inject[link], _inject_cred[link] ); - _routers[node]->AddOutputChannel( _eject[link], _eject_cred[link] ); - } - - } - - cout<<"==========================Router to Router =====================\n"; - //add inter router channels - //since there is no way to systematically number the channels we just start from 0 - //the map, is a mapping of output->input - int channel_count = 0; - for(niter = router_list[0].begin(); niter!=router_list[0].end(); niter++){ - map<int, map<int, pair<int,int> > >::iterator riter = router_list[1].find(niter->first); - int node = niter->first; - map<int, pair<int,int> >::iterator rriter; - cout<<"router "<<node<<endl; - for(rriter = riter->second.begin();rriter!=riter->second.end(); rriter++){ - int other_node = rriter->first; - int link = channel_count; - //add the outport port assined to the map - (riter->second)[other_node].first = outport[node]; - outport[node]++; - cout<<"\t connected to router "<<other_node<<" using link "<<link - <<" at outport "<<rriter->second.first - <<" lat "<<rriter->second.second<<endl; - - _chan[link]->SetLatency(rriter->second.second); - _chan_cred[link]->SetLatency(rriter->second.second); - - _routers[node]->AddOutputChannel( _chan[link], _chan_cred[link] ); - _routers[other_node]->AddInputChannel( _chan[link], _chan_cred[link]); - channel_count++; - } - } - - buildRoutingTable(); - -} - - -void AnyNet::RegisterRoutingFunctions() { - gRoutingFunctionMap["min_anynet"] = &min_anynet; -} - -void min_anynet( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ){ - int out_port=-1; - if(!inject){ - assert(global_routing_table[r->GetID()].count(f->dest)!=0); - out_port=global_routing_table[r->GetID()][f->dest]; - } - - - 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; - } - - outputs->Clear( ); - - outputs->AddRange( out_port , vcBegin, vcEnd ); -} - -void AnyNet::buildRoutingTable(){ - cout<<"========================== Routing table =====================\n"; - routing_table.resize(_size); - for(int i = 0; i<_size; i++){ - route(i); - } - global_routing_table = &routing_table[0]; -} - - -//11/7/2012 -//basically djistra's, tested on a large dragonfly anynet configuration -void AnyNet::route(int r_start){ - int* dist = new int[_size]; - int* prev = new int[_size]; - set<int> rlist; - for(int i = 0; i<_size; i++){ - dist[i] = numeric_limits<int>::max(); - prev[i] = -1; - rlist.insert(i); - } - dist[r_start] = 0; - while(!rlist.empty()){ - //find min - int min_dist = numeric_limits<int>::max(); - int min_cand = -1; - for(set<int>::iterator i = rlist.begin(); - i!=rlist.end(); - i++){ - if(dist[*i]<min_dist){ - min_dist = dist[*i]; - min_cand = *i; - } - } - rlist.erase(min_cand); - - //neighbor - for(map<int,pair<int,int> >::iterator i = router_list[1][min_cand].begin(); - i!=router_list[1][min_cand].end(); - i++){ - int new_dist = dist[min_cand] + i->second.second;//distance is hops not cycles - if(new_dist < dist[i->first]){ - dist[i->first] = new_dist; - prev[i->first] = min_cand; - } - } - } - - //post process from the prev list - for(int i = 0; i<_size; i++){ - if(prev[i] ==-1){ //self - assert(i == r_start); - for(map<int, pair<int, int> >::iterator iter = router_list[0][i].begin(); - iter!=router_list[0][i].end(); - iter++){ - routing_table[r_start][iter->first]=iter->second.first; - //cout<<"node "<<iter->first<<" port "<< iter->second.first<<endl; - } - } else { - int distance=0; - int neighbor=i; - while(prev[neighbor]!=r_start){ - assert(router_list[1][neighbor].count(prev[neighbor])>0); - distance+=router_list[1][prev[neighbor]][neighbor].second;//REVERSE lat - neighbor= prev[neighbor]; - } - distance+=router_list[1][prev[neighbor]][neighbor].second;//lat - - assert( router_list[1][r_start].count(neighbor)!=0); - int port = router_list[1][r_start][neighbor].first; - for(map<int, pair<int,int> >::iterator iter = router_list[0][i].begin(); - iter!=router_list[0][i].end(); - iter++){ - routing_table[r_start][iter->first]=port; - //cout<<"node "<<iter->first<<" port "<< port<<" dist "<<distance<<endl; - } - } - } -} - - -void AnyNet::readFile(){ - - ifstream network_list; - string line; - enum ParseState{HEAD_TYPE=0, - HEAD_ID, - BODY_TYPE, - BODY_ID, - LINK_WEIGHT}; - enum ParseType{NODE=0, - ROUTER, - UNKNOWN}; - - network_list.open(file_name.c_str()); - if(!network_list.is_open()){ - cout<<"Anynet:can't open network file "<<file_name<<endl; - exit(-1); - } - - //loop through the entire file - while(!network_list.eof()){ - getline(network_list,line); - if(line==""){ - continue; - } - - ParseState state=HEAD_TYPE; - //position to parse out white sspace - int pos = 0; - int next_pos=-1; - string temp; - //the first node and its type - int head_id = -1; - ParseType head_type = UNKNOWN; - //stuff that head are linked to - ParseType body_type = UNKNOWN; - int body_id = -1; - int link_weight = 1; - - do{ - - //skip empty spaces - next_pos = line.find(" ",pos); - temp = line.substr(pos,next_pos-pos); - pos = next_pos+1; - if(temp=="" || temp==" "){ - continue; - } - - switch(state){ - case HEAD_TYPE: - if(temp=="router"){ - head_type = ROUTER; - } else if (temp == "node"){ - head_type = NODE; - } else { - cout<<"Anynet:Unknow head of line type "<<temp<<"\n"; - assert(false); - } - state=HEAD_ID; - break; - case HEAD_ID: - //need better error check - head_id = atoi(temp.c_str()); - - //intialize router structures - if(router_list[NODE].count(head_id) == 0){ - router_list[NODE][head_id] = map<int, pair<int,int> >(); - } - if(router_list[ROUTER].count(head_id) == 0){ - router_list[ROUTER][head_id] = map<int, pair<int,int> >(); - } - - state=BODY_TYPE; - break; - case LINK_WEIGHT: - if(temp=="router"|| - temp == "node"){ - //ignore - } else { - link_weight= atoi(temp.c_str()); - router_list[head_type][head_id][body_id].second=link_weight; - break; - } - //intentionally letting it flow through - case BODY_TYPE: - if(temp=="router"){ - body_type = ROUTER; - } else if (temp == "node"){ - body_type = NODE; - } else { - cout<<"Anynet:Unknow body type "<<temp<<"\n"; - assert(false); - } - state=BODY_ID; - break; - case BODY_ID: - body_id = atoi(temp.c_str()); - //intialize router structures if necessary - if(body_type==ROUTER){ - if(router_list[NODE].count(body_id) ==0){ - router_list[NODE][body_id] = map<int, pair<int,int> >(); - } - if(router_list[ROUTER].count(body_id) == 0){ - router_list[ROUTER][body_id] = map<int, pair<int,int> >(); - } - } - - if(head_type==NODE && body_type==NODE){ - - cout<<"Anynet:Cannot connect node to node "<<temp<<"\n"; - assert(false); - - } else if(head_type==NODE && body_type==ROUTER){ - - if(node_list.count(head_id)!=0 && - node_list[head_id]!=body_id){ - cout<<"Anynet:Node "<<body_id<<" trying to connect to multiple router " - <<body_id<<" and "<<node_list[head_id]<<endl; - assert(false); - } - node_list[head_id]=body_id; - router_list[NODE][body_id][head_id]=pair<int, int>(-1,1); - - } else if(head_type==ROUTER && body_type==NODE){ - //insert and check node - if(node_list.count(body_id) != 0 && - node_list[body_id]!=head_id){ - cout<<"Anynet:Node "<<body_id<<" trying to connect to multiple router " - <<body_id<<" and "<<node_list[head_id]<<endl; - assert(false); - } - node_list[body_id] = head_id; - router_list[NODE][head_id][body_id]=pair<int, int>(-1,1); - - } else if(head_type==ROUTER && body_type==ROUTER){ - router_list[ROUTER][head_id][body_id]=pair<int, int>(-1,1); - if(router_list[ROUTER][body_id].count(head_id)==0){ - router_list[ROUTER][body_id][head_id]=pair<int, int>(-1,1); - } - } - state=LINK_WEIGHT; - break ; - default: - cout<<"Anynet:Unknow parse state\n"; - assert(false); - break; - } - - } while(pos!=0); - if(state!=LINK_WEIGHT && - state!=BODY_TYPE){ - cout<<"Anynet:Incomplete parse of the line: "<<line<<endl; - } - - } - - //map verification, make sure the information contained in bother maps - //are the same - assert(router_list[0].size() == router_list[1].size()); - - //traffic generator assumes node list is sequenctial and starts at 0 - vector<int> node_check; - for(map<int,int>::iterator i = node_list.begin(); - i!=node_list.end(); - i++){ - node_check.push_back(i->first); - } - sort(node_check.begin(), node_check.end()); - for(size_t i = 0; i<node_check.size(); i++){ - if(node_check[i] != i){ - cout<<"Anynet:booksim trafficmanager assumes sequential node numbering starting at 0\n"; - assert(false); - } - } - -} - diff --git a/src/intersim2/.svn/pristine/2f/2ff946ea4e0a43b74a424e711f7489085c496e3a.svn-base b/src/intersim2/.svn/pristine/2f/2ff946ea4e0a43b74a424e711f7489085c496e3a.svn-base deleted file mode 100644 index 5eacc21..0000000 --- a/src/intersim2/.svn/pristine/2f/2ff946ea4e0a43b74a424e711f7489085c496e3a.svn-base +++ /dev/null @@ -1,121 +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. -*/ - -// ---------------------------------------------------------------------- -// -// Matrix: Matrix Arbiter -// -// ---------------------------------------------------------------------- - -#include "matrix_arb.hpp" -#include <iostream> -using namespace std ; - -MatrixArbiter::MatrixArbiter( Module *parent, const string &name, int size ) - : Arbiter( parent, name, size ), _last_req(-1) { - _matrix.resize(size); - for ( int i = 0 ; i < size ; i++ ) { - _matrix[i].resize(size); - for ( int j = 0; j < i; j++ ) { - _matrix[i][j] = 1; - } - } -} - -void MatrixArbiter::PrintState() const { - cout << "Priority Matrix: " << endl ; - for ( int r = 0; r < _size ; r++ ) { - for ( int c = 0 ; c < _size ; c++ ) { - cout << _matrix[r][c] << " " ; - } - cout << endl ; - } - cout << endl ; -} - -void MatrixArbiter::UpdateState() { - // update priority matrix using last grant - if ( _selected > -1 ) { - for ( int i = 0; i < _size ; i++ ) { - if( _selected != i ) { - _matrix[_selected][i] = 0 ; - _matrix[i][_selected] = 1 ; - } - } - } -} - -void MatrixArbiter::AddRequest( int input, int id, int pri ) -{ - _last_req = input; - Arbiter::AddRequest(input, id, pri); -} - -int MatrixArbiter::Arbitrate( int* id, int* pri ) { - - // avoid running arbiter if it has not recevied at least two requests - // (in this case, requests and grants are identical) - if ( _num_reqs < 2 ) { - - _selected = _last_req ; - - } else { - - _selected = -1 ; - - for ( int input = 0 ; input < _size ; input++ ) { - if(_request[input].valid) { - - bool grant = true; - for ( int i = 0 ; i < _size ; i++ ) { - if ( _request[i].valid && - ( ( ( _request[i].pri == _request[input].pri ) && - _matrix[i][input]) || - ( _request[i].pri > _request[input].pri ) - ) ) { - grant = false ; - break ; - } - } - - if ( grant ) { - _selected = input ; - break ; - } - } - - } - } - - return Arbiter::Arbitrate(id, pri); -} - -void MatrixArbiter::Clear() -{ - _last_req = -1; - Arbiter::Clear(); -} diff --git a/src/intersim2/.svn/pristine/33/337f567cc4b77aad754f713a5fd363118f925249.svn-base b/src/intersim2/.svn/pristine/33/337f567cc4b77aad754f713a5fd363118f925249.svn-base deleted file mode 100644 index f9e7801..0000000 --- a/src/intersim2/.svn/pristine/33/337f567cc4b77aad754f713a5fd363118f925249.svn-base +++ /dev/null @@ -1,52 +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. -*/ - -#include "booksim.hpp" -#include "misc_utils.hpp" - -int powi( int x, int y ) // compute x to the y -{ - int r = 1; - - for ( int i = 0; i < y; ++i ) { - r *= x; - } - - return r; -} - -int log_two( int x ) -{ - int r = 0; - - x >>= 1; - while( x ) { - r++; x >>= 1; - } - - return r; -} diff --git a/src/intersim2/.svn/pristine/38/38bf48ff0300a37f3005867f74e32b80297f8b09.svn-base b/src/intersim2/.svn/pristine/38/38bf48ff0300a37f3005867f74e32b80297f8b09.svn-base deleted file mode 100644 index d8db065..0000000 --- a/src/intersim2/.svn/pristine/38/38bf48ff0300a37f3005867f74e32b80297f8b09.svn-base +++ /dev/null @@ -1,75 +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. -*/ - -#ifndef _BATCHTRAFFICMANAGER_HPP_ -#define _BATCHTRAFFICMANAGER_HPP_ - -#include <iostream> - -#include "config_utils.hpp" -#include "stats.hpp" -#include "trafficmanager.hpp" - -class BatchTrafficManager : public TrafficManager { - -protected: - - int _max_outstanding; - int _batch_size; - int _batch_count; - int _last_id; - int _last_pid; - - Stats * _batch_time; - double _overall_min_batch_time; - double _overall_avg_batch_time; - double _overall_max_batch_time; - - ostream * _sent_packets_out; - - virtual void _RetireFlit( Flit *f, int dest ); - - virtual int _IssuePacket( int source, int cl ); - virtual void _ClearStats( ); - virtual bool _SingleSim( ); - - virtual void _UpdateOverallStats( ); - - virtual string _OverallStatsCSV(int c = 0) const; - -public: - - BatchTrafficManager( const Configuration &config, const vector<Network *> & net ); - virtual ~BatchTrafficManager( ); - - virtual void WriteStats( ostream & os = cout ) const; - virtual void DisplayStats( ostream & os = cout ) const; - virtual void DisplayOverallStats( ostream & os = cout ) const; - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/39/398668283dbbef318596ac5cdfdb72a53973f2d1.svn-base b/src/intersim2/.svn/pristine/39/398668283dbbef318596ac5cdfdb72a53973f2d1.svn-base deleted file mode 100644 index 1abff33..0000000 --- a/src/intersim2/.svn/pristine/39/398668283dbbef318596ac5cdfdb72a53973f2d1.svn-base +++ /dev/null @@ -1,161 +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. -*/ - -#ifndef _BUFFER_HPP_ -#define _BUFFER_HPP_ - -#include <vector> - -#include "vc.hpp" -#include "flit.hpp" -#include "outputset.hpp" -#include "routefunc.hpp" -#include "config_utils.hpp" - -class Buffer : public Module { - - int _occupancy; - int _size; - - vector<VC*> _vc; - -#ifdef TRACK_BUFFERS - vector<int> _class_occupancy; -#endif - -public: - - Buffer( const Configuration& config, int outputs, - Module *parent, const string& name ); - ~Buffer(); - - void AddFlit( int vc, Flit *f ); - - inline Flit *RemoveFlit( int vc ) - { - --_occupancy; -#ifdef TRACK_BUFFERS - int cl = _vc[vc]->FrontFlit()->cl; - assert(_class_occupancy[cl] > 0); - --_class_occupancy[cl]; -#endif - return _vc[vc]->RemoveFlit( ); - } - - inline Flit *FrontFlit( int vc ) const - { - return _vc[vc]->FrontFlit( ); - } - - inline bool Empty( int vc ) const - { - return _vc[vc]->Empty( ); - } - - inline bool Full( ) const - { - return _occupancy >= _size; - } - - inline VC::eVCState GetState( int vc ) const - { - return _vc[vc]->GetState( ); - } - - inline void SetState( int vc, VC::eVCState s ) - { - _vc[vc]->SetState(s); - } - - inline const OutputSet *GetRouteSet( int vc ) const - { - return _vc[vc]->GetRouteSet( ); - } - - inline void SetRouteSet( int vc, OutputSet * output_set ) - { - _vc[vc]->SetRouteSet(output_set); - } - - inline void SetOutput( int vc, int out_port, int out_vc ) - { - _vc[vc]->SetOutput(out_port, out_vc); - } - - inline int GetOutputPort( int vc ) const - { - return _vc[vc]->GetOutputPort( ); - } - - inline int GetOutputVC( int vc ) const - { - return _vc[vc]->GetOutputVC( ); - } - - inline int GetPriority( int vc ) const - { - return _vc[vc]->GetPriority( ); - } - - inline void Route( int vc, tRoutingFunction rf, const Router* router, const Flit* f, int in_channel ) - { - _vc[vc]->Route(rf, router, f, in_channel); - } - - // ==== Debug functions ==== - - inline void SetWatch( int vc, bool watch = true ) - { - _vc[vc]->SetWatch(watch); - } - - inline bool IsWatched( int vc ) const - { - return _vc[vc]->IsWatched( ); - } - - inline int GetOccupancy( ) const - { - return _occupancy; - } - - inline int GetOccupancy( int vc ) const - { - return _vc[vc]->GetOccupancy( ); - } - -#ifdef TRACK_BUFFERS - inline int GetOccupancyForClass(int c) const - { - return _class_occupancy[c]; - } -#endif - - void Display( ostream & os = cout ) const; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/3a/3a771e1b366aae7e427d29b3f55d7f51045173d5.svn-base b/src/intersim2/.svn/pristine/3a/3a771e1b366aae7e427d29b3f55d7f51045173d5.svn-base deleted file mode 100644 index 6c15d25..0000000 --- a/src/intersim2/.svn/pristine/3a/3a771e1b366aae7e427d29b3f55d7f51045173d5.svn-base +++ /dev/null @@ -1,71 +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. -*/ - -// ---------------------------------------------------------------------- -// -// TreeArbiter -// -// ---------------------------------------------------------------------- - -#ifndef _TREE_ARB_HPP_ -#define _TREE_ARB_HPP_ - -#include "arbiter.hpp" - -class TreeArbiter : public Arbiter { - - int _group_size ; - - vector<Arbiter *> _group_arbiters; - Arbiter * _global_arbiter; - - vector<int> _group_reqs; - -public: - - // Constructors - TreeArbiter( Module *parent, const string &name, int size, int groups, const string & arb_type ) ; - - ~TreeArbiter(); - - // Print priority matrix to standard output - virtual void PrintState() const ; - - // Update priority matrix based on last aribtration result - virtual void UpdateState() ; - - // Arbitrate amongst requests. Returns winning input and - // updates pointers to metadata when valid pointers are passed - virtual int Arbitrate( int* id = 0, int* pri = 0) ; - - virtual void AddRequest( int input, int id, int pri ) ; - - virtual void Clear(); - -} ; - -#endif diff --git a/src/intersim2/.svn/pristine/3b/3bdd451bbcde75941cf7ad8caf63c4465c856102.svn-base b/src/intersim2/.svn/pristine/3b/3bdd451bbcde75941cf7ad8caf63c4465c856102.svn-base deleted file mode 100644 index e587a7f..0000000 --- a/src/intersim2/.svn/pristine/3b/3bdd451bbcde75941cf7ad8caf63c4465c856102.svn-base +++ /dev/null @@ -1,187 +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. -*/ - -/*main.cpp - * - *The starting point of the network simulator - *-Include all network header files - *-initilize the network - *-initialize the traffic manager and set it to run - * - * - */ -#include <sys/time.h> - -#include <string> -#include <cstdlib> -#include <iostream> -#include <fstream> - - - -#include <sstream> -#include "booksim.hpp" -#include "routefunc.hpp" -#include "traffic.hpp" -#include "booksim_config.hpp" -#include "trafficmanager.hpp" -#include "random_utils.hpp" -#include "network.hpp" -#include "injection.hpp" -#include "power_module.hpp" - - - -/////////////////////////////////////////////////////////////////////////////// -//Global declarations -////////////////////// - - /* the current traffic manager instance */ -TrafficManager * trafficManager = NULL; - -int GetSimTime() { - return trafficManager->getTime(); -} - -class Stats; -Stats * GetStats(const std::string & name) { - Stats* test = trafficManager->getStats(name); - if(test == 0){ - cout<<"warning statistics "<<name<<" not found"<<endl; - } - return test; -} - -/* printing activity factor*/ -bool gPrintActivity; - -int gK;//radix -int gN;//dimension -int gC;//concentration - -int gNodes; - -//generate nocviewer trace -bool gTrace; - -ostream * gWatchOut; - - - -///////////////////////////////////////////////////////////////////////////// - -bool Simulate( BookSimConfig const & config ) -{ - vector<Network *> net; - - int subnets = config.GetInt("subnets"); - /*To include a new network, must register the network here - *add an else if statement with the name of the network - */ - net.resize(subnets); - for (int i = 0; i < subnets; ++i) { - ostringstream name; - name << "network_" << i; - net[i] = Network::New( config, name.str() ); - } - - /*tcc and characterize are legacy - *not sure how to use them - */ - - assert(trafficManager == NULL); - trafficManager = TrafficManager::New( config, net ) ; - - /*Start the simulation run - */ - - double total_time; /* Amount of time we've run */ - struct timeval start_time, end_time; /* Time before/after user code */ - total_time = 0.0; - gettimeofday(&start_time, NULL); - - bool result = trafficManager->Run() ; - - - gettimeofday(&end_time, NULL); - total_time = ((double)(end_time.tv_sec) + (double)(end_time.tv_usec)/1000000.0) - - ((double)(start_time.tv_sec) + (double)(start_time.tv_usec)/1000000.0); - - cout<<"Total run time "<<total_time<<endl; - - for (int i=0; i<subnets; ++i) { - - ///Power analysis - if(config.GetInt("sim_power") > 0){ - Power_Module pnet(net[i], config); - pnet.run(); - } - - delete net[i]; - } - - delete trafficManager; - trafficManager = NULL; - - return result; -} - - -int main( int argc, char **argv ) -{ - - BookSimConfig config; - - - if ( !ParseArgs( &config, argc, argv ) ) { - cerr << "Usage: " << argv[0] << " configfile... [param=value...]" << endl; - return 0; - } - - - /*initialize routing, traffic, injection functions - */ - InitializeRoutingMap( config ); - - gPrintActivity = (config.GetInt("print_activity") > 0); - gTrace = (config.GetInt("viewer_trace") > 0); - - string watch_out_file = config.GetStr( "watch_out" ); - if(watch_out_file == "") { - gWatchOut = NULL; - } else if(watch_out_file == "-") { - gWatchOut = &cout; - } else { - gWatchOut = new ofstream(watch_out_file.c_str()); - } - - - /*configure and run the simulator - */ - bool result = Simulate( config ); - return result ? -1 : 0; -} diff --git a/src/intersim2/.svn/pristine/3b/3bebc9fde5e475aaa53b6d4abda241d37117421b.svn-base b/src/intersim2/.svn/pristine/3b/3bebc9fde5e475aaa53b6d4abda241d37117421b.svn-base deleted file mode 100644 index 2e20502..0000000 --- a/src/intersim2/.svn/pristine/3b/3bebc9fde5e475aaa53b6d4abda241d37117421b.svn-base +++ /dev/null @@ -1,67 +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. -*/ - -#include "switch_monitor.hpp" - -#include "flit.hpp" - -SwitchMonitor::SwitchMonitor( int inputs, int outputs, int classes ) -: _cycles(0), _inputs(inputs), _outputs(outputs), _classes(classes) { - _event.resize(inputs * outputs * classes, 0) ; -} - -int SwitchMonitor::index( int input, int output, int cl ) const { - assert((input >= 0) && (input < _inputs)); - assert((output >= 0) && (output < _outputs)); - assert((cl >= 0) && (cl < _classes)); - return cl + _classes * ( output + _outputs * input ) ; -} - -void SwitchMonitor::cycle() { - _cycles++ ; -} - -void SwitchMonitor::traversal( int input, int output, Flit const * f ) { - _event[ index( input, output, f->cl) ]++ ; -} - -void SwitchMonitor::display(ostream & os) const { - for ( int i = 0 ; i < _inputs ; i++ ) { - for ( int o = 0 ; o < _outputs ; o++) { - os << "[" << i << " -> " << o << "] " ; - for ( int c = 0 ; c < _classes ; c++ ) { - os << c << ":" << _event[index(i,o,c)] << " " ; - } - os << endl ; - } - } -} - -ostream & operator<<( ostream & os, SwitchMonitor const & obj ) { - obj.display(os); - return os ; -} diff --git a/src/intersim2/.svn/pristine/3c/3c57b304902a442e45bf4e4225aac564cd2bdc26.svn-base b/src/intersim2/.svn/pristine/3c/3c57b304902a442e45bf4e4225aac564cd2bdc26.svn-base deleted file mode 100644 index 37133f0..0000000 --- a/src/intersim2/.svn/pristine/3c/3c57b304902a442e45bf4e4225aac564cd2bdc26.svn-base +++ /dev/null @@ -1,62 +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. -*/ - -#ifndef _MODULE_HPP_ -#define _MODULE_HPP_ - -#include "booksim.hpp" - -#include <string> -#include <vector> -#include <iostream> - -class Module { -private: - string _name; - string _fullname; - - vector<Module *> _children; - -protected: - void _AddChild( Module *child ); - -public: - Module( Module *parent, const string& name ); - virtual ~Module( ) { } - - inline const string & Name() const { return _name; } - inline const string & FullName() const { return _fullname; } - - void DisplayHierarchy( int level = 0, ostream & os = cout ) const; - - void Error( const string& msg ) const; - void Debug( const string& msg ) const; - - virtual void Display( ostream & os = cout ) const; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/3c/3c8671257ad287c8e877c0942bdc9f16e9f7fe0c.svn-base b/src/intersim2/.svn/pristine/3c/3c8671257ad287c8e877c0942bdc9f16e9f7fe0c.svn-base deleted file mode 100644 index 2084eec..0000000 --- a/src/intersim2/.svn/pristine/3c/3c8671257ad287c8e877c0942bdc9f16e9f7fe0c.svn-base +++ /dev/null @@ -1,162 +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. -*/ - -#include "booksim.hpp" -#include <vector> -#include <sstream> - -#include "fly.hpp" -#include "misc_utils.hpp" - -//#define DEBUG_FLY - -KNFly::KNFly( const Configuration &config, const string & name ) : -Network( config, name ) -{ - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); -} - -void KNFly::_ComputeSize( const Configuration &config ) -{ - _k = config.GetInt( "k" ); - _n = config.GetInt( "n" ); - - gK = _k; gN = _n; - - _nodes = powi( _k, _n ); - - // n stages of k^(n-1) k x k switches - _size = _n*powi( _k, _n-1 ); - - // n-1 sets of wiring between the stages - _channels = (_n-1)*_nodes; -} - -void KNFly::_BuildNet( const Configuration &config ) -{ - ostringstream router_name; - - int per_stage = powi( _k, _n-1 ); - - int node = 0; - int c; - - for ( int stage = 0; stage < _n; ++stage ) { - for ( int addr = 0; addr < per_stage; ++addr ) { - - router_name << "router_" << stage << "_" << addr; - _routers[node] = Router::NewRouter( config, this, router_name.str( ), - node, _k, _k ); - _timed_modules.push_back(_routers[node]); - router_name.str(""); - -#ifdef DEBUG_FLY - cout << "connecting node " << node << " to:" << endl; -#endif - - for ( int port = 0; port < _k; ++port ) { - // Input connections - if ( stage == 0 ) { - c = addr*_k + port; - _routers[node]->AddInputChannel( _inject[c], _inject_cred[c] ); -#ifdef DEBUG_FLY - cout << " injection channel " << c << endl; -#endif - } else { - c = _InChannel( stage, addr, port ); - _routers[node]->AddInputChannel( _chan[c], _chan_cred[c] ); - _chan[c]->SetLatency( 1 ); - -#ifdef DEBUG_FLY - cout << " input channel " << c << endl; -#endif - } - - // Output connections - if ( stage == _n - 1 ) { - c = addr*_k + port; - _routers[node]->AddOutputChannel( _eject[c], _eject_cred[c] ); -#ifdef DEBUG_FLY - cout << " ejection channel " << c << endl; -#endif - } else { - c = _OutChannel( stage, addr, port ); - _routers[node]->AddOutputChannel( _chan[c], _chan_cred[c] ); -#ifdef DEBUG_FLY - cout << " output channel " << c << endl; -#endif - } - } - - ++node; - } - } -} - -int KNFly::_OutChannel( int stage, int addr, int port ) const -{ - return stage*_nodes + addr*_k + port; -} - -int KNFly::_InChannel( int stage, int addr, int port ) const -{ - int in_addr; - int in_port; - - // Channels are between {node,port} - // { d_{n-1} ... d_{n-stage} ... d_0 } and - // { d_{n-1} ... d_0 ... d_{n-stage} } - - int shift = powi( _k, _n-stage-1 ); - - int last_digit = port; - int zero_digit = ( addr / shift ) % _k; - - // swap zero and last digit to get first node's address - in_addr = addr - zero_digit*shift + last_digit*shift; - in_port = zero_digit; - - return (stage-1)*_nodes + in_addr*_k + in_port; -} - -int KNFly::GetN( ) const -{ - return _n; -} - -int KNFly::GetK( ) const -{ - return _k; -} - -double KNFly::Capacity( ) const -{ - return 1.0; -} - diff --git a/src/intersim2/.svn/pristine/3f/3f4cacd217f3c1d154a11537511bf6b6e96a8e6b.svn-base b/src/intersim2/.svn/pristine/3f/3f4cacd217f3c1d154a11537511bf6b6e96a8e6b.svn-base deleted file mode 100644 index 43876dc..0000000 --- a/src/intersim2/.svn/pristine/3f/3f4cacd217f3c1d154a11537511bf6b6e96a8e6b.svn-base +++ /dev/null @@ -1,76 +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. -*/ - -#ifndef _STATS_HPP_ -#define _STATS_HPP_ - -#include "module.hpp" - -class Stats : public Module { - int _num_samples; - double _sample_sum; - double _sample_squared_sum; - - //bool _reset; - double _min; - double _max; - - int _num_bins; - double _bin_size; - - vector<int> _hist; - -public: - Stats( Module *parent, const string &name, - double bin_size = 1.0, int num_bins = 10 ); - - void Clear( ); - - double Average( ) const; - double Variance( ) const; - double Max( ) const; - double Min( ) const; - double Sum( ) const; - double SquaredSum( ) const; - int NumSamples( ) const; - - void AddSample( double val ); - inline void AddSample( int val ) { - AddSample( (double)val ); - } - - int GetBin(int b){ return _hist[b];} - - void Display( ostream & os = cout ) const; - - friend ostream & operator<<(ostream & os, const Stats & s); - -}; - -ostream & operator<<(ostream & os, const Stats & s); - -#endif diff --git a/src/intersim2/.svn/pristine/42/42777bd5ccda83625dfbf29e7aec13f2e773373a.svn-base b/src/intersim2/.svn/pristine/42/42777bd5ccda83625dfbf29e7aec13f2e773373a.svn-base deleted file mode 100644 index 6260406..0000000 --- a/src/intersim2/.svn/pristine/42/42777bd5ccda83625dfbf29e7aec13f2e773373a.svn-base +++ /dev/null @@ -1,1999 +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. -*/ - -/*routefunc.cpp - * - *This is where most of the routing functions reside. Some of the topologies - *has their own "register routing functions" which must be called to access - *those routing functions. - * - *After writing a routing function, don't forget to register it. The reg - *format is rfname_topologyname. - * - */ - -#include <map> -#include <cstdlib> -#include <cassert> - -#include "booksim.hpp" -#include "routefunc.hpp" -#include "kncube.hpp" -#include "random_utils.hpp" -#include "misc_utils.hpp" -#include "fattree.hpp" -#include "tree4.hpp" -#include "qtree.hpp" -#include "cmesh.hpp" - - - -map<string, tRoutingFunction> gRoutingFunctionMap; - -/* Global information used by routing functions */ - -int gNumVCs; - -/* Add more functions here - * - */ - -// ============================================================ -// Balfour-Schultz -int gReadReqBeginVC, gReadReqEndVC; -int gWriteReqBeginVC, gWriteReqEndVC; -int gReadReplyBeginVC, gReadReplyEndVC; -int gWriteReplyBeginVC, gWriteReplyEndVC; - -// ============================================================ -// QTree: Nearest Common Ancestor -// === -void qtree_nca( const Router *r, const Flit *f, - int in_channel, OutputSet* outputs, bool inject) -{ - 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 { - - int height = QTree::HeightFromID( r->GetID() ); - int pos = QTree::PosFromID( r->GetID() ); - - int dest = f->dest; - - for (int i = height+1; i < gN; i++) - dest /= gK; - if ( pos == dest / gK ) - // Route down to child - out_port = dest % gK ; - else - // Route up to parent - out_port = gK; - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -// ============================================================ -// Tree4: Nearest Common Ancestor w/ Adaptive Routing Up -// === -void tree4_anca( const Router *r, const Flit *f, - int in_channel, OutputSet* outputs, bool inject) -{ - 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 range = 1; - - int out_port; - - if(inject) { - - out_port = -1; - - } else { - - int dest = f->dest; - - const int NPOS = 16; - - int rH = r->GetID( ) / NPOS; - int rP = r->GetID( ) % NPOS; - - if ( rH == 0 ) { - dest /= 16; - out_port = 2 * dest + RandomInt(1); - } else if ( rH == 1 ) { - dest /= 4; - if ( dest / 4 == rP / 2 ) - out_port = dest % 4; - else { - out_port = gK; - range = gK; - } - } else { - if ( dest/4 == rP ) - out_port = dest % 4; - else { - out_port = gK; - range = 2; - } - } - - // cout << "Router("<<rH<<","<<rP<<"): id= " << f->id << " dest= " << f->dest << " out_port = " - // << out_port << endl; - - } - - outputs->Clear( ); - - for (int i = 0; i < range; ++i) - outputs->AddRange( out_port + i, vcBegin, vcEnd ); -} - -// ============================================================ -// Tree4: Nearest Common Ancestor w/ Random Routing Up -// === -void tree4_nca( const Router *r, const Flit *f, - int in_channel, OutputSet* outputs, bool inject) -{ - 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 { - - int dest = f->dest; - - const int NPOS = 16; - - int rH = r->GetID( ) / NPOS; - int rP = r->GetID( ) % NPOS; - - if ( rH == 0 ) { - dest /= 16; - out_port = 2 * dest + RandomInt(1); - } else if ( rH == 1 ) { - dest /= 4; - if ( dest / 4 == rP / 2 ) - out_port = dest % 4; - else - out_port = gK + RandomInt(gK-1); - } else { - if ( dest/4 == rP ) - out_port = dest % 4; - else - out_port = gK + RandomInt(1); - } - - // cout << "Router("<<rH<<","<<rP<<"): id= " << f->id << " dest= " << f->dest << " out_port = " - // << out_port << endl; - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -// ============================================================ -// FATTREE: Nearest Common Ancestor w/ Random Routing Up -// === -void fattree_nca( const Router *r, const Flit *f, - int in_channel, OutputSet* outputs, bool inject) -{ - 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 { - - int dest = f->dest; - int router_id = r->GetID(); //routers are numbered with smallest at the top level - int routers_per_level = powi(gK, gN-1); - int pos = router_id%routers_per_level; - int router_depth = router_id/ routers_per_level; //which level - int routers_per_neighborhood = powi(gK,gN-router_depth-1); - int router_neighborhood = pos/routers_per_neighborhood; //coverage of this tree - int router_coverage = powi(gK, gN-router_depth); //span of the tree from this router - - - //NCA reached going down - if(dest <(router_neighborhood+1)* router_coverage && - dest >=router_neighborhood* router_coverage){ - //down ports are numbered first - - //ejection - if(router_depth == gN-1){ - out_port = dest%gK; - } else { - //find the down port for the destination - int router_branch_coverage = powi(gK, gN-(router_depth+1)); - out_port = (dest-router_neighborhood* router_coverage)/router_branch_coverage; - } - } else { - //up ports are numbered last - assert(in_channel<gK);//came from a up channel - out_port = gK+RandomInt(gK-1); - } - } - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -// ============================================================ -// FATTREE: Nearest Common Ancestor w/ Adaptive Routing Up -// === -void fattree_anca( const Router *r, const Flit *f, - int in_channel, OutputSet* outputs, bool inject) -{ - - 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 { - - - int dest = f->dest; - int router_id = r->GetID(); //routers are numbered with smallest at the top level - int routers_per_level = powi(gK, gN-1); - int pos = router_id%routers_per_level; - int router_depth = router_id/ routers_per_level; //which level - int routers_per_neighborhood = powi(gK,gN-router_depth-1); - int router_neighborhood = pos/routers_per_neighborhood; //coverage of this tree - int router_coverage = powi(gK, gN-router_depth); //span of the tree from this router - - - //NCA reached going down - if(dest <(router_neighborhood+1)* router_coverage && - dest >=router_neighborhood* router_coverage){ - //down ports are numbered first - - //ejection - if(router_depth == gN-1){ - out_port = dest%gK; - } else { - //find the down port for the destination - int router_branch_coverage = powi(gK, gN-(router_depth+1)); - out_port = (dest-router_neighborhood* router_coverage)/router_branch_coverage; - } - } else { - //up ports are numbered last - assert(in_channel<gK);//came from a up channel - out_port = gK; - int random1 = RandomInt(gK-1); // Chose two ports out of the possible at random, compare loads, choose one. - int random2 = RandomInt(gK-1); - if (r->GetUsedCredit(out_port + random1) > r->GetUsedCredit(out_port + random2)){ - out_port = out_port + random2; - }else{ - out_port = out_port + random1; - } - } - } - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - - - - -// ============================================================ -// Mesh - adatpive XY,YX Routing -// pick xy or yx min routing adaptively at the source router -// === - -int dor_next_mesh( int cur, int dest, bool descending = false ); - -void adaptive_xy_yx_mesh( const Router *r, const Flit *f, - int in_channel, OutputSet *outputs, bool inject ) -{ - 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 if(r->GetID() == f->dest) { - - // at destination router, we don't need to separate VCs by dim order - out_port = 2*gN; - - } else { - - //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); - - int out_port_xy = dor_next_mesh( r->GetID(), f->dest, false ); - int out_port_yx = dor_next_mesh( r->GetID(), f->dest, true ); - - // Route order (XY or YX) determined when packet is injected - // into the network, adaptively - bool x_then_y; - if(in_channel < 2*gN){ - x_then_y = (f->vc < (vcBegin + available_vcs)); - } else { - int credit_xy = r->GetUsedCredit(out_port_xy); - int credit_yx = r->GetUsedCredit(out_port_yx); - if(credit_xy > credit_yx) { - x_then_y = false; - } else if(credit_xy < credit_yx) { - x_then_y = true; - } else { - x_then_y = (RandomInt(1) > 0); - } - } - - if(x_then_y) { - out_port = out_port_xy; - vcEnd -= available_vcs; - } else { - out_port = out_port_yx; - vcBegin += available_vcs; - } - - } - - outputs->Clear(); - - outputs->AddRange( out_port , vcBegin, vcEnd ); - -} - -void xy_yx_mesh( const Router *r, const Flit *f, - int in_channel, OutputSet *outputs, bool inject ) -{ - 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 if(r->GetID() == f->dest) { - - // at destination router, we don't need to separate VCs by dim order - out_port = 2*gN; - - } else { - - //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); - - // Route order (XY or YX) determined when packet is injected - // into the network - bool x_then_y = ((in_channel < 2*gN) ? - (f->vc < (vcBegin + available_vcs)) : - (RandomInt(1) > 0)); - - if(x_then_y) { - out_port = dor_next_mesh( r->GetID(), f->dest, false ); - vcEnd -= available_vcs; - } else { - out_port = dor_next_mesh( r->GetID(), f->dest, true ); - vcBegin += available_vcs; - } - - } - - outputs->Clear(); - - outputs->AddRange( out_port , vcBegin, vcEnd ); - -} - -// -// End Balfour-Schultz -//============================================================= - -//============================================================= - -int dor_next_mesh( int cur, int dest, bool descending ) -{ - if ( cur == dest ) { - return 2*gN; // Eject - } - - int dim_left; - - if(descending) { - for ( dim_left = ( gN - 1 ); dim_left > 0; --dim_left ) { - if ( ( cur * gK / gNodes ) != ( dest * gK / gNodes ) ) { break; } - cur = (cur * gK) % gNodes; dest = (dest * gK) % gNodes; - } - cur = (cur * gK) / gNodes; - dest = (dest * gK) / gNodes; - } else { - for ( dim_left = 0; dim_left < ( gN - 1 ); ++dim_left ) { - if ( ( cur % gK ) != ( dest % gK ) ) { break; } - cur /= gK; dest /= gK; - } - cur %= gK; - dest %= gK; - } - - if ( cur < dest ) { - return 2*dim_left; // Right - } else { - return 2*dim_left + 1; // Left - } -} - -//============================================================= - -void dor_next_torus( int cur, int dest, int in_port, - int *out_port, int *partition, - bool balance = false ) -{ - int dim_left; - int dir; - int dist2; - - for ( dim_left = 0; dim_left < gN; ++dim_left ) { - if ( ( cur % gK ) != ( dest % gK ) ) { break; } - cur /= gK; dest /= gK; - } - - if ( dim_left < gN ) { - - if ( (in_port/2) != dim_left ) { - // Turning into a new dimension - - cur %= gK; dest %= gK; - dist2 = gK - 2 * ( ( dest - cur + gK ) % gK ); - - if ( ( dist2 > 0 ) || - ( ( dist2 == 0 ) && ( RandomInt( 1 ) ) ) ) { - *out_port = 2*dim_left; // Right - dir = 0; - } else { - *out_port = 2*dim_left + 1; // Left - dir = 1; - } - - if ( partition ) { - if ( balance ) { - // Cray's "Partition" allocation - // Two datelines: one between k-1 and 0 which forces VC 1 - // another between ((k-1)/2) and ((k-1)/2 + 1) which - // forces VC 0 otherwise any VC can be used - - if ( ( ( dir == 0 ) && ( cur > dest ) ) || - ( ( dir == 1 ) && ( cur < dest ) ) ) { - *partition = 1; - } else if ( ( ( dir == 0 ) && ( cur <= (gK-1)/2 ) && ( dest > (gK-1)/2 ) ) || - ( ( dir == 1 ) && ( cur > (gK-1)/2 ) && ( dest <= (gK-1)/2 ) ) ) { - *partition = 0; - } else { - *partition = RandomInt( 1 ); // use either VC set - } - } else { - // Deterministic, fixed dateline between nodes k-1 and 0 - - if ( ( ( dir == 0 ) && ( cur > dest ) ) || - ( ( dir == 1 ) && ( dest < cur ) ) ) { - *partition = 1; - } else { - *partition = 0; - } - } - } - } else { - // Inverting the least significant bit keeps - // the packet moving in the same direction - *out_port = in_port ^ 0x1; - } - - } else { - *out_port = 2*gN; // Eject - } -} - -//============================================================= - -void dim_order_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - int out_port = inject ? -1 : dor_next_mesh( r->GetID( ), f->dest ); - - 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))); - - if ( !inject && f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcEnd << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - outputs->Clear(); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void dim_order_ni_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - int out_port = inject ? -1 : dor_next_mesh( r->GetID( ), f->dest ); - - 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))); - - // at the destination router, we don't need to separate VCs by destination - if(inject || (r->GetID() != f->dest)) { - - int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes; - assert(vcs_per_dest > 0); - - vcBegin += f->dest * vcs_per_dest; - vcEnd = vcBegin + vcs_per_dest - 1; - - } - - if( !inject && f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcEnd << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void dim_order_pni_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - int out_port = inject ? -1 : dor_next_mesh( r->GetID(), f->dest ); - - 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))); - - if(inject || (r->GetID() != f->dest)) { - int next_coord = f->dest; - if(!inject) { - int out_dim = out_port / 2; - for(int d = 0; d < out_dim; ++d) { - next_coord /= gK; - } - } - next_coord %= gK; - assert(next_coord >= 0 && next_coord < gK); - int vcs_per_dest = (vcEnd - vcBegin + 1) / gK; - assert(vcs_per_dest > 0); - vcBegin += next_coord * vcs_per_dest; - vcEnd = vcBegin + vcs_per_dest - 1; - } - - if( !inject && f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcEnd << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -// Random intermediate in the minimal quadrant defined -// by the source and destination -int rand_min_intr_mesh( int src, int dest ) -{ - int dist; - - int intm = 0; - int offset = 1; - - for ( int n = 0; n < gN; ++n ) { - dist = ( dest % gK ) - ( src % gK ); - - if ( dist > 0 ) { - intm += offset * ( ( src % gK ) + RandomInt( dist ) ); - } else { - intm += offset * ( ( dest % gK ) + RandomInt( -dist ) ); - } - - offset *= gK; - dest /= gK; src /= gK; - } - - return intm; -} - -//============================================================= - -void romm_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - 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 { - - if ( in_channel == 2*gN ) { - f->ph = 0; // Phase 0 - f->intm = rand_min_intr_mesh( f->src, f->dest ); - } - - if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) { - f->ph = 1; // Go to phase 1 - } - - out_port = dor_next_mesh( r->GetID( ), (f->ph == 0) ? f->intm : f->dest ); - - // at the destination router, we don't need to separate VCs by phase - if(r->GetID() != f->dest) { - - //each class must have at least 2 vcs assigned or else valiant valiant will deadlock - int available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - - if(f->ph == 0) { - vcEnd -= available_vcs; - } else { - assert(f->ph == 1); - vcBegin += available_vcs; - } - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void romm_ni_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - 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))); - - // at the destination router, we don't need to separate VCs by destination - if(inject || (r->GetID() != f->dest)) { - - int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes; - assert(vcs_per_dest > 0); - - vcBegin += f->dest * vcs_per_dest; - vcEnd = vcBegin + vcs_per_dest - 1; - - } - - int out_port; - - if(inject) { - - out_port = -1; - - } else { - - if ( in_channel == 2*gN ) { - f->ph = 0; // Phase 0 - f->intm = rand_min_intr_mesh( f->src, f->dest ); - } - - if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) { - f->ph = 1; // Go to phase 1 - } - - out_port = dor_next_mesh( r->GetID( ), (f->ph == 0) ? f->intm : f->dest ); - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void min_adapt_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - 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))); - - outputs->Clear( ); - - if(inject) { - // injection can use all VCs - outputs->AddRange(-1, vcBegin, vcEnd); - return; - } else if(r->GetID() == f->dest) { - // ejection can also use all VCs - outputs->AddRange(2*gN, vcBegin, vcEnd); - return; - } - - int in_vc; - - if ( in_channel == 2*gN ) { - in_vc = vcEnd; // ignore the injection VC - } else { - in_vc = f->vc; - } - - // DOR for the escape channel (VC 0), low priority - int out_port = dor_next_mesh( r->GetID( ), f->dest ); - outputs->AddRange( out_port, 0, vcBegin, vcBegin ); - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcBegin << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - if ( in_vc != vcBegin ) { // If not in the escape VC - // Minimal adaptive for all other channels - int cur = r->GetID( ); - int dest = f->dest; - - for ( int n = 0; n < gN; ++n ) { - if ( ( cur % gK ) != ( dest % gK ) ) { - // Add minimal direction in dimension 'n' - if ( ( cur % gK ) < ( dest % gK ) ) { // Right - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << (vcBegin+1) << "," - << vcEnd << "]" - << " at output port " << 2*n - << " with priority " << 1 - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - outputs->AddRange( 2*n, vcBegin+1, vcEnd, 1 ); - } else { // Left - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << (vcBegin+1) << "," - << vcEnd << "]" - << " at output port " << 2*n+1 - << " with priority " << 1 - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - outputs->AddRange( 2*n + 1, vcBegin+1, vcEnd, 1 ); - } - } - cur /= gK; - dest /= gK; - } - } -} - -//============================================================= - -void planar_adapt_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - 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))); - - outputs->Clear( ); - - if(inject) { - // injection can use all VCs - outputs->AddRange(-1, vcBegin, vcEnd); - return; - } - - int cur = r->GetID( ); - int dest = f->dest; - - if ( cur != dest ) { - - int in_vc = f->vc; - int vc_mult = (vcEnd - vcBegin + 1) / 3; - - // Find the first unmatched dimension -- except - // for when we're in the first dimension because - // of misrouting in the last adaptive plane. - // In this case, go to the last dimension instead. - - int n; - for ( n = 0; n < gN; ++n ) { - if ( ( ( cur % gK ) != ( dest % gK ) ) && - !( ( in_channel/2 == 0 ) && - ( n == 0 ) && - ( in_vc < vcBegin+2*vc_mult ) ) ) { - break; - } - - cur /= gK; - dest /= gK; - } - - assert( n < gN ); - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "PLANAR ADAPTIVE: flit " << f->id - << " in adaptive plane " << n << "." << endl; - } - - // We're in adaptive plane n - - // Can route productively in d_{i,2} - bool increase; - bool fault; - if ( ( cur % gK ) < ( dest % gK ) ) { // Increasing - increase = true; - if ( !r->IsFaultyOutput( 2*n ) ) { - outputs->AddRange( 2*n, vcBegin+2*vc_mult, vcEnd ); - fault = false; - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "PLANAR ADAPTIVE: increasing in dimension " << n - << "." << endl; - } - } else { - fault = true; - } - } else { // Decreasing - increase = false; - if ( !r->IsFaultyOutput( 2*n + 1 ) ) { - outputs->AddRange( 2*n + 1, vcBegin+2*vc_mult, vcEnd ); - fault = false; - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "PLANAR ADAPTIVE: decreasing in dimension " << n - << "." << endl; - } - } else { - fault = true; - } - } - - n = ( n + 1 ) % gN; - cur /= gK; - dest /= gK; - - if ( !increase ) { - vcBegin += vc_mult; - } - vcEnd = vcBegin + vc_mult - 1; - - int d1_min_c; - if ( ( cur % gK ) < ( dest % gK ) ) { // Increasing in d_{i+1} - d1_min_c = 2*n; - } else if ( ( cur % gK ) != ( dest % gK ) ) { // Decreasing in d_{i+1} - d1_min_c = 2*n + 1; - } else { - d1_min_c = -1; - } - - // do we want to 180? if so, the last - // route was a misroute in this dimension, - // if there is no fault in d_i, just ignore - // this dimension, otherwise continue to misroute - if ( d1_min_c == in_channel ) { - if ( fault ) { - d1_min_c = in_channel ^ 1; - } else { - d1_min_c = -1; - } - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "PLANAR ADAPTIVE: avoiding 180 in dimension " << n - << "." << endl; - } - } - - if ( d1_min_c != -1 ) { - if ( !r->IsFaultyOutput( d1_min_c ) ) { - outputs->AddRange( d1_min_c, vcBegin, vcEnd ); - } else if ( fault ) { - // major problem ... fault in d_i and d_{i+1} - r->Error( "There seem to be faults in d_i and d_{i+1}" ); - } - } else if ( fault ) { // need to misroute! - bool atedge; - if ( cur % gK == 0 ) { - d1_min_c = 2*n; - atedge = true; - } else if ( cur % gK == gK - 1 ) { - d1_min_c = 2*n + 1; - atedge = true; - } else { - d1_min_c = 2*n + RandomInt( 1 ); // random misroute - - if ( d1_min_c == in_channel ) { // don't 180 - d1_min_c = in_channel ^ 1; - } - atedge = false; - } - - if ( !r->IsFaultyOutput( d1_min_c ) ) { - outputs->AddRange( d1_min_c, vcBegin, vcEnd ); - } else if ( !atedge && !r->IsFaultyOutput( d1_min_c ^ 1 ) ) { - outputs->AddRange( d1_min_c ^ 1, vcBegin, vcEnd ); - } else { - // major problem ... fault in d_i and d_{i+1} - r->Error( "There seem to be faults in d_i and d_{i+1}" ); - } - } - } else { - outputs->AddRange( 2*gN, vcBegin, vcEnd ); - } -} - -//============================================================= -/* - FIXME: This is broken (note that f->dr is never actually modified). - Even if it were, this should really use f->ph instead of introducing a single- - use field. - -void limited_adapt_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - outputs->Clear( ); - - 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))); - - if ( inject ) { - outputs->AddRange( -1, vcBegin, vcEnd - 1 ); - f->dr = 0; // zero dimension reversals - return; - } - - int cur = r->GetID( ); - int dest = f->dest; - - if ( cur != dest ) { - if ( ( f->vc != vcEnd ) && - ( f->dr != vcEnd - 1 ) ) { - - for ( int n = 0; n < gN; ++n ) { - if ( ( cur % gK ) != ( dest % gK ) ) { - int min_port; - if ( ( cur % gK ) < ( dest % gK ) ) { - min_port = 2*n; // Right - } else { - min_port = 2*n + 1; // Left - } - - // Go in a productive direction with high priority - outputs->AddRange( min_port, vcBegin, vcEnd - 1, 2 ); - - // Go in the non-productive direction with low priority - outputs->AddRange( min_port ^ 0x1, vcBegin, vcEnd - 1, 1 ); - } else { - // Both directions are non-productive - outputs->AddRange( 2*n, vcBegin, vcEnd - 1, 1 ); - outputs->AddRange( 2*n+1, vcBegin, vcEnd - 1, 1 ); - } - - cur /= gK; - dest /= gK; - } - - } else { - outputs->AddRange( dor_next_mesh( cur, dest ), - vcEnd, vcEnd, 0 ); - } - - } else { // at destination - outputs->AddRange( 2*gN, vcBegin, vcEnd ); - } -} -*/ -//============================================================= - -void valiant_mesh( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - 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 { - - if ( in_channel == 2*gN ) { - f->ph = 0; // Phase 0 - f->intm = RandomInt( gNodes - 1 ); - } - - if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) { - f->ph = 1; // Go to phase 1 - } - - out_port = dor_next_mesh( r->GetID( ), (f->ph == 0) ? f->intm : f->dest ); - - // at the destination router, we don't need to separate VCs by phase - if(r->GetID() != f->dest) { - - //each class must have at least 2 vcs assigned or else valiant valiant will deadlock - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - - if(f->ph == 0) { - vcEnd -= available_vcs; - } else { - assert(f->ph == 1); - vcBegin += available_vcs; - } - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void valiant_torus( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - 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 { - - int phase; - if ( in_channel == 2*gN ) { - phase = 0; // Phase 0 - f->intm = RandomInt( gNodes - 1 ); - } else { - phase = f->ph / 2; - } - - if ( ( phase == 0 ) && ( r->GetID( ) == f->intm ) ) { - phase = 1; // Go to phase 1 - in_channel = 2*gN; // ensures correct vc selection at the beginning of phase 2 - } - - int ring_part; - dor_next_torus( r->GetID( ), (phase == 0) ? f->intm : f->dest, in_channel, - &out_port, &ring_part, false ); - - f->ph = 2 * phase + ring_part; - - // at the destination router, we don't need to separate VCs by phase, etc. - if(r->GetID() != f->dest) { - - int const ring_available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(ring_available_vcs > 0); - - if(ring_part == 0) { - vcEnd -= ring_available_vcs; - } else { - assert(ring_part == 1); - vcBegin += ring_available_vcs; - } - - int const ph_available_vcs = ring_available_vcs / 2; - assert(ph_available_vcs > 0); - - if(phase == 0) { - vcEnd -= ph_available_vcs; - } else { - assert(phase == 1); - vcBegin += ph_available_vcs; - } - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void valiant_ni_torus( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - 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))); - - // at the destination router, we don't need to separate VCs by destination - if(inject || (r->GetID() != f->dest)) { - - int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes; - assert(vcs_per_dest > 0); - - vcBegin += f->dest * vcs_per_dest; - vcEnd = vcBegin + vcs_per_dest - 1; - - } - - int out_port; - - if(inject) { - - out_port = -1; - - } else { - - int phase; - if ( in_channel == 2*gN ) { - phase = 0; // Phase 0 - f->intm = RandomInt( gNodes - 1 ); - } else { - phase = f->ph / 2; - } - - if ( ( f->ph == 0 ) && ( r->GetID( ) == f->intm ) ) { - f->ph = 1; // Go to phase 1 - in_channel = 2*gN; // ensures correct vc selection at the beginning of phase 2 - } - - int ring_part; - dor_next_torus( r->GetID( ), (f->ph == 0) ? f->intm : f->dest, in_channel, - &out_port, &ring_part, false ); - - f->ph = 2 * phase + ring_part; - - // at the destination router, we don't need to separate VCs by phase, etc. - if(r->GetID() != f->dest) { - - int const ring_available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(ring_available_vcs > 0); - - if(ring_part == 0) { - vcEnd -= ring_available_vcs; - } else { - assert(ring_part == 1); - vcBegin += ring_available_vcs; - } - - int const ph_available_vcs = ring_available_vcs / 2; - assert(ph_available_vcs > 0); - - if(phase == 0) { - vcEnd -= ph_available_vcs; - } else { - assert(phase == 1); - vcBegin += ph_available_vcs; - } - } - - if (f->watch) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcEnd << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void dim_order_torus( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - 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 { - - int cur = r->GetID( ); - int dest = f->dest; - - dor_next_torus( cur, dest, in_channel, - &out_port, &f->ph, false ); - - - // at the destination router, we don't need to separate VCs by ring partition - if(cur != dest) { - - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - - if ( f->ph == 0 ) { - vcEnd -= available_vcs; - } else { - vcBegin += available_vcs; - } - } - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcEnd << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void dim_order_ni_torus( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - 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 { - - int cur = r->GetID( ); - int dest = f->dest; - - dor_next_torus( cur, dest, in_channel, - &out_port, NULL, false ); - - // at the destination router, we don't need to separate VCs by destination - if(cur != dest) { - - int const vcs_per_dest = (vcEnd - vcBegin + 1) / gNodes; - assert(vcs_per_dest); - - vcBegin += f->dest * vcs_per_dest; - vcEnd = vcBegin + vcs_per_dest - 1; - - } - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcEnd << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void dim_order_bal_torus( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - 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 { - - int cur = r->GetID( ); - int dest = f->dest; - - dor_next_torus( cur, dest, in_channel, - &out_port, &f->ph, true ); - - // at the destination router, we don't need to separate VCs by ring partition - if(cur != dest) { - - int const available_vcs = (vcEnd - vcBegin + 1) / 2; - assert(available_vcs > 0); - - if ( f->ph == 0 ) { - vcEnd -= available_vcs; - } else { - assert(f->ph == 1); - vcBegin += available_vcs; - } - } - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << "Adding VC range [" - << vcBegin << "," - << vcEnd << "]" - << " at output port " << out_port - << " for flit " << f->id - << " (input port " << in_channel - << ", destination " << f->dest << ")" - << "." << endl; - } - - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - -//============================================================= - -void min_adapt_torus( const Router *r, const Flit *f, int in_channel, OutputSet *outputs, bool inject ) -{ - 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))); - - outputs->Clear( ); - - if(inject) { - // injection can use all VCs - outputs->AddRange(-1, vcBegin, vcEnd); - return; - } else if(r->GetID() == f->dest) { - // ejection can also use all VCs - outputs->AddRange(2*gN, vcBegin, vcEnd); - } - - int in_vc; - if ( in_channel == 2*gN ) { - in_vc = vcEnd; // ignore the injection VC - } else { - in_vc = f->vc; - } - - int cur = r->GetID( ); - int dest = f->dest; - - int out_port; - - if ( in_vc > ( vcBegin + 1 ) ) { // If not in the escape VCs - // Minimal adaptive for all other channels - - for ( int n = 0; n < gN; ++n ) { - if ( ( cur % gK ) != ( dest % gK ) ) { - int dist2 = gK - 2 * ( ( ( dest % gK ) - ( cur % gK ) + gK ) % gK ); - - if ( dist2 > 0 ) { /*) || - ( ( dist2 == 0 ) && ( RandomInt( 1 ) ) ) ) {*/ - outputs->AddRange( 2*n, vcBegin+3, vcBegin+3, 1 ); // Right - } else { - outputs->AddRange( 2*n + 1, vcBegin+3, vcBegin+3, 1 ); // Left - } - } - - cur /= gK; - dest /= gK; - } - - // DOR for the escape channel (VCs 0-1), low priority --- - // trick the algorithm with the in channel. want VC assignment - // as if we had injected at this node - dor_next_torus( r->GetID( ), f->dest, 2*gN, - &out_port, &f->ph, false ); - } else { - // DOR for the escape channel (VCs 0-1), low priority - dor_next_torus( cur, dest, in_channel, - &out_port, &f->ph, false ); - } - - if ( f->ph == 0 ) { - outputs->AddRange( out_port, vcBegin, vcBegin, 0 ); - } else { - outputs->AddRange( out_port, vcBegin+1, vcBegin+1, 0 ); - } -} - -//============================================================= - -void dest_tag_fly( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - 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 { - - int stage = ( r->GetID( ) * gK ) / gNodes; - int dest = f->dest; - - while( stage < ( gN - 1 ) ) { - dest /= gK; - ++stage; - } - - out_port = dest % gK; - } - - outputs->Clear( ); - - outputs->AddRange( out_port, vcBegin, vcEnd ); -} - - - -//============================================================= - -void chaos_torus( const Router *r, const Flit *f, - int in_channel, OutputSet *outputs, bool inject ) -{ - outputs->Clear( ); - - if(inject) { - outputs->AddRange(-1, 0, 0); - return; - } - - int cur = r->GetID( ); - int dest = f->dest; - - if ( cur != dest ) { - for ( int n = 0; n < gN; ++n ) { - - if ( ( cur % gK ) != ( dest % gK ) ) { - int dist2 = gK - 2 * ( ( ( dest % gK ) - ( cur % gK ) + gK ) % gK ); - - if ( dist2 >= 0 ) { - outputs->AddRange( 2*n, 0, 0 ); // Right - } - - if ( dist2 <= 0 ) { - outputs->AddRange( 2*n + 1, 0, 0 ); // Left - } - } - - cur /= gK; - dest /= gK; - } - } else { - outputs->AddRange( 2*gN, 0, 0 ); - } -} - - -//============================================================= - -void chaos_mesh( const Router *r, const Flit *f, - int in_channel, OutputSet *outputs, bool inject ) -{ - outputs->Clear( ); - - if(inject) { - outputs->AddRange(-1, 0, 0); - return; - } - - int cur = r->GetID( ); - int dest = f->dest; - - if ( cur != dest ) { - for ( int n = 0; n < gN; ++n ) { - if ( ( cur % gK ) != ( dest % gK ) ) { - // Add minimal direction in dimension 'n' - if ( ( cur % gK ) < ( dest % gK ) ) { // Right - outputs->AddRange( 2*n, 0, 0 ); - } else { // Left - outputs->AddRange( 2*n + 1, 0, 0 ); - } - } - cur /= gK; - dest /= gK; - } - } else { - outputs->AddRange( 2*gN, 0, 0 ); - } -} - -//============================================================= - -void InitializeRoutingMap( const Configuration & config ) -{ - - gNumVCs = config.GetInt( "num_vcs" ); - - // - // traffic class partitions - // - gReadReqBeginVC = config.GetInt("read_request_begin_vc"); - if(gReadReqBeginVC < 0) { - gReadReqBeginVC = 0; - } - gReadReqEndVC = config.GetInt("read_request_end_vc"); - if(gReadReqEndVC < 0) { - gReadReqEndVC = gNumVCs / 2 - 1; - } - gWriteReqBeginVC = config.GetInt("write_request_begin_vc"); - if(gWriteReqBeginVC < 0) { - gWriteReqBeginVC = 0; - } - gWriteReqEndVC = config.GetInt("write_request_end_vc"); - if(gWriteReqEndVC < 0) { - gWriteReqEndVC = gNumVCs / 2 - 1; - } - gReadReplyBeginVC = config.GetInt("read_reply_begin_vc"); - if(gReadReplyBeginVC < 0) { - gReadReplyBeginVC = gNumVCs / 2; - } - gReadReplyEndVC = config.GetInt("read_reply_end_vc"); - if(gReadReplyEndVC < 0) { - gReadReplyEndVC = gNumVCs - 1; - } - gWriteReplyBeginVC = config.GetInt("write_reply_begin_vc"); - if(gWriteReplyBeginVC < 0) { - gWriteReplyBeginVC = gNumVCs / 2; - } - gWriteReplyEndVC = config.GetInt("write_reply_end_vc"); - if(gWriteReplyEndVC < 0) { - gWriteReplyEndVC = gNumVCs - 1; - } - - /* Register routing functions here */ - - // =================================================== - // Balfour-Schultz - gRoutingFunctionMap["nca_fattree"] = &fattree_nca; - gRoutingFunctionMap["anca_fattree"] = &fattree_anca; - gRoutingFunctionMap["nca_qtree"] = &qtree_nca; - gRoutingFunctionMap["nca_tree4"] = &tree4_nca; - gRoutingFunctionMap["anca_tree4"] = &tree4_anca; - gRoutingFunctionMap["dor_mesh"] = &dim_order_mesh; - gRoutingFunctionMap["xy_yx_mesh"] = &xy_yx_mesh; - gRoutingFunctionMap["adaptive_xy_yx_mesh"] = &adaptive_xy_yx_mesh; - // End Balfour-Schultz - // =================================================== - - gRoutingFunctionMap["dim_order_mesh"] = &dim_order_mesh; - gRoutingFunctionMap["dim_order_ni_mesh"] = &dim_order_ni_mesh; - gRoutingFunctionMap["dim_order_pni_mesh"] = &dim_order_pni_mesh; - gRoutingFunctionMap["dim_order_torus"] = &dim_order_torus; - gRoutingFunctionMap["dim_order_ni_torus"] = &dim_order_ni_torus; - gRoutingFunctionMap["dim_order_bal_torus"] = &dim_order_bal_torus; - - gRoutingFunctionMap["romm_mesh"] = &romm_mesh; - gRoutingFunctionMap["romm_ni_mesh"] = &romm_ni_mesh; - - gRoutingFunctionMap["min_adapt_mesh"] = &min_adapt_mesh; - gRoutingFunctionMap["min_adapt_torus"] = &min_adapt_torus; - - gRoutingFunctionMap["planar_adapt_mesh"] = &planar_adapt_mesh; - - // FIXME: This is broken. - // gRoutingFunctionMap["limited_adapt_mesh"] = &limited_adapt_mesh; - - gRoutingFunctionMap["valiant_mesh"] = &valiant_mesh; - gRoutingFunctionMap["valiant_torus"] = &valiant_torus; - gRoutingFunctionMap["valiant_ni_torus"] = &valiant_ni_torus; - - gRoutingFunctionMap["dest_tag_fly"] = &dest_tag_fly; - - gRoutingFunctionMap["chaos_mesh"] = &chaos_mesh; - gRoutingFunctionMap["chaos_torus"] = &chaos_torus; -} diff --git a/src/intersim2/.svn/pristine/47/471f8248dcd907fcddacc3b42c965e4919cb2f35.svn-base b/src/intersim2/.svn/pristine/47/471f8248dcd907fcddacc3b42c965e4919cb2f35.svn-base deleted file mode 100644 index 9e65de5..0000000 --- a/src/intersim2/.svn/pristine/47/471f8248dcd907fcddacc3b42c965e4919cb2f35.svn-base +++ /dev/null @@ -1,48 +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. -*/ - -#ifndef _ISLIP_HPP_ -#define _ISLIP_HPP_ - -#include <vector> - -#include "allocator.hpp" - -class iSLIP_Sparse : public SparseAllocator { - int _iSLIP_iter; - - vector<int> _gptrs; - vector<int> _aptrs; - -public: - iSLIP_Sparse( Module *parent, const string& name, - int inputs, int outputs, int iters ); - - void Allocate( ); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/4d/4d8326ecf3cc79ffda12daf20e4a46b4439ada88.svn-base b/src/intersim2/.svn/pristine/4d/4d8326ecf3cc79ffda12daf20e4a46b4439ada88.svn-base deleted file mode 100644 index d96bd56..0000000 --- a/src/intersim2/.svn/pristine/4d/4d8326ecf3cc79ffda12daf20e4a46b4439ada88.svn-base +++ /dev/null @@ -1,290 +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. -*/ - -/*network.cpp - * - *This class is the basis of the entire network, it contains, all the routers - *channels in the network, and is extended by all the network topologies - * - */ - -#include <cassert> -#include <sstream> - -#include "booksim.hpp" -#include "network.hpp" - -#include "kncube.hpp" -#include "fly.hpp" -#include "cmesh.hpp" -#include "flatfly_onchip.hpp" -#include "qtree.hpp" -#include "tree4.hpp" -#include "fattree.hpp" -#include "anynet.hpp" -#include "dragonfly.hpp" - - -Network::Network( const Configuration &config, const string & name ) : - TimedModule( 0, name ) -{ - _size = -1; - _nodes = -1; - _channels = -1; - _classes = config.GetInt("classes"); -} - -Network::~Network( ) -{ - for ( int r = 0; r < _size; ++r ) { - if ( _routers[r] ) delete _routers[r]; - } - for ( int s = 0; s < _nodes; ++s ) { - if ( _inject[s] ) delete _inject[s]; - if ( _inject_cred[s] ) delete _inject_cred[s]; - } - for ( int d = 0; d < _nodes; ++d ) { - if ( _eject[d] ) delete _eject[d]; - if ( _eject_cred[d] ) delete _eject_cred[d]; - } - for ( int c = 0; c < _channels; ++c ) { - if ( _chan[c] ) delete _chan[c]; - if ( _chan_cred[c] ) delete _chan_cred[c]; - } -} - -Network * Network::New(const Configuration & config, const string & name) -{ - const string topo = config.GetStr( "topology" ); - Network * n = NULL; - if ( topo == "torus" ) { - KNCube::RegisterRoutingFunctions() ; - n = new KNCube( config, name, false ); - } else if ( topo == "mesh" ) { - KNCube::RegisterRoutingFunctions() ; - n = new KNCube( config, name, true ); - } else if ( topo == "cmesh" ) { - CMesh::RegisterRoutingFunctions() ; - n = new CMesh( config, name ); - } else if ( topo == "fly" ) { - KNFly::RegisterRoutingFunctions() ; - n = new KNFly( config, name ); - } else if ( topo == "qtree" ) { - QTree::RegisterRoutingFunctions() ; - n = new QTree( config, name ); - } else if ( topo == "tree4" ) { - Tree4::RegisterRoutingFunctions() ; - n = new Tree4( config, name ); - } else if ( topo == "fattree" ) { - FatTree::RegisterRoutingFunctions() ; - n = new FatTree( config, name ); - } else if ( topo == "flatfly" ) { - FlatFlyOnChip::RegisterRoutingFunctions() ; - n = new FlatFlyOnChip( config, name ); - } else if ( topo == "anynet"){ - AnyNet::RegisterRoutingFunctions() ; - n = new AnyNet(config, name); - } else if ( topo == "dragonflynew"){ - DragonFlyNew::RegisterRoutingFunctions() ; - n = new DragonFlyNew(config, name); - } else { - cerr << "Unknown topology: " << topo << endl; - } - - /*legacy code that insert random faults in the networks - *not sure how to use this - */ - if ( n && ( config.GetInt( "link_failures" ) > 0 ) ) { - n->InsertRandomFaults( config ); - } - return n; -} - -void Network::_Alloc( ) -{ - assert( ( _size != -1 ) && - ( _nodes != -1 ) && - ( _channels != -1 ) ); - - _routers.resize(_size); - gNodes = _nodes; - - /*booksim used arrays of flits as the channels which makes have capacity of - *one. To simulate channel latency, flitchannel class has been added - *which are fifos with depth = channel latency and each cycle the channel - *shifts by one - *credit channels are the necessary counter part - */ - _inject.resize(_nodes); - _inject_cred.resize(_nodes); - for ( int s = 0; s < _nodes; ++s ) { - ostringstream name; - name << Name() << "_fchan_ingress" << s; - _inject[s] = new FlitChannel(this, name.str(), _classes); - _inject[s]->SetSource(NULL, s); - _timed_modules.push_back(_inject[s]); - name.str(""); - name << Name() << "_cchan_ingress" << s; - _inject_cred[s] = new CreditChannel(this, name.str()); - _timed_modules.push_back(_inject_cred[s]); - } - _eject.resize(_nodes); - _eject_cred.resize(_nodes); - for ( int d = 0; d < _nodes; ++d ) { - ostringstream name; - name << Name() << "_fchan_egress" << d; - _eject[d] = new FlitChannel(this, name.str(), _classes); - _eject[d]->SetSink(NULL, d); - _timed_modules.push_back(_eject[d]); - name.str(""); - name << Name() << "_cchan_egress" << d; - _eject_cred[d] = new CreditChannel(this, name.str()); - _timed_modules.push_back(_eject_cred[d]); - } - _chan.resize(_channels); - _chan_cred.resize(_channels); - for ( int c = 0; c < _channels; ++c ) { - ostringstream name; - name << Name() << "_fchan_" << c; - _chan[c] = new FlitChannel(this, name.str(), _classes); - _timed_modules.push_back(_chan[c]); - name.str(""); - name << Name() << "_cchan_" << c; - _chan_cred[c] = new CreditChannel(this, name.str()); - _timed_modules.push_back(_chan_cred[c]); - } -} - -void Network::ReadInputs( ) -{ - for(deque<TimedModule *>::const_iterator iter = _timed_modules.begin(); - iter != _timed_modules.end(); - ++iter) { - (*iter)->ReadInputs( ); - } -} - -void Network::Evaluate( ) -{ - for(deque<TimedModule *>::const_iterator iter = _timed_modules.begin(); - iter != _timed_modules.end(); - ++iter) { - (*iter)->Evaluate( ); - } -} - -void Network::WriteOutputs( ) -{ - for(deque<TimedModule *>::const_iterator iter = _timed_modules.begin(); - iter != _timed_modules.end(); - ++iter) { - (*iter)->WriteOutputs( ); - } -} - -void Network::WriteFlit( Flit *f, int source ) -{ - assert( ( source >= 0 ) && ( source < _nodes ) ); - _inject[source]->Send(f); -} - -Flit *Network::ReadFlit( int dest ) -{ - assert( ( dest >= 0 ) && ( dest < _nodes ) ); - return _eject[dest]->Receive(); -} - -void Network::WriteCredit( Credit *c, int dest ) -{ - assert( ( dest >= 0 ) && ( dest < _nodes ) ); - _eject_cred[dest]->Send(c); -} - -Credit *Network::ReadCredit( int source ) -{ - assert( ( source >= 0 ) && ( source < _nodes ) ); - return _inject_cred[source]->Receive(); -} - -void Network::InsertRandomFaults( const Configuration &config ) -{ - Error( "InsertRandomFaults not implemented for this topology!" ); -} - -void Network::OutChannelFault( int r, int c, bool fault ) -{ - assert( ( r >= 0 ) && ( r < _size ) ); - _routers[r]->OutChannelFault( c, fault ); -} - -double Network::Capacity( ) const -{ - return 1.0; -} - -/* this function can be heavily modified to display any information - * neceesary of the network, by default, call display on each router - * and display the channel utilization rate - */ -void Network::Display( ostream & os ) const -{ - for ( int r = 0; r < _size; ++r ) { - _routers[r]->Display( os ); - } -} - -void Network::DumpChannelMap( ostream & os, string const & prefix ) const -{ - os << prefix << "source_router,source_port,dest_router,dest_port" << endl; - for(int c = 0; c < _nodes; ++c) - os << prefix - << "-1," - << _inject[c]->GetSourcePort() << ',' - << _inject[c]->GetSink()->GetID() << ',' - << _inject[c]->GetSinkPort() << endl; - for(int c = 0; c < _channels; ++c) - os << prefix - << _chan[c]->GetSource()->GetID() << ',' - << _chan[c]->GetSourcePort() << ',' - << _chan[c]->GetSink()->GetID() << ',' - << _chan[c]->GetSinkPort() << endl; - for(int c = 0; c < _nodes; ++c) - os << prefix - << _eject[c]->GetSource()->GetID() << ',' - << _eject[c]->GetSourcePort() << ',' - << "-1," - << _eject[c]->GetSinkPort() << endl; -} - -void Network::DumpNodeMap( ostream & os, string const & prefix ) const -{ - os << prefix << "source_router,dest_router" << endl; - for(int s = 0; s < _nodes; ++s) - os << prefix - << _eject[s]->GetSource()->GetID() << ',' - << _inject[s]->GetSink()->GetID() << endl; -} diff --git a/src/intersim2/.svn/pristine/52/52025d7789c8bb45a38bad2e58ac67cc26f3b4ed.svn-base b/src/intersim2/.svn/pristine/52/52025d7789c8bb45a38bad2e58ac67cc26f3b4ed.svn-base deleted file mode 100644 index 261c411..0000000 --- a/src/intersim2/.svn/pristine/52/52025d7789c8bb45a38bad2e58ac67cc26f3b4ed.svn-base +++ /dev/null @@ -1,99 +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. -*/ - -// ---------------------------------------------------------------------- -// -// File Name: flitchannel.hpp -// -// The FlitChannel models a flit channel with a multi-cycle -// transmission delay. The channel latency can be specified as -// an integer number of simulator cycles. -// ---------------------------------------------------------------------- - -#ifndef FLITCHANNEL_HPP -#define FLITCHANNEL_HPP - -// ---------------------------------------------------------------------- -// $Author: jbalfour $ -// $Date: 2007/06/27 23:10:17 $ -// $Id$ -// ---------------------------------------------------------------------- - -#include "channel.hpp" -#include "flit.hpp" - -using namespace std; - -class Router ; - -class FlitChannel : public Channel<Flit> { -public: - FlitChannel(Module * parent, string const & name, int classes); - - void SetSource(Router const * const router, int port) ; - inline Router const * const GetSource() const { - return _routerSource; - } - inline int const & GetSourcePort() const { - return _routerSourcePort; - } - void SetSink(Router const * const router, int port) ; - inline Router const * const GetSink() const { - return _routerSink; - } - inline int const & GetSinkPort() const { - return _routerSinkPort; - } - inline vector<int> const & GetActivity() const { - return _active; - } - - // Send flit - virtual void Send(Flit * flit); - - virtual void ReadInputs(); - virtual void WriteOutputs(); - -private: - - //////////////////////////////////////// - // - // Power Models OBSOLETE - // - //////////////////////////////////////// - - Router const * _routerSource; - int _routerSourcePort; - Router const * _routerSink; - int _routerSinkPort; - - // Statistics for Activity Factors - vector<int> _active; - int _idle; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/55/5559780a67de13b98fb00d7f052ce254551f229b.svn-base b/src/intersim2/.svn/pristine/55/5559780a67de13b98fb00d7f052ce254551f229b.svn-base deleted file mode 100644 index 4387d46..0000000 --- a/src/intersim2/.svn/pristine/55/5559780a67de13b98fb00d7f052ce254551f229b.svn-base +++ /dev/null @@ -1,88 +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. -*/ - -#ifndef _FlatFlyOnChip_HPP_ -#define _FlatFlyOnChip_HPP_ - -#include "network.hpp" - -#include "routefunc.hpp" -#include <cassert> - - -class FlatFlyOnChip : public Network { - - int _m; - int _n; - int _r; - int _k; - int _c; - int _radix; - int _net_size; - int _stageout; - int _numinput; - int _stages; - int _num_of_switch; - - void _ComputeSize( const Configuration &config ); - void _BuildNet( const Configuration &config ); - - int _OutChannel( int stage, int addr, int port, int outputs ) const; - int _InChannel( int stage, int addr, int port ) const; - -public: - FlatFlyOnChip( const Configuration &config, const string & name ); - - int GetN( ) const; - int GetK( ) const; - - static void RegisterRoutingFunctions() ; - double Capacity( ) const; - void InsertRandomFaults( const Configuration &config ); -}; -void adaptive_xyyx_flatfly( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -void xyyx_flatfly( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -void min_flatfly( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -void ugal_xyyx_flatfly_onchip( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -void ugal_flatfly_onchip( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -void ugal_pni_flatfly_onchip( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -void valiant_flatfly( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); - -int find_distance (int src, int dest); -int find_ran_intm (int src, int dest); -int flatfly_outport(int dest, int rID); -int flatfly_transformation(int dest); -int flatfly_outport_yx(int dest, int rID); - -#endif diff --git a/src/intersim2/.svn/pristine/55/55ee19fa1932804a55ee815f4456c4a6f21a355f.svn-base b/src/intersim2/.svn/pristine/55/55ee19fa1932804a55ee815f4456c4a6f21a355f.svn-base deleted file mode 100644 index 5d38938..0000000 --- a/src/intersim2/.svn/pristine/55/55ee19fa1932804a55ee815f4456c4a6f21a355f.svn-base +++ /dev/null @@ -1,239 +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. -*/ - -#ifndef _BUFFER_STATE_HPP_ -#define _BUFFER_STATE_HPP_ - -#include <vector> -#include <queue> - -#include "module.hpp" -#include "flit.hpp" -#include "credit.hpp" -#include "config_utils.hpp" - -class BufferState : public Module { - - class BufferPolicy : public Module { - protected: - BufferState const * const _buffer_state; - public: - BufferPolicy(Configuration const & config, BufferState * parent, - const string & name); - virtual void SetMinLatency(int min_latency) {} - virtual void TakeBuffer(int vc = 0); - virtual void SendingFlit(Flit const * const f); - virtual void FreeSlotFor(int vc = 0); - virtual bool IsFullFor(int vc = 0) const = 0; - virtual int AvailableFor(int vc = 0) const = 0; - virtual int LimitFor(int vc = 0) const = 0; - - static BufferPolicy * New(Configuration const & config, - BufferState * parent, const string & name); - }; - - class PrivateBufferPolicy : public BufferPolicy { - protected: - int _vc_buf_size; - public: - PrivateBufferPolicy(Configuration const & config, BufferState * parent, - const string & name); - virtual void SendingFlit(Flit const * const f); - virtual bool IsFullFor(int vc = 0) const; - virtual int AvailableFor(int vc = 0) const; - virtual int LimitFor(int vc = 0) const; - }; - - class SharedBufferPolicy : public BufferPolicy { - protected: - int _buf_size; - vector<int> _private_buf_vc_map; - vector<int> _private_buf_size; - vector<int> _private_buf_occupancy; - int _shared_buf_size; - int _shared_buf_occupancy; - vector<int> _reserved_slots; - void ProcessFreeSlot(int vc = 0); - public: - SharedBufferPolicy(Configuration const & config, BufferState * parent, - const string & name); - virtual void SendingFlit(Flit const * const f); - virtual void FreeSlotFor(int vc = 0); - virtual bool IsFullFor(int vc = 0) const; - virtual int AvailableFor(int vc = 0) const; - virtual int LimitFor(int vc = 0) const; - }; - - class LimitedSharedBufferPolicy : public SharedBufferPolicy { - protected: - int _vcs; - int _active_vcs; - int _max_held_slots; - public: - LimitedSharedBufferPolicy(Configuration const & config, - BufferState * parent, - const string & name); - virtual void TakeBuffer(int vc = 0); - virtual void SendingFlit(Flit const * const f); - virtual bool IsFullFor(int vc = 0) const; - virtual int AvailableFor(int vc = 0) const; - virtual int LimitFor(int vc = 0) const; - }; - - class DynamicLimitedSharedBufferPolicy : public LimitedSharedBufferPolicy { - public: - DynamicLimitedSharedBufferPolicy(Configuration const & config, - BufferState * parent, - const string & name); - virtual void TakeBuffer(int vc = 0); - virtual void SendingFlit(Flit const * const f); - }; - - class ShiftingDynamicLimitedSharedBufferPolicy : public DynamicLimitedSharedBufferPolicy { - public: - ShiftingDynamicLimitedSharedBufferPolicy(Configuration const & config, - BufferState * parent, - const string & name); - virtual void TakeBuffer(int vc = 0); - virtual void SendingFlit(Flit const * const f); - }; - - class FeedbackSharedBufferPolicy : public SharedBufferPolicy { - protected: - int _ComputeRTT(int vc, int last_rtt) const; - int _ComputeLimit(int rtt) const; - int _ComputeMaxSlots(int vc) const; - int _vcs; - vector<int> _occupancy_limit; - vector<int> _round_trip_time; - vector<queue<int> > _flit_sent_time; - int _min_latency; - int _total_mapped_size; - int _aging_scale; - int _offset; - public: - FeedbackSharedBufferPolicy(Configuration const & config, - BufferState * parent, const string & name); - virtual void SetMinLatency(int min_latency); - virtual void SendingFlit(Flit const * const f); - virtual void FreeSlotFor(int vc = 0); - virtual bool IsFullFor(int vc = 0) const; - virtual int AvailableFor(int vc = 0) const; - virtual int LimitFor(int vc = 0) const; - }; - - class SimpleFeedbackSharedBufferPolicy : public FeedbackSharedBufferPolicy { - protected: - vector<int> _pending_credits; - public: - SimpleFeedbackSharedBufferPolicy(Configuration const & config, - BufferState * parent, const string & name); - virtual void SendingFlit(Flit const * const f); - virtual void FreeSlotFor(int vc = 0); - }; - - bool _wait_for_tail_credit; - int _size; - int _occupancy; - vector<int> _vc_occupancy; - int _vcs; - - BufferPolicy * _buffer_policy; - - vector<int> _in_use_by; - vector<bool> _tail_sent; - vector<int> _last_id; - vector<int> _last_pid; - -#ifdef TRACK_BUFFERS - int _classes; - vector<queue<int> > _outstanding_classes; - vector<int> _class_occupancy; -#endif - -public: - - BufferState( const Configuration& config, - Module *parent, const string& name ); - - ~BufferState(); - - inline void SetMinLatency(int min_latency) { - _buffer_policy->SetMinLatency(min_latency); - } - - void ProcessCredit( Credit const * const c ); - void SendingFlit( Flit const * const f ); - - void TakeBuffer( int vc = 0, int tag = 0 ); - - inline bool IsFull() const { - assert(_occupancy <= _size); - return (_occupancy == _size); - } - inline bool IsFullFor( int vc = 0 ) const { - return _buffer_policy->IsFullFor(vc); - } - inline int AvailableFor( int vc = 0 ) const { - return _buffer_policy->AvailableFor(vc); - } - inline int LimitFor( int vc = 0 ) const { - return _buffer_policy->LimitFor(vc); - } - inline bool IsEmptyFor(int vc = 0) const { - assert((vc >= 0) && (vc < _vcs)); - return (_vc_occupancy[vc] == 0); - } - inline bool IsAvailableFor( int vc = 0 ) const { - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return _in_use_by[vc] < 0; - } - inline int UsedBy(int vc = 0) const { - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return _in_use_by[vc]; - } - - inline int Occupancy() const { - return _occupancy; - } - - inline int OccupancyFor( int vc = 0 ) const { - assert((vc >= 0) && (vc < _vcs)); - return _vc_occupancy[vc]; - } - -#ifdef TRACK_BUFFERS - inline int OccupancyForClass(int c) const { - assert((c >= 0) && (c < _classes)); - return _class_occupancy[c]; - } -#endif - - void Display( ostream & os = cout ) const; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/56/569d5254648903d6589a32c30a98b3276cdbdebd.svn-base b/src/intersim2/.svn/pristine/56/569d5254648903d6589a32c30a98b3276cdbdebd.svn-base deleted file mode 100644 index 5ecb0f9..0000000 --- a/src/intersim2/.svn/pristine/56/569d5254648903d6589a32c30a98b3276cdbdebd.svn-base +++ /dev/null @@ -1,91 +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. -*/ - -// ---------------------------------------------------------------------- -// -// File Name: flitchannel.cpp -// Author: James Balfour, Rebecca Schultz -// -// ---------------------------------------------------------------------- - -#include "flitchannel.hpp" - -#include <iostream> -#include <iomanip> - -#include "router.hpp" -#include "globals.hpp" - -// ---------------------------------------------------------------------- -// $Author: jbalfour $ -// $Date: 2007/06/27 23:10:17 $ -// $Id$ -// ---------------------------------------------------------------------- -FlitChannel::FlitChannel(Module * parent, string const & name, int classes) -: Channel<Flit>(parent, name), _routerSource(NULL), _routerSourcePort(-1), - _routerSink(NULL), _routerSinkPort(-1), _idle(0) { - _active.resize(classes, 0); -} - -void FlitChannel::SetSource(Router const * const router, int port) { - _routerSource = router; - _routerSourcePort = port; -} - -void FlitChannel::SetSink(Router const * const router, int port) { - _routerSink = router; - _routerSinkPort = port; -} - -void FlitChannel::Send(Flit * f) { - if(f) { - ++_active[f->cl]; - } else { - ++_idle; - } - Channel<Flit>::Send(f); -} - -void FlitChannel::ReadInputs() { - Flit const * const & f = _input; - if(f && f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Beginning channel traversal for flit " << f->id - << " with delay " << _delay - << "." << endl; - } - Channel<Flit>::ReadInputs(); -} - -void FlitChannel::WriteOutputs() { - Channel<Flit>::WriteOutputs(); - if(_output && _output->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Completed channel traversal for flit " << _output->id - << "." << endl; - } -} diff --git a/src/intersim2/.svn/pristine/58/589a6050104bd5e828d72f3efdc31796eae32683.svn-base b/src/intersim2/.svn/pristine/58/589a6050104bd5e828d72f3efdc31796eae32683.svn-base deleted file mode 100644 index 59249e6..0000000 --- a/src/intersim2/.svn/pristine/58/589a6050104bd5e828d72f3efdc31796eae32683.svn-base +++ /dev/null @@ -1,51 +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. -*/ - -#ifndef _MAXSIZE_HPP_ -#define _MAXSIZE_HPP_ - -#include <vector> - -#include "allocator.hpp" - -class MaxSizeMatch : public DenseAllocator { - vector<int> _from; // array to hold breadth-first tree - int *_s; // stack of leaf nodes in tree - int *_ns; // next stack - int _prio; // priority pointer to ensure fairness - - bool _ShortestAugmenting( ); - -public: - MaxSizeMatch( Module *parent, const string& name, - int inputs, int ouputs ); - ~MaxSizeMatch( ); - - void Allocate( ); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/59/59bcc26ad66045a58e3f0590f2b12ad7eba5991f.svn-base b/src/intersim2/.svn/pristine/59/59bcc26ad66045a58e3f0590f2b12ad7eba5991f.svn-base deleted file mode 100644 index 5919b56..0000000 --- a/src/intersim2/.svn/pristine/59/59bcc26ad66045a58e3f0590f2b12ad7eba5991f.svn-base +++ /dev/null @@ -1,71 +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. -*/ - -// ---------------------------------------------------------------------- -// -// Matrix: Matrix Arbiter -// -// ---------------------------------------------------------------------- - -#ifndef _MATRIX_ARB_HPP_ -#define _MATRIX_ARB_HPP_ - -#include <vector> - -#include "arbiter.hpp" - -using namespace std; - -class MatrixArbiter : public Arbiter { - - // Priority matrix - vector<vector<int> > _matrix ; - - int _last_req ; - -public: - - // Constructors - MatrixArbiter( Module *parent, const string &name, int size ) ; - - // Print priority matrix to standard output - virtual void PrintState() const ; - - // Update priority matrix based on last aribtration result - virtual void UpdateState() ; - - // Arbitrate amongst requests. Returns winning input and - // updates pointers to metadata when valid pointers are passed - virtual int Arbitrate( int* id = 0, int* pri = 0) ; - - virtual void AddRequest( int input, int id, int pri ) ; - - virtual void Clear(); - -} ; - -#endif diff --git a/src/intersim2/.svn/pristine/5c/5cc61faafce12ea44fa63fb32a14f8f0c74c7338.svn-base b/src/intersim2/.svn/pristine/5c/5cc61faafce12ea44fa63fb32a14f8f0c74c7338.svn-base deleted file mode 100644 index d438ee6..0000000 --- a/src/intersim2/.svn/pristine/5c/5cc61faafce12ea44fa63fb32a14f8f0c74c7338.svn-base +++ /dev/null @@ -1,66 +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. -*/ - -#ifndef _OUTPUTSET_HPP_ -#define _OUTPUTSET_HPP_ - -#include <set> - -class OutputSet { - - -public: - struct sSetElement { - int vc_start; - int vc_end; - int pri; - int output_port; - }; - - void Clear( ); - void Add( int output_port, int vc, int pri = 0 ); - void AddRange( int output_port, int vc_start, int vc_end, int pri = 0 ); - - bool OutputEmpty( int output_port ) const; - int NumVCs( int output_port ) const; - - const set<sSetElement> & GetSet() const; - - int GetVC( int output_port, int vc_index, int *pri = 0 ) const; - bool GetPortVC( int *out_port, int *out_vc ) const; -private: - set<sSetElement> _outputs; -}; - -inline bool operator<(const OutputSet::sSetElement & se1, - const OutputSet::sSetElement & se2) { - return se1.pri > se2.pri; // higher priorities first! -} - -#endif - - diff --git a/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base b/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base deleted file mode 100644 index 44d597c..0000000 --- a/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base +++ /dev/null @@ -1,187 +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. -*/ - -//////////////////////////////////////////////////////////////////////// -// -// QTree: A Quad-Tree Indirect Network. -// -// -//////////////////////////////////////////////////////////////////////// -// -// RCS Information: -// $Author: jbalfour $ -// $Date: 2007/05/17 17:14:07 $ -// $Id$ -// -//////////////////////////////////////////////////////////////////////// - -#include "booksim.hpp" -#include <vector> -#include <sstream> -#include "qtree.hpp" -#include "misc_utils.hpp" - -QTree::QTree( const Configuration& config, const string & name ) -: Network ( config, name ) -{ - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); -} - - -void QTree::_ComputeSize( const Configuration& config ) -{ - - _k = config.GetInt( "k" ); - _n = config.GetInt( "n" ); - - assert( _k == 4 && _n == 3 ); - - gK = _k; gN = _n; - - _nodes = powi( _k, _n ); - - _size = 0; - for (int i = 0; i < _n; i++) - _size += powi( _k, i ); - - _channels = 0; - for (int j = 1; j < _n; j++) - _channels += 2 * powi( _k, j ); - -} - -void QTree::RegisterRoutingFunctions(){ - -} - -void QTree::_BuildNet( const Configuration& config ) -{ - - ostringstream routerName; - int h, r, pos, port; - - for (h = 0; h < _n; h++) { - for (pos = 0 ; pos < powi( _k, h ) ; ++pos ) { - - int id = h * 256 + pos; - r = _RouterIndex( h, pos ); - - routerName << "router_" << h << "_" << pos; - - int d = ( h == 0 ) ? _k : _k + 1; - _routers[r] = Router::NewRouter( config, this, - routerName.str( ), - id, d, d); - _timed_modules.push_back(_routers[r]); - routerName.str(""); - } - } - - // Injection & Ejection Channels - for ( pos = 0 ; pos < powi( _k, _n-1 ) ; ++pos ) { - r = _RouterIndex( _n-1, pos ); - for ( port = 0 ; port < _k ; port++ ) { - - _routers[r]->AddInputChannel( _inject[_k*pos+port], - _inject_cred[_k*pos+port]); - - _routers[r]->AddOutputChannel( _eject[_k*pos+port], - _eject_cred[_k*pos+port]); - } - } - - int c; - for ( h = 0 ; h < _n ; ++h ) { - for ( pos = 0 ; pos < powi( _k, h ) ; ++pos ) { - for ( port = 0 ; port < _k ; port++ ) { - - r = _RouterIndex( h, pos ); - - if ( h < _n-1 ) { - // Channels to Children Nodes - c = _InputIndex( h , pos, port ); - _routers[r]->AddInputChannel( _chan[c], - _chan_cred[c] ); - - c = _OutputIndex( h, pos, port ); - _routers[r]->AddOutputChannel( _chan[c], - _chan_cred[c] ); - - } - } - if ( h > 0 ) { - // Channels to Parent Nodes - c = _OutputIndex( h - 1, pos / _k, pos % _k ); - _routers[r]->AddInputChannel( _chan[c], - _chan_cred[c] ); - - c = _InputIndex( h - 1, pos / _k, pos % _k ); - _routers[r]->AddOutputChannel( _chan[c], - _chan_cred[c]); - } - } - } -} - -int QTree::_RouterIndex( int height, int pos ) -{ - int r = 0; - for ( int h = 0; h < height; h++ ) - r += powi( _k, h ); - return (r + pos); -} - -int QTree::_InputIndex( int height, int pos, int port ) -{ - assert( height >= 0 && height < powi( _k,_n-1 ) ); - int c = 0; - for ( int h = 0; h < height; h++) - c += powi( _k, h+1 ); - return ( c + _k * pos + port ); -} - -int QTree::_OutputIndex( int height, int pos, int port ) -{ - assert( height >= 0 && height < powi( _k,_n-1 ) ); - int c = _channels / 2; - for ( int h = 0; h < height; h++) - c += powi( _k, h+1 ); - return ( c + _k * pos + port ); -} - - -int QTree::HeightFromID( int id ) -{ - return id / 256; -} - -int QTree::PosFromID( int id ) -{ - return id % 256; -} diff --git a/src/intersim2/.svn/pristine/65/650f86454fd17051ddb2eca80fd985027770a1ba.svn-base b/src/intersim2/.svn/pristine/65/650f86454fd17051ddb2eca80fd985027770a1ba.svn-base deleted file mode 100644 index 466583e..0000000 --- a/src/intersim2/.svn/pristine/65/650f86454fd17051ddb2eca80fd985027770a1ba.svn-base +++ /dev/null @@ -1,49 +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. -*/ - -#ifndef _LOA_HPP_ -#define _LOA_HPP_ - -#include <vector> - -#include "allocator.hpp" - -class LOA : public DenseAllocator { - vector<int> _counts; - vector<int> _req; - - vector<int> _rptr; - vector<int> _gptr; - -public: - LOA( Module *parent, const string& name, - int inputs, int outputs ); - - void Allocate( ); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/66/6699bbb1b4cb750a8857780e76ee4923ef317c90.svn-base b/src/intersim2/.svn/pristine/66/6699bbb1b4cb750a8857780e76ee4923ef317c90.svn-base deleted file mode 100644 index 3667472..0000000 --- a/src/intersim2/.svn/pristine/66/6699bbb1b4cb750a8857780e76ee4923ef317c90.svn-base +++ /dev/null @@ -1,34 +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. -*/ - -#ifndef _MISC_UTILS_HPP_ -#define _MISC_UTILS_HPP_ - -int log_two( int x ); -int powi( int x, int y ); - -#endif diff --git a/src/intersim2/.svn/pristine/69/691260433188a985b38ff49ca3f51e6c0b731c0a.svn-base b/src/intersim2/.svn/pristine/69/691260433188a985b38ff49ca3f51e6c0b731c0a.svn-base deleted file mode 100644 index f9e727a..0000000 --- a/src/intersim2/.svn/pristine/69/691260433188a985b38ff49ca3f51e6c0b731c0a.svn-base +++ /dev/null @@ -1,118 +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. -*/ - -#ifndef _NETWORK_HPP_ -#define _NETWORK_HPP_ - -#include <vector> -#include <deque> - -#include "module.hpp" -#include "flit.hpp" -#include "credit.hpp" -#include "router.hpp" -#include "module.hpp" -#include "timed_module.hpp" -#include "flitchannel.hpp" -#include "channel.hpp" -#include "config_utils.hpp" -#include "globals.hpp" - -typedef Channel<Credit> CreditChannel; - - -class Network : public TimedModule { -protected: - - int _size; - int _nodes; - int _channels; - int _classes; - - vector<Router *> _routers; - - vector<FlitChannel *> _inject; - vector<CreditChannel *> _inject_cred; - - vector<FlitChannel *> _eject; - vector<CreditChannel *> _eject_cred; - - vector<FlitChannel *> _chan; - vector<CreditChannel *> _chan_cred; - - deque<TimedModule *> _timed_modules; - - virtual void _ComputeSize( const Configuration &config ) = 0; - virtual void _BuildNet( const Configuration &config ) = 0; - - void _Alloc( ); - -public: - Network( const Configuration &config, const string & name ); - virtual ~Network( ); - - static Network *New( const Configuration &config, const string & name ); - - virtual void WriteFlit( Flit *f, int source ); - virtual Flit *ReadFlit( int dest ); - - virtual void WriteCredit( Credit *c, int dest ); - virtual Credit *ReadCredit( int source ); - - inline int NumNodes( ) const {return _nodes;} - - virtual void InsertRandomFaults( const Configuration &config ); - void OutChannelFault( int r, int c, bool fault = true ); - - virtual double Capacity( ) const; - - virtual void ReadInputs( ); - virtual void Evaluate( ); - virtual void WriteOutputs( ); - - void Display( ostream & os = cout ) const; - void DumpChannelMap( ostream & os = cout, string const & prefix = "" ) const; - void DumpNodeMap( ostream & os = cout, string const & prefix = "" ) const; - - int NumChannels() const {return _channels;} - const vector<FlitChannel *> & GetInject() {return _inject;} - FlitChannel * GetInject(int index) {return _inject[index];} - const vector<CreditChannel *> & GetInjectCred() {return _inject_cred;} - CreditChannel * GetInjectCred(int index) {return _inject_cred[index];} - const vector<FlitChannel *> & GetEject(){return _eject;} - FlitChannel * GetEject(int index) {return _eject[index];} - const vector<CreditChannel *> & GetEjectCred(){return _eject_cred;} - CreditChannel * GetEjectCred(int index) {return _eject_cred[index];} - const vector<FlitChannel *> & GetChannels(){return _chan;} - const vector<CreditChannel *> & GetChannelsCred(){return _chan_cred;} - const vector<Router *> & GetRouters(){return _routers;} - Router * GetRouter(int index) {return _routers[index];} - int NumRouters() const {return _size;} -}; - -#endif - diff --git a/src/intersim2/.svn/pristine/6c/6c86a0b772d76fae9d90046d17b6ec12b77551d0.svn-base b/src/intersim2/.svn/pristine/6c/6c86a0b772d76fae9d90046d17b6ec12b77551d0.svn-base deleted file mode 100644 index 58a3ba5..0000000 --- a/src/intersim2/.svn/pristine/6c/6c86a0b772d76fae9d90046d17b6ec12b77551d0.svn-base +++ /dev/null @@ -1,130 +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. -*/ - -/*stats.cpp - * - *class stores statistics gnerated by the trafficmanager such as the latency - *hope count of the the flits - * - *reset option resets the min and max alues of this statistiscs - */ - -#include "booksim.hpp" -#include <iostream> -#include <sstream> -#include <limits> -#include <cmath> -#include <cstdio> - -#include "stats.hpp" - -Stats::Stats( Module *parent, const string &name, - double bin_size, int num_bins ) : - Module( parent, name ), _num_bins( num_bins ), _bin_size( bin_size ) -{ - Clear(); -} - -void Stats::Clear( ) -{ - _num_samples = 0; - _sample_sum = 0.0; - _sample_squared_sum = 0.0; - - _hist.assign(_num_bins, 0); - - _min = numeric_limits<double>::quiet_NaN(); - _max = -numeric_limits<double>::quiet_NaN(); - - // _reset = true; -} - -double Stats::Average( ) const -{ - return _sample_sum / (double)_num_samples; -} - -double Stats::Variance( ) const -{ - return (_sample_squared_sum * (double)_num_samples - _sample_sum * _sample_sum) / ((double)_num_samples * (double)_num_samples); -} - -double Stats::Min( ) const -{ - return _min; -} - -double Stats::Max( ) const -{ - return _max; -} - -double Stats::Sum( ) const -{ - return _sample_sum; -} - -double Stats::SquaredSum( ) const -{ - return _sample_squared_sum; -} - -int Stats::NumSamples( ) const -{ - return _num_samples; -} - -void Stats::AddSample( double val ) -{ - ++_num_samples; - _sample_sum += val; - - // NOTE: the negation ensures that NaN values are handled correctly! - _max = !(val <= _max) ? val : _max; - _min = !(val >= _min) ? val : _min; - - //double clamp between 0 and num_bins-1 - int b = (int)fmax(floor( val / _bin_size ), 0.0); - b = (b >= _num_bins) ? (_num_bins - 1) : b; - - _hist[b]++; -} - -void Stats::Display( ostream & os ) const -{ - os << *this << endl; -} - -ostream & operator<<(ostream & os, const Stats & s) { - vector<int> const & v = s._hist; - os << "[ "; - for(size_t i = 0; i < v.size(); ++i) { - os << v[i] << " "; - } - os << "]"; - return os; -} diff --git a/src/intersim2/.svn/pristine/6d/6d0272df1c727d8c5fa77a3bfa9155d50335a5c6.svn-base b/src/intersim2/.svn/pristine/6d/6d0272df1c727d8c5fa77a3bfa9155d50335a5c6.svn-base deleted file mode 100644 index bbda15a..0000000 --- a/src/intersim2/.svn/pristine/6d/6d0272df1c727d8c5fa77a3bfa9155d50335a5c6.svn-base +++ /dev/null @@ -1,95 +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: Mesh topology with concentration and express links along the -// edge of the network -// -//////////////////////////////////////////////////////////////////////// -// -// RCS Information: -// $Author: jbalfour $ -// $Date: 2007/06/26 22:49:23 $ -// $Id$ -// -//////////////////////////////////////////////////////////////////////// -#ifndef _CMESH_HPP_ -#define _CMESH_HPP_ - -#include "network.hpp" -#include "routefunc.hpp" - -class CMesh : public Network { -public: - CMesh( const Configuration &config, const string & name ); - int GetN() const; - int GetK() const; - - static int NodeToRouter( int address ) ; - static int NodeToPort( int address ) ; - - static void RegisterRoutingFunctions() ; - -private: - - static int _cX ; - static int _cY ; - - static int _memo_NodeShiftX ; - static int _memo_NodeShiftY ; - static int _memo_PortShiftY ; - - void _ComputeSize( const Configuration &config ); - void _BuildNet( const Configuration& config ); - - int _k ; - int _n ; - int _c ; - int _xcount; - int _ycount; - int _xrouter; - int _yrouter; - bool _express_channels; -}; - -// -// Routing Functions -// -void xy_yx_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) ; - -void xy_yx_no_express_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) ; - -void dor_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) ; - -void dor_no_express_cmesh( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) ; - -#endif diff --git a/src/intersim2/.svn/pristine/6e/6ee04608f65a1c9be65fcbe3def54f38d00f1bf5.svn-base b/src/intersim2/.svn/pristine/6e/6ee04608f65a1c9be65fcbe3def54f38d00f1bf5.svn-base deleted file mode 100644 index 9df88db..0000000 --- a/src/intersim2/.svn/pristine/6e/6ee04608f65a1c9be65fcbe3def54f38d00f1bf5.svn-base +++ /dev/null @@ -1,518 +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. -*/ - -#include <iostream> -#include <sstream> -#include "random_utils.hpp" -#include "traffic.hpp" - -TrafficPattern::TrafficPattern(int nodes) -: _nodes(nodes) -{ - if(nodes <= 0) { - cout << "Error: Traffic patterns require at least one node." << endl; - exit(-1); - } -} - -void TrafficPattern::reset() -{ - -} - -TrafficPattern * TrafficPattern::New(string const & pattern, int nodes, - Configuration const * const config) -{ - string pattern_name; - string param_str; - size_t left = pattern.find_first_of('('); - if(left == string::npos) { - pattern_name = pattern; - } else { - pattern_name = pattern.substr(0, left); - size_t right = pattern.find_last_of(')'); - if(right == string::npos) { - param_str = pattern.substr(left+1); - } else { - param_str = pattern.substr(left+1, right-left-1); - } - } - vector<string> params = tokenize_str(param_str); - - TrafficPattern * result = NULL; - if(pattern_name == "bitcomp") { - result = new BitCompTrafficPattern(nodes); - } else if(pattern_name == "transpose") { - result = new TransposeTrafficPattern(nodes); - } else if(pattern_name == "bitrev") { - result = new BitRevTrafficPattern(nodes); - } else if(pattern_name == "shuffle") { - result = new ShuffleTrafficPattern(nodes); - } else if(pattern_name == "randperm") { - int perm_seed = -1; - if(params.empty()) { - if(config) { - perm_seed = config->GetInt("perm_seed"); - } else { - cout << "Error: Missing parameter for random permutation traffic pattern: " << pattern << endl; - exit(-1); - } - } else { - perm_seed = atoi(params[0].c_str()); - } - result = new RandomPermutationTrafficPattern(nodes, perm_seed); - } else if(pattern_name == "uniform") { - result = new UniformRandomTrafficPattern(nodes); - } else if(pattern_name == "background") { - vector<int> excludes = tokenize_int(params[0]); - result = new UniformBackgroundTrafficPattern(nodes, excludes); - } else if(pattern_name == "diagonal") { - result = new DiagonalTrafficPattern(nodes); - } else if(pattern_name == "asymmetric") { - result = new AsymmetricTrafficPattern(nodes); - } else if(pattern_name == "taper64") { - result = new Taper64TrafficPattern(nodes); - } else if(pattern_name == "bad_dragon") { - bool missing_params = false; - int k = -1; - if(params.size() < 1) { - if(config) { - k = config->GetInt("k"); - } else { - missing_params = true; - } - } else { - k = atoi(params[0].c_str()); - } - int n = -1; - if(params.size() < 2) { - if(config) { - n = config->GetInt("n"); - } else { - missing_params = true; - } - } else { - n = atoi(params[1].c_str()); - } - if(missing_params) { - cout << "Error: Missing parameters for dragonfly bad permutation traffic pattern: " << pattern << endl; - exit(-1); - } - result = new BadPermDFlyTrafficPattern(nodes, k, n); - } else if((pattern_name == "tornado") || (pattern_name == "neighbor") || - (pattern_name == "badperm_yarc")) { - bool missing_params = false; - int k = -1; - if(params.size() < 1) { - if(config) { - k = config->GetInt("k"); - } else { - missing_params = true; - } - } else { - k = atoi(params[0].c_str()); - } - int n = -1; - if(params.size() < 2) { - if(config) { - n = config->GetInt("n"); - } else { - missing_params = true; - } - } else { - n = atoi(params[1].c_str()); - } - int xr = -1; - if(params.size() < 3) { - if(config) { - xr = config->GetInt("xr"); - } else { - missing_params = true; - } - } else { - xr = atoi(params[2].c_str()); - } - if(missing_params) { - cout << "Error: Missing parameters for digit permutation traffic pattern: " << pattern << endl; - exit(-1); - } - if(pattern_name == "tornado") { - result = new TornadoTrafficPattern(nodes, k, n, xr); - } else if(pattern_name == "neighbor") { - result = new NeighborTrafficPattern(nodes, k, n, xr); - } else if(pattern_name == "badperm_yarc") { - result = new BadPermYarcTrafficPattern(nodes, k, n, xr); - } - } else if(pattern_name == "hotspot") { - if(params.empty()) { - params.push_back("-1"); - } - vector<int> hotspots = tokenize_int(params[0]); - for(size_t i = 0; i < hotspots.size(); ++i) { - if(hotspots[i] < 0) { - hotspots[i] = RandomInt(nodes - 1); - } - } - vector<int> rates; - if(params.size() >= 2) { - rates = tokenize_int(params[1]); - rates.resize(hotspots.size(), rates.back()); - } else { - rates.resize(hotspots.size(), 1); - } - result = new HotSpotTrafficPattern(nodes, hotspots, rates); - } else { - cout << "Error: Unknown traffic pattern: " << pattern << endl; - exit(-1); - } - return result; -} - -PermutationTrafficPattern::PermutationTrafficPattern(int nodes) - : TrafficPattern(nodes) -{ - -} - -BitPermutationTrafficPattern::BitPermutationTrafficPattern(int nodes) - : PermutationTrafficPattern(nodes) -{ - if((nodes & -nodes) != nodes) { - cout << "Error: Bit permutation traffic patterns require the number of " - << "nodes to be a power of two." << endl; - exit(-1); - } -} - -BitCompTrafficPattern::BitCompTrafficPattern(int nodes) - : BitPermutationTrafficPattern(nodes) -{ - -} - -int BitCompTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - int const mask = _nodes - 1; - return ~source & mask; -} - -TransposeTrafficPattern::TransposeTrafficPattern(int nodes) - : BitPermutationTrafficPattern(nodes), _shift(0) -{ - while(nodes >>= 1) { - ++_shift; - } - if(_shift % 2) { - cout << "Error: Transpose traffic pattern requires the number of nodes to " - << "be an even power of two." << endl; - exit(-1); - } - _shift >>= 1; -} - -int TransposeTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - int const mask_lo = (1 << _shift) - 1; - int const mask_hi = mask_lo << _shift; - return (((source >> _shift) & mask_lo) | ((source << _shift) & mask_hi)); -} - -BitRevTrafficPattern::BitRevTrafficPattern(int nodes) - : BitPermutationTrafficPattern(nodes) -{ - -} - -int BitRevTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - int result = 0; - for(int n = _nodes; n > 1; n >>= 1) { - result = (result << 1) | (source % 2); - source >>= 1; - } - return result; -} - -ShuffleTrafficPattern::ShuffleTrafficPattern(int nodes) - : BitPermutationTrafficPattern(nodes) -{ - -} - -int ShuffleTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - int const shifted = source << 1; - return ((shifted & (_nodes - 1)) | bool(shifted & _nodes)); -} - -DigitPermutationTrafficPattern::DigitPermutationTrafficPattern(int nodes, int k, - int n, int xr) - : PermutationTrafficPattern(nodes), _k(k), _n(n), _xr(xr) -{ - -} - -TornadoTrafficPattern::TornadoTrafficPattern(int nodes, int k, int n, int xr) - : DigitPermutationTrafficPattern(nodes, k, n, xr) -{ - -} - -int TornadoTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - - int offset = 1; - int result = 0; - - for(int n = 0; n < _n; ++n) { - result += offset * - (((source / offset) % (_xr * _k) + ((_xr * _k + 1) / 2 - 1)) % (_xr * _k)); - offset *= (_xr * _k); - } - return result; -} - -NeighborTrafficPattern::NeighborTrafficPattern(int nodes, int k, int n, int xr) - : DigitPermutationTrafficPattern(nodes, k, n, xr) -{ - -} - -int NeighborTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - - int offset = 1; - int result = 0; - - for(int n = 0; n < _n; ++n) { - result += offset * - (((source / offset) % (_xr * _k) + 1) % (_xr * _k)); - offset *= (_xr * _k); - } - return result; -} - -RandomPermutationTrafficPattern::RandomPermutationTrafficPattern(int nodes, - int seed) - : TrafficPattern(nodes) -{ - _dest.resize(nodes); - randomize(seed); -} - -void RandomPermutationTrafficPattern::randomize(int seed) -{ - unsigned long prev_seed = RandomIntLong( ); - RandomSeed(seed); - - _dest.assign(_nodes, -1); - - for(int i = 0; i < _nodes; ++i) { - int ind = RandomInt(_nodes - 1 - i); - - int j = 0; - int cnt = 0; - while((cnt < ind) || (_dest[j] != -1)) { - if(_dest[j] == -1) { - ++cnt; - } - ++j; - assert(j < _nodes); - } - - _dest[j] = i; - } - - RandomSeed(prev_seed); -} - -int RandomPermutationTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - assert((_dest[source] >= 0) && (_dest[source] < _nodes)); - return _dest[source]; -} - -RandomTrafficPattern::RandomTrafficPattern(int nodes) - : TrafficPattern(nodes) -{ - -} - -UniformRandomTrafficPattern::UniformRandomTrafficPattern(int nodes) - : RandomTrafficPattern(nodes) -{ - -} - -int UniformRandomTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - return RandomInt(_nodes - 1); -} - -UniformBackgroundTrafficPattern::UniformBackgroundTrafficPattern(int nodes, vector<int> excluded_nodes) - : RandomTrafficPattern(nodes) -{ - for(size_t i = 0; i < excluded_nodes.size(); ++i) { - int const node = excluded_nodes[i]; - assert((node >= 0) && (node < _nodes)); - _excluded.insert(node); - } -} - -int UniformBackgroundTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - - int result; - - do { - result = RandomInt(_nodes - 1); - } while(_excluded.count(result) > 0); - - return result; -} - -DiagonalTrafficPattern::DiagonalTrafficPattern(int nodes) - : RandomTrafficPattern(nodes) -{ - -} - -int DiagonalTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - return ((RandomInt(2) == 0) ? ((source + 1) % _nodes) : source); -} - -AsymmetricTrafficPattern::AsymmetricTrafficPattern(int nodes) - : RandomTrafficPattern(nodes) -{ - -} - -int AsymmetricTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - int const half = _nodes / 2; - return (source % half) + (RandomInt(1) ? half : 0); -} - -Taper64TrafficPattern::Taper64TrafficPattern(int nodes) - : RandomTrafficPattern(nodes) -{ - if(nodes != 64) { - cout << "Error: Tthe Taper64 traffic pattern requires the number of nodes " - << "to be exactly 64." << endl; - exit(-1); - } -} - -int Taper64TrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - if(RandomInt(1)) { - return ((64 + source + 8 * (RandomInt(2) - 1) + (RandomInt(2) - 1)) % 64); - } else { - return RandomInt(_nodes - 1); - } -} - -BadPermDFlyTrafficPattern::BadPermDFlyTrafficPattern(int nodes, int k, int n) - : DigitPermutationTrafficPattern(nodes, k, n, 1) -{ - -} - -int BadPermDFlyTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - - int const grp_size_routers = 2 * _k; - int const grp_size_nodes = grp_size_routers * _k; - - return ((RandomInt(grp_size_nodes - 1) + ((source / grp_size_nodes) + 1) * grp_size_nodes) % _nodes); -} - -BadPermYarcTrafficPattern::BadPermYarcTrafficPattern(int nodes, int k, int n, - int xr) - : DigitPermutationTrafficPattern(nodes, k, n, xr) -{ - -} - -int BadPermYarcTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - int const row = source / (_xr * _k); - return RandomInt((_xr * _k) - 1) * (_xr * _k) + row; -} - -HotSpotTrafficPattern::HotSpotTrafficPattern(int nodes, vector<int> hotspots, - vector<int> rates) - : TrafficPattern(nodes), _hotspots(hotspots), _rates(rates), _max_val(-1) -{ - assert(!_hotspots.empty()); - size_t const size = _hotspots.size(); - _rates.resize(size, _rates.empty() ? 1 : _rates.back()); - for(size_t i = 0; i < size; ++i) { - int const hotspot = _hotspots[i]; - assert((hotspot >= 0) && (hotspot < _nodes)); - int const rate = _rates[i]; - assert(rate >= 0); - _max_val += rate; - } -} - -int HotSpotTrafficPattern::dest(int source) -{ - assert((source >= 0) && (source < _nodes)); - - if(_hotspots.size() == 1) { - return _hotspots[0]; - } - - int pct = RandomInt(_max_val); - - for(size_t i = 0; i < (_hotspots.size() - 1); ++i) { - int const limit = _rates[i]; - if(limit > pct) { - return _hotspots[i]; - } else { - pct -= limit; - } - } - assert(_rates.back() > pct); - return _hotspots.back(); -} diff --git a/src/intersim2/.svn/pristine/70/7052ff59571d88c99070cd8d659460b1534cf1b3.svn-base b/src/intersim2/.svn/pristine/70/7052ff59571d88c99070cd8d659460b1534cf1b3.svn-base deleted file mode 100644 index 05382f5..0000000 --- a/src/intersim2/.svn/pristine/70/7052ff59571d88c99070cd8d659460b1534cf1b3.svn-base +++ /dev/null @@ -1,86 +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. -*/ - -// ---------------------------------------------------------------------- -// -// SeparableAllocator: Separable Allocator Base Class -// -// ---------------------------------------------------------------------- - -#include "separable.hpp" - -#include <sstream> - -#include "arbiter.hpp" - -SeparableAllocator::SeparableAllocator( Module* parent, const string& name, - int inputs, int outputs, - const string& arb_type ) - : SparseAllocator( parent, name, inputs, outputs ) -{ - - _input_arb.resize(inputs); - - for (int i = 0; i < inputs; ++i) { - ostringstream arb_name("arb_i"); - arb_name << i; - _input_arb[i] = Arbiter::NewArbiter(this, arb_name.str(), arb_type, outputs); - } - - _output_arb.resize(outputs); - - for (int i = 0; i < outputs; ++i) { - ostringstream arb_name("arb_o"); - arb_name << i; - _output_arb[i] = Arbiter::NewArbiter(this, arb_name.str( ), arb_type, inputs); - } - -} - -SeparableAllocator::~SeparableAllocator() { - - for (int i = 0; i < _inputs; ++i) { - delete _input_arb[i]; - } - - for (int i = 0; i < _outputs; ++i) { - delete _output_arb[i]; - } - -} - -void SeparableAllocator::Clear() { - for ( int i = 0 ; i < _inputs ; i++ ) { - if(_input_arb[i]-> _num_reqs) - _input_arb[i]->Clear(); - } - for ( int o = 0; o < _outputs; o++ ) { - if(_output_arb[o]->_num_reqs) - _output_arb[o]->Clear(); - } - SparseAllocator::Clear(); -} diff --git a/src/intersim2/.svn/pristine/72/72bdb07d5ae6b1010a5ae388c45b5fbe2d549f92.svn-base b/src/intersim2/.svn/pristine/72/72bdb07d5ae6b1010a5ae388c45b5fbe2d549f92.svn-base deleted file mode 100644 index 8b1f029..0000000 --- a/src/intersim2/.svn/pristine/72/72bdb07d5ae6b1010a5ae388c45b5fbe2d549f92.svn-base +++ /dev/null @@ -1,75 +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. -*/ - -// ---------------------------------------------------------------------- -// -// RoundRobin: Round Robin Arbiter -// -// ---------------------------------------------------------------------- - -#ifndef _ROUNDROBIN_HPP_ -#define _ROUNDROBIN_HPP_ - -#include "arbiter.hpp" - -class RoundRobinArbiter : public Arbiter { - - // Priority pointer - int _pointer ; - -public: - - // Constructors - RoundRobinArbiter( Module *parent, const string &name, int size ) ; - - // Print priority matrix to standard output - virtual void PrintState() const ; - - // Update priority matrix based on last aribtration result - virtual void UpdateState() ; - - // Arbitrate amongst requests. Returns winning input and - // updates pointers to metadata when valid pointers are passed - virtual int Arbitrate( int* id = 0, int* pri = 0) ; - - virtual void AddRequest( int input, int id, int pri ) ; - - virtual void Clear(); - - static inline bool Supersedes(int input1, int pri1, int input2, int pri2, int offset, int size) - { - // in a round-robin scheme with the given number of positions and current - // offset, should a request at input1 with priority pri1 supersede a - // request at input2 with priority pri2? - return ((pri1 > pri2) || - ((pri1 == pri2) && - (((input1 - offset + size) % size) < ((input2 - offset + size) % size)))); - } - -} ; - -#endif diff --git a/src/intersim2/.svn/pristine/75/75fab6aaa53ec97ae2f9769ab873fea5abf9516b.svn-base b/src/intersim2/.svn/pristine/75/75fab6aaa53ec97ae2f9769ab873fea5abf9516b.svn-base deleted file mode 100644 index cef5539..0000000 --- a/src/intersim2/.svn/pristine/75/75fab6aaa53ec97ae2f9769ab873fea5abf9516b.svn-base +++ /dev/null @@ -1,83 +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. -*/ - -#include <sstream> - -#include "globals.hpp" -#include "booksim.hpp" -#include "buffer.hpp" - -Buffer::Buffer( const Configuration& config, int outputs, - Module *parent, const string& name ) : -Module( parent, name ), _occupancy(0) -{ - int num_vcs = config.GetInt( "num_vcs" ); - - _size = config.GetInt("buf_size"); - if(_size < 0) { - _size = num_vcs * config.GetInt( "vc_buf_size" ); - }; - - _vc.resize(num_vcs); - - for(int i = 0; i < num_vcs; ++i) { - ostringstream vc_name; - vc_name << "vc_" << i; - _vc[i] = new VC(config, outputs, this, vc_name.str( ) ); - } - -#ifdef TRACK_BUFFERS - int classes = config.GetInt("classes"); - _class_occupancy.resize(classes, 0); -#endif -} - -Buffer::~Buffer() -{ - for(vector<VC*>::iterator i = _vc.begin(); i != _vc.end(); ++i) { - delete *i; - } -} - -void Buffer::AddFlit( int vc, Flit *f ) -{ - if(_occupancy >= _size) { - Error("Flit buffer overflow."); - } - ++_occupancy; - _vc[vc]->AddFlit(f); -#ifdef TRACK_BUFFERS - ++_class_occupancy[f->cl]; -#endif -} - -void Buffer::Display( ostream & os ) const -{ - for(vector<VC*>::const_iterator i = _vc.begin(); i != _vc.end(); ++i) { - (*i)->Display(os); - } -} diff --git a/src/intersim2/.svn/pristine/76/7692129db779b4e8cd14cf7ab6fac567093153b2.svn-base b/src/intersim2/.svn/pristine/76/7692129db779b4e8cd14cf7ab6fac567093153b2.svn-base deleted file mode 100644 index 12898c2..0000000 --- a/src/intersim2/.svn/pristine/76/7692129db779b4e8cd14cf7ab6fac567093153b2.svn-base +++ /dev/null @@ -1,52 +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. -*/ - -// ---------------------------------------------------------------------- -// -// SeparableInputFirstAllocator: Separable Input-First Allocator -// -// ---------------------------------------------------------------------- - -#ifndef _SEPARABLE_INPUT_FIRST_HPP_ -#define _SEPARABLE_INPUT_FIRST_HPP_ - -#include <set> - -#include "separable.hpp" - -class SeparableInputFirstAllocator : public SeparableAllocator { - -public: - - SeparableInputFirstAllocator( Module* parent, const string& name, int inputs, - int outputs, const string& arb_type ) ; - - virtual void Allocate() ; - -} ; - -#endif diff --git a/src/intersim2/.svn/pristine/77/77d1aaef881a98fa412061c4daa8137d12ee6f3f.svn-base b/src/intersim2/.svn/pristine/77/77d1aaef881a98fa412061c4daa8137d12ee6f3f.svn-base deleted file mode 100644 index 3622918..0000000 --- a/src/intersim2/.svn/pristine/77/77d1aaef881a98fa412061c4daa8137d12ee6f3f.svn-base +++ /dev/null @@ -1,158 +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. -*/ - -#ifndef _ALLOCATOR_HPP_ -#define _ALLOCATOR_HPP_ - -#include <string> -#include <map> -#include <set> -#include <vector> - -#include "module.hpp" -#include "config_utils.hpp" - -class Allocator : public Module { -protected: - const int _inputs; - const int _outputs; - - bool _dirty; - - vector<int> _inmatch; - vector<int> _outmatch; - -public: - - struct sRequest { - int port; - int label; - int in_pri; - int out_pri; - }; - - Allocator( Module *parent, const string& name, - int inputs, int outputs ); - - virtual void Clear( ); - - virtual int ReadRequest( int in, int out ) const = 0; - virtual bool ReadRequest( sRequest &req, int in, int out ) const = 0; - - virtual void AddRequest( int in, int out, int label = 1, - int in_pri = 0, int out_pri = 0 ); - virtual void RemoveRequest( int in, int out, int label = 1 ) = 0; - - virtual void Allocate( ) = 0; - - int OutputAssigned( int in ) const; - int InputAssigned( int out ) const; - - virtual bool OutputHasRequests( int out ) const = 0; - virtual bool InputHasRequests( int in ) const = 0; - - virtual int NumOutputRequests( int out ) const = 0; - virtual int NumInputRequests( int in ) const = 0; - - virtual void PrintRequests( ostream * os = NULL ) const = 0; - void PrintGrants( ostream * os = NULL ) const; - - static Allocator *NewAllocator( Module *parent, const string& name, - const string &alloc_type, - int inputs, int outputs, - Configuration const * const config = NULL ); -}; - -//================================================== -// A dense allocator stores the entire request -// matrix. -//================================================== - -class DenseAllocator : public Allocator { -protected: - vector<vector<sRequest> > _request; - -public: - DenseAllocator( Module *parent, const string& name, - int inputs, int outputs ); - - void Clear( ); - - int ReadRequest( int in, int out ) const; - bool ReadRequest( sRequest &req, int in, int out ) const; - - void AddRequest( int in, int out, int label = 1, - int in_pri = 0, int out_pri = 0 ); - void RemoveRequest( int in, int out, int label = 1 ); - - bool OutputHasRequests( int out ) const; - bool InputHasRequests( int in ) const; - - int NumOutputRequests( int out ) const; - int NumInputRequests( int in ) const; - - void PrintRequests( ostream * os = NULL ) const; - -}; - -//================================================== -// A sparse allocator only stores the requests -// (allows for a more efficient implementation). -//================================================== - -class SparseAllocator : public Allocator { -protected: - set<int> _in_occ; - set<int> _out_occ; - - vector<map<int, sRequest> > _in_req; - vector<map<int, sRequest> > _out_req; - -public: - SparseAllocator( Module *parent, const string& name, - int inputs, int outputs ); - - void Clear( ); - - int ReadRequest( int in, int out ) const; - bool ReadRequest( sRequest &req, int in, int out ) const; - - void AddRequest( int in, int out, int label = 1, - int in_pri = 0, int out_pri = 0 ); - void RemoveRequest( int in, int out, int label = 1 ); - - bool OutputHasRequests( int out ) const; - bool InputHasRequests( int in ) const; - - int NumOutputRequests( int out ) const; - int NumInputRequests( int in ) const; - - void PrintRequests( ostream * os = NULL ) const; - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/78/78c651a126efa354bfbf06841fb91bf72d970003.svn-base b/src/intersim2/.svn/pristine/78/78c651a126efa354bfbf06841fb91bf72d970003.svn-base deleted file mode 100644 index 1295ab7..0000000 --- a/src/intersim2/.svn/pristine/78/78c651a126efa354bfbf06841fb91bf72d970003.svn-base +++ /dev/null @@ -1,57 +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. -*/ - -#ifndef _WAVEFRONT_HPP_ -#define _WAVEFRONT_HPP_ - -#include <set> - -#include "allocator.hpp" - -class Wavefront : public DenseAllocator { - -private: - int _last_in; - int _last_out; - set<pair<int, int> > _priorities; - bool _skip_diags; - -protected: - int _square; - int _pri; - int _num_requests; - -public: - Wavefront( Module *parent, const string& name, - int inputs, int outputs, bool skip_diags = false ); - - virtual void AddRequest( int in, int out, int label = 1, - int in_pri = 0, int out_pri = 0 ); - virtual void Allocate( ); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/78/78db9a8009e2eeebfa8c1d67e38108237e7cf1b3.svn-base b/src/intersim2/.svn/pristine/78/78db9a8009e2eeebfa8c1d67e38108237e7cf1b3.svn-base deleted file mode 100644 index f8b6b4d..0000000 --- a/src/intersim2/.svn/pristine/78/78db9a8009e2eeebfa8c1d67e38108237e7cf1b3.svn-base +++ /dev/null @@ -1,72 +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. -*/ - -//////////////////////////////////////////////////////////////////////// -// -// Tree4: Network with 64 Terminal Nodes arranged in a tree topology -// with 4 routers at the root of the tree -// -//////////////////////////////////////////////////////////////////////// -// -// RCS Information: -// $Author: jbalfour $ -// $Date: 2007/06/26 22:49:23 $ -// $Id$ -// -//////////////////////////////////////////////////////////////////////// - -#ifndef _TREE4_HPP_ -#define _TREE4_HPP_ -#include <cassert> -#include "network.hpp" - -class Tree4 : public Network { - - int _k; - int _n; - - int _channelWidth; - - void _ComputeSize( const Configuration& config ); - void _BuildNet( const Configuration& config ); - - - Router*& _Router( int height, int pos ); - - int _WireLatency( int height1, int pos1, int height2, int pos2 ); - -public: - - Tree4( const Configuration& config, const string & name ); - static void RegisterRoutingFunctions() ; - - static int HeightFromID( int id ); - static int PosFromID( int id ); - static int SpeedUp( int height ); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/7a/7a54a566c36bec4672c4c004940eb007ffb11730.svn-base b/src/intersim2/.svn/pristine/7a/7a54a566c36bec4672c4c004940eb007ffb11730.svn-base deleted file mode 100644 index 108d139..0000000 --- a/src/intersim2/.svn/pristine/7a/7a54a566c36bec4672c4c004940eb007ffb11730.svn-base +++ /dev/null @@ -1,289 +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. -*/ - -//////////////////////////////////////////////////////////////////////// -// -// Tree4: Network with 64 Terminal Nodes arranged in a tree topology -// with 4 routers at the root of the tree -// -// Level 0 : 4 8 x 8 Routers (8 Descending Links per Router) -// Level 1 : 8 8 x 8 Routers (4 Descending Links per Router) -// Level 2 : 16 6 x 6 Routers (4 Descending Links per Router) -// Level 3 : 64 Terminal Nodes -// -//////////////////////////////////////////////////////////////////////// -// -// RCS Information: -// $Author: jbalfour $ -// $Date: 2007/06/26 22:49:23 $ -// $Id$ -// -//////////////////////////////////////////////////////////////////////// - -#include "booksim.hpp" -#include <vector> -#include <sstream> -#include <cmath> - -#include "tree4.hpp" -#include "misc_utils.hpp" - -Tree4::Tree4( const Configuration& config, const string & name ) -: Network ( config, name ) -{ - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); -} - -void Tree4::_ComputeSize( const Configuration& config ) -{ - int h; - - _k = config.GetInt( "k" ); - assert(_k == 4); - _n = config.GetInt( "n" ); - assert(_n == 3); - - gK = _k; gN = _n; - - _nodes = powi( _k, _n ); - - _size = 0; - for ( h = 0; h < _n; ++h ) - _size += (4 >> h) * powi( _k, h ); - - _channels = 2 // Two Channels per Connection - * ( 2 * powi( _k, 1) ) // Number of Middle Routers - * ( 2 * _k ); // Connectivity of Middle Routers -} - -void Tree4::RegisterRoutingFunctions(){ - -} - -void Tree4::_BuildNet( const Configuration& config ) -{ - - // - // Allocate Routers - // - ostringstream name; - int h, pos, nPos, degree, id; - - for ( h = 0; h < _n; h++ ) { - nPos = (4 >> h) * powi( _k, h ); - for ( pos = 0; pos < nPos; ++pos) { - if ( h < _n-1 ) - degree = 8; - else - degree = 6; - - name.str(""); - name << "router_" << h << "_" << pos; - id = h * powi( _k, _n-1 ) + pos; - Router * r = Router::NewRouter( config, this, name.str( ), - id, degree, degree ); - _Router( h, pos ) = r; - _timed_modules.push_back(r); - } - } - - // - // Connect Channels to Routers - // - int pp, pc; - // - // Connection Rule: Output Ports 0:3 Move DOWN Network - // Output Ports 4:7 Move UP Network - // - - // Injection & Ejection Channels - nPos = powi( _k, _n - 1 ); - for ( pos = 0 ; pos < nPos ; ++pos ) { - for ( int port = 0 ; port < _k ; ++port ) { - - _Router( _n-1, pos)->AddInputChannel( _inject[_k*pos+port], - _inject_cred[_k*pos+port]); - - - _inject[_k*pos+port]->SetLatency( 1 ); - _inject_cred[_k*pos+port]->SetLatency( 1 ); - - _Router( _n-1, pos)->AddOutputChannel( _eject[_k*pos+port], - _eject_cred[_k*pos+port]); - - _eject[_k*pos+port]->SetLatency( 1 ); - _eject_cred[_k*pos+port]->SetLatency( 1 ); - - } - } - - // Connections between h = 1 and h = 2 Levels - int c = 0; - nPos = 2 * powi( _k, 1 ); - for ( pos = 0; pos < nPos; ++pos ) { - for ( int port = 0; port < _k; ++port ) { - - pp = pos; - pc = _k * ( pos / 2 ) + port; - - // cout << "connecting (1,"<<pp<<") <-> (2,"<<pc<<")"<<endl; - - _Router( 1, pp)->AddOutputChannel( _chan[c], _chan_cred[c] ); - _Router( 2, pc)->AddInputChannel( _chan[c], _chan_cred[c] ); - - //_chan[c]->SetLatency( L ); - //_chan_cred[c]->SetLatency( L ); - - _chan[c]->SetLatency( 1 ); - _chan_cred[c]->SetLatency( 1 ); - - c++; - - _Router(1, pp)->AddInputChannel( _chan[c], _chan_cred[c] ); - _Router(2, pc)->AddOutputChannel( _chan[c], _chan_cred[c] ); - - //_chan[c]->SetLatency( L ); - //_chan_cred[c]->SetLatency( L ); - _chan[c]->SetLatency( 1 ); - _chan_cred[c]->SetLatency( 1 ); - - c++; - } - } - - // Connections between h = 0 and h = 1 Levels - nPos = 4 * powi( _k, 0 ); - for ( pos = 0; pos < nPos; ++pos ) { - for ( int port = 0; port < 2 * _k; ++port ) { - pp = pos; - pc = port; - - // cout << "connecting (0,"<<pp<<") <-> (1,"<<pc<<")"<<endl; - - _Router(0, pp)->AddOutputChannel( _chan[c], _chan_cred[c] ); - _Router(1, pc)->AddInputChannel( _chan[c], _chan_cred[c] ); - - // _chan[c]->SetLatency( L ); - //_chan_cred[c]->SetLatency( L ); - _chan[c]->SetLatency( 1 ); - _chan_cred[c]->SetLatency( 1 ); - - c++; - - _Router(0, pp)->AddInputChannel( _chan[c], _chan_cred[c] ); - _Router(1, pc)->AddOutputChannel( _chan[c], _chan_cred[c] ); - - // _chan[c]->SetLatency( L ); - // _chan_cred[c]->SetLatency( L ); - _chan[c]->SetLatency( 1 ); - _chan_cred[c]->SetLatency( 1 ); - c++; - } - } - - // cout << "Used " << c << " of " << _channels << " channels" << endl; - -} - -Router*& Tree4::_Router( int height, int pos ) -{ - assert( height < _n ); - assert( pos < (4 >> height) * powi( _k, height) ); - - int i = 0; - for ( int h = 0; h < height; ++h ) - i += (4 >> h) * powi( _k, h ); - return _routers[i+pos]; - -} - -int Tree4::_WireLatency( int height1, int pos1, int height2, int pos2 ) -{ - int heightChild, heightParent, posChild, posParent; - - int L; - - if (height1 < height2) { - heightChild = height2; - posChild = pos2; - heightParent = height1; - posParent = pos1; - } else { - heightChild = height1; - posChild = pos1; - heightParent = height2; - posParent = pos2; - } - - int _length_d2_d1 = 2 ; - int _length_d1_d0_0 = 2 ; - int _length_d1_d0_1 = 2 ; - int _length_d1_d0_2 = 6 ; - int _length_d1_d0_3 = 6 ; - - assert( heightChild == heightParent+1 ); - - // We must decrement the delays by one to account for how the - // simulator interprets the specified delay (with 0 indicating one - // cycle of delay). - - if ( heightChild == 2 ) - L = _length_d2_d1; - else { - if ( posChild == 0 || posChild == 6 ) - switch ( posParent ) { - case 0: L =_length_d1_d0_0; break; - case 1: L =_length_d1_d0_1; break; - case 2: L =_length_d1_d0_2; break; - case 3: L =_length_d1_d0_3; break; - } - if ( posChild == 1 || posChild == 7 ) - switch ( posParent ) { - case 0: L =_length_d1_d0_3; break; - case 1: L =_length_d1_d0_2; break; - case 2: L =_length_d1_d0_1; break; - case 3: L =_length_d1_d0_0; break; - } - if ( posChild == 2 || posChild == 4 ) - switch ( posParent ) { - case 0: L = _length_d1_d0_0; break; - case 1: L = _length_d1_d0_1; break; - case 2: L = _length_d1_d0_2; break; - case 3: L = _length_d1_d0_3; break; - } - if ( posChild == 3|| posChild == 5 ) - switch ( posParent ) { - case 0: L =_length_d1_d0_3; break; - case 1: L =_length_d1_d0_2; break; - case 2: L =_length_d1_d0_1; break; - case 3: L =_length_d1_d0_0; break; - } - } - return L; -} diff --git a/src/intersim2/.svn/pristine/7b/7b0efd00926de5ec0c6efc86d8ddfbba35da0f82.svn-base b/src/intersim2/.svn/pristine/7b/7b0efd00926de5ec0c6efc86d8ddfbba35da0f82.svn-base deleted file mode 100644 index 5481d1e..0000000 --- a/src/intersim2/.svn/pristine/7b/7b0efd00926de5ec0c6efc86d8ddfbba35da0f82.svn-base +++ /dev/null @@ -1,44 +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. -*/ - -#ifndef _TIMED_MODULE_HPP_ -#define _TIMED_MODULE_HPP_ - -#include "module.hpp" - -class TimedModule : public Module { - -public: - TimedModule(Module * parent, string const & name) : Module(parent, name) {} - virtual ~TimedModule() {} - - virtual void ReadInputs() = 0; - virtual void Evaluate() = 0; - virtual void WriteOutputs() = 0; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/7b/7b445ae8a3f265094d5af4956c88457b77c18fa5.svn-base b/src/intersim2/.svn/pristine/7b/7b445ae8a3f265094d5af4956c88457b77c18fa5.svn-base deleted file mode 100644 index 46ba99b..0000000 --- a/src/intersim2/.svn/pristine/7b/7b445ae8a3f265094d5af4956c88457b77c18fa5.svn-base +++ /dev/null @@ -1,220 +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. -*/ - -#include <limits> -#include <sstream> -#include <fstream> - -#include "packet_reply_info.hpp" -#include "random_utils.hpp" -#include "batchtrafficmanager.hpp" - -BatchTrafficManager::BatchTrafficManager( const Configuration &config, - const vector<Network *> & net ) -: TrafficManager(config, net), _last_id(-1), _last_pid(-1), - _overall_min_batch_time(0), _overall_avg_batch_time(0), - _overall_max_batch_time(0) -{ - - _max_outstanding = config.GetInt ("max_outstanding_requests"); - - _batch_size = config.GetInt( "batch_size" ); - _batch_count = config.GetInt( "batch_count" ); - - _batch_time = new Stats( this, "batch_time", 1.0, 1000 ); - _stats["batch_time"] = _batch_time; - - string sent_packets_out_file = config.GetStr( "sent_packets_out" ); - if(sent_packets_out_file == "") { - _sent_packets_out = NULL; - } else { - _sent_packets_out = new ofstream(sent_packets_out_file.c_str()); - } -} - -BatchTrafficManager::~BatchTrafficManager( ) -{ - delete _batch_time; - if(_sent_packets_out) delete _sent_packets_out; -} - -void BatchTrafficManager::_RetireFlit( Flit *f, int dest ) -{ - _last_id = f->id; - _last_pid = f->pid; - TrafficManager::_RetireFlit(f, dest); -} - -int BatchTrafficManager::_IssuePacket( int source, int cl ) -{ - int result = 0; - if(_use_read_write[cl]) { //read write packets - //check queue for waiting replies. - //check to make sure it is on time yet - if(!_repliesPending[source].empty()) { - if(_repliesPending[source].front()->time <= _time) { - result = -1; - } - } else { - if((_packet_seq_no[source] < _batch_size) && - ((_max_outstanding <= 0) || - (_requestsOutstanding[source] < _max_outstanding))) { - - //coin toss to determine request type. - result = (RandomFloat() < 0.5) ? 2 : 1; - - _requestsOutstanding[source]++; - } - } - } else { //normal - if((_packet_seq_no[source] < _batch_size) && - ((_max_outstanding <= 0) || - (_requestsOutstanding[source] < _max_outstanding))) { - result = _GetNextPacketSize(cl); - _requestsOutstanding[source]++; - } - } - if(result != 0) { - _packet_seq_no[source]++; - } - return result; -} - -void BatchTrafficManager::_ClearStats( ) -{ - TrafficManager::_ClearStats(); - _batch_time->Clear( ); -} - -bool BatchTrafficManager::_SingleSim( ) -{ - int batch_index = 0; - while(batch_index < _batch_count) { - _packet_seq_no.assign(_nodes, 0); - _last_id = -1; - _last_pid = -1; - _sim_state = running; - int start_time = _time; - bool batch_complete; - cout << "Sending batch " << batch_index + 1 << " (" << _batch_size << " packets)..." << endl; - do { - _Step(); - batch_complete = true; - for(int i = 0; i < _nodes; ++i) { - if(_packet_seq_no[i] < _batch_size) { - batch_complete = false; - break; - } - } - if(_sent_packets_out) { - *_sent_packets_out << _packet_seq_no << endl; - } - } while(!batch_complete); - cout << "Batch injected. Time used is " << _time - start_time << " cycles." << endl; - - int sent_time = _time; - cout << "Waiting for batch to complete..." << endl; - - int empty_steps = 0; - - bool packets_left = false; - for(int c = 0; c < _classes; ++c) { - packets_left |= !_total_in_flight_flits[c].empty(); - } - - while( packets_left ) { - _Step( ); - - ++empty_steps; - - if ( empty_steps % 1000 == 0 ) { - _DisplayRemaining( ); - cout << "."; - } - - packets_left = false; - for(int c = 0; c < _classes; ++c) { - packets_left |= !_total_in_flight_flits[c].empty(); - } - } - cout << endl; - cout << "Batch received. Time used is " << _time - sent_time << " cycles." << endl - << "Last packet was " << _last_pid << ", last flit was " << _last_id << "." << endl; - - _batch_time->AddSample(_time - start_time); - - cout << _sim_state << endl; - - UpdateStats(); - DisplayStats(); - - ++batch_index; - } - _sim_state = draining; - _drain_time = _time; - return 1; -} - -void BatchTrafficManager::_UpdateOverallStats() { - TrafficManager::_UpdateOverallStats(); - _overall_min_batch_time += _batch_time->Min(); - _overall_avg_batch_time += _batch_time->Average(); - _overall_max_batch_time += _batch_time->Max(); -} - -string BatchTrafficManager::_OverallStatsCSV(int c) const -{ - ostringstream os; - os << TrafficManager::_OverallStatsCSV(c) << ',' - << _overall_min_batch_time / (double)_total_sims << ',' - << _overall_avg_batch_time / (double)_total_sims << ',' - << _overall_max_batch_time / (double)_total_sims; - return os.str(); -} - -void BatchTrafficManager::WriteStats(ostream & os) const -{ - TrafficManager::WriteStats(os); - os << "batch_time = " << _batch_time->Average() << ";" << endl; -} - -void BatchTrafficManager::DisplayStats(ostream & os) const { - TrafficManager::DisplayStats(); - os << "Minimum batch duration = " << _batch_time->Min() << endl; - os << "Average batch duration = " << _batch_time->Average() << endl; - os << "Maximum batch duration = " << _batch_time->Max() << endl; -} - -void BatchTrafficManager::DisplayOverallStats(ostream & os) const { - TrafficManager::DisplayOverallStats(os); - os << "Overall min batch duration = " << _overall_min_batch_time / (double)_total_sims - << " (" << _total_sims << " samples)" << endl - << "Overall min batch duration = " << _overall_avg_batch_time / (double)_total_sims - << " (" << _total_sims << " samples)" << endl - << "Overall min batch duration = " << _overall_max_batch_time / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; -} diff --git a/src/intersim2/.svn/pristine/7c/7c4fde53686972fa2db885e0743742173afd1bb9.svn-base b/src/intersim2/.svn/pristine/7c/7c4fde53686972fa2db885e0743742173afd1bb9.svn-base deleted file mode 100644 index f7f84ac..0000000 --- a/src/intersim2/.svn/pristine/7c/7c4fde53686972fa2db885e0743742173afd1bb9.svn-base +++ /dev/null @@ -1,57 +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. -*/ - -#include "packet_reply_info.hpp" - -stack<PacketReplyInfo*> PacketReplyInfo::_all; -stack<PacketReplyInfo*> PacketReplyInfo::_free; - -PacketReplyInfo * PacketReplyInfo::New() -{ - PacketReplyInfo * pr; - if(_free.empty()) { - pr = new PacketReplyInfo(); - _all.push(pr); - } else { - pr = _free.top(); - _free.pop(); - } - return pr; -} - -void PacketReplyInfo::Free() -{ - _free.push(this); -} - -void PacketReplyInfo::FreeAll() -{ - while(!_all.empty()) { - delete _all.top(); - _all.pop(); - } -} diff --git a/src/intersim2/.svn/pristine/7f/7fdf02535ae5ba5ca9a2b15879dbcdd928095585.svn-base b/src/intersim2/.svn/pristine/7f/7fdf02535ae5ba5ca9a2b15879dbcdd928095585.svn-base deleted file mode 100644 index b3972d2..0000000 --- a/src/intersim2/.svn/pristine/7f/7fdf02535ae5ba5ca9a2b15879dbcdd928095585.svn-base +++ /dev/null @@ -1,202 +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. -*/ - -#ifndef _ROUTER_HPP_ -#define _ROUTER_HPP_ - -#include <string> -#include <vector> - -#include "timed_module.hpp" -#include "flit.hpp" -#include "credit.hpp" -#include "flitchannel.hpp" -#include "channel.hpp" -#include "config_utils.hpp" - -typedef Channel<Credit> CreditChannel; - -class Router : public TimedModule { - -protected: - - static int const STALL_BUFFER_BUSY; - static int const STALL_BUFFER_CONFLICT; - static int const STALL_BUFFER_FULL; - static int const STALL_BUFFER_RESERVED; - static int const STALL_CROSSBAR_CONFLICT; - - int _id; - - int _inputs; - int _outputs; - - int _classes; - - int _input_speedup; - int _output_speedup; - - double _internal_speedup; - double _partial_internal_cycles; - - int _crossbar_delay; - int _credit_delay; - - vector<FlitChannel *> _input_channels; - vector<CreditChannel *> _input_credits; - vector<FlitChannel *> _output_channels; - vector<CreditChannel *> _output_credits; - vector<bool> _channel_faults; - -#ifdef TRACK_FLOWS - vector<vector<int> > _received_flits; - vector<vector<int> > _stored_flits; - vector<vector<int> > _sent_flits; - vector<vector<int> > _outstanding_credits; - vector<vector<int> > _active_packets; -#endif - -#ifdef TRACK_STALLS - vector<int> _buffer_busy_stalls; - vector<int> _buffer_conflict_stalls; - vector<int> _buffer_full_stalls; - vector<int> _buffer_reserved_stalls; - vector<int> _crossbar_conflict_stalls; -#endif - - virtual void _InternalStep() = 0; - -public: - Router( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ); - - static Router *NewRouter( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ); - - virtual void AddInputChannel( FlitChannel *channel, CreditChannel *backchannel ); - virtual void AddOutputChannel( FlitChannel *channel, CreditChannel *backchannel ); - - inline FlitChannel * GetInputChannel( int input ) const { - assert((input >= 0) && (input < _inputs)); - return _input_channels[input]; - } - inline FlitChannel * GetOutputChannel( int output ) const { - assert((output >= 0) && (output < _outputs)); - return _output_channels[output]; - } - - virtual void ReadInputs( ) = 0; - virtual void Evaluate( ); - virtual void WriteOutputs( ) = 0; - - void OutChannelFault( int c, bool fault = true ); - bool IsFaultyOutput( int c ) const; - - inline int GetID( ) const {return _id;} - - - virtual int GetUsedCredit(int o) const = 0; - virtual int GetBufferOccupancy(int i) const = 0; - -#ifdef TRACK_BUFFERS - virtual int GetUsedCreditForClass(int output, int cl) const = 0; - virtual int GetBufferOccupancyForClass(int input, int cl) const = 0; -#endif - -#ifdef TRACK_FLOWS - inline vector<int> const & GetReceivedFlits(int c) const { - assert((c >= 0) && (c < _classes)); - return _received_flits[c]; - } - inline vector<int> const & GetStoredFlits(int c) const { - assert((c >= 0) && (c < _classes)); - return _stored_flits[c]; - } - inline vector<int> const & GetSentFlits(int c) const { - assert((c >= 0) && (c < _classes)); - return _sent_flits[c]; - } - inline vector<int> const & GetOutstandingCredits(int c) const { - assert((c >= 0) && (c < _classes)); - return _outstanding_credits[c]; - } - - inline vector<int> const & GetActivePackets(int c) const { - assert((c >= 0) && (c < _classes)); - return _active_packets[c]; - } - - inline void ResetFlowStats(int c) { - assert((c >= 0) && (c < _classes)); - _received_flits[c].assign(_received_flits[c].size(), 0); - _sent_flits[c].assign(_sent_flits[c].size(), 0); - } -#endif - - virtual vector<int> UsedCredits() const = 0; - virtual vector<int> FreeCredits() const = 0; - virtual vector<int> MaxCredits() const = 0; - -#ifdef TRACK_STALLS - inline int GetBufferBusyStalls(int c) const { - assert((c >= 0) && (c < _classes)); - return _buffer_busy_stalls[c]; - } - inline int GetBufferConflictStalls(int c) const { - assert((c >= 0) && (c < _classes)); - return _buffer_conflict_stalls[c]; - } - inline int GetBufferFullStalls(int c) const { - assert((c >= 0) && (c < _classes)); - return _buffer_full_stalls[c]; - } - inline int GetBufferReservedStalls(int c) const { - assert((c >= 0) && (c < _classes)); - return _buffer_reserved_stalls[c]; - } - inline int GetCrossbarConflictStalls(int c) const { - assert((c >= 0) && (c < _classes)); - return _crossbar_conflict_stalls[c]; - } - - inline void ResetStallStats(int c) { - assert((c >= 0) && (c < _classes)); - _buffer_busy_stalls[c] = 0; - _buffer_conflict_stalls[c] = 0; - _buffer_full_stalls[c] = 0; - _buffer_reserved_stalls[c] = 0; - _crossbar_conflict_stalls[c] = 0; - } -#endif - - inline int NumInputs() const {return _inputs;} - inline int NumOutputs() const {return _outputs;} -}; - -#endif diff --git a/src/intersim2/.svn/pristine/82/829eb51edd8ef3cc3c06778a3e3a379f352728e1.svn-base b/src/intersim2/.svn/pristine/82/829eb51edd8ef3cc3c06778a3e3a379f352728e1.svn-base deleted file mode 100644 index 89c5e21..0000000 --- a/src/intersim2/.svn/pristine/82/829eb51edd8ef3cc3c06778a3e3a379f352728e1.svn-base +++ /dev/null @@ -1,254 +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. -*/ - -#include "booksim.hpp" -#include <iostream> - -#include "selalloc.hpp" -#include "random_utils.hpp" - -//#define DEBUG_SELALLOC - -SelAlloc::SelAlloc( Module *parent, const string& name, - int inputs, int outputs, int iters ) : - SparseAllocator( parent, name, inputs, outputs ) -{ - _iter = iters; - - _gptrs.resize(outputs, 0); - _aptrs.resize(inputs, 0); - _outmask.resize(outputs, 0); -} - -void SelAlloc::Allocate( ) -{ - int input; - int output; - - int input_offset; - int output_offset; - - map<int, sRequest>::iterator p; - set<int>::iterator outer_iter; - bool wrapped; - - int max_index; - int max_pri; - - vector<int> grants(_outputs, -1); - - for ( int iter = 0; iter < _iter; ++iter ) { - // Grant phase - - for( outer_iter = _out_occ.begin( ); - outer_iter != _out_occ.end( ); ++outer_iter ) { - output = *outer_iter; - - // Skip loop if there are no requests - // or the output is already matched or - // the output is masked - if ( ( _out_req[output].empty( ) ) || - ( _outmatch[output] != -1 ) || - ( _outmask[output] != 0 ) ) { - continue; - } - - // A round-robin arbiter between input requests - input_offset = _gptrs[output]; - - p = _out_req[output].begin( ); - while( ( p != _out_req[output].end( ) ) && - ( p->second.port < input_offset ) ) { - p++; - } - - max_index = -1; - max_pri = 0; - - wrapped = false; - while( (!wrapped) || - ( ( p != _out_req[output].end() ) && - ( p->second.port < input_offset ) ) ) { - if ( p == _out_req[output].end( ) ) { - if ( wrapped ) { break; } - // p is valid here because empty lists - // are skipped (above) - p = _out_req[output].begin( ); - wrapped = true; - } - - input = p->second.port; - - // we know the output is free (above) and - // if the input is free, check if request is the - // highest priority so far - if ( ( _inmatch[input] == -1 ) && - ( ( p->second.out_pri > max_pri ) || ( max_index == -1 ) ) ) { - max_pri = p->second.out_pri; - max_index = input; - } - - p++; - } - - if ( max_index != -1 ) { // grant - grants[output] = max_index; - } - } - -#ifdef DEBUG_SELALLOC - cout << "grants: "; - for ( int i = 0; i < _outputs; ++i ) { - cout << grants[i] << " "; - } - cout << endl; - - cout << "aptrs: "; - for ( int i = 0; i < _inputs; ++i ) { - cout << _aptrs[i] << " "; - } - cout << endl; -#endif - - // Accept phase - - for ( outer_iter = _in_occ.begin( ); - outer_iter != _in_occ.end( ); ++outer_iter ) { - input = *outer_iter; - - if ( _in_req[input].empty( ) ) { - continue; - } - - // A round-robin arbiter between output grants - output_offset = _aptrs[input]; - - p = _in_req[input].begin( ); - while( ( p != _in_req[input].end( ) ) && - ( p->second.port < output_offset ) ) { - p++; - } - - max_index = -1; - max_pri = 0; - - wrapped = false; - while( (!wrapped) || - ( ( p != _in_req[input].end() ) && - ( p->second.port < output_offset ) ) ) { - if ( p == _in_req[input].end( ) ) { - if ( wrapped ) { break; } - // p is valid here because empty lists - // are skipped (above) - p = _in_req[input].begin( ); - wrapped = true; - } - - output = p->second.port; - - // we know the output is free (above) and - // if the input is free, check if the highest - // priroity - if ( ( grants[output] == input ) && - ( !_out_req[output].empty( ) ) && - ( ( p->second.in_pri > max_pri ) || ( max_index == -1 ) ) ) { - max_pri = p->second.in_pri; - max_index = output; - } - - p++; - } - - if ( max_index != -1 ) { - // Accept - output = max_index; - - _inmatch[input] = output; - _outmatch[output] = input; - - // Only update pointers if accepted during the 1st iteration - if ( iter == 0 ) { - _gptrs[output] = ( input + 1 ) % _inputs; - _aptrs[input] = ( output + 1 ) % _outputs; - } - } - } - } - -#ifdef DEBUG_SELALLOC - cout << "input match: "; - for ( int i = 0; i < _inputs; ++i ) { - cout << _inmatch[i] << " "; - } - cout << endl; - - cout << "output match: "; - for ( int j = 0; j < _outputs; ++j ) { - cout << _outmatch[j] << " "; - } - cout << endl; -#endif -} - -void SelAlloc::MaskOutput( int out, int mask ) -{ - assert( ( out >= 0 ) && ( out < _outputs ) ); - _outmask[out] = mask; -} - -void SelAlloc::PrintRequests( ostream * os ) const -{ - map<int, sRequest>::const_iterator iter; - - if(!os) os = &cout; - - *os << "Input requests = [ "; - for ( int input = 0; input < _inputs; ++input ) { - *os << input << " -> [ "; - for ( iter = _in_req[input].begin( ); - iter != _in_req[input].end( ); iter++ ) { - *os << iter->second.port << " "; - } - *os << "] "; - } - *os << "], output requests = [ "; - for ( int output = 0; output < _outputs; ++output ) { - *os << output << " -> "; - if ( _outmask[output] == 0 ) { - *os << "[ "; - for ( iter = _out_req[output].begin( ); - iter != _out_req[output].end( ); iter++ ) { - *os << iter->second.port << " "; - } - *os << "] "; - } else { - *os << "masked "; - } - } - *os << "]." << endl; -} - diff --git a/src/intersim2/.svn/pristine/8c/8c5b24b41796edbfedbb98138da7278e7c22d832.svn-base b/src/intersim2/.svn/pristine/8c/8c5b24b41796edbfedbb98138da7278e7c22d832.svn-base deleted file mode 100644 index 48000bf..0000000 --- a/src/intersim2/.svn/pristine/8c/8c5b24b41796edbfedbb98138da7278e7c22d832.svn-base +++ /dev/null @@ -1,34 +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. -*/ - -#define main rng_main -#include "rng.c" - -long ran_next( ) -{ - return ran_arr_next( ); -} diff --git a/src/intersim2/.svn/pristine/8e/8e7a59b2896a3ee93a308768d554d28b324b26aa.svn-base b/src/intersim2/.svn/pristine/8e/8e7a59b2896a3ee93a308768d554d28b324b26aa.svn-base deleted file mode 100644 index d92ad08..0000000 --- a/src/intersim2/.svn/pristine/8e/8e7a59b2896a3ee93a308768d554d28b324b26aa.svn-base +++ /dev/null @@ -1,2283 +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. -*/ - -#include <sstream> -#include <cmath> -#include <fstream> -#include <limits> -#include <cstdlib> - -#include "booksim.hpp" -#include "booksim_config.hpp" -#include "trafficmanager.hpp" -#include "batchtrafficmanager.hpp" -#include "random_utils.hpp" -#include "vc.hpp" -#include "packet_reply_info.hpp" - -TrafficManager * TrafficManager::New(Configuration const & config, - vector<Network *> const & net) -{ - TrafficManager * result = NULL; - string sim_type = config.GetStr("sim_type"); - if((sim_type == "latency") || (sim_type == "throughput")) { - result = new TrafficManager(config, net); - } else if(sim_type == "batch") { - result = new BatchTrafficManager(config, net); - } else { - cerr << "Unknown simulation type: " << sim_type << endl; - } - return result; -} - -TrafficManager::TrafficManager( const Configuration &config, const vector<Network *> & net ) - : Module( 0, "traffic_manager" ), _net(net), _empty_network(false), _deadlock_timer(0), _reset_time(0), _drain_time(-1), _cur_id(0), _cur_pid(0), _time(0) -{ - - _nodes = _net[0]->NumNodes( ); - _routers = _net[0]->NumRouters( ); - - _vcs = config.GetInt("num_vcs"); - _subnets = config.GetInt("subnets"); - - _subnet.resize(Flit::NUM_FLIT_TYPES); - _subnet[Flit::READ_REQUEST] = config.GetInt("read_request_subnet"); - _subnet[Flit::READ_REPLY] = config.GetInt("read_reply_subnet"); - _subnet[Flit::WRITE_REQUEST] = config.GetInt("write_request_subnet"); - _subnet[Flit::WRITE_REPLY] = config.GetInt("write_reply_subnet"); - - // ============ Message priorities ============ - - string priority = config.GetStr( "priority" ); - - if ( priority == "class" ) { - _pri_type = class_based; - } else if ( priority == "age" ) { - _pri_type = age_based; - } else if ( priority == "network_age" ) { - _pri_type = network_age_based; - } else if ( priority == "local_age" ) { - _pri_type = local_age_based; - } else if ( priority == "queue_length" ) { - _pri_type = queue_length_based; - } else if ( priority == "hop_count" ) { - _pri_type = hop_count_based; - } else if ( priority == "sequence" ) { - _pri_type = sequence_based; - } else if ( priority == "none" ) { - _pri_type = none; - } else { - Error( "Unkown priority value: " + priority ); - } - - // ============ Routing ============ - - string rf = config.GetStr("routing_function") + "_" + config.GetStr("topology"); - map<string, tRoutingFunction>::const_iterator rf_iter = gRoutingFunctionMap.find(rf); - if(rf_iter == gRoutingFunctionMap.end()) { - Error("Invalid routing function: " + rf); - } - _rf = rf_iter->second; - - _lookahead_routing = !config.GetInt("routing_delay"); - _noq = config.GetInt("noq"); - if(_noq) { - if(!_lookahead_routing) { - Error("NOQ requires lookahead routing to be enabled."); - } - } - - // ============ Traffic ============ - - _classes = config.GetInt("classes"); - - _use_read_write = config.GetIntArray("use_read_write"); - if(_use_read_write.empty()) { - _use_read_write.push_back(config.GetInt("use_read_write")); - } - _use_read_write.resize(_classes, _use_read_write.back()); - - _write_fraction = config.GetFloatArray("write_fraction"); - if(_write_fraction.empty()) { - _write_fraction.push_back(config.GetFloat("write_fraction")); - } - _write_fraction.resize(_classes, _write_fraction.back()); - - _read_request_size = config.GetIntArray("read_request_size"); - if(_read_request_size.empty()) { - _read_request_size.push_back(config.GetInt("read_request_size")); - } - _read_request_size.resize(_classes, _read_request_size.back()); - - _read_reply_size = config.GetIntArray("read_reply_size"); - if(_read_reply_size.empty()) { - _read_reply_size.push_back(config.GetInt("read_reply_size")); - } - _read_reply_size.resize(_classes, _read_reply_size.back()); - - _write_request_size = config.GetIntArray("write_request_size"); - if(_write_request_size.empty()) { - _write_request_size.push_back(config.GetInt("write_request_size")); - } - _write_request_size.resize(_classes, _write_request_size.back()); - - _write_reply_size = config.GetIntArray("write_reply_size"); - if(_write_reply_size.empty()) { - _write_reply_size.push_back(config.GetInt("write_reply_size")); - } - _write_reply_size.resize(_classes, _write_reply_size.back()); - - string packet_size_str = config.GetStr("packet_size"); - if(packet_size_str.empty()) { - _packet_size.push_back(vector<int>(1, config.GetInt("packet_size"))); - } else { - vector<string> packet_size_strings = tokenize_str(packet_size_str); - for(size_t i = 0; i < packet_size_strings.size(); ++i) { - _packet_size.push_back(tokenize_int(packet_size_strings[i])); - } - } - _packet_size.resize(_classes, _packet_size.back()); - - string packet_size_rate_str = config.GetStr("packet_size_rate"); - if(packet_size_rate_str.empty()) { - int rate = config.GetInt("packet_size_rate"); - assert(rate >= 0); - for(int c = 0; c < _classes; ++c) { - int size = _packet_size[c].size(); - _packet_size_rate.push_back(vector<int>(size, rate)); - _packet_size_max_val.push_back(size * rate - 1); - } - } else { - vector<string> packet_size_rate_strings = tokenize_str(packet_size_rate_str); - packet_size_rate_strings.resize(_classes, packet_size_rate_strings.back()); - for(int c = 0; c < _classes; ++c) { - vector<int> rates = tokenize_int(packet_size_rate_strings[c]); - rates.resize(_packet_size[c].size(), rates.back()); - _packet_size_rate.push_back(rates); - int size = rates.size(); - int max_val = -1; - for(int i = 0; i < size; ++i) { - int rate = rates[i]; - assert(rate >= 0); - max_val += rate; - } - _packet_size_max_val.push_back(max_val); - } - } - - for(int c = 0; c < _classes; ++c) { - if(_use_read_write[c]) { - _packet_size[c] = - vector<int>(1, (_read_request_size[c] + _read_reply_size[c] + - _write_request_size[c] + _write_reply_size[c]) / 2); - _packet_size_rate[c] = vector<int>(1, 1); - _packet_size_max_val[c] = 0; - } - } - - _load = config.GetFloatArray("injection_rate"); - if(_load.empty()) { - _load.push_back(config.GetFloat("injection_rate")); - } - _load.resize(_classes, _load.back()); - - if(config.GetInt("injection_rate_uses_flits")) { - for(int c = 0; c < _classes; ++c) - _load[c] /= _GetAveragePacketSize(c); - } - - _traffic = config.GetStrArray("traffic"); - _traffic.resize(_classes, _traffic.back()); - - _traffic_pattern.resize(_classes); - - _class_priority = config.GetIntArray("class_priority"); - if(_class_priority.empty()) { - _class_priority.push_back(config.GetInt("class_priority")); - } - _class_priority.resize(_classes, _class_priority.back()); - - vector<string> injection_process = config.GetStrArray("injection_process"); - injection_process.resize(_classes, injection_process.back()); - - _injection_process.resize(_classes); - - for(int c = 0; c < _classes; ++c) { - _traffic_pattern[c] = TrafficPattern::New(_traffic[c], _nodes, &config); - _injection_process[c] = InjectionProcess::New(injection_process[c], _nodes, _load[c], &config); - } - - // ============ Injection VC states ============ - - _buf_states.resize(_nodes); - _last_vc.resize(_nodes); - _last_class.resize(_nodes); - - for ( int source = 0; source < _nodes; ++source ) { - _buf_states[source].resize(_subnets); - _last_class[source].resize(_subnets, 0); - _last_vc[source].resize(_subnets); - for ( int subnet = 0; subnet < _subnets; ++subnet ) { - ostringstream tmp_name; - tmp_name << "terminal_buf_state_" << source << "_" << subnet; - BufferState * bs = new BufferState( config, this, tmp_name.str( ) ); - int vc_alloc_delay = config.GetInt("vc_alloc_delay"); - int sw_alloc_delay = config.GetInt("sw_alloc_delay"); - int router_latency = config.GetInt("routing_delay") + (config.GetInt("speculative") ? max(vc_alloc_delay, sw_alloc_delay) : (vc_alloc_delay + sw_alloc_delay)); - int min_latency = 1 + _net[subnet]->GetInject(source)->GetLatency() + router_latency + _net[subnet]->GetInjectCred(source)->GetLatency(); - bs->SetMinLatency(min_latency); - _buf_states[source][subnet] = bs; - _last_vc[source][subnet].resize(_classes, -1); - } - } - -#ifdef TRACK_FLOWS - _outstanding_credits.resize(_classes); - for(int c = 0; c < _classes; ++c) { - _outstanding_credits[c].resize(_subnets, vector<int>(_nodes, 0)); - } - _outstanding_classes.resize(_nodes); - for(int n = 0; n < _nodes; ++n) { - _outstanding_classes[n].resize(_subnets, vector<queue<int> >(_vcs)); - } -#endif - - // ============ Injection queues ============ - - _qtime.resize(_nodes); - _qdrained.resize(_nodes); - _partial_packets.resize(_nodes); - - for ( int s = 0; s < _nodes; ++s ) { - _qtime[s].resize(_classes); - _qdrained[s].resize(_classes); - _partial_packets[s].resize(_classes); - } - - _total_in_flight_flits.resize(_classes); - _measured_in_flight_flits.resize(_classes); - _retired_packets.resize(_classes); - - _packet_seq_no.resize(_nodes); - _repliesPending.resize(_nodes); - _requestsOutstanding.resize(_nodes); - - _hold_switch_for_packet = config.GetInt("hold_switch_for_packet"); - - // ============ Simulation parameters ============ - - _total_sims = config.GetInt( "sim_count" ); - - _router.resize(_subnets); - for (int i=0; i < _subnets; ++i) { - _router[i] = _net[i]->GetRouters(); - } - - //seed the network - RandomSeed(config.GetInt("seed")); - - _measure_latency = (config.GetStr("sim_type") == "latency"); - - _sample_period = config.GetInt( "sample_period" ); - _max_samples = config.GetInt( "max_samples" ); - _warmup_periods = config.GetInt( "warmup_periods" ); - - _measure_stats = config.GetIntArray( "measure_stats" ); - if(_measure_stats.empty()) { - _measure_stats.push_back(config.GetInt("measure_stats")); - } - _measure_stats.resize(_classes, _measure_stats.back()); - _pair_stats = (config.GetInt("pair_stats")==1); - - _latency_thres = config.GetFloatArray( "latency_thres" ); - if(_latency_thres.empty()) { - _latency_thres.push_back(config.GetFloat("latency_thres")); - } - _latency_thres.resize(_classes, _latency_thres.back()); - - _warmup_threshold = config.GetFloatArray( "warmup_thres" ); - if(_warmup_threshold.empty()) { - _warmup_threshold.push_back(config.GetFloat("warmup_thres")); - } - _warmup_threshold.resize(_classes, _warmup_threshold.back()); - - _acc_warmup_threshold = config.GetFloatArray( "acc_warmup_thres" ); - if(_acc_warmup_threshold.empty()) { - _acc_warmup_threshold.push_back(config.GetFloat("acc_warmup_thres")); - } - _acc_warmup_threshold.resize(_classes, _acc_warmup_threshold.back()); - - _stopping_threshold = config.GetFloatArray( "stopping_thres" ); - if(_stopping_threshold.empty()) { - _stopping_threshold.push_back(config.GetFloat("stopping_thres")); - } - _stopping_threshold.resize(_classes, _stopping_threshold.back()); - - _acc_stopping_threshold = config.GetFloatArray( "acc_stopping_thres" ); - if(_acc_stopping_threshold.empty()) { - _acc_stopping_threshold.push_back(config.GetFloat("acc_stopping_thres")); - } - _acc_stopping_threshold.resize(_classes, _acc_stopping_threshold.back()); - - _include_queuing = config.GetInt( "include_queuing" ); - - _print_csv_results = config.GetInt( "print_csv_results" ); - _deadlock_warn_timeout = config.GetInt( "deadlock_warn_timeout" ); - - string watch_file = config.GetStr( "watch_file" ); - if((watch_file != "") && (watch_file != "-")) { - _LoadWatchList(watch_file); - } - - vector<int> watch_flits = config.GetIntArray("watch_flits"); - for(size_t i = 0; i < watch_flits.size(); ++i) { - _flits_to_watch.insert(watch_flits[i]); - } - - vector<int> watch_packets = config.GetIntArray("watch_packets"); - for(size_t i = 0; i < watch_packets.size(); ++i) { - _packets_to_watch.insert(watch_packets[i]); - } - - string stats_out_file = config.GetStr( "stats_out" ); - if(stats_out_file == "") { - _stats_out = NULL; - } else if(stats_out_file == "-") { - _stats_out = &cout; - } else { - _stats_out = new ofstream(stats_out_file.c_str()); - config.WriteMatlabFile(_stats_out); - } - -#ifdef TRACK_FLOWS - _injected_flits.resize(_classes, vector<int>(_nodes, 0)); - _ejected_flits.resize(_classes, vector<int>(_nodes, 0)); - string injected_flits_out_file = config.GetStr( "injected_flits_out" ); - if(injected_flits_out_file == "") { - _injected_flits_out = NULL; - } else { - _injected_flits_out = new ofstream(injected_flits_out_file.c_str()); - } - string received_flits_out_file = config.GetStr( "received_flits_out" ); - if(received_flits_out_file == "") { - _received_flits_out = NULL; - } else { - _received_flits_out = new ofstream(received_flits_out_file.c_str()); - } - string stored_flits_out_file = config.GetStr( "stored_flits_out" ); - if(stored_flits_out_file == "") { - _stored_flits_out = NULL; - } else { - _stored_flits_out = new ofstream(stored_flits_out_file.c_str()); - } - string sent_flits_out_file = config.GetStr( "sent_flits_out" ); - if(sent_flits_out_file == "") { - _sent_flits_out = NULL; - } else { - _sent_flits_out = new ofstream(sent_flits_out_file.c_str()); - } - string outstanding_credits_out_file = config.GetStr( "outstanding_credits_out" ); - if(outstanding_credits_out_file == "") { - _outstanding_credits_out = NULL; - } else { - _outstanding_credits_out = new ofstream(outstanding_credits_out_file.c_str()); - } - string ejected_flits_out_file = config.GetStr( "ejected_flits_out" ); - if(ejected_flits_out_file == "") { - _ejected_flits_out = NULL; - } else { - _ejected_flits_out = new ofstream(ejected_flits_out_file.c_str()); - } - string active_packets_out_file = config.GetStr( "active_packets_out" ); - if(active_packets_out_file == "") { - _active_packets_out = NULL; - } else { - _active_packets_out = new ofstream(active_packets_out_file.c_str()); - } -#endif - -#ifdef TRACK_CREDITS - string used_credits_out_file = config.GetStr( "used_credits_out" ); - if(used_credits_out_file == "") { - _used_credits_out = NULL; - } else { - _used_credits_out = new ofstream(used_credits_out_file.c_str()); - } - string free_credits_out_file = config.GetStr( "free_credits_out" ); - if(free_credits_out_file == "") { - _free_credits_out = NULL; - } else { - _free_credits_out = new ofstream(free_credits_out_file.c_str()); - } - string max_credits_out_file = config.GetStr( "max_credits_out" ); - if(max_credits_out_file == "") { - _max_credits_out = NULL; - } else { - _max_credits_out = new ofstream(max_credits_out_file.c_str()); - } -#endif - - // ============ Statistics ============ - - _plat_stats.resize(_classes); - _overall_min_plat.resize(_classes, 0.0); - _overall_avg_plat.resize(_classes, 0.0); - _overall_max_plat.resize(_classes, 0.0); - - _nlat_stats.resize(_classes); - _overall_min_nlat.resize(_classes, 0.0); - _overall_avg_nlat.resize(_classes, 0.0); - _overall_max_nlat.resize(_classes, 0.0); - - _flat_stats.resize(_classes); - _overall_min_flat.resize(_classes, 0.0); - _overall_avg_flat.resize(_classes, 0.0); - _overall_max_flat.resize(_classes, 0.0); - - _frag_stats.resize(_classes); - _overall_min_frag.resize(_classes, 0.0); - _overall_avg_frag.resize(_classes, 0.0); - _overall_max_frag.resize(_classes, 0.0); - - if(_pair_stats){ - _pair_plat.resize(_classes); - _pair_nlat.resize(_classes); - _pair_flat.resize(_classes); - } - - _hop_stats.resize(_classes); - _overall_hop_stats.resize(_classes, 0.0); - - _sent_packets.resize(_classes); - _overall_min_sent_packets.resize(_classes, 0.0); - _overall_avg_sent_packets.resize(_classes, 0.0); - _overall_max_sent_packets.resize(_classes, 0.0); - _accepted_packets.resize(_classes); - _overall_min_accepted_packets.resize(_classes, 0.0); - _overall_avg_accepted_packets.resize(_classes, 0.0); - _overall_max_accepted_packets.resize(_classes, 0.0); - - _sent_flits.resize(_classes); - _overall_min_sent.resize(_classes, 0.0); - _overall_avg_sent.resize(_classes, 0.0); - _overall_max_sent.resize(_classes, 0.0); - _accepted_flits.resize(_classes); - _overall_min_accepted.resize(_classes, 0.0); - _overall_avg_accepted.resize(_classes, 0.0); - _overall_max_accepted.resize(_classes, 0.0); - -#ifdef TRACK_STALLS - _buffer_busy_stalls.resize(_classes); - _buffer_conflict_stalls.resize(_classes); - _buffer_full_stalls.resize(_classes); - _buffer_reserved_stalls.resize(_classes); - _crossbar_conflict_stalls.resize(_classes); - _overall_buffer_busy_stalls.resize(_classes, 0); - _overall_buffer_conflict_stalls.resize(_classes, 0); - _overall_buffer_full_stalls.resize(_classes, 0); - _overall_buffer_reserved_stalls.resize(_classes, 0); - _overall_crossbar_conflict_stalls.resize(_classes, 0); -#endif - - for ( int c = 0; c < _classes; ++c ) { - ostringstream tmp_name; - - tmp_name << "plat_stat_" << c; - _plat_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 1000 ); - _stats[tmp_name.str()] = _plat_stats[c]; - tmp_name.str(""); - - tmp_name << "nlat_stat_" << c; - _nlat_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 1000 ); - _stats[tmp_name.str()] = _nlat_stats[c]; - tmp_name.str(""); - - tmp_name << "flat_stat_" << c; - _flat_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 1000 ); - _stats[tmp_name.str()] = _flat_stats[c]; - tmp_name.str(""); - - tmp_name << "frag_stat_" << c; - _frag_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 100 ); - _stats[tmp_name.str()] = _frag_stats[c]; - tmp_name.str(""); - - tmp_name << "hop_stat_" << c; - _hop_stats[c] = new Stats( this, tmp_name.str( ), 1.0, 20 ); - _stats[tmp_name.str()] = _hop_stats[c]; - tmp_name.str(""); - - if(_pair_stats){ - _pair_plat[c].resize(_nodes*_nodes); - _pair_nlat[c].resize(_nodes*_nodes); - _pair_flat[c].resize(_nodes*_nodes); - } - - _sent_packets[c].resize(_nodes, 0); - _accepted_packets[c].resize(_nodes, 0); - _sent_flits[c].resize(_nodes, 0); - _accepted_flits[c].resize(_nodes, 0); - -#ifdef TRACK_STALLS - _buffer_busy_stalls[c].resize(_subnets*_routers, 0); - _buffer_conflict_stalls[c].resize(_subnets*_routers, 0); - _buffer_full_stalls[c].resize(_subnets*_routers, 0); - _buffer_reserved_stalls[c].resize(_subnets*_routers, 0); - _crossbar_conflict_stalls[c].resize(_subnets*_routers, 0); -#endif - if(_pair_stats){ - for ( int i = 0; i < _nodes; ++i ) { - for ( int j = 0; j < _nodes; ++j ) { - tmp_name << "pair_plat_stat_" << c << "_" << i << "_" << j; - _pair_plat[c][i*_nodes+j] = new Stats( this, tmp_name.str( ), 1.0, 250 ); - _stats[tmp_name.str()] = _pair_plat[c][i*_nodes+j]; - tmp_name.str(""); - - tmp_name << "pair_nlat_stat_" << c << "_" << i << "_" << j; - _pair_nlat[c][i*_nodes+j] = new Stats( this, tmp_name.str( ), 1.0, 250 ); - _stats[tmp_name.str()] = _pair_nlat[c][i*_nodes+j]; - tmp_name.str(""); - - tmp_name << "pair_flat_stat_" << c << "_" << i << "_" << j; - _pair_flat[c][i*_nodes+j] = new Stats( this, tmp_name.str( ), 1.0, 250 ); - _stats[tmp_name.str()] = _pair_flat[c][i*_nodes+j]; - tmp_name.str(""); - } - } - } - } - - _slowest_flit.resize(_classes, -1); - _slowest_packet.resize(_classes, -1); - - - -} - -TrafficManager::~TrafficManager( ) -{ - - for ( int source = 0; source < _nodes; ++source ) { - for ( int subnet = 0; subnet < _subnets; ++subnet ) { - delete _buf_states[source][subnet]; - } - } - - for ( int c = 0; c < _classes; ++c ) { - delete _plat_stats[c]; - delete _nlat_stats[c]; - delete _flat_stats[c]; - delete _frag_stats[c]; - delete _hop_stats[c]; - - delete _traffic_pattern[c]; - delete _injection_process[c]; - if(_pair_stats){ - for ( int i = 0; i < _nodes; ++i ) { - for ( int j = 0; j < _nodes; ++j ) { - delete _pair_plat[c][i*_nodes+j]; - delete _pair_nlat[c][i*_nodes+j]; - delete _pair_flat[c][i*_nodes+j]; - } - } - } - } - - if(gWatchOut && (gWatchOut != &cout)) delete gWatchOut; - if(_stats_out && (_stats_out != &cout)) delete _stats_out; - -#ifdef TRACK_FLOWS - if(_injected_flits_out) delete _injected_flits_out; - if(_received_flits_out) delete _received_flits_out; - if(_stored_flits_out) delete _stored_flits_out; - if(_sent_flits_out) delete _sent_flits_out; - if(_outstanding_credits_out) delete _outstanding_credits_out; - if(_ejected_flits_out) delete _ejected_flits_out; - if(_active_packets_out) delete _active_packets_out; -#endif - -#ifdef TRACK_CREDITS - if(_used_credits_out) delete _used_credits_out; - if(_free_credits_out) delete _free_credits_out; - if(_max_credits_out) delete _max_credits_out; -#endif - - PacketReplyInfo::FreeAll(); - Flit::FreeAll(); - Credit::FreeAll(); -} - - -void TrafficManager::_RetireFlit( Flit *f, int dest ) -{ - _deadlock_timer = 0; - - assert(_total_in_flight_flits[f->cl].count(f->id) > 0); - _total_in_flight_flits[f->cl].erase(f->id); - - if(f->record) { - assert(_measured_in_flight_flits[f->cl].count(f->id) > 0); - _measured_in_flight_flits[f->cl].erase(f->id); - } - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " - << "node" << dest << " | " - << "Retiring flit " << f->id - << " (packet " << f->pid - << ", src = " << f->src - << ", dest = " << f->dest - << ", hops = " << f->hops - << ", flat = " << f->atime - f->itime - << ")." << endl; - } - - if ( f->head && ( f->dest != dest ) ) { - ostringstream err; - err << "Flit " << f->id << " arrived at incorrect output " << dest; - Error( err.str( ) ); - } - - if((_slowest_flit[f->cl] < 0) || - (_flat_stats[f->cl]->Max() < (f->atime - f->itime))) - _slowest_flit[f->cl] = f->id; - _flat_stats[f->cl]->AddSample( f->atime - f->itime); - if(_pair_stats){ - _pair_flat[f->cl][f->src*_nodes+dest]->AddSample( f->atime - f->itime ); - } - - if ( f->tail ) { - Flit * head; - if(f->head) { - head = f; - } else { - map<int, Flit *>::iterator iter = _retired_packets[f->cl].find(f->pid); - assert(iter != _retired_packets[f->cl].end()); - head = iter->second; - _retired_packets[f->cl].erase(iter); - assert(head->head); - assert(f->pid == head->pid); - } - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " - << "node" << dest << " | " - << "Retiring packet " << f->pid - << " (plat = " << f->atime - head->ctime - << ", nlat = " << f->atime - head->itime - << ", frag = " << (f->atime - head->atime) - (f->id - head->id) // NB: In the spirit of solving problems using ugly hacks, we compute the packet length by taking advantage of the fact that the IDs of flits within a packet are contiguous. - << ", src = " << head->src - << ", dest = " << head->dest - << ")." << endl; - } - - //code the source of request, look carefully, its tricky ;) - if (f->type == Flit::READ_REQUEST || f->type == Flit::WRITE_REQUEST) { - PacketReplyInfo* rinfo = PacketReplyInfo::New(); - rinfo->source = f->src; - rinfo->time = f->atime; - rinfo->record = f->record; - rinfo->type = f->type; - _repliesPending[dest].push_back(rinfo); - } else { - if(f->type == Flit::READ_REPLY || f->type == Flit::WRITE_REPLY ){ - _requestsOutstanding[dest]--; - } else if(f->type == Flit::ANY_TYPE) { - _requestsOutstanding[f->src]--; - } - - } - - // Only record statistics once per packet (at tail) - // and based on the simulation state - if ( ( _sim_state == warming_up ) || f->record ) { - - _hop_stats[f->cl]->AddSample( f->hops ); - - if((_slowest_packet[f->cl] < 0) || - (_plat_stats[f->cl]->Max() < (f->atime - head->itime))) - _slowest_packet[f->cl] = f->pid; - _plat_stats[f->cl]->AddSample( f->atime - head->ctime); - _nlat_stats[f->cl]->AddSample( f->atime - head->itime); - _frag_stats[f->cl]->AddSample( (f->atime - head->atime) - (f->id - head->id) ); - - if(_pair_stats){ - _pair_plat[f->cl][f->src*_nodes+dest]->AddSample( f->atime - head->ctime ); - _pair_nlat[f->cl][f->src*_nodes+dest]->AddSample( f->atime - head->itime ); - } - } - - if(f != head) { - head->Free(); - } - - } - - if(f->head && !f->tail) { - _retired_packets[f->cl].insert(make_pair(f->pid, f)); - } else { - f->Free(); - } -} - -int TrafficManager::_IssuePacket( int source, int cl ) -{ - int result = 0; - if(_use_read_write[cl]){ //use read and write - //check queue for waiting replies. - //check to make sure it is on time yet - if (!_repliesPending[source].empty()) { - if(_repliesPending[source].front()->time <= _time) { - result = -1; - } - } else { - - //produce a packet - if(_injection_process[cl]->test(source)) { - - //coin toss to determine request type. - result = (RandomFloat() < _write_fraction[cl]) ? 2 : 1; - - _requestsOutstanding[source]++; - } - } - } else { //normal mode - result = _injection_process[cl]->test(source) ? 1 : 0; - _requestsOutstanding[source]++; - } - if(result != 0) { - _packet_seq_no[source]++; - } - return result; -} - -void TrafficManager::_GeneratePacket( int source, int stype, - int cl, int time ) -{ - assert(stype!=0); - - Flit::FlitType packet_type = Flit::ANY_TYPE; - int size = _GetNextPacketSize(cl); //input size - int pid = _cur_pid++; - assert(_cur_pid); - int packet_destination = _traffic_pattern[cl]->dest(source); - bool record = false; - bool watch = gWatchOut && (_packets_to_watch.count(pid) > 0); - if(_use_read_write[cl]){ - if(stype > 0) { - if (stype == 1) { - packet_type = Flit::READ_REQUEST; - size = _read_request_size[cl]; - } else if (stype == 2) { - packet_type = Flit::WRITE_REQUEST; - size = _write_request_size[cl]; - } else { - ostringstream err; - err << "Invalid packet type: " << packet_type; - Error( err.str( ) ); - } - } else { - PacketReplyInfo* rinfo = _repliesPending[source].front(); - if (rinfo->type == Flit::READ_REQUEST) {//read reply - size = _read_reply_size[cl]; - packet_type = Flit::READ_REPLY; - } else if(rinfo->type == Flit::WRITE_REQUEST) { //write reply - size = _write_reply_size[cl]; - packet_type = Flit::WRITE_REPLY; - } else { - ostringstream err; - err << "Invalid packet type: " << rinfo->type; - Error( err.str( ) ); - } - packet_destination = rinfo->source; - time = rinfo->time; - record = rinfo->record; - _repliesPending[source].pop_front(); - rinfo->Free(); - } - } - - if ((packet_destination <0) || (packet_destination >= _nodes)) { - ostringstream err; - err << "Incorrect packet destination " << packet_destination - << " for stype " << packet_type; - Error( err.str( ) ); - } - - if ( ( _sim_state == running ) || - ( ( _sim_state == draining ) && ( time < _drain_time ) ) ) { - record = _measure_stats[cl]; - } - - int subnetwork = ((packet_type == Flit::ANY_TYPE) ? - RandomInt(_subnets-1) : - _subnet[packet_type]); - - if ( watch ) { - *gWatchOut << GetSimTime() << " | " - << "node" << source << " | " - << "Enqueuing packet " << pid - << " at time " << time - << "." << endl; - } - - for ( int i = 0; i < size; ++i ) { - Flit * f = Flit::New(); - f->id = _cur_id++; - assert(_cur_id); - f->pid = pid; - f->watch = watch | (gWatchOut && (_flits_to_watch.count(f->id) > 0)); - f->subnetwork = subnetwork; - f->src = source; - f->ctime = time; - f->record = record; - f->cl = cl; - - _total_in_flight_flits[f->cl].insert(make_pair(f->id, f)); - if(record) { - _measured_in_flight_flits[f->cl].insert(make_pair(f->id, f)); - } - - if(gTrace){ - cout<<"New Flit "<<f->src<<endl; - } - f->type = packet_type; - - if ( i == 0 ) { // Head flit - f->head = true; - //packets are only generated to nodes smaller or equal to limit - f->dest = packet_destination; - } else { - f->head = false; - f->dest = -1; - } - switch( _pri_type ) { - case class_based: - f->pri = _class_priority[cl]; - assert(f->pri >= 0); - break; - case age_based: - f->pri = numeric_limits<int>::max() - time; - assert(f->pri >= 0); - break; - case sequence_based: - f->pri = numeric_limits<int>::max() - _packet_seq_no[source]; - assert(f->pri >= 0); - break; - default: - f->pri = 0; - } - if ( i == ( size - 1 ) ) { // Tail flit - f->tail = true; - } else { - f->tail = false; - } - - f->vc = -1; - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " - << "node" << source << " | " - << "Enqueuing flit " << f->id - << " (packet " << f->pid - << ") at time " << time - << "." << endl; - } - - _partial_packets[source][cl].push_back( f ); - } -} - -void TrafficManager::_Inject(){ - - for ( int input = 0; input < _nodes; ++input ) { - for ( int c = 0; c < _classes; ++c ) { - // Potentially generate packets for any (input,class) - // that is currently empty - if ( _partial_packets[input][c].empty() ) { - bool generated = false; - while( !generated && ( _qtime[input][c] <= _time ) ) { - int stype = _IssuePacket( input, c ); - - if ( stype != 0 ) { //generate a packet - _GeneratePacket( input, stype, c, - _include_queuing==1 ? - _qtime[input][c] : _time ); - generated = true; - } - // only advance time if this is not a reply packet - if(!_use_read_write[c] || (stype >= 0)){ - ++_qtime[input][c]; - } - } - - if ( ( _sim_state == draining ) && - ( _qtime[input][c] > _drain_time ) ) { - _qdrained[input][c] = true; - } - } - } - } -} - -void TrafficManager::_Step( ) -{ - bool flits_in_flight = false; - for(int c = 0; c < _classes; ++c) { - flits_in_flight |= !_total_in_flight_flits[c].empty(); - } - if(flits_in_flight && (_deadlock_timer++ >= _deadlock_warn_timeout)){ - _deadlock_timer = 0; - cout << "WARNING: Possible network deadlock.\n"; - } - - vector<map<int, Flit *> > flits(_subnets); - - for ( int subnet = 0; subnet < _subnets; ++subnet ) { - for ( int n = 0; n < _nodes; ++n ) { - Flit * const f = _net[subnet]->ReadFlit( n ); - if ( f ) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " - << "node" << n << " | " - << "Ejecting flit " << f->id - << " (packet " << f->pid << ")" - << " from VC " << f->vc - << "." << endl; - } - flits[subnet].insert(make_pair(n, f)); - if((_sim_state == warming_up) || (_sim_state == running)) { - ++_accepted_flits[f->cl][n]; - if(f->tail) { - ++_accepted_packets[f->cl][n]; - } - } - } - - Credit * const c = _net[subnet]->ReadCredit( n ); - if ( c ) { -#ifdef TRACK_FLOWS - for(set<int>::const_iterator iter = c->vc.begin(); iter != c->vc.end(); ++iter) { - int const vc = *iter; - assert(!_outstanding_classes[n][subnet][vc].empty()); - int cl = _outstanding_classes[n][subnet][vc].front(); - _outstanding_classes[n][subnet][vc].pop(); - assert(_outstanding_credits[cl][subnet][n] > 0); - --_outstanding_credits[cl][subnet][n]; - } -#endif - _buf_states[n][subnet]->ProcessCredit(c); - c->Free(); - } - } - _net[subnet]->ReadInputs( ); - } - - if ( !_empty_network ) { - _Inject(); - } - - for(int subnet = 0; subnet < _subnets; ++subnet) { - - for(int n = 0; n < _nodes; ++n) { - - Flit * f = NULL; - - BufferState * const dest_buf = _buf_states[n][subnet]; - - int const last_class = _last_class[n][subnet]; - - int class_limit = _classes; - - if(_hold_switch_for_packet) { - list<Flit *> const & pp = _partial_packets[n][last_class]; - if(!pp.empty() && !pp.front()->head && - !dest_buf->IsFullFor(pp.front()->vc)) { - f = pp.front(); - assert(f->vc == _last_vc[n][subnet][last_class]); - - // if we're holding the connection, we don't need to check that class - // again in the for loop - --class_limit; - } - } - - for(int i = 1; i <= class_limit; ++i) { - - int const c = (last_class + i) % _classes; - - list<Flit *> const & pp = _partial_packets[n][c]; - - if(pp.empty()) { - continue; - } - - Flit * const cf = pp.front(); - assert(cf); - assert(cf->cl == c); - - if(cf->subnetwork != subnet) { - continue; - } - - if(f && (f->pri >= cf->pri)) { - continue; - } - - if(cf->head && cf->vc == -1) { // Find first available VC - - OutputSet route_set; - _rf(NULL, cf, -1, &route_set, true); - set<OutputSet::sSetElement> const & os = route_set.GetSet(); - assert(os.size() == 1); - OutputSet::sSetElement const & se = *os.begin(); - assert(se.output_port == -1); - int vc_start = se.vc_start; - int vc_end = se.vc_end; - int vc_count = vc_end - vc_start + 1; - if(_noq) { - assert(_lookahead_routing); - const FlitChannel * inject = _net[subnet]->GetInject(n); - const Router * router = inject->GetSink(); - assert(router); - int in_channel = inject->GetSinkPort(); - - // NOTE: Because the lookahead is not for injection, but for the - // first hop, we have to temporarily set cf's VC to be non-negative - // in order to avoid seting of an assertion in the routing function. - cf->vc = vc_start; - _rf(router, cf, in_channel, &cf->la_route_set, false); - cf->vc = -1; - - if(cf->watch) { - *gWatchOut << GetSimTime() << " | " - << "node" << n << " | " - << "Generating lookahead routing info for flit " << cf->id - << " (NOQ)." << endl; - } - set<OutputSet::sSetElement> const sl = cf->la_route_set.GetSet(); - assert(sl.size() == 1); - int next_output = sl.begin()->output_port; - vc_count /= router->NumOutputs(); - vc_start += next_output * vc_count; - vc_end = vc_start + vc_count - 1; - assert(vc_start >= se.vc_start && vc_start <= se.vc_end); - assert(vc_end >= se.vc_start && vc_end <= se.vc_end); - assert(vc_start <= vc_end); - } - if(cf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Finding output VC for flit " << cf->id - << ":" << endl; - } - for(int i = 1; i <= vc_count; ++i) { - int const lvc = _last_vc[n][subnet][c]; - int const vc = - (lvc < vc_start || lvc > vc_end) ? - vc_start : - (vc_start + (lvc - vc_start + i) % vc_count); - assert((vc >= vc_start) && (vc <= vc_end)); - if(!dest_buf->IsAvailableFor(vc)) { - if(cf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Output VC " << vc << " is busy." << endl; - } - } else { - if(dest_buf->IsFullFor(vc)) { - if(cf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Output VC " << vc << " is full." << endl; - } - } else { - if(cf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Selected output VC " << vc << "." << endl; - } - cf->vc = vc; - break; - } - } - } - } - - if(cf->vc == -1) { - if(cf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "No output VC found for flit " << cf->id - << "." << endl; - } - } else { - if(dest_buf->IsFullFor(cf->vc)) { - if(cf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Selected output VC " << cf->vc - << " is full for flit " << cf->id - << "." << endl; - } - } else { - f = cf; - } - } - } - - if(f) { - - assert(f->subnetwork == subnet); - - int const c = f->cl; - - if(f->head) { - - if (_lookahead_routing) { - if(!_noq) { - const FlitChannel * inject = _net[subnet]->GetInject(n); - const Router * router = inject->GetSink(); - assert(router); - int in_channel = inject->GetSinkPort(); - _rf(router, f, in_channel, &f->la_route_set, false); - if(f->watch) { - *gWatchOut << GetSimTime() << " | " - << "node" << n << " | " - << "Generating lookahead routing info for flit " << f->id - << "." << endl; - } - } else if(f->watch) { - *gWatchOut << GetSimTime() << " | " - << "node" << n << " | " - << "Already generated lookahead routing info for flit " << f->id - << " (NOQ)." << endl; - } - } else { - f->la_route_set.Clear(); - } - - dest_buf->TakeBuffer(f->vc); - _last_vc[n][subnet][c] = f->vc; - } - - _last_class[n][subnet] = c; - - _partial_packets[n][c].pop_front(); - -#ifdef TRACK_FLOWS - ++_outstanding_credits[c][subnet][n]; - _outstanding_classes[n][subnet][f->vc].push(c); -#endif - - dest_buf->SendingFlit(f); - - if(_pri_type == network_age_based) { - f->pri = numeric_limits<int>::max() - _time; - assert(f->pri >= 0); - } - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " - << "node" << n << " | " - << "Injecting flit " << f->id - << " into subnet " << subnet - << " at time " << _time - << " with priority " << f->pri - << "." << endl; - } - f->itime = _time; - - // Pass VC "back" - if(!_partial_packets[n][c].empty() && !f->tail) { - Flit * const nf = _partial_packets[n][c].front(); - nf->vc = f->vc; - } - - if((_sim_state == warming_up) || (_sim_state == running)) { - ++_sent_flits[c][n]; - if(f->head) { - ++_sent_packets[c][n]; - } - } - -#ifdef TRACK_FLOWS - ++_injected_flits[c][n]; -#endif - - _net[subnet]->WriteFlit(f, n); - - } - } - } - - for(int subnet = 0; subnet < _subnets; ++subnet) { - for(int n = 0; n < _nodes; ++n) { - map<int, Flit *>::const_iterator iter = flits[subnet].find(n); - if(iter != flits[subnet].end()) { - Flit * const f = iter->second; - - f->atime = _time; - if(f->watch) { - *gWatchOut << GetSimTime() << " | " - << "node" << n << " | " - << "Injecting credit for VC " << f->vc - << " into subnet " << subnet - << "." << endl; - } - Credit * const c = Credit::New(); - c->vc.insert(f->vc); - _net[subnet]->WriteCredit(c, n); - -#ifdef TRACK_FLOWS - ++_ejected_flits[f->cl][n]; -#endif - - _RetireFlit(f, n); - } - } - flits[subnet].clear(); - _net[subnet]->Evaluate( ); - _net[subnet]->WriteOutputs( ); - } - - ++_time; - assert(_time); - if(gTrace){ - cout<<"TIME "<<_time<<endl; - } - -} - -bool TrafficManager::_PacketsOutstanding( ) const -{ - for ( int c = 0; c < _classes; ++c ) { - if ( _measure_stats[c] ) { - if ( _measured_in_flight_flits[c].empty() ) { - - for ( int s = 0; s < _nodes; ++s ) { - if ( !_qdrained[s][c] ) { -#ifdef DEBUG_DRAIN - cout << "waiting on queue " << s << " class " << c; - cout << ", time = " << _time << " qtime = " << _qtime[s][c] << endl; -#endif - return true; - } - } - } else { -#ifdef DEBUG_DRAIN - cout << "in flight = " << _measured_in_flight_flits[c].size() << endl; -#endif - return true; - } - } - } - return false; -} - -void TrafficManager::_ClearStats( ) -{ - _slowest_flit.assign(_classes, -1); - _slowest_packet.assign(_classes, -1); - - for ( int c = 0; c < _classes; ++c ) { - - _plat_stats[c]->Clear( ); - _nlat_stats[c]->Clear( ); - _flat_stats[c]->Clear( ); - - _frag_stats[c]->Clear( ); - - _sent_packets[c].assign(_nodes, 0); - _accepted_packets[c].assign(_nodes, 0); - _sent_flits[c].assign(_nodes, 0); - _accepted_flits[c].assign(_nodes, 0); - -#ifdef TRACK_STALLS - _buffer_busy_stalls[c].assign(_subnets*_routers, 0); - _buffer_conflict_stalls[c].assign(_subnets*_routers, 0); - _buffer_full_stalls[c].assign(_subnets*_routers, 0); - _buffer_reserved_stalls[c].assign(_subnets*_routers, 0); - _crossbar_conflict_stalls[c].assign(_subnets*_routers, 0); -#endif - if(_pair_stats){ - for ( int i = 0; i < _nodes; ++i ) { - for ( int j = 0; j < _nodes; ++j ) { - _pair_plat[c][i*_nodes+j]->Clear( ); - _pair_nlat[c][i*_nodes+j]->Clear( ); - _pair_flat[c][i*_nodes+j]->Clear( ); - } - } - } - _hop_stats[c]->Clear(); - - } - - _reset_time = _time; -} - -void TrafficManager::_ComputeStats( const vector<int> & stats, int *sum, int *min, int *max, int *min_pos, int *max_pos ) const -{ - int const count = stats.size(); - assert(count > 0); - - if(min_pos) { - *min_pos = 0; - } - if(max_pos) { - *max_pos = 0; - } - - if(min) { - *min = stats[0]; - } - if(max) { - *max = stats[0]; - } - - *sum = stats[0]; - - for ( int i = 1; i < count; ++i ) { - int curr = stats[i]; - if ( min && ( curr < *min ) ) { - *min = curr; - if ( min_pos ) { - *min_pos = i; - } - } - if ( max && ( curr > *max ) ) { - *max = curr; - if ( max_pos ) { - *max_pos = i; - } - } - *sum += curr; - } -} - -void TrafficManager::_DisplayRemaining( ostream & os ) const -{ - for(int c = 0; c < _classes; ++c) { - - map<int, Flit *>::const_iterator iter; - int i; - - os << "Class " << c << ":" << endl; - - os << "Remaining flits: "; - for ( iter = _total_in_flight_flits[c].begin( ), i = 0; - ( iter != _total_in_flight_flits[c].end( ) ) && ( i < 10 ); - iter++, i++ ) { - os << iter->first << " "; - } - if(_total_in_flight_flits[c].size() > 10) - os << "[...] "; - - os << "(" << _total_in_flight_flits[c].size() << " flits)" << endl; - - os << "Measured flits: "; - for ( iter = _measured_in_flight_flits[c].begin( ), i = 0; - ( iter != _measured_in_flight_flits[c].end( ) ) && ( i < 10 ); - iter++, i++ ) { - os << iter->first << " "; - } - if(_measured_in_flight_flits[c].size() > 10) - os << "[...] "; - - os << "(" << _measured_in_flight_flits[c].size() << " flits)" << endl; - - } -} - -bool TrafficManager::_SingleSim( ) -{ - int converged = 0; - - //once warmed up, we require 3 converging runs to end the simulation - vector<double> prev_latency(_classes, 0.0); - vector<double> prev_accepted(_classes, 0.0); - bool clear_last = false; - int total_phases = 0; - while( ( total_phases < _max_samples ) && - ( ( _sim_state != running ) || - ( converged < 3 ) ) ) { - - if ( clear_last || (( ( _sim_state == warming_up ) && ( ( total_phases % 2 ) == 0 ) )) ) { - clear_last = false; - _ClearStats( ); - } - - - for ( int iter = 0; iter < _sample_period; ++iter ) - _Step( ); - - //cout << _sim_state << endl; - - UpdateStats(); - DisplayStats(); - - int lat_exc_class = -1; - int lat_chg_exc_class = -1; - int acc_chg_exc_class = -1; - - for(int c = 0; c < _classes; ++c) { - - if(_measure_stats[c] == 0) { - continue; - } - - double cur_latency = _plat_stats[c]->Average( ); - - int total_accepted_count; - _ComputeStats( _accepted_flits[c], &total_accepted_count ); - double total_accepted_rate = (double)total_accepted_count / (double)(_time - _reset_time); - double cur_accepted = total_accepted_rate / (double)_nodes; - - double latency_change = fabs((cur_latency - prev_latency[c]) / cur_latency); - prev_latency[c] = cur_latency; - - double accepted_change = fabs((cur_accepted - prev_accepted[c]) / cur_accepted); - prev_accepted[c] = cur_accepted; - - double latency = (double)_plat_stats[c]->Sum(); - double count = (double)_plat_stats[c]->NumSamples(); - - map<int, Flit *>::const_iterator iter; - for(iter = _total_in_flight_flits[c].begin(); - iter != _total_in_flight_flits[c].end(); - iter++) { - latency += (double)(_time - iter->second->ctime); - count++; - } - - if((lat_exc_class < 0) && - (_latency_thres[c] >= 0.0) && - ((latency / count) > _latency_thres[c])) { - lat_exc_class = c; - } - - cout << "latency change = " << latency_change << endl; - if(lat_chg_exc_class < 0) { - if((_sim_state == warming_up) && - (_warmup_threshold[c] >= 0.0) && - (latency_change > _warmup_threshold[c])) { - lat_chg_exc_class = c; - } else if((_sim_state == running) && - (_stopping_threshold[c] >= 0.0) && - (latency_change > _stopping_threshold[c])) { - lat_chg_exc_class = c; - } - } - - cout << "throughput change = " << accepted_change << endl; - if(acc_chg_exc_class < 0) { - if((_sim_state == warming_up) && - (_acc_warmup_threshold[c] >= 0.0) && - (accepted_change > _acc_warmup_threshold[c])) { - acc_chg_exc_class = c; - } else if((_sim_state == running) && - (_acc_stopping_threshold[c] >= 0.0) && - (accepted_change > _acc_stopping_threshold[c])) { - acc_chg_exc_class = c; - } - } - - } - - // Fail safe for latency mode, throughput will ust continue - if ( _measure_latency && ( lat_exc_class >= 0 ) ) { - - cout << "Average latency for class " << lat_exc_class << " exceeded " << _latency_thres[lat_exc_class] << " cycles. Aborting simulation." << endl; - converged = 0; - _sim_state = draining; - _drain_time = _time; - if(_stats_out) { - WriteStats(*_stats_out); - } - break; - - } - - if ( _sim_state == warming_up ) { - if ( ( _warmup_periods > 0 ) ? - ( total_phases + 1 >= _warmup_periods ) : - ( ( !_measure_latency || ( lat_chg_exc_class < 0 ) ) && - ( acc_chg_exc_class < 0 ) ) ) { - cout << "Warmed up ..." << "Time used is " << _time << " cycles" <<endl; - clear_last = true; - _sim_state = running; - } - } else if(_sim_state == running) { - if ( ( !_measure_latency || ( lat_chg_exc_class < 0 ) ) && - ( acc_chg_exc_class < 0 ) ) { - ++converged; - } else { - converged = 0; - } - } - ++total_phases; - } - - if ( _sim_state == running ) { - ++converged; - - _sim_state = draining; - _drain_time = _time; - - if ( _measure_latency ) { - cout << "Draining all recorded packets ..." << endl; - int empty_steps = 0; - while( _PacketsOutstanding( ) ) { - _Step( ); - - ++empty_steps; - - if ( empty_steps % 1000 == 0 ) { - - int lat_exc_class = -1; - - for(int c = 0; c < _classes; c++) { - - double threshold = _latency_thres[c]; - - if(threshold < 0.0) { - continue; - } - - double acc_latency = _plat_stats[c]->Sum(); - double acc_count = (double)_plat_stats[c]->NumSamples(); - - map<int, Flit *>::const_iterator iter; - for(iter = _total_in_flight_flits[c].begin(); - iter != _total_in_flight_flits[c].end(); - iter++) { - acc_latency += (double)(_time - iter->second->ctime); - acc_count++; - } - - if((acc_latency / acc_count) > threshold) { - lat_exc_class = c; - break; - } - } - - if(lat_exc_class >= 0) { - cout << "Average latency for class " << lat_exc_class << " exceeded " << _latency_thres[lat_exc_class] << " cycles. Aborting simulation." << endl; - converged = 0; - _sim_state = warming_up; - if(_stats_out) { - WriteStats(*_stats_out); - } - break; - } - - _DisplayRemaining( ); - - } - } - } - } else { - cout << "Too many sample periods needed to converge" << endl; - } - - return ( converged > 0 ); -} - -bool TrafficManager::Run( ) -{ - for ( int sim = 0; sim < _total_sims; ++sim ) { - - _time = 0; - - //remove any pending request from the previous simulations - _requestsOutstanding.assign(_nodes, 0); - for (int i=0;i<_nodes;i++) { - while(!_repliesPending[i].empty()) { - _repliesPending[i].front()->Free(); - _repliesPending[i].pop_front(); - } - } - - //reset queuetime for all sources - for ( int s = 0; s < _nodes; ++s ) { - _qtime[s].assign(_classes, 0); - _qdrained[s].assign(_classes, false); - } - - // warm-up ... - // reset stats, all packets after warmup_time marked - // converge - // draing, wait until all packets finish - _sim_state = warming_up; - - _ClearStats( ); - - for(int c = 0; c < _classes; ++c) { - _traffic_pattern[c]->reset(); - _injection_process[c]->reset(); - } - - if ( !_SingleSim( ) ) { - cout << "Simulation unstable, ending ..." << endl; - return false; - } - - // Empty any remaining packets - cout << "Draining remaining packets ..." << endl; - _empty_network = true; - int empty_steps = 0; - - bool packets_left = false; - for(int c = 0; c < _classes; ++c) { - packets_left |= !_total_in_flight_flits[c].empty(); - } - - while( packets_left ) { - _Step( ); - - ++empty_steps; - - if ( empty_steps % 1000 == 0 ) { - _DisplayRemaining( ); - } - - packets_left = false; - for(int c = 0; c < _classes; ++c) { - packets_left |= !_total_in_flight_flits[c].empty(); - } - } - //wait until all the credits are drained as well - while(Credit::OutStanding()!=0){ - _Step(); - } - _empty_network = false; - - //for the love of god don't ever say "Time taken" anywhere else - //the power script depend on it - cout << "Time taken is " << _time << " cycles" <<endl; - - if(_stats_out) { - WriteStats(*_stats_out); - } - _UpdateOverallStats(); - } - - DisplayOverallStats(); - if(_print_csv_results) { - DisplayOverallStatsCSV(); - } - - return true; -} - -void TrafficManager::_UpdateOverallStats() { - for ( int c = 0; c < _classes; ++c ) { - - if(_measure_stats[c] == 0) { - continue; - } - - _overall_min_plat[c] += _plat_stats[c]->Min(); - _overall_avg_plat[c] += _plat_stats[c]->Average(); - _overall_max_plat[c] += _plat_stats[c]->Max(); - _overall_min_nlat[c] += _nlat_stats[c]->Min(); - _overall_avg_nlat[c] += _nlat_stats[c]->Average(); - _overall_max_nlat[c] += _nlat_stats[c]->Max(); - _overall_min_flat[c] += _flat_stats[c]->Min(); - _overall_avg_flat[c] += _flat_stats[c]->Average(); - _overall_max_flat[c] += _flat_stats[c]->Max(); - - _overall_min_frag[c] += _frag_stats[c]->Min(); - _overall_avg_frag[c] += _frag_stats[c]->Average(); - _overall_max_frag[c] += _frag_stats[c]->Max(); - - _overall_hop_stats[c] += _hop_stats[c]->Average(); - - int count_min, count_sum, count_max; - double rate_min, rate_sum, rate_max; - double rate_avg; - double time_delta = (double)(_drain_time - _reset_time); - _ComputeStats( _sent_flits[c], &count_sum, &count_min, &count_max ); - rate_min = (double)count_min / time_delta; - rate_sum = (double)count_sum / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - _overall_min_sent[c] += rate_min; - _overall_avg_sent[c] += rate_avg; - _overall_max_sent[c] += rate_max; - _ComputeStats( _sent_packets[c], &count_sum, &count_min, &count_max ); - rate_min = (double)count_min / time_delta; - rate_sum = (double)count_sum / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - _overall_min_sent_packets[c] += rate_min; - _overall_avg_sent_packets[c] += rate_avg; - _overall_max_sent_packets[c] += rate_max; - _ComputeStats( _accepted_flits[c], &count_sum, &count_min, &count_max ); - rate_min = (double)count_min / time_delta; - rate_sum = (double)count_sum / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - _overall_min_accepted[c] += rate_min; - _overall_avg_accepted[c] += rate_avg; - _overall_max_accepted[c] += rate_max; - _ComputeStats( _accepted_packets[c], &count_sum, &count_min, &count_max ); - rate_min = (double)count_min / time_delta; - rate_sum = (double)count_sum / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - _overall_min_accepted_packets[c] += rate_min; - _overall_avg_accepted_packets[c] += rate_avg; - _overall_max_accepted_packets[c] += rate_max; - -#ifdef TRACK_STALLS - _ComputeStats(_buffer_busy_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - _overall_buffer_busy_stalls[c] += rate_avg; - _ComputeStats(_buffer_conflict_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - _overall_buffer_conflict_stalls[c] += rate_avg; - _ComputeStats(_buffer_full_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - _overall_buffer_full_stalls[c] += rate_avg; - _ComputeStats(_buffer_reserved_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - _overall_buffer_reserved_stalls[c] += rate_avg; - _ComputeStats(_crossbar_conflict_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - _overall_crossbar_conflict_stalls[c] += rate_avg; -#endif - - } -} - -void TrafficManager::WriteStats(ostream & os) const { - - os << "%=================================" << endl; - - for(int c = 0; c < _classes; ++c) { - - if(_measure_stats[c] == 0) { - continue; - } - - //c+1 due to matlab array starting at 1 - os << "plat(" << c+1 << ") = " << _plat_stats[c]->Average() << ";" << endl - << "plat_hist(" << c+1 << ",:) = " << *_plat_stats[c] << ";" << endl - << "nlat(" << c+1 << ") = " << _nlat_stats[c]->Average() << ";" << endl - << "nlat_hist(" << c+1 << ",:) = " << *_nlat_stats[c] << ";" << endl - << "flat(" << c+1 << ") = " << _flat_stats[c]->Average() << ";" << endl - << "flat_hist(" << c+1 << ",:) = " << *_flat_stats[c] << ";" << endl - << "frag_hist(" << c+1 << ",:) = " << *_frag_stats[c] << ";" << endl - << "hops(" << c+1 << ",:) = " << *_hop_stats[c] << ";" << endl; - if(_pair_stats){ - os<< "pair_sent(" << c+1 << ",:) = [ "; - for(int i = 0; i < _nodes; ++i) { - for(int j = 0; j < _nodes; ++j) { - os << _pair_plat[c][i*_nodes+j]->NumSamples() << " "; - } - } - os << "];" << endl - << "pair_plat(" << c+1 << ",:) = [ "; - for(int i = 0; i < _nodes; ++i) { - for(int j = 0; j < _nodes; ++j) { - os << _pair_plat[c][i*_nodes+j]->Average( ) << " "; - } - } - os << "];" << endl - << "pair_nlat(" << c+1 << ",:) = [ "; - for(int i = 0; i < _nodes; ++i) { - for(int j = 0; j < _nodes; ++j) { - os << _pair_nlat[c][i*_nodes+j]->Average( ) << " "; - } - } - os << "];" << endl - << "pair_flat(" << c+1 << ",:) = [ "; - for(int i = 0; i < _nodes; ++i) { - for(int j = 0; j < _nodes; ++j) { - os << _pair_flat[c][i*_nodes+j]->Average( ) << " "; - } - } - } - - double time_delta = (double)(_drain_time - _reset_time); - - os << "];" << endl - << "sent_packets(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _nodes; ++d ) { - os << (double)_sent_packets[c][d] / time_delta << " "; - } - os << "];" << endl - << "accepted_packets(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _nodes; ++d ) { - os << (double)_accepted_packets[c][d] / time_delta << " "; - } - os << "];" << endl - << "sent_flits(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _nodes; ++d ) { - os << (double)_sent_flits[c][d] / time_delta << " "; - } - os << "];" << endl - << "accepted_flits(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _nodes; ++d ) { - os << (double)_accepted_flits[c][d] / time_delta << " "; - } - os << "];" << endl - << "sent_packet_size(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _nodes; ++d ) { - os << (double)_sent_flits[c][d] / (double)_sent_packets[c][d] << " "; - } - os << "];" << endl - << "accepted_packet_size(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _nodes; ++d ) { - os << (double)_accepted_flits[c][d] / (double)_accepted_packets[c][d] << " "; - } - os << "];" << endl; -#ifdef TRACK_STALLS - os << "buffer_busy_stalls(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _subnets*_routers; ++d ) { - os << (double)_buffer_busy_stalls[c][d] / time_delta << " "; - } - os << "];" << endl - << "buffer_conflict_stalls(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _subnets*_routers; ++d ) { - os << (double)_buffer_conflict_stalls[c][d] / time_delta << " "; - } - os << "];" << endl - << "buffer_full_stalls(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _subnets*_routers; ++d ) { - os << (double)_buffer_full_stalls[c][d] / time_delta << " "; - } - os << "];" << endl - << "buffer_reserved_stalls(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _subnets*_routers; ++d ) { - os << (double)_buffer_reserved_stalls[c][d] / time_delta << " "; - } - os << "];" << endl - << "crossbar_conflict_stalls(" << c+1 << ",:) = [ "; - for ( int d = 0; d < _subnets*_routers; ++d ) { - os << (double)_crossbar_conflict_stalls[c][d] / time_delta << " "; - } - os << "];" << endl; -#endif - } -} - -void TrafficManager::UpdateStats() { -#if defined(TRACK_FLOWS) || defined(TRACK_STALLS) - for(int c = 0; c < _classes; ++c) { -#ifdef TRACK_FLOWS - { - char trail_char = (c == _classes - 1) ? '\n' : ','; - if(_injected_flits_out) *_injected_flits_out << _injected_flits[c] << trail_char; - _injected_flits[c].assign(_nodes, 0); - if(_ejected_flits_out) *_ejected_flits_out << _ejected_flits[c] << trail_char; - _ejected_flits[c].assign(_nodes, 0); - } -#endif - for(int subnet = 0; subnet < _subnets; ++subnet) { -#ifdef TRACK_FLOWS - if(_outstanding_credits_out) *_outstanding_credits_out << _outstanding_credits[c][subnet] << ','; - if(_stored_flits_out) *_stored_flits_out << vector<int>(_nodes, 0) << ','; -#endif - for(int router = 0; router < _routers; ++router) { - Router * const r = _router[subnet][router]; -#ifdef TRACK_FLOWS - char trail_char = - ((router == _routers - 1) && (subnet == _subnets - 1) && (c == _classes - 1)) ? '\n' : ','; - if(_received_flits_out) *_received_flits_out << r->GetReceivedFlits(c) << trail_char; - if(_stored_flits_out) *_stored_flits_out << r->GetStoredFlits(c) << trail_char; - if(_sent_flits_out) *_sent_flits_out << r->GetSentFlits(c) << trail_char; - if(_outstanding_credits_out) *_outstanding_credits_out << r->GetOutstandingCredits(c) << trail_char; - if(_active_packets_out) *_active_packets_out << r->GetActivePackets(c) << trail_char; - r->ResetFlowStats(c); -#endif -#ifdef TRACK_STALLS - _buffer_busy_stalls[c][subnet*_routers+router] += r->GetBufferBusyStalls(c); - _buffer_conflict_stalls[c][subnet*_routers+router] += r->GetBufferConflictStalls(c); - _buffer_full_stalls[c][subnet*_routers+router] += r->GetBufferFullStalls(c); - _buffer_reserved_stalls[c][subnet*_routers+router] += r->GetBufferReservedStalls(c); - _crossbar_conflict_stalls[c][subnet*_routers+router] += r->GetCrossbarConflictStalls(c); - r->ResetStallStats(c); -#endif - } - } - } -#ifdef TRACK_FLOWS - if(_injected_flits_out) *_injected_flits_out << flush; - if(_received_flits_out) *_received_flits_out << flush; - if(_stored_flits_out) *_stored_flits_out << flush; - if(_sent_flits_out) *_sent_flits_out << flush; - if(_outstanding_credits_out) *_outstanding_credits_out << flush; - if(_ejected_flits_out) *_ejected_flits_out << flush; - if(_active_packets_out) *_active_packets_out << flush; -#endif -#endif - -#ifdef TRACK_CREDITS - for(int s = 0; s < _subnets; ++s) { - for(int n = 0; n < _nodes; ++n) { - BufferState const * const bs = _buf_states[n][s]; - for(int v = 0; v < _vcs; ++v) { - if(_used_credits_out) *_used_credits_out << bs->OccupancyFor(v) << ','; - if(_free_credits_out) *_free_credits_out << bs->AvailableFor(v) << ','; - if(_max_credits_out) *_max_credits_out << bs->LimitFor(v) << ','; - } - } - for(int r = 0; r < _routers; ++r) { - Router const * const rtr = _router[s][r]; - char trail_char = - ((r == _routers - 1) && (s == _subnets - 1)) ? '\n' : ','; - if(_used_credits_out) *_used_credits_out << rtr->UsedCredits() << trail_char; - if(_free_credits_out) *_free_credits_out << rtr->FreeCredits() << trail_char; - if(_max_credits_out) *_max_credits_out << rtr->MaxCredits() << trail_char; - } - } - if(_used_credits_out) *_used_credits_out << flush; - if(_free_credits_out) *_free_credits_out << flush; - if(_max_credits_out) *_max_credits_out << flush; -#endif - -} - -void TrafficManager::DisplayStats(ostream & os) const { - - for(int c = 0; c < _classes; ++c) { - - if(_measure_stats[c] == 0) { - continue; - } - - cout << "Class " << c << ":" << endl; - - cout - << "Packet latency average = " << _plat_stats[c]->Average() << endl - << "\tminimum = " << _plat_stats[c]->Min() << endl - << "\tmaximum = " << _plat_stats[c]->Max() << endl - << "Network latency average = " << _nlat_stats[c]->Average() << endl - << "\tminimum = " << _nlat_stats[c]->Min() << endl - << "\tmaximum = " << _nlat_stats[c]->Max() << endl - << "Slowest packet = " << _slowest_packet[c] << endl - << "Flit latency average = " << _flat_stats[c]->Average() << endl - << "\tminimum = " << _flat_stats[c]->Min() << endl - << "\tmaximum = " << _flat_stats[c]->Max() << endl - << "Slowest flit = " << _slowest_flit[c] << endl - << "Fragmentation average = " << _frag_stats[c]->Average() << endl - << "\tminimum = " << _frag_stats[c]->Min() << endl - << "\tmaximum = " << _frag_stats[c]->Max() << endl; - - int count_sum, count_min, count_max; - double rate_sum, rate_min, rate_max; - double rate_avg; - int sent_packets, sent_flits, accepted_packets, accepted_flits; - int min_pos, max_pos; - double time_delta = (double)(_time - _reset_time); - _ComputeStats(_sent_packets[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos); - rate_sum = (double)count_sum / time_delta; - rate_min = (double)count_min / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - sent_packets = count_sum; - cout << "Injected packet rate average = " << rate_avg << endl - << "\tminimum = " << rate_min - << " (at node " << min_pos << ")" << endl - << "\tmaximum = " << rate_max - << " (at node " << max_pos << ")" << endl; - _ComputeStats(_accepted_packets[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos); - rate_sum = (double)count_sum / time_delta; - rate_min = (double)count_min / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - accepted_packets = count_sum; - cout << "Accepted packet rate average = " << rate_avg << endl - << "\tminimum = " << rate_min - << " (at node " << min_pos << ")" << endl - << "\tmaximum = " << rate_max - << " (at node " << max_pos << ")" << endl; - _ComputeStats(_sent_flits[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos); - rate_sum = (double)count_sum / time_delta; - rate_min = (double)count_min / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - sent_flits = count_sum; - cout << "Injected flit rate average = " << rate_avg << endl - << "\tminimum = " << rate_min - << " (at node " << min_pos << ")" << endl - << "\tmaximum = " << rate_max - << " (at node " << max_pos << ")" << endl; - _ComputeStats(_accepted_flits[c], &count_sum, &count_min, &count_max, &min_pos, &max_pos); - rate_sum = (double)count_sum / time_delta; - rate_min = (double)count_min / time_delta; - rate_max = (double)count_max / time_delta; - rate_avg = rate_sum / (double)_nodes; - accepted_flits = count_sum; - cout << "Accepted flit rate average= " << rate_avg << endl - << "\tminimum = " << rate_min - << " (at node " << min_pos << ")" << endl - << "\tmaximum = " << rate_max - << " (at node " << max_pos << ")" << endl; - - cout << "Injected packet length average = " << (double)sent_flits / (double)sent_packets << endl - << "Accepted packet length average = " << (double)accepted_flits / (double)accepted_packets << endl; - - cout << "Total in-flight flits = " << _total_in_flight_flits[c].size() - << " (" << _measured_in_flight_flits[c].size() << " measured)" - << endl; - -#ifdef TRACK_STALLS - _ComputeStats(_buffer_busy_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - os << "Buffer busy stall rate = " << rate_avg << endl; - _ComputeStats(_buffer_conflict_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - os << "Buffer conflict stall rate = " << rate_avg << endl; - _ComputeStats(_buffer_full_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - os << "Buffer full stall rate = " << rate_avg << endl; - _ComputeStats(_buffer_reserved_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - os << "Buffer reserved stall rate = " << rate_avg << endl; - _ComputeStats(_crossbar_conflict_stalls[c], &count_sum); - rate_sum = (double)count_sum / time_delta; - rate_avg = rate_sum / (double)(_subnets*_routers); - os << "Crossbar conflict stall rate = " << rate_avg << endl; -#endif - - } -} - -void TrafficManager::DisplayOverallStats( ostream & os ) const { - - os << "====== Overall Traffic Statistics ======" << endl; - for ( int c = 0; c < _classes; ++c ) { - - if(_measure_stats[c] == 0) { - continue; - } - - os << "====== Traffic class " << c << " ======" << endl; - - os << "Packet latency average = " << _overall_avg_plat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_plat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_plat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Network latency average = " << _overall_avg_nlat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_nlat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_nlat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Flit latency average = " << _overall_avg_flat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_flat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_flat[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Fragmentation average = " << _overall_avg_frag[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_frag[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_frag[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Injected packet rate average = " << _overall_avg_sent_packets[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_sent_packets[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_sent_packets[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Accepted packet rate average = " << _overall_avg_accepted_packets[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_accepted_packets[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_accepted_packets[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Injected flit rate average = " << _overall_avg_sent[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_sent[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_sent[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Accepted flit rate average = " << _overall_avg_accepted[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tminimum = " << _overall_min_accepted[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - os << "\tmaximum = " << _overall_max_accepted[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - - os << "Injected packet size average = " << _overall_avg_sent[c] / _overall_avg_sent_packets[c] - << " (" << _total_sims << " samples)" << endl; - - os << "Accepted packet size average = " << _overall_avg_accepted[c] / _overall_avg_accepted_packets[c] - << " (" << _total_sims << " samples)" << endl; - - os << "Hops average = " << _overall_hop_stats[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; - -#ifdef TRACK_STALLS - os << "Buffer busy stall rate = " << (double)_overall_buffer_busy_stalls[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl - << "Buffer conflict stall rate = " << (double)_overall_buffer_conflict_stalls[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl - << "Buffer full stall rate = " << (double)_overall_buffer_full_stalls[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl - << "Buffer reserved stall rate = " << (double)_overall_buffer_reserved_stalls[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl - << "Crossbar conflict stall rate = " << (double)_overall_crossbar_conflict_stalls[c] / (double)_total_sims - << " (" << _total_sims << " samples)" << endl; -#endif - - } - -} - -string TrafficManager::_OverallStatsCSV(int c) const -{ - ostringstream os; - os << _traffic[c] - << ',' << _use_read_write[c] - << ',' << _load[c] - << ',' << _overall_min_plat[c] / (double)_total_sims - << ',' << _overall_avg_plat[c] / (double)_total_sims - << ',' << _overall_max_plat[c] / (double)_total_sims - << ',' << _overall_min_nlat[c] / (double)_total_sims - << ',' << _overall_avg_nlat[c] / (double)_total_sims - << ',' << _overall_max_nlat[c] / (double)_total_sims - << ',' << _overall_min_flat[c] / (double)_total_sims - << ',' << _overall_avg_flat[c] / (double)_total_sims - << ',' << _overall_max_flat[c] / (double)_total_sims - << ',' << _overall_min_frag[c] / (double)_total_sims - << ',' << _overall_avg_frag[c] / (double)_total_sims - << ',' << _overall_max_frag[c] / (double)_total_sims - << ',' << _overall_min_sent_packets[c] / (double)_total_sims - << ',' << _overall_avg_sent_packets[c] / (double)_total_sims - << ',' << _overall_max_sent_packets[c] / (double)_total_sims - << ',' << _overall_min_accepted_packets[c] / (double)_total_sims - << ',' << _overall_avg_accepted_packets[c] / (double)_total_sims - << ',' << _overall_max_accepted_packets[c] / (double)_total_sims - << ',' << _overall_min_sent[c] / (double)_total_sims - << ',' << _overall_avg_sent[c] / (double)_total_sims - << ',' << _overall_max_sent[c] / (double)_total_sims - << ',' << _overall_min_accepted[c] / (double)_total_sims - << ',' << _overall_avg_accepted[c] / (double)_total_sims - << ',' << _overall_max_accepted[c] / (double)_total_sims - << ',' << _overall_avg_sent[c] / _overall_avg_sent_packets[c] - << ',' << _overall_avg_accepted[c] / _overall_avg_accepted_packets[c] - << ',' << _overall_hop_stats[c] / (double)_total_sims; - -#ifdef TRACK_STALLS - os << ',' << (double)_overall_buffer_busy_stalls[c] / (double)_total_sims - << ',' << (double)_overall_buffer_conflict_stalls[c] / (double)_total_sims - << ',' << (double)_overall_buffer_full_stalls[c] / (double)_total_sims - << ',' << (double)_overall_buffer_reserved_stalls[c] / (double)_total_sims - << ',' << (double)_overall_crossbar_conflict_stalls[c] / (double)_total_sims; -#endif - - return os.str(); -} - -void TrafficManager::DisplayOverallStatsCSV(ostream & os) const { - for(int c = 0; c < _classes; ++c) { - os << "results:" << c << ',' << _OverallStatsCSV() << endl; - } -} - -//read the watchlist -void TrafficManager::_LoadWatchList(const string & filename){ - ifstream watch_list; - watch_list.open(filename.c_str()); - - string line; - if(watch_list.is_open()) { - while(!watch_list.eof()) { - getline(watch_list, line); - if(line != "") { - if(line[0] == 'p') { - _packets_to_watch.insert(atoi(line.c_str()+1)); - } else { - _flits_to_watch.insert(atoi(line.c_str())); - } - } - } - - } else { - Error("Unable to open flit watch file: " + filename); - } -} - -int TrafficManager::_GetNextPacketSize(int cl) const -{ - assert(cl >= 0 && cl < _classes); - - vector<int> const & psize = _packet_size[cl]; - int sizes = psize.size(); - - if(sizes == 1) { - return psize[0]; - } - - vector<int> const & prate = _packet_size_rate[cl]; - int max_val = _packet_size_max_val[cl]; - - int pct = RandomInt(max_val); - - for(int i = 0; i < (sizes - 1); ++i) { - int const limit = prate[i]; - if(limit > pct) { - return psize[i]; - } else { - pct -= limit; - } - } - assert(prate.back() > pct); - return psize.back(); -} - -double TrafficManager::_GetAveragePacketSize(int cl) const -{ - vector<int> const & psize = _packet_size[cl]; - int sizes = psize.size(); - if(sizes == 1) { - return (double)psize[0]; - } - vector<int> const & prate = _packet_size_rate[cl]; - int sum = 0; - for(int i = 0; i < sizes; ++i) { - sum += psize[i] * prate[i]; - } - return (double)sum / (double)(_packet_size_max_val[cl] + 1); -} diff --git a/src/intersim2/.svn/pristine/8f/8fa65cdf95f29e2fd90afe3901d296d085ff768b.svn-base b/src/intersim2/.svn/pristine/8f/8fa65cdf95f29e2fd90afe3901d296d085ff768b.svn-base deleted file mode 100644 index bc0c5ba..0000000 --- a/src/intersim2/.svn/pristine/8f/8fa65cdf95f29e2fd90afe3901d296d085ff768b.svn-base +++ /dev/null @@ -1,43 +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. -*/ - -#ifndef _BOOKSIM_HPP_ -#define _BOOKSIM_HPP_ - -#include <string> -#include <cstdlib> -#include <cstring> -#include <climits> -#include <cassert> -#ifdef _WIN32_ -#pragma warning (disable: 4786) -#include <ostream> -#endif - -using namespace std; - -#endif diff --git a/src/intersim2/.svn/pristine/8f/8fca73abe4a7446a1a53687a6baca97dc056eabf.svn-base b/src/intersim2/.svn/pristine/8f/8fca73abe4a7446a1a53687a6baca97dc056eabf.svn-base deleted file mode 100644 index b1a60ea..0000000 --- a/src/intersim2/.svn/pristine/8f/8fca73abe4a7446a1a53687a6baca97dc056eabf.svn-base +++ /dev/null @@ -1,34 +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. -*/ - -#define main rng_double_main -#include "rng-double.c" - -double ranf_next( ) -{ - return ranf_arr_next( ); -} diff --git a/src/intersim2/.svn/pristine/8f/8fd71b46841aae63fcfe44908c2a1827741661fb.svn-base b/src/intersim2/.svn/pristine/8f/8fd71b46841aae63fcfe44908c2a1827741661fb.svn-base deleted file mode 100644 index a10b781..0000000 --- a/src/intersim2/.svn/pristine/8f/8fd71b46841aae63fcfe44908c2a1827741661fb.svn-base +++ /dev/null @@ -1,111 +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. -*/ - -// ---------------------------------------------------------------------- -// -// Arbiter: Base class for Matrix and Round Robin Arbiter -// -// ---------------------------------------------------------------------- - -#include "arbiter.hpp" -#include "roundrobin_arb.hpp" -#include "matrix_arb.hpp" -#include "tree_arb.hpp" - -#include <limits> -#include <cassert> - -using namespace std ; - -Arbiter::Arbiter( Module *parent, const string &name, int size ) - : Module( parent, name ), - _size(size), _selected(-1), _highest_pri(numeric_limits<int>::min()), - _best_input(-1), _num_reqs(0) -{ - _request.resize(size); - for ( int i = 0 ; i < size ; i++ ) - _request[i].valid = false ; -} - -void Arbiter::AddRequest( int input, int id, int pri ) -{ - assert( 0 <= input && input < _size ) ; - assert( !_request[input].valid ); - - _num_reqs++ ; - _request[input].valid = true ; - _request[input].id = id ; - _request[input].pri = pri ; -} - -int Arbiter::Arbitrate( int* id, int* pri ) -{ - if ( _selected != -1 ) { - if ( id ) - *id = _request[_selected].id ; - if ( pri ) - *pri = _request[_selected].pri ; - } - - assert((_selected >= 0) || (_num_reqs == 0)); - - return _selected ; -} - -void Arbiter::Clear() -{ - if(_num_reqs > 0) { - - // clear the request vector - for ( int i = 0; i < _size ; i++ ) - _request[i].valid = false ; - _num_reqs = 0 ; - _selected = -1; - } -} - -Arbiter *Arbiter::NewArbiter( Module *parent, const string& name, - const string &arb_type, int size) -{ - Arbiter *a = NULL; - if(arb_type == "round_robin") { - a = new RoundRobinArbiter( parent, name, size ); - } else if(arb_type == "matrix") { - a = new MatrixArbiter( parent, name, size ); - } else if(arb_type.substr(0, 5) == "tree(") { - size_t left = 4; - size_t middle = arb_type.find_first_of(','); - assert(middle != string::npos); - size_t right = arb_type.find_last_of(')'); - assert(right != string::npos); - string groups_str = arb_type.substr(left+1, middle-left-1); - int groups = atoi(groups_str.c_str()); - string sub_arb_type = arb_type.substr(middle+1, right-middle-1); - a = new TreeArbiter( parent, name, size, groups, sub_arb_type ); - } else assert(false); - return a; -} diff --git a/src/intersim2/.svn/pristine/90/90e277f393024f15eeb6e024bd34ac972b818aaf.svn-base b/src/intersim2/.svn/pristine/90/90e277f393024f15eeb6e024bd34ac972b818aaf.svn-base deleted file mode 100644 index 0fda1c1..0000000 --- a/src/intersim2/.svn/pristine/90/90e277f393024f15eeb6e024bd34ac972b818aaf.svn-base +++ /dev/null @@ -1,210 +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. - Neither the name of the Stanford University nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - 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. -*/ - -#include "booksim.hpp" -#include <iostream> - -#include "maxsize.hpp" - -// shortest augmenting path: -// -// for all unmatched left nodes, -// push node onto work stack -// end -// -// for all j, -// from[j] = undefined -// end -// -// do, -// -// while( !stack.empty ), -// -// nl = stack.pop -// for each edge (nl,j), -// if ( ( lmatch[nl] != j ) && ( from[j] == undefined ) ), -// if ( rmatch[j] == undefined ), -// stop // augmenting path found -// else -// from[j] = nl -// newstack.push( rmatch[j] ) -// end -// end -// end -// end -// -// stack = newstack -// end -// - -//#define DEBUG_MAXSIZE -//#define PRINT_MATCHING - -MaxSizeMatch::MaxSizeMatch( Module *parent, const string& name, - int inputs, int outputs ) : - DenseAllocator( parent, name, inputs, outputs ) -{ - _from.resize(outputs); - _s = new int [inputs]; - _ns = new int [inputs]; - _prio = 0; -} - -MaxSizeMatch::~MaxSizeMatch( ) -{ - delete [] _s; - delete [] _ns; -} - -void MaxSizeMatch::Allocate( ) -{ - - // augment as many times as possible - // (this is an O(N^3) maximum-size matching algorithm) - while( _ShortestAugmenting( ) ); - - // next time, start at next input to ensure fairness - _prio = (_prio + 1) % _inputs; -} - - -bool MaxSizeMatch::_ShortestAugmenting( ) -{ - int i, j, jn; - int slen, nslen; - - // start with empty stack - slen = 0; - - // push all unassigned inputs to the stack - for ( i = 0; i < _inputs; ++i ) { - j = (i + _prio) % _inputs; - if ( _inmatch[j] == -1 ) { // start with unmatched left nodes - _s[slen++] = j; - } - } - - _from.assign(_inputs, -1); - - for ( int iter = 0; iter < _inputs; iter++ ) { - nslen = 0; - - for ( int e = 0; e < slen; ++e ) { - i = _s[e]; - - for ( j = 0; j < _outputs; ++j ) { - if ( ( _request[i][j].label != -1 ) && // edge (i,j) exists - ( _inmatch[i] != j ) && // (i,j) is not contained in the current matching - ( _from[j] == -1 ) ) { // no shorter path to j exists - - _from[j] = i; // how did we get to j? - -#ifdef DEBUG_MAXSIZE - cout << " got to " << j << " from " << i << endl; -#endif - if ( _outmatch[j] == -1 ) { // j is unmatched -- augmenting path found - goto found_augmenting; - } else { // j is matched - _ns[nslen] = _outmatch[j]; // add the destination of this edge to the leaf nodes - nslen++; - -#ifdef DEBUG_MAXSIZE - cout << " adding " << _outmatch[j] << endl; -#endif - } - } - } - } - - // no augmenting path found yet, swap stacks - int * t = _s; - _s = _ns; - _ns = t; - slen = nslen; - } - - return false; // no augmenting paths - - found_augmenting: - - // the augmenting path ends at node j on the right - -#ifdef DEBUG_MAXSIZE - cout << "Found path: " << j << "c <- "; -#endif - - i = _from[j]; - _outmatch[j] = i; - -#ifdef DEBUG_MAXSIZE - cout << i; -#endif - - while ( _inmatch[i] != -1 ) { // loop until the end of the path - jn = _inmatch[i]; // remove previous edge (i,jn) and add (i,j) - _inmatch[i] = j; - -#ifdef DEBUG_MAXSIZE - cout << " <- " << j << "c <- "; -#endif - - j = jn; // add edge from (jn,in) - i = _from[j]; - _outmatch[j] = i; - -#ifdef DEBUG_MAXSIZE - cout << i; -#endif - } - -#ifdef DEBUG_MAXSIZE - cout << endl; -#endif - - _inmatch[i] = j; - -#ifdef PRINT_MATCHING - cout << "left matching: "; - - for ( i = 0; i < _inputs; i++ ) { - cout << _inmatch[i] << " "; - } - cout << endl; - - cout << "right matching: "; - for ( i = 0; i < _outputs; i++ ) { - cout << _outmatch[i] << " "; - } - cout << endl; -#endif - - return true; -} diff --git a/src/intersim2/.svn/pristine/90/90f780ee11bbe517547a3648019db3592a5e7675.svn-base b/src/intersim2/.svn/pristine/90/90f780ee11bbe517547a3648019db3592a5e7675.svn-base deleted file mode 100644 index 8cdb445..0000000 --- a/src/intersim2/.svn/pristine/90/90f780ee11bbe517547a3648019db3592a5e7675.svn-base +++ /dev/null @@ -1,88 +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. -*/ - -/*module.cpp - * - *The basic class that is extended by all other components of the network - *Provides the basic hierarchy structure and basic fuctions - * - */ - -#include <iostream> -#include <cstdlib> - -#include "booksim.hpp" -#include "module.hpp" - -Module::Module( Module *parent, const string& name ) -{ - _name = name; - - if ( parent ) { - parent->_AddChild( this ); - _fullname = parent->_fullname + "/" + name; - } else { - _fullname = name; - } -} - -void Module::_AddChild( Module *child ) -{ - _children.push_back( child ); -} - -void Module::DisplayHierarchy( int level, ostream & os ) const -{ - vector<Module *>::const_iterator mod_iter; - - for ( int l = 0; l < level; l++ ) { - os << " "; - } - - os << _name << endl; - - for ( mod_iter = _children.begin( ); - mod_iter != _children.end( ); mod_iter++ ) { - (*mod_iter)->DisplayHierarchy( level + 1 ); - } -} - -void Module::Error( const string& msg ) const -{ - cout << "Error in " << _fullname << " : " << msg << endl; - exit( -1 ); -} - -void Module::Debug( const string& msg ) const -{ - cout << "Debug (" << _fullname << ") : " << msg << endl; -} - -void Module::Display( ostream & os ) const -{ - os << "Display method not implemented for " << _fullname << endl; -} diff --git a/src/intersim2/.svn/pristine/94/941911d54bdc048828d97698138c156dd9becc6c.svn-base b/src/intersim2/.svn/pristine/94/941911d54bdc048828d97698138c156dd9becc6c.svn-base deleted file mode 100644 index 715878a..0000000 --- a/src/intersim2/.svn/pristine/94/941911d54bdc048828d97698138c156dd9becc6c.svn-base +++ /dev/null @@ -1,69 +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. -*/ - -//////////////////////////////////////////////////////////////////////// -// -// QTree: A Quad-Tree Indirect Network. -// -// -//////////////////////////////////////////////////////////////////////// -// -// RCS Information: -// $Author: jbalfour $ -// $Date: 2007/05/17 17:14:07 $ -// $Id$ -// -//////////////////////////////////////////////////////////////////////// - -#ifndef _QTREE_HPP_ -#define _QTREE_HPP_ -#include <cassert> -#include "network.hpp" - -class QTree : public Network { - - int _k; - int _n; - - void _ComputeSize( const Configuration& config ); - void _BuildNet( const Configuration& config ); - - int _RouterIndex( int height, int pos ); - int _InputIndex( int height, int pos, int port ); - int _OutputIndex( int height, int pos, int port ); - -public: - - QTree( const Configuration& config, const string & name ); - static void RegisterRoutingFunctions() ; - - static int HeightFromID( int id ); - static int PosFromID( int id ); - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/95/9532d33b08220b7f51a001451336e589a0a92e97.svn-base b/src/intersim2/.svn/pristine/95/9532d33b08220b7f51a001451336e589a0a92e97.svn-base deleted file mode 100644 index 2afa56a..0000000 --- a/src/intersim2/.svn/pristine/95/9532d33b08220b7f51a001451336e589a0a92e97.svn-base +++ /dev/null @@ -1,69 +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. -*/ - -#ifndef _ANYNET_HPP_ -#define _ANYNET_HPP_ - -#include "network.hpp" -#include "routefunc.hpp" -#include <cassert> -#include <string> -#include <map> -#include <list> - -class AnyNet : public Network { - - string file_name; - //associtation between nodes and routers - map<int, int > node_list; - //[link type][src router][dest router]=(port, latency) - vector<map<int, map<int, pair<int,int> > > > router_list; - //stores minimal routing information from every router to every node - //[router][dest_node]=port - vector<map<int, int> > routing_table; - - void _ComputeSize( const Configuration &config ); - void _BuildNet( const Configuration &config ); - void readFile(); - void buildRoutingTable(); - void route(int r_start); - -public: - AnyNet( const Configuration &config, const string & name ); - ~AnyNet(); - - int GetN( ) const{ return -1;} - int GetK( ) const{ return -1;} - - static void RegisterRoutingFunctions(); - double Capacity( ) const {return -1;} - void InsertRandomFaults( const Configuration &config ){} -}; - -void min_anynet( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -#endif diff --git a/src/intersim2/.svn/pristine/96/968162a2f3ef193e7baffadd696d73fccaf5d69c.svn-base b/src/intersim2/.svn/pristine/96/968162a2f3ef193e7baffadd696d73fccaf5d69c.svn-base deleted file mode 100644 index 70c9052..0000000 --- a/src/intersim2/.svn/pristine/96/968162a2f3ef193e7baffadd696d73fccaf5d69c.svn-base +++ /dev/null @@ -1,160 +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. -*/ - -#include "booksim.hpp" -#include <cassert> - -#include "prio_arb.hpp" - - -PriorityArbiter::PriorityArbiter( const Configuration &config, - Module *parent, const string& name, - int inputs ) -: Module( parent, name ), _rr_ptr(0), _inputs( inputs ) -{ - -} - -void PriorityArbiter::Clear( ) -{ - _requests.clear( ); -} - -void PriorityArbiter::AddRequest( int in, int label, int pri ) -{ - sRequest r; - list<sRequest>::iterator insert_point; - - r.in = in; r.label = label; r.pri = pri; - - insert_point = _requests.begin( ); - while( ( insert_point != _requests.end( ) ) && - ( insert_point->in < in ) ) { - insert_point++; - } - - bool del = false; - bool add = true; - - // For consistant behavior, delete the existing request - // if it is for the same input and has a higher - // priority - - if ( ( insert_point != _requests.end( ) ) && - ( insert_point->in == in ) ) { - if ( insert_point->pri < pri ) { - del = true; - } else { - add = false; - } - } - - if ( add ) { - _requests.insert( insert_point, r ); - } - - if ( del ) { - _requests.erase( insert_point ); - } -} - -void PriorityArbiter::RemoveRequest( int in, int label ) -{ - list<sRequest>::iterator erase_point; - - erase_point = _requests.begin( ); - while( ( erase_point != _requests.end( ) ) && - ( erase_point->in < in ) ) { - erase_point++; - } - - assert( erase_point != _requests.end( ) ); - _requests.erase( erase_point ); -} - -int PriorityArbiter::Match( ) const -{ - return _match; -} - -void PriorityArbiter::Arbitrate( ) -{ - list<sRequest>::iterator p; - - int max_index, max_pri; - bool wrapped; - - //MERGENOTE - //booksim does not have this if statement - //as far as I can tell they are identical in function - if ( _requests.begin( ) != _requests.end( ) ) { - // A round-robin arbiter between input requests - p = _requests.begin( ); - while( ( p != _requests.end( ) ) && - ( p->in < _rr_ptr ) ) { - p++; - } - - max_index = -1; - max_pri = 0; - - wrapped = false; - while( (!wrapped) || ( p->in < _rr_ptr ) ) { - if ( p == _requests.end( ) ) { - if ( wrapped ) { break; } - // p is valid here because empty lists - // are skipped (above) - p = _requests.begin( ); - wrapped = true; - } - - // check if request is the highest priority so far - if ( ( p->pri > max_pri ) || ( max_index == -1 ) ) { - max_pri = p->pri; - max_index = p->in; - } - - p++; - } - - _match = max_index; // -1 for no match - if ( _match != -1 ) { - _rr_ptr = ( _match + 1 ) % _inputs; - } - - } else { - _match = -1; - } -} - -//MERGENOTE -//added update function to priorityarbiter - -void PriorityArbiter::Update( ) -{ - _rr_ptr = ( _rr_ptr + 1 ) % _inputs; -} diff --git a/src/intersim2/.svn/pristine/97/9709aa53e9b91e3103a5c627cfd4c83d5857c451.svn-base b/src/intersim2/.svn/pristine/97/9709aa53e9b91e3103a5c627cfd4c83d5857c451.svn-base deleted file mode 100644 index e262f47..0000000 --- a/src/intersim2/.svn/pristine/97/9709aa53e9b91e3103a5c627cfd4c83d5857c451.svn-base +++ /dev/null @@ -1,187 +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. -*/ - -#ifndef _EVENT_ROUTER_HPP_ -#define _EVENT_ROUTER_HPP_ - -#include <string> -#include <queue> -#include <vector> - -#include "module.hpp" -#include "router.hpp" -#include "buffer.hpp" -#include "vc.hpp" -#include "prio_arb.hpp" -#include "routefunc.hpp" -#include "outputset.hpp" -#include "pipefifo.hpp" - -class EventNextVCState : public Module { -public: - enum eNextVCState { idle, busy, tail_pending }; - - struct tWaiting { - int input; - int vc; - int id; - int pres; - bool watch; - }; - -private: - int _buf_size; - int _vcs; - - vector<int> _credits; - vector<int> _presence; - vector<int> _input; - vector<int> _inputVC; - - vector<list<tWaiting *> > _waiting; - - vector<eNextVCState> _state; - -public: - - EventNextVCState( const Configuration& config, - Module *parent, const string& name ); - - eNextVCState GetState( int vc ) const; - int GetPresence( int vc ) const; - int GetCredits( int vc ) const; - int GetInput( int vc ) const; - int GetInputVC( int vc ) const; - - bool IsWaiting( int vc ) const; - bool IsInputWaiting( int vc, int w_input, int w_vc ) const; - - void PushWaiting( int vc, tWaiting *w ); - void IncrWaiting( int vc, int w_input, int w_vc ); - tWaiting *PopWaiting( int vc ); - - void SetState( int vc, eNextVCState state ); - void SetCredits( int vc, int value ); - void SetPresence( int vc, int value ); - void SetInput( int vc, int input ); - void SetInputVC( int vc, int in_vc ); -}; - -class EventRouter : public Router { - int _vcs; - - int _vct; - - vector<Buffer *> _buf; - vector<vector<bool> > _active; - - tRoutingFunction _rf; - - vector<EventNextVCState *> _output_state; - - PipelineFIFO<Flit> *_crossbar_pipe; - PipelineFIFO<Credit> *_credit_pipe; - - vector<queue<Flit *> > _input_buffer; - vector<queue<Flit *> > _output_buffer; - - vector<queue<Credit *> > _in_cred_buffer; - vector<queue<Credit *> > _out_cred_buffer; - - struct tArrivalEvent { - int input; - int output; - int src_vc; - int dst_vc; - bool head; - bool tail; - - int id; // debug - bool watch; // debug - }; - - PipelineFIFO<tArrivalEvent> *_arrival_pipe; - vector<queue<tArrivalEvent *> > _arrival_queue; - vector<PriorityArbiter*> _arrival_arbiter; - - struct tTransportEvent { - int input; - int src_vc; - int dst_vc; - - int id; // debug - bool watch; // debug - }; - - vector<queue<tTransportEvent *> > _transport_queue; - vector<PriorityArbiter*> _transport_arbiter; - - vector<bool> _transport_free; - vector<int> _transport_match; - - void _ReceiveFlits( ); - void _ReceiveCredits( ); - - void _IncomingFlits( ); - void _ArrivalRequests( int input ); - void _ArrivalArb( int output ); - void _SendTransport( int input, int output, tArrivalEvent *aevt ); - void _ProcessWaiting( int output, int out_vc ); - void _TransportRequests( int output ); - void _TransportArb( int input ); - void _OutputQueuing( ); - - void _SendFlits( ); - void _SendCredits( ); - - virtual void _InternalStep( ); - -public: - EventRouter( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ); - virtual ~EventRouter( ); - - virtual void ReadInputs( ); - virtual void WriteOutputs( ); - - virtual int GetUsedCredit(int o) const {return 0;} - virtual int GetBufferOccupancy(int i) const {return 0;} - -#ifdef TRACK_BUFFERS - virtual int GetUsedCreditForClass(int output, int cl) const {return 0;} - virtual int GetBufferOccupancyForClass(int input, int cl) const {return 0;} -#endif - - virtual vector<int> UsedCredits() const { return vector<int>(); } - virtual vector<int> FreeCredits() const { return vector<int>(); } - virtual vector<int> MaxCredits() const { return vector<int>(); } - - void Display( ostream & os = cout ) const; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/9a/9a6a33f2fd931773aa82485ef360d84c227abb12.svn-base b/src/intersim2/.svn/pristine/9a/9a6a33f2fd931773aa82485ef360d84c227abb12.svn-base deleted file mode 100644 index 98d07bb..0000000 --- a/src/intersim2/.svn/pristine/9a/9a6a33f2fd931773aa82485ef360d84c227abb12.svn-base +++ /dev/null @@ -1,76 +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. -*/ - -//////////////////////////////////////////////////////////////////////// -// -// FatTree -// -//////////////////////////////////////////////////////////////////////// -// -// RCS Information: -// $Author: jbalfour $ -// $Date: 2007/06/26 22:49:23 $ -// $Id$ -// -//////////////////////////////////////////////////////////////////////// - -#ifndef _FatTree_HPP_ -#define _FatTree_HPP_ - -#include "network.hpp" - -class FatTree : public Network { - - int _k; - int _n; - - - void _ComputeSize( const Configuration& config ); - void _BuildNet( const Configuration& config ); - - Router*& _Router( int depth, int pos ); - - int _mapSize; - int* _inputChannelMap; - int* _outputChannelMap; - int* _latencyMap; - - - -public: - - FatTree( const Configuration& config ,const string & name ); - static void RegisterRoutingFunctions() ; - - // - // Methods to Assit Routing Functions - // - static int PreferedPort( const Router* r, int index ); - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/9a/9a75723858a7c299341d4e68fbb1581f9865b898.svn-base b/src/intersim2/.svn/pristine/9a/9a75723858a7c299341d4e68fbb1581f9865b898.svn-base deleted file mode 100644 index c0bdc89..0000000 --- a/src/intersim2/.svn/pristine/9a/9a75723858a7c299341d4e68fbb1581f9865b898.svn-base +++ /dev/null @@ -1,47 +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. - -//concentrated mesh configuration file running batch mode -//xr, yr, x, y, are use to indicate how the concnetration is formed. - -topology = cmesh; - -k = 4; -n = 2; -c = 4; -xr = 2; -yr = 2; - -x = 4; -y = 4; - -routing_function = dor_no_express; - -traffic = bitcomp; - -use_read_write = 0; - -batch_size = 2000; diff --git a/src/intersim2/.svn/pristine/9a/9aed09bfc8ce0fffa6872c93917412c0577120c2.svn-base b/src/intersim2/.svn/pristine/9a/9aed09bfc8ce0fffa6872c93917412c0577120c2.svn-base deleted file mode 100644 index 1d446a5..0000000 --- a/src/intersim2/.svn/pristine/9a/9aed09bfc8ce0fffa6872c93917412c0577120c2.svn-base +++ /dev/null @@ -1,322 +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. -*/ - -#ifndef _TRAFFICMANAGER_HPP_ -#define _TRAFFICMANAGER_HPP_ - -#include <list> -#include <map> -#include <set> -#include <cassert> - -#include "module.hpp" -#include "config_utils.hpp" -#include "network.hpp" -#include "flit.hpp" -#include "buffer_state.hpp" -#include "stats.hpp" -#include "traffic.hpp" -#include "routefunc.hpp" -#include "outputset.hpp" -#include "injection.hpp" - -//register the requests to a node -class PacketReplyInfo; - -class TrafficManager : public Module { - -private: - - vector<vector<int> > _packet_size; - vector<vector<int> > _packet_size_rate; - vector<int> _packet_size_max_val; - -protected: - int _nodes; - int _routers; - int _vcs; - - vector<Network *> _net; - vector<vector<Router *> > _router; - - // ============ Traffic ============ - - int _classes; - - vector<double> _load; - - vector<int> _use_read_write; - vector<double> _write_fraction; - - vector<int> _read_request_size; - vector<int> _read_reply_size; - vector<int> _write_request_size; - vector<int> _write_reply_size; - - vector<string> _traffic; - - vector<int> _class_priority; - - vector<vector<int> > _last_class; - - vector<TrafficPattern *> _traffic_pattern; - vector<InjectionProcess *> _injection_process; - - // ============ Message priorities ============ - - enum ePriority { class_based, age_based, network_age_based, local_age_based, queue_length_based, hop_count_based, sequence_based, none }; - - ePriority _pri_type; - - // ============ Injection VC states ============ - - vector<vector<BufferState *> > _buf_states; -#ifdef TRACK_FLOWS - vector<vector<vector<int> > > _outstanding_credits; - vector<vector<vector<queue<int> > > > _outstanding_classes; -#endif - vector<vector<vector<int> > > _last_vc; - - // ============ Routing ============ - - tRoutingFunction _rf; - bool _lookahead_routing; - bool _noq; - - // ============ Injection queues ============ - - vector<vector<int> > _qtime; - vector<vector<bool> > _qdrained; - vector<vector<list<Flit *> > > _partial_packets; - - vector<map<int, Flit *> > _total_in_flight_flits; - vector<map<int, Flit *> > _measured_in_flight_flits; - vector<map<int, Flit *> > _retired_packets; - bool _empty_network; - - bool _hold_switch_for_packet; - - // ============ physical sub-networks ========== - - int _subnets; - - vector<int> _subnet; - - // ============ deadlock ========== - - int _deadlock_timer; - int _deadlock_warn_timeout; - - // ============ request & replies ========================== - - vector<int> _packet_seq_no; - vector<list<PacketReplyInfo*> > _repliesPending; - vector<int> _requestsOutstanding; - - // ============ Statistics ============ - - vector<Stats *> _plat_stats; - vector<double> _overall_min_plat; - vector<double> _overall_avg_plat; - vector<double> _overall_max_plat; - - vector<Stats *> _nlat_stats; - vector<double> _overall_min_nlat; - vector<double> _overall_avg_nlat; - vector<double> _overall_max_nlat; - - vector<Stats *> _flat_stats; - vector<double> _overall_min_flat; - vector<double> _overall_avg_flat; - vector<double> _overall_max_flat; - - vector<Stats *> _frag_stats; - vector<double> _overall_min_frag; - vector<double> _overall_avg_frag; - vector<double> _overall_max_frag; - - vector<vector<Stats *> > _pair_plat; - vector<vector<Stats *> > _pair_nlat; - vector<vector<Stats *> > _pair_flat; - - vector<Stats *> _hop_stats; - vector<double> _overall_hop_stats; - - vector<vector<int> > _sent_packets; - vector<double> _overall_min_sent_packets; - vector<double> _overall_avg_sent_packets; - vector<double> _overall_max_sent_packets; - vector<vector<int> > _accepted_packets; - vector<double> _overall_min_accepted_packets; - vector<double> _overall_avg_accepted_packets; - vector<double> _overall_max_accepted_packets; - vector<vector<int> > _sent_flits; - vector<double> _overall_min_sent; - vector<double> _overall_avg_sent; - vector<double> _overall_max_sent; - vector<vector<int> > _accepted_flits; - vector<double> _overall_min_accepted; - vector<double> _overall_avg_accepted; - vector<double> _overall_max_accepted; - -#ifdef TRACK_STALLS - vector<vector<int> > _buffer_busy_stalls; - vector<vector<int> > _buffer_conflict_stalls; - vector<vector<int> > _buffer_full_stalls; - vector<vector<int> > _buffer_reserved_stalls; - vector<vector<int> > _crossbar_conflict_stalls; - vector<double> _overall_buffer_busy_stalls; - vector<double> _overall_buffer_conflict_stalls; - vector<double> _overall_buffer_full_stalls; - vector<double> _overall_buffer_reserved_stalls; - vector<double> _overall_crossbar_conflict_stalls; -#endif - - vector<int> _slowest_packet; - vector<int> _slowest_flit; - - map<string, Stats *> _stats; - - // ============ Simulation parameters ============ - - enum eSimState { warming_up, running, draining, done }; - eSimState _sim_state; - - bool _measure_latency; - - int _reset_time; - int _drain_time; - - int _total_sims; - int _sample_period; - int _max_samples; - int _warmup_periods; - - int _include_queuing; - - vector<int> _measure_stats; - bool _pair_stats; - - vector<double> _latency_thres; - - vector<double> _stopping_threshold; - vector<double> _acc_stopping_threshold; - - vector<double> _warmup_threshold; - vector<double> _acc_warmup_threshold; - - int _cur_id; - int _cur_pid; - int _time; - - set<int> _flits_to_watch; - set<int> _packets_to_watch; - - bool _print_csv_results; - - //flits to watch - ostream * _stats_out; - -#ifdef TRACK_FLOWS - vector<vector<int> > _injected_flits; - vector<vector<int> > _ejected_flits; - ostream * _injected_flits_out; - ostream * _received_flits_out; - ostream * _stored_flits_out; - ostream * _sent_flits_out; - ostream * _outstanding_credits_out; - ostream * _ejected_flits_out; - ostream * _active_packets_out; -#endif - -#ifdef TRACK_CREDITS - ostream * _used_credits_out; - ostream * _free_credits_out; - ostream * _max_credits_out; -#endif - - // ============ Internal methods ============ -protected: - - virtual void _RetireFlit( Flit *f, int dest ); - - void _Inject(); - void _Step( ); - - bool _PacketsOutstanding( ) const; - - virtual int _IssuePacket( int source, int cl ); - void _GeneratePacket( int source, int size, int cl, int time ); - - virtual void _ClearStats( ); - - void _ComputeStats( const vector<int> & stats, int *sum, int *min = NULL, int *max = NULL, int *min_pos = NULL, int *max_pos = NULL ) const; - - virtual bool _SingleSim( ); - - void _DisplayRemaining( ostream & os = cout ) const; - - void _LoadWatchList(const string & filename); - - virtual void _UpdateOverallStats(); - - virtual string _OverallStatsCSV(int c = 0) const; - - int _GetNextPacketSize(int cl) const; - double _GetAveragePacketSize(int cl) const; - -public: - - static TrafficManager * New(Configuration const & config, - vector<Network *> const & net); - - TrafficManager( const Configuration &config, const vector<Network *> & net ); - virtual ~TrafficManager( ); - - bool Run( ); - - virtual void WriteStats( ostream & os = cout ) const ; - virtual void UpdateStats( ) ; - virtual void DisplayStats( ostream & os = cout ) const ; - virtual void DisplayOverallStats( ostream & os = cout ) const ; - virtual void DisplayOverallStatsCSV( ostream & os = cout ) const ; - - inline int getTime() { return _time;} - Stats * getStats(const string & name) { return _stats[name]; } - -}; - -template<class T> -ostream & operator<<(ostream & os, const vector<T> & v) { - for(size_t i = 0; i < v.size() - 1; ++i) { - os << v[i] << ","; - } - os << v[v.size()-1]; - return os; -} - -#endif diff --git a/src/intersim2/.svn/pristine/9b/9b149c35e1f088a947ef877a58c79300dd5b074e.svn-base b/src/intersim2/.svn/pristine/9b/9b149c35e1f088a947ef877a58c79300dd5b074e.svn-base deleted file mode 100644 index 8409322..0000000 --- a/src/intersim2/.svn/pristine/9b/9b149c35e1f088a947ef877a58c79300dd5b074e.svn-base +++ /dev/null @@ -1,103 +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. -*/ - -// ---------------------------------------------------------------------- -// -// SeparableInputFirstAllocator: Separable Input-First Allocator -// -// ---------------------------------------------------------------------- - -#include "separable_input_first.hpp" - -#include "booksim.hpp" -#include "arbiter.hpp" - -#include <vector> -#include <iostream> -#include <cstring> - -SeparableInputFirstAllocator:: -SeparableInputFirstAllocator( Module* parent, const string& name, int inputs, - int outputs, const string& arb_type ) - : SeparableAllocator( parent, name, inputs, outputs, arb_type ) -{} - -void SeparableInputFirstAllocator::Allocate() { - - set<int>::const_iterator port_iter = _in_occ.begin(); - while(port_iter != _in_occ.end()) { - - const int & input = *port_iter; - - // add requests to the input arbiter - - map<int, sRequest>::const_iterator req_iter = _in_req[input].begin(); - while(req_iter != _in_req[input].end()) { - - const sRequest & req = req_iter->second; - - _input_arb[input]->AddRequest(req.port, req.label, req.in_pri); - - ++req_iter; - } - - // Execute the input arbiters and propagate the grants to the - // output arbiters. - - int label = -1; - const int output = _input_arb[input]->Arbitrate(&label, NULL); - assert(output > -1); - - const sRequest & req = _out_req[output][input]; - assert((req.port == input) && (req.label == label)); - - _output_arb[output]->AddRequest(req.port, req.label, req.out_pri); - - ++port_iter; - } - - port_iter = _out_occ.begin(); - while(port_iter != _out_occ.end()) { - - const int & output = *port_iter; - - // Execute the output arbiters. - - const int input = _output_arb[output]->Arbitrate(NULL, NULL); - - if(input > -1) { - assert((_inmatch[input] == -1) && (_outmatch[output] == -1)); - - _inmatch[input] = output ; - _outmatch[output] = input ; - _input_arb[input]->UpdateState() ; - _output_arb[output]->UpdateState() ; - } - - ++port_iter; - } -} diff --git a/src/intersim2/.svn/pristine/9e/9ee6cbb1a61d3f7c2992c673ad86d0ed1d245ef8.svn-base b/src/intersim2/.svn/pristine/9e/9ee6cbb1a61d3f7c2992c673ad86d0ed1d245ef8.svn-base deleted file mode 100644 index ec440d8..0000000 --- a/src/intersim2/.svn/pristine/9e/9ee6cbb1a61d3f7c2992c673ad86d0ed1d245ef8.svn-base +++ /dev/null @@ -1,116 +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. - -//A flattened butterfly configurate file with many tweaks from the -//default settings. - - -// Flow control -// Total number of VCs must match the above assignments -num_vcs = 8; -vc_buf_size = 4; - -wait_for_tail_credit = 0; - -// -// Router architectureq -// -vc_allocator = islip; -sw_allocator = islip; -alloc_iters = 1; - -credit_delay = 2; -routing_delay = 0; -vc_alloc_delay = 1; -sw_alloc_delay = 1; -st_final_delay = 1; - -input_speedup = 1; -output_speedup = 1; -internal_speedup = 1.0; - -// -// Traffic -// - -warmup_periods = 3; - -sample_period = 1000; - -sim_count = 1; - -traffic = uniform; - - -// Flatfly -// -// #node = k^(n+1) -// -// x, y, specifies the arrangement of routers in x and y dim -// xr, yr specifiies the arayment of clients in a router -// -topology = flatfly; -subnets = 1; - -c = 4; -k = 4; -n = 2; - -x = 4; -y = 4; -xr = 2; -yr = 2; - -// -// Routing -// - -routing_function = ran_min; - -//1: batch mode, 0: injection mode -use_read_write = 0; - -//for injection mode -packet_size = 1; -injection_rate = 0.1; - -//for batch mode -read_request_size=1; -write_request_size=1; -read_reply_size=1; -write_reply_size=1; - -read_request_begin_vc = 0; -read_request_end_vc = 3; -write_reply_begin_vc = 4; -write_reply_end_vc = 7; -read_reply_begin_vc = 4; -read_reply_end_vc = 7; -write_request_begin_vc = 0; -write_request_end_vc = 3; - -//latency: drains all packet, throughput:no drain? -sim_type = latency; diff --git a/src/intersim2/.svn/pristine/9f/9f3bdc5b32d0fd02e717f7a9c517e280355586fb.svn-base b/src/intersim2/.svn/pristine/9f/9f3bdc5b32d0fd02e717f7a9c517e280355586fb.svn-base deleted file mode 100644 index 748506d..0000000 --- a/src/intersim2/.svn/pristine/9f/9f3bdc5b32d0fd02e717f7a9c517e280355586fb.svn-base +++ /dev/null @@ -1,103 +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. -*/ - -// ---------------------------------------------------------------------- -// -// SeparableOutputFirstAllocator: Separable Output-First Allocator -// -// ---------------------------------------------------------------------- - -#include "separable_output_first.hpp" - -#include "booksim.hpp" -#include "arbiter.hpp" - -#include <vector> -#include <iostream> -#include <cstring> - -SeparableOutputFirstAllocator:: -SeparableOutputFirstAllocator( Module* parent, const string& name, int inputs, - int outputs, const string& arb_type ) - : SeparableAllocator( parent, name, inputs, outputs, arb_type ) -{} - -void SeparableOutputFirstAllocator::Allocate() { - - set<int>::const_iterator port_iter = _out_occ.begin(); - while(port_iter != _out_occ.end()) { - - const int & output = *port_iter; - - // add requests to the output arbiter - - map<int, sRequest>::const_iterator req_iter = _out_req[output].begin(); - while(req_iter != _out_req[output].end()) { - - const sRequest & req = req_iter->second; - - _output_arb[output]->AddRequest(req.port, req.label, req.out_pri); - - ++req_iter; - } - - // Execute the output arbiter and propagate the grants to the - // input arbiters. - - int label = -1; - const int input = _output_arb[output]->Arbitrate(&label, NULL); - assert(input > -1); - - const sRequest & req = _in_req[input][output]; - assert((req.port == output) && (req.label == label)); - - _input_arb[input]->AddRequest(req.port, req.label, req.in_pri); - - ++port_iter; - } - - port_iter = _in_occ.begin(); - while(port_iter != _in_occ.end()) { - - const int & input = *port_iter; - - // Execute the input arbiters. - - const int output = _input_arb[input]->Arbitrate(NULL, NULL); - - if(output > -1) { - assert((_inmatch[input] == -1) && (_outmatch[output] == -1)); - - _inmatch[input] = output; - _outmatch[output] = input; - _input_arb[input]->UpdateState() ; - _output_arb[output]->UpdateState() ; - } - - ++port_iter; - } -} diff --git a/src/intersim2/.svn/pristine/a4/a4359ad59061eaed8a442687bbf1e8693be96a72.svn-base b/src/intersim2/.svn/pristine/a4/a4359ad59061eaed8a442687bbf1e8693be96a72.svn-base deleted file mode 100644 index dccabf7..0000000 --- a/src/intersim2/.svn/pristine/a4/a4359ad59061eaed8a442687bbf1e8693be96a72.svn-base +++ /dev/null @@ -1,68 +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. - -//8X8 mesh with 20 flits per packet under injection mode -//injection rate here is packet per cycle, NOT flit per cycle - -// Topology - -topology = mesh; -k = 8; -n = 2; - -// Routing -routing_function = dor; - -// Flow control -num_vcs = 8; -vc_buf_size = 8; -wait_for_tail_credit = 1; - -// Router architecture -vc_allocator = islip; -sw_allocator = islip; -alloc_iters = 1; - -credit_delay = 2; -routing_delay = 0; -vc_alloc_delay = 1; -sw_alloc_delay = 1; - -input_speedup = 2; -output_speedup = 1; -internal_speedup = 1.0; - - -// Traffic -traffic = transpose; -packet_size = 20; - - -// Simulation -sim_type = latency; - -injection_rate = 0.005; - diff --git a/src/intersim2/.svn/pristine/ad/ad824944d4de71c9e947f9e386f12aa8c6ec4355.svn-base b/src/intersim2/.svn/pristine/ad/ad824944d4de71c9e947f9e386f12aa8c6ec4355.svn-base deleted file mode 100644 index c05ef50..0000000 --- a/src/intersim2/.svn/pristine/ad/ad824944d4de71c9e947f9e386f12aa8c6ec4355.svn-base +++ /dev/null @@ -1,104 +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. -*/ - -#ifndef _FLIT_HPP_ -#define _FLIT_HPP_ - -#include <iostream> -#include <stack> - -#include "booksim.hpp" -#include "outputset.hpp" - -class Flit { - -public: - - const static int NUM_FLIT_TYPES = 5; - enum FlitType { READ_REQUEST = 0, - READ_REPLY = 1, - WRITE_REQUEST = 2, - WRITE_REPLY = 3, - ANY_TYPE = 4 }; - FlitType type; - - int vc; - - int cl; - - bool head; - bool tail; - - int ctime; - int itime; - int atime; - - int id; - int pid; - - bool record; - - int src; - int dest; - - int pri; - - int hops; - bool watch; - int subnetwork; - - // intermediate destination (if any) - mutable int intm; - - // phase in multi-phase algorithms - mutable int ph; - - // Fields for arbitrary data - void* data ; - - // Lookahead route info - OutputSet la_route_set; - - void Reset(); - - static Flit * New(); - void Free(); - static void FreeAll(); - -private: - - Flit(); - ~Flit() {} - - static stack<Flit *> _all; - static stack<Flit *> _free; - -}; - -ostream& operator<<( ostream& os, const Flit& f ); - -#endif diff --git a/src/intersim2/.svn/pristine/af/afde60b791408b0db1c56c113ccfe45105b846eb.svn-base b/src/intersim2/.svn/pristine/af/afde60b791408b0db1c56c113ccfe45105b846eb.svn-base deleted file mode 100644 index 665e5b3..0000000 --- a/src/intersim2/.svn/pristine/af/afde60b791408b0db1c56c113ccfe45105b846eb.svn-base +++ /dev/null @@ -1,119 +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. -*/ - -// ---------------------------------------------------------------------- -// -// TreeArbiter -// -// ---------------------------------------------------------------------- - -#include "tree_arb.hpp" -#include <iostream> -#include <sstream> - -using namespace std ; - -TreeArbiter::TreeArbiter( Module *parent, const string &name, - int size, int groups, const string & arb_type ) - : Arbiter( parent, name, size ) { - assert(size % groups == 0); - _group_arbiters.resize(groups); - _group_reqs.resize(groups, 0); - _group_size = size / groups; - for(int i = 0; i < groups; ++i) { - ostringstream group_arb_name; - group_arb_name << "group_arb" << i; - _group_arbiters[i] = Arbiter::NewArbiter(this, group_arb_name.str(), arb_type, _group_size); - } - _global_arbiter = Arbiter::NewArbiter(this, "global_arb", arb_type, groups); -} - -TreeArbiter::~TreeArbiter() { - for(int i = 0; i < (int)_group_arbiters.size(); ++i) { - delete _group_arbiters[i]; - } - delete _global_arbiter; -} - -void TreeArbiter::PrintState() const { - for(int i = 0; i < (int)_group_arbiters.size(); ++i) { - cout << "Group arbiter " << i << ":" << endl; - _group_arbiters[i]->PrintState(); - } - cout << "Global arbiter:" << endl; - _global_arbiter->PrintState(); -} - -void TreeArbiter::UpdateState() { - if(_selected > -1) { - int last_winner = _global_arbiter->LastWinner(); - assert(last_winner >= 0 && last_winner < (int)_group_arbiters.size()); - _group_arbiters[last_winner]->UpdateState(); - _global_arbiter->UpdateState(); - } -} - -void TreeArbiter::AddRequest( int input, int id, int pri ) -{ - Arbiter::AddRequest(input, id, pri); - int group_index = input / _group_size; - _group_arbiters[group_index]->AddRequest( input % _group_size, id, pri ); - ++_group_reqs[group_index]; -} - -int TreeArbiter::Arbitrate( int* id, int* pri ) { - if(!_num_reqs) { - return -1; - } - for(int i = 0; i < (int)_group_arbiters.size(); ++i) { - if(_group_reqs[i]) { - int group_id, group_pri; - _group_arbiters[i]->Arbitrate(&group_id, &group_pri); - _global_arbiter->AddRequest(i, group_id, group_pri); - } - } - int group = _global_arbiter->Arbitrate(NULL, NULL); - assert(group >= 0 && group < (int)_group_arbiters.size()); - int group_sel = _group_arbiters[group]->LastWinner(); - assert(group_sel >= 0 && group_sel < _group_size); - _selected = group * _group_size + group_sel; - assert(_selected >= 0 && _selected < _size); - return Arbiter::Arbitrate(id, pri); -} - -void TreeArbiter::Clear() -{ - if(!_num_reqs) { - return; - } - for(int i = 0; i < (int)_group_arbiters.size(); ++i) { - _group_arbiters[i]->Clear(); - _group_reqs[i] = 0; - } - _global_arbiter->Clear(); - Arbiter::Clear(); -} diff --git a/src/intersim2/.svn/pristine/b0/b0621120b70fa66b06fa3e7adc9b386974b8c0c3.svn-base b/src/intersim2/.svn/pristine/b0/b0621120b70fa66b06fa3e7adc9b386974b8c0c3.svn-base deleted file mode 100644 index 21c879a..0000000 --- a/src/intersim2/.svn/pristine/b0/b0621120b70fa66b06fa3e7adc9b386974b8c0c3.svn-base +++ /dev/null @@ -1,66 +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. -*/ - -#ifndef _SWITCH_MONITOR_HPP_ -#define _SWITCH_MONITOR_HPP_ - -#include <vector> -#include <iostream> - -using namespace std; - -class Flit; - -class SwitchMonitor { - int _cycles ; - int _inputs ; - int _outputs ; - int _classes ; - vector<int> _event ; - int index( int input, int output, int cl ) const ; -public: - SwitchMonitor( int inputs, int outputs, int classes ) ; - void cycle() ; - vector<int> const & GetActivity() const { - return _event; - } - inline int const & NumInputs() const { - return _inputs; - } - inline int const & NumOutputs() const { - return _outputs; - } - inline int const & NumClasses() const { - return _classes; - } - void traversal( int input, int output, Flit const * f ) ; - void display(ostream & os) const; -} ; - -ostream & operator<<( ostream & os, SwitchMonitor const & obj ) ; - -#endif diff --git a/src/intersim2/.svn/pristine/b4/b4f5b1485bfafbb63c019d5aadd0f1c58250fbe4.svn-base b/src/intersim2/.svn/pristine/b4/b4f5b1485bfafbb63c019d5aadd0f1c58250fbe4.svn-base deleted file mode 100644 index eb45bc2..0000000 --- a/src/intersim2/.svn/pristine/b4/b4f5b1485bfafbb63c019d5aadd0f1c58250fbe4.svn-base +++ /dev/null @@ -1,50 +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. -*/ - -// ---------------------------------------------------------------------- -// -// SeparableOutputFirstAllocator: Separable Output-First Allocator -// -// ---------------------------------------------------------------------- - -#ifndef _SEPARABLE_OUTPUT_FIRST_HPP_ -#define _SEPARABLE_OUTPUT_FIRST_HPP_ - -#include "separable.hpp" - -class SeparableOutputFirstAllocator : public SeparableAllocator { - -public: - - SeparableOutputFirstAllocator( Module* parent, const string& name, int inputs, - int outputs, const string& arb_type ) ; - - virtual void Allocate() ; - -} ; - -#endif diff --git a/src/intersim2/.svn/pristine/b6/b6c4fdbece4c23327c9e321b130c2ec595705f98.svn-base b/src/intersim2/.svn/pristine/b6/b6c4fdbece4c23327c9e321b130c2ec595705f98.svn-base deleted file mode 100644 index aeb258a..0000000 --- a/src/intersim2/.svn/pristine/b6/b6c4fdbece4c23327c9e321b130c2ec595705f98.svn-base +++ /dev/null @@ -1,183 +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. -*/ - -#ifndef _IQ_ROUTER_HPP_ -#define _IQ_ROUTER_HPP_ - -#include <string> -#include <deque> -#include <queue> -#include <set> -#include <map> - -#include "router.hpp" -#include "routefunc.hpp" - -using namespace std; - -class VC; -class Flit; -class Credit; -class Buffer; -class BufferState; -class Allocator; -class SwitchMonitor; -class BufferMonitor; - -class IQRouter : public Router { - - int _vcs; - - bool _vc_busy_when_full; - bool _vc_prioritize_empty; - bool _vc_shuffle_requests; - - bool _speculative; - bool _spec_check_elig; - bool _spec_check_cred; - bool _spec_mask_by_reqs; - - bool _active; - - int _routing_delay; - int _vc_alloc_delay; - int _sw_alloc_delay; - - map<int, Flit *> _in_queue_flits; - - deque<pair<int, pair<Credit *, int> > > _proc_credits; - - deque<pair<int, pair<int, int> > > _route_vcs; - deque<pair<int, pair<pair<int, int>, int> > > _vc_alloc_vcs; - deque<pair<int, pair<pair<int, int>, int> > > _sw_hold_vcs; - deque<pair<int, pair<pair<int, int>, int> > > _sw_alloc_vcs; - - deque<pair<int, pair<Flit *, pair<int, int> > > > _crossbar_flits; - - map<int, Credit *> _out_queue_credits; - - vector<Buffer *> _buf; - vector<BufferState *> _next_buf; - - Allocator *_vc_allocator; - Allocator *_sw_allocator; - Allocator *_spec_sw_allocator; - - vector<int> _vc_rr_offset; - vector<int> _sw_rr_offset; - - tRoutingFunction _rf; - - int _output_buffer_size; - vector<queue<Flit *> > _output_buffer; - - vector<queue<Credit *> > _credit_buffer; - - bool _hold_switch_for_packet; - vector<int> _switch_hold_in; - vector<int> _switch_hold_out; - vector<int> _switch_hold_vc; - - bool _noq; - vector<vector<int> > _noq_next_output_port; - vector<vector<int> > _noq_next_vc_start; - vector<vector<int> > _noq_next_vc_end; - -#ifdef TRACK_FLOWS - vector<vector<queue<int> > > _outstanding_classes; -#endif - - bool _ReceiveFlits( ); - bool _ReceiveCredits( ); - - virtual void _InternalStep( ); - - bool _SWAllocAddReq(int input, int vc, int output); - - void _InputQueuing( ); - - void _RouteEvaluate( ); - void _VCAllocEvaluate( ); - void _SWHoldEvaluate( ); - void _SWAllocEvaluate( ); - void _SwitchEvaluate( ); - - void _RouteUpdate( ); - void _VCAllocUpdate( ); - void _SWHoldUpdate( ); - void _SWAllocUpdate( ); - void _SwitchUpdate( ); - - void _OutputQueuing( ); - - void _SendFlits( ); - void _SendCredits( ); - - void _UpdateNOQ(int input, int vc, Flit const * f); - - // ---------------------------------------- - // - // Router Power Modellingyes - // - // ---------------------------------------- - - SwitchMonitor * _switchMonitor ; - BufferMonitor * _bufferMonitor ; - -public: - - IQRouter( Configuration const & config, - Module *parent, string const & name, int id, - int inputs, int outputs ); - - virtual ~IQRouter( ); - - virtual void AddOutputChannel(FlitChannel * channel, CreditChannel * backchannel); - - virtual void ReadInputs( ); - virtual void WriteOutputs( ); - - void Display( ostream & os = cout ) const; - - virtual int GetUsedCredit(int o) const; - virtual int GetBufferOccupancy(int i) const; - -#ifdef TRACK_BUFFERS - virtual int GetUsedCreditForClass(int output, int cl) const; - virtual int GetBufferOccupancyForClass(int input, int cl) const; -#endif - - virtual vector<int> UsedCredits() const; - virtual vector<int> FreeCredits() const; - virtual vector<int> MaxCredits() const; - - SwitchMonitor const * const GetSwitchMonitor() const {return _switchMonitor;} - BufferMonitor const * const GetBufferMonitor() const {return _bufferMonitor;} - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/b7/b755bb8c053f61f95a6ce87cddff8068f0fa19fa.svn-base b/src/intersim2/.svn/pristine/b7/b755bb8c053f61f95a6ce87cddff8068f0fa19fa.svn-base deleted file mode 100644 index df0f9fc..0000000 --- a/src/intersim2/.svn/pristine/b7/b755bb8c053f61f95a6ce87cddff8068f0fa19fa.svn-base +++ /dev/null @@ -1,137 +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. -*/ - -#ifndef _VC_HPP_ -#define _VC_HPP_ - -#include <deque> - -#include "flit.hpp" -#include "outputset.hpp" -#include "routefunc.hpp" -#include "config_utils.hpp" - -class VC : public Module { -public: - enum eVCState { state_min = 0, idle = state_min, routing, vc_alloc, active, - state_max = active }; - struct state_info_t { - int cycles; - }; - static const char * const VCSTATE[]; - -private: - - deque<Flit *> _buffer; - - eVCState _state; - - OutputSet *_route_set; - int _out_port, _out_vc; - - enum ePrioType { local_age_based, queue_length_based, hop_count_based, none, other }; - - ePrioType _pri_type; - - int _pri; - - int _priority_donation; - - bool _watched; - - int _expected_pid; - - int _last_id; - int _last_pid; - - bool _lookahead_routing; - -public: - - VC( const Configuration& config, int outputs, - Module *parent, const string& name ); - ~VC(); - - void AddFlit( Flit *f ); - inline Flit *FrontFlit( ) const - { - return _buffer.empty() ? NULL : _buffer.front(); - } - - Flit *RemoveFlit( ); - - - inline bool Empty( ) const - { - return _buffer.empty( ); - } - - inline VC::eVCState GetState( ) const - { - return _state; - } - - - void SetState( eVCState s ); - - const OutputSet *GetRouteSet( ) const; - void SetRouteSet( OutputSet * output_set ); - - void SetOutput( int port, int vc ); - - inline int GetOutputPort( ) const - { - return _out_port; - } - - - inline int GetOutputVC( ) const - { - return _out_vc; - } - - void UpdatePriority(); - - inline int GetPriority( ) const - { - return _pri; - } - void Route( tRoutingFunction rf, const Router* router, const Flit* f, int in_channel ); - - inline int GetOccupancy() const - { - return (int)_buffer.size(); - } - - // ==== Debug functions ==== - - void SetWatch( bool watch = true ); - bool IsWatched( ) const; - void Display( ostream & os = cout ) const; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/b8/b8715f9652140e4746a42ce2c1ca742a6dcc8ab1.svn-base b/src/intersim2/.svn/pristine/b8/b8715f9652140e4746a42ce2c1ca742a6dcc8ab1.svn-base deleted file mode 100644 index 3e8f5ae..0000000 --- a/src/intersim2/.svn/pristine/b8/b8715f9652140e4746a42ce2c1ca742a6dcc8ab1.svn-base +++ /dev/null @@ -1,68 +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. -*/ - -#ifndef _INJECTION_HPP_ -#define _INJECTION_HPP_ - -#include "config_utils.hpp" - -using namespace std; - -class InjectionProcess { -protected: - int _nodes; - double _rate; - InjectionProcess(int nodes, double rate); -public: - virtual ~InjectionProcess() {} - virtual bool test(int source) = 0; - virtual void reset(); - static InjectionProcess * New(string const & inject, int nodes, double load, - Configuration const * const config = NULL); -}; - -class BernoulliInjectionProcess : public InjectionProcess { -public: - BernoulliInjectionProcess(int nodes, double rate); - virtual bool test(int source); -}; - -class OnOffInjectionProcess : public InjectionProcess { -private: - double _alpha; - double _beta; - double _r1; - vector<int> _initial; - vector<int> _state; -public: - OnOffInjectionProcess(int nodes, double rate, double alpha, double beta, - double r1, vector<int> initial); - virtual void reset(); - virtual bool test(int source); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/b9/b92275ee465ac160db13b1f1e271cf80bc843710.svn-base b/src/intersim2/.svn/pristine/b9/b92275ee465ac160db13b1f1e271cf80bc843710.svn-base deleted file mode 100644 index 1819d18..0000000 --- a/src/intersim2/.svn/pristine/b9/b92275ee465ac160db13b1f1e271cf80bc843710.svn-base +++ /dev/null @@ -1,183 +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. -*/ - -#include "booksim.hpp" -#include <iostream> - -#include "islip.hpp" -#include "random_utils.hpp" - -//#define DEBUG_ISLIP - -iSLIP_Sparse::iSLIP_Sparse( Module *parent, const string& name, - int inputs, int outputs, int iters ) : - SparseAllocator( parent, name, inputs, outputs ), - _iSLIP_iter(iters) -{ - _gptrs.resize(_outputs, 0); - _aptrs.resize(_inputs, 0); -} - -void iSLIP_Sparse::Allocate( ) -{ - int input; - int output; - - int input_offset; - int output_offset; - - map<int, sRequest>::iterator p; - bool wrapped; - - for ( int iter = 0; iter < _iSLIP_iter; ++iter ) { - // Grant phase - - vector<int> grants(_outputs, -1); - - for ( output = 0; output < _outputs; ++output ) { - - // Skip loop if there are no requests - // or the output is already matched - if ( ( _out_req[output].empty( ) ) || - ( _outmatch[output] != -1 ) ) { - continue; - } - - // A round-robin arbiter between input requests - input_offset = _gptrs[output]; - - p = _out_req[output].begin( ); - while( ( p != _out_req[output].end( ) ) && - ( p->second.port < input_offset ) ) { - p++; - } - - wrapped = false; - while( (!wrapped) || - ( ( p != _out_req[output].end( ) ) && - ( p->second.port < input_offset ) ) ) { - if ( p == _out_req[output].end( ) ) { - if ( wrapped ) { break; } - // p is valid here because empty lists - // are skipped (above) - p = _out_req[output].begin( ); - wrapped = true; - } - - input = p->second.port; - - // we know the output is free (above) and - // if the input is free, grant request - if ( _inmatch[input] == -1 ) { - grants[output] = input; - break; - } - - p++; - } - } - -#ifdef DEBUG_ISLIP - cout << "grants: "; - for ( int i = 0; i < _outputs; ++i ) { - cout << grants[i] << " "; - } - cout << endl; - - cout << "aptrs: "; - for ( int i = 0; i < _inputs; ++i ) { - cout << _aptrs[i] << " "; - } - cout << endl; -#endif - - // Accept phase - - for ( input = 0; input < _inputs; ++input ) { - - if ( _in_req[input].empty( ) ) { - continue; - } - - // A round-robin arbiter between output grants - output_offset = _aptrs[input]; - - p = _in_req[input].begin( ); - while( ( p != _in_req[input].end( ) ) && - ( p->second.port < output_offset ) ) { - p++; - } - - wrapped = false; - while( (!wrapped) || - ( ( p != _in_req[input].end( ) ) && - ( p->second.port < output_offset ) ) ) { - if ( p == _in_req[input].end( ) ) { - if ( wrapped ) { break; } - // p is valid here because empty lists - // are skipped (above) - p = _in_req[input].begin( ); - wrapped = true; - } - - output = p->second.port; - - // we know the output is free (above) and - // if the input is free, grant request - if ( grants[output] == input ) { - // Accept - _inmatch[input] = output; - _outmatch[output] = input; - - // Only update pointers if accepted during the 1st iteration - if ( iter == 0 ) { - _gptrs[output] = ( input + 1 ) % _inputs; - _aptrs[input] = ( output + 1 ) % _outputs; - } - - break; - } - - p++; - } - } - } - -#ifdef DEBUG_ISLIP - cout << "input match: "; - for ( int i = 0; i < _inputs; ++i ) { - cout << _inmatch[i] << " "; - } - cout << endl; - - cout << "output match: "; - for ( int j = 0; j < _outputs; ++j ) { - cout << _outmatch[j] << " "; - } - cout << endl; -#endif -} diff --git a/src/intersim2/.svn/pristine/bf/bf0b085441d2569f393cadb89df82945471cd4d4.svn-base b/src/intersim2/.svn/pristine/bf/bf0b085441d2569f393cadb89df82945471cd4d4.svn-base deleted file mode 100644 index 01a2281..0000000 --- a/src/intersim2/.svn/pristine/bf/bf0b085441d2569f393cadb89df82945471cd4d4.svn-base +++ /dev/null @@ -1,575 +0,0 @@ -/* - 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. - Neither the name of the Stanford University nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - - 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. -*/ - -#include "booksim.hpp" -#include <vector> -#include <sstream> - -#include "dragonfly.hpp" -#include "random_utils.hpp" -#include "misc_utils.hpp" -#include "globals.hpp" - -#define DRAGON_LATENCY - -int gP, gA, gG; - -//calculate the hop count between src and estination -int dragonflynew_hopcnt(int src, int dest) -{ - int hopcnt; - int dest_grp_ID, src_grp_ID; - int src_hopcnt, dest_hopcnt; - int src_intm, dest_intm; - int grp_output, dest_grp_output; - int grp_output_RID; - - int _grp_num_routers= gA; - int _grp_num_nodes =_grp_num_routers*gP; - - dest_grp_ID = int(dest/_grp_num_nodes); - src_grp_ID = int(src / _grp_num_nodes); - - //source and dest are in the same group, either 0-1 hop - if (dest_grp_ID == src_grp_ID) { - if ((int)(dest / gP) == (int)(src /gP)) - hopcnt = 0; - else - hopcnt = 1; - - } else { - //source and dest are in the same group - //find the number of hops in the source group - //find the number of hops in the dest group - if (src_grp_ID > dest_grp_ID) { - grp_output = dest_grp_ID; - dest_grp_output = src_grp_ID - 1; - } - else { - grp_output = dest_grp_ID - 1; - dest_grp_output = src_grp_ID; - } - grp_output_RID = ((int) (grp_output / (gP))) + src_grp_ID * _grp_num_routers; - src_intm = grp_output_RID * gP; - - grp_output_RID = ((int) (dest_grp_output / (gP))) + dest_grp_ID * _grp_num_routers; - dest_intm = grp_output_RID * gP; - - //hop count in source group - if ((int)( src_intm / gP) == (int)( src / gP ) ) - src_hopcnt = 0; - else - src_hopcnt = 1; - - //hop count in destination group - if ((int)( dest_intm / gP) == (int)( dest / gP ) ){ - dest_hopcnt = 0; - }else{ - dest_hopcnt = 1; - } - - //tally - hopcnt = src_hopcnt + 1 + dest_hopcnt; - } - - return hopcnt; -} - - -//packet output port based on the source, destination and current location -int dragonfly_port(int rID, int source, int dest){ - int _grp_num_routers= gA; - int _grp_num_nodes =_grp_num_routers*gP; - - int out_port = -1; - int grp_ID = int(rID / _grp_num_routers); - int dest_grp_ID = int(dest/_grp_num_nodes); - int grp_output=-1; - int grp_RID=-1; - int group_dest=-1; - - //which router within this group the packet needs to go to - if (dest_grp_ID == grp_ID) { - grp_RID = int(dest / gP); - } else { - if (grp_ID > dest_grp_ID) { - grp_output = dest_grp_ID; - } else { - grp_output = dest_grp_ID - 1; - } - grp_RID = int(grp_output /gP) + grp_ID * _grp_num_routers; - group_dest = grp_RID * gP; - } - - //At the last hop - if (dest >= rID*gP && dest < (rID+1)*gP) { - out_port = dest%gP; - } else if (grp_RID == rID) { - //At the optical link - out_port = gP + (gA-1) + grp_output %(gP); - } else { - //need to route within a group - assert(grp_RID!=-1); - - if (rID < grp_RID){ - out_port = (grp_RID % _grp_num_routers) - 1 + gP; - }else{ - out_port = (grp_RID % _grp_num_routers) + gP; - } - } - - assert(out_port!=-1); - return out_port; -} - - -DragonFlyNew::DragonFlyNew( const Configuration &config, const string & name ) : - Network( config, name ) -{ - - _ComputeSize( config ); - _Alloc( ); - _BuildNet( config ); -} - -void DragonFlyNew::_ComputeSize( const Configuration &config ) -{ - - // LIMITATION - // -- only one dimension between the group - // _n == # of dimensions within a group - // _p == # of processors within a router - // inter-group ports : _p - // terminal ports : _p - // intra-group ports : 2*_p - 1 - _p = config.GetInt( "k" ); // # of ports in each switch - _n = config.GetInt( "n" ); - - - assert(_n==1); - // dimension - - if (_n == 1) - _k = _p + _p + 2*_p - 1; - else - _k = _p + _p + 2*_p; - - - // FIX... - gK = _p; gN = _n; - - // with 1 dimension, total of 2p routers per group - // N = 2p * p * (2p^2 + 1) - // a = # of routers per group - // = 2p (if n = 1) - // = p^(n) (if n > 2) - // g = # of groups - // = a * p + 1 - // N = a * p * g; - - if (_n == 1) - _a = 2 * _p; - else - _a = powi(_p, _n); - - _g = _a * _p + 1; - _nodes = _a * _p * _g; - - _num_of_switch = _nodes / _p; - _channels = _num_of_switch * (_k - _p); - _size = _num_of_switch; - - - - gG = _g; - gP = _p; - gA = _a; - _grp_num_routers = gA; - _grp_num_nodes =_grp_num_routers*gP; - -} - -void DragonFlyNew::_BuildNet( const Configuration &config ) -{ - - int _output=-1; - int _input=-1; - int _dim_ID=-1; - int _num_ports_per_switch=-1; - int _dim_size=-1; - int c; - - ostringstream router_name; - - - - cout << " Dragonfly " << endl; - cout << " p = " << _p << " n = " << _n << endl; - cout << " each switch - total radix = "<< _k << endl; - cout << " # of switches = "<< _num_of_switch << endl; - cout << " # of channels = "<< _channels << endl; - cout << " # of nodes ( size of network ) = " << _nodes << endl; - cout << " # of groups (_g) = " << _g << endl; - cout << " # of routers per group (_a) = " << _a << endl; - - for ( int node = 0; node < _num_of_switch; ++node ) { - // ID of the group - int grp_ID; - grp_ID = (int) (node/_a); - router_name << "router"; - - router_name << "_" << node ; - - _routers[node] = Router::NewRouter( config, this, router_name.str( ), - node, _k, _k ); - _timed_modules.push_back(_routers[node]); - - router_name.str(""); - - for ( int cnt = 0; cnt < _p; ++cnt ) { - c = _p * node + cnt; - _routers[node]->AddInputChannel( _inject[c], _inject_cred[c] ); - - } - - for ( int cnt = 0; cnt < _p; ++cnt ) { - c = _p * node + cnt; - _routers[node]->AddOutputChannel( _eject[c], _eject_cred[c] ); - - } - - // add OUPUT channels - // _k == # of processor per router - // need 2*_k routers --thus, - // 2_k-1 outputs channels within group - // _k-1 outputs for intra-group - - // - - if (_n > 1 ) { cout << " ERROR: n>1 dimension NOT supported yet... " << endl; exit(-1); } - - //******************************************** - // connect OUTPUT channels - //******************************************** - // add intra-group output channel - for ( int dim = 0; dim < _n; ++dim ) { - for ( int cnt = 0; cnt < (2*_p -1); ++cnt ) { - _output = (2*_p-1 + _p) * _n * node + (2*_p-1) * dim + cnt; - - _routers[node]->AddOutputChannel( _chan[_output], _chan_cred[_output] ); - -#ifdef DRAGON_LATENCY - _chan[_output]->SetLatency(10); - _chan_cred[_output]->SetLatency(10); -#endif - } - } - - // add inter-group output channel - - for ( int cnt = 0; cnt < _p; ++cnt ) { - _output = (2*_p-1 + _p) * node + (2*_p - 1) + cnt; - - // _chan[_output].global = true; - _routers[node]->AddOutputChannel( _chan[_output], _chan_cred[_output] ); -#ifdef DRAGON_LATENCY - _chan[_output]->SetLatency(100); - _chan_cred[_output]->SetLatency(100); -#endif - } - - - //******************************************** - // connect INPUT channels - //******************************************** - // # of non-local nodes - _num_ports_per_switch = (_k - _p); - - - // intra-group GROUP channels - for ( int dim = 0; dim < _n; ++dim ) { - - _dim_size = powi(_k,dim); - - _dim_ID = ((int) (node / ( powi(_p, dim)))); - - - - // NODE ID withing group - _dim_ID = node % _a; - - - - - for ( int cnt = 0; cnt < (2*_p-1); ++cnt ) { - - if ( cnt < _dim_ID) { - - _input = grp_ID * _num_ports_per_switch * _a - - (_dim_ID - cnt) * _num_ports_per_switch + - _dim_ID * _num_ports_per_switch + - (_dim_ID - 1); - } - else { - - _input = grp_ID * _num_ports_per_switch * _a + - _dim_ID * _num_ports_per_switch + - (cnt - _dim_ID + 1) * _num_ports_per_switch + - _dim_ID; - - } - - if (_input < 0) { - cout << " ERROR: _input less than zero " << endl; - exit(-1); - } - - - _routers[node]->AddInputChannel( _chan[_input], _chan_cred[_input] ); - } - } - - - // add INPUT channels -- "optical" channels connecting the groups - int _grp_num_routers; - int grp_output; - int grp_ID2; - - for ( int cnt = 0; cnt < _p; ++cnt ) { - // _dim_ID - grp_output = _dim_ID* _p + cnt; - - _grp_num_routers = powi(_k, _n-1); - grp_ID2 = (int) ((grp_ID - 1) / (_k - 1)); - - if ( grp_ID > grp_output) { - - _input = (grp_output) * _num_ports_per_switch * _a + // starting point of group - (_num_ports_per_switch - _p) * (int) ((grp_ID - 1) / _p) + // find the correct router within grp - (_num_ports_per_switch - _p) + // add offset within router - grp_ID - 1; - } else { - - _input = (grp_output + 1) * _num_ports_per_switch * _a + - (_num_ports_per_switch - _p) * (int) ((grp_ID) / _p) + // find the correct router within grp - (_num_ports_per_switch - _p) + - grp_ID; - } - - _routers[node]->AddInputChannel( _chan[_input], _chan_cred[_input] ); - } - - } - - cout<<"Done links"<<endl; -} - - -int DragonFlyNew::GetN( ) const -{ - return _n; -} - -int DragonFlyNew::GetK( ) const -{ - return _k; -} - -void DragonFlyNew::InsertRandomFaults( const Configuration &config ) -{ - -} - -double DragonFlyNew::Capacity( ) const -{ - return (double)_k / 8.0; -} - -void DragonFlyNew::RegisterRoutingFunctions(){ - - gRoutingFunctionMap["min_dragonflynew"] = &min_dragonflynew; - gRoutingFunctionMap["ugal_dragonflynew"] = &ugal_dragonflynew; -} - - -void min_dragonflynew( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - outputs->Clear( ); - - if(inject) { - int inject_vc= RandomInt(gNumVCs-1); - outputs->AddRange(-1, inject_vc, inject_vc); - return; - } - - int _grp_num_routers= gA; - - int dest = f->dest; - int rID = r->GetID(); - - int grp_ID = int(rID / _grp_num_routers); - int debug = f->watch; - int out_port = -1; - int out_vc = 0; - int dest_grp_ID=-1; - - if ( in_channel < gP ) { - out_vc = 0; - f->ph = 0; - if (dest_grp_ID == grp_ID) { - f->ph = 1; - } - } - - - out_port = dragonfly_port(rID, f->src, dest); - - //optical dateline - if (out_port >=gP + (gA-1)) { - f->ph = 1; - } - - out_vc = f->ph; - if (debug) - *gWatchOut << GetSimTime() << " | " << r->FullName() << " | " - << " through output port : " << out_port - << " out vc: " << out_vc << endl; - outputs->AddRange( out_port, out_vc, out_vc ); -} - - -//Basic adaptive routign algorithm for the dragonfly -void ugal_dragonflynew( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ) -{ - //need 3 VCs for deadlock freedom - - assert(gNumVCs==3); - outputs->Clear( ); - if(inject) { - int inject_vc= RandomInt(gNumVCs-1); - outputs->AddRange(-1, inject_vc, inject_vc); - return; - } - - //this constant biases the adaptive decision toward minimum routing - //negative value woudl biases it towards nonminimum routing - int adaptive_threshold = 30; - - int _grp_num_routers= gA; - int _grp_num_nodes =_grp_num_routers*gP; - int _network_size = gA * gP * gG; - - - int dest = f->dest; - int rID = r->GetID(); - int grp_ID = (int) (rID / _grp_num_routers); - int dest_grp_ID = int(dest/_grp_num_nodes); - - int debug = f->watch; - int out_port = -1; - int out_vc = 0; - int min_queue_size, min_hopcnt; - int nonmin_queue_size, nonmin_hopcnt; - int intm_grp_ID; - int intm_rID; - - if(debug){ - cout<<"At router "<<rID<<endl; - } - int min_router_output, nonmin_router_output; - - //at the source router, make the adaptive routing decision - if ( in_channel < gP ) { - //dest are in the same group, only use minimum routing - if (dest_grp_ID == grp_ID) { - f->ph = 2; - } else { - //select a random node - f->intm =RandomInt(_network_size - 1); - intm_grp_ID = (int)(f->intm/_grp_num_nodes); - if (debug){ - cout<<"Intermediate node "<<f->intm<<" grp id "<<intm_grp_ID<<endl; - } - - //random intermediate are in the same group, use minimum routing - if(grp_ID == intm_grp_ID){ - f->ph = 1; - } else { - //congestion metrics using queue length, obtained by GetUsedCredit() - min_hopcnt = dragonflynew_hopcnt(f->src, f->dest); - min_router_output = dragonfly_port(rID, f->src, f->dest); - min_queue_size = max(r->GetUsedCredit(min_router_output), 0) ; - - - nonmin_hopcnt = dragonflynew_hopcnt(f->src, f->intm) + - dragonflynew_hopcnt(f->intm,f->dest); - nonmin_router_output = dragonfly_port(rID, f->src, f->intm); - nonmin_queue_size = max(r->GetUsedCredit(nonmin_router_output), 0); - - //congestion comparison, could use hopcnt instead of 1 and 2 - if ((1 * min_queue_size ) <= (2 * nonmin_queue_size)+adaptive_threshold ) { - if (debug) cout << " MINIMAL routing " << endl; - f->ph = 1; - } else { - f->ph = 0; - } - } - } - } - - //transition from nonminimal phase to minimal - if(f->ph==0){ - intm_rID= (int)(f->intm/gP); - if( rID == intm_rID){ - f->ph = 1; - } - } - - //port assignement based on the phase - if(f->ph == 0){ - out_port = dragonfly_port(rID, f->src, f->intm); - } else if(f->ph == 1){ - out_port = dragonfly_port(rID, f->src, f->dest); - } else if(f->ph == 2){ - out_port = dragonfly_port(rID, f->src, f->dest); - } else { - assert(false); - } - - //optical dateline - if (f->ph == 1 && out_port >=gP + (gA-1)) { - f->ph = 2; - } - - //vc assignemnt based on phase - out_vc = f->ph; - - outputs->AddRange( out_port, out_vc, out_vc ); -} diff --git a/src/intersim2/.svn/pristine/c3/c3580bf85e8bc6015a74e1f37916987e00accdaa.svn-base b/src/intersim2/.svn/pristine/c3/c3580bf85e8bc6015a74e1f37916987e00accdaa.svn-base deleted file mode 100644 index 076ca87..0000000 --- a/src/intersim2/.svn/pristine/c3/c3580bf85e8bc6015a74e1f37916987e00accdaa.svn-base +++ /dev/null @@ -1,146 +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. - -# -# Makefile -# -LEX = flex -YACC = bison -y -DEFINE = -INCPATH = -I. -Iarbiters -Iallocators -Irouters -Inetworks -Ipower -CPPFLAGS += -Wall $(INCPATH) $(DEFINE) -CPPFLAGS += -O3 -CPPFLAGS += -g -LFLAGS += - - -OBJDIR := obj -PROG := booksim - -# simulator source files -CPP_SRCS = main.cpp \ - config_utils.cpp \ - booksim_config.cpp \ - module.cpp \ - buffer.cpp \ - vc.cpp \ - routefunc.cpp \ - traffic.cpp \ - flitchannel.cpp \ - trafficmanager.cpp \ - batchtrafficmanager.cpp \ - packet_reply_info.cpp \ - buffer_state.cpp \ - stats.cpp \ - credit.cpp \ - outputset.cpp \ - flit.cpp \ - injection.cpp\ - misc_utils.cpp\ - rng_wrapper.cpp\ - rng_double_wrapper.cpp\ - power_module.cpp \ - switch_monitor.cpp \ - buffer_monitor.cpp - - - -LEX_OBJS = ${OBJDIR}/lex.yy.o -YACC_OBJS = ${OBJDIR}/y.tab.o - -# networks -NETWORKS:= $(wildcard networks/*.cpp) -ALLOCATORS:= $(wildcard allocators/*.cpp) -ARBITERS:= $(wildcard arbiters/*.cpp) -ROUTERS:= $(wildcard routers/*.cpp) -POWER:= $(wildcard power/*.cpp) - -#--- Make rules --- -OBJS := $(LEX_OBJS) $(YACC_OBJS)\ - $(CPP_SRCS:%.cpp=${OBJDIR}/%.o)\ - $(NETWORKS:networks/%.cpp=${OBJDIR}/%.o)\ - $(ALLOCATORS:allocators/%.cpp=${OBJDIR}/%.o)\ - $(ARBITERS:arbiters/%.cpp=${OBJDIR}/%.o)\ - $(ROUTERS:routers/%.cpp=${OBJDIR}/%.o)\ - $(POWER:power/%.cpp=${OBJDIR}/%.o) - -.PHONY: clean - -all:$(PROG) - -$(PROG): $(OBJS) - $(CXX) $(LFLAGS) $^ -o $@ - -# rules to compile simulator - - -${LEX_OBJS}: lex.yy.c y.tab.h - $(CC) $(CPPFLAGS) -c $< -o $@ - -${YACC_OBJS}: y.tab.c y.tab.h - $(CC) $(CPPFLAGS) -c $< -o $@ - -${OBJDIR}/%.o: %.cpp - $(CXX) $(CPPFLAGS) -c $< -o $@ - -# rules to compile networks -${OBJDIR}/%.o: networks/%.cpp - $(CXX) $(CPPFLAGS) -c $< -o $@ - -# rules to compile arbiters -${OBJDIR}/%.o: arbiters/%.cpp - $(CXX) $(CPPFLAGS) -c $< -o $@ - -# rules to compile allocators -${OBJDIR}/%.o: allocators/%.cpp - $(CXX) $(CPPFLAGS) -c $< -o $@ - -# rules to compile routers -${OBJDIR}/%.o: routers/%.cpp - $(CXX) $(CPPFLAGS) -c $< -o $@ - -# rules to compile power classes -${OBJDIR}/%.o: power/%.cpp - $(CXX) $(CPPFLAGS) -c $< -o $@ - -clean: - rm -f $(OBJS) - rm -f $(PROG) - rm -f *~ - rm -f allocators/*~ - rm -f arbiters/*~ - rm -f networks/*~ - rm -f runfiles/*~ - rm -f routers/*~ - rm -f examples/*~ - rm -f y.tab.c y.tab.h lex.yy.c - rm -f moc_bgui.cpp - -y.tab.c y.tab.h: config.y - $(YACC) -d $< - -lex.yy.c: config.l - $(LEX) $< diff --git a/src/intersim2/.svn/pristine/c3/c3dce16b735e5ff4045d124ee30299d4ff39f5b1.svn-base b/src/intersim2/.svn/pristine/c3/c3dce16b735e5ff4045d124ee30299d4ff39f5b1.svn-base deleted file mode 100644 index 7d12faf..0000000 --- a/src/intersim2/.svn/pristine/c3/c3dce16b735e5ff4045d124ee30299d4ff39f5b1.svn-base +++ /dev/null @@ -1,95 +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. -*/ - -#ifndef _CONFIG_UTILS_HPP_ -#define _CONFIG_UTILS_HPP_ - -#include "booksim.hpp" - -#include<cstdio> -#include<string> -#include<map> -#include<vector> - -extern "C" int yyparse(); - -class Configuration { - static Configuration * theConfig; - FILE * _config_file; - string _config_string; - -protected: - map<string,string> _str_map; - map<string,int> _int_map; - map<string,double> _float_map; - -public: - Configuration(); - - void AddStrField(string const & field, string const & value); - - void Assign(string const & field, string const & value); - void Assign(string const & field, int value); - void Assign(string const & field, double value); - - string GetStr(string const & field) const; - int GetInt(string const & field) const; - double GetFloat(string const & field) const; - - vector<string> GetStrArray(const string & field) const; - vector<int> GetIntArray(const string & field) const; - vector<double> GetFloatArray(const string & field) const; - - void ParseFile(string const & filename); - void ParseString(string const & str); - int Input(char * line, int max_size); - void ParseError(string const & msg, unsigned int lineno = 0) const; - - void WriteFile(string const & filename); - void WriteMatlabFile(ostream * o) const; - - inline const map<string, string> & GetStrMap() const { - return _str_map; - } - inline const map<string, int> & GetIntMap() const { - return _int_map; - } - inline const map<string, double> & GetFloatMap() const { - return _float_map; - } - - static Configuration * GetTheConfig(); - -}; - -bool ParseArgs(Configuration * cf, int argc, char **argv); - -vector<string> tokenize_str(string const & data); -vector<int> tokenize_int(string const & data); -vector<double> tokenize_float(string const & data); - -#endif diff --git a/src/intersim2/.svn/pristine/c5/c5213fecc8710817b2514c72787b0207849f9280.svn-base b/src/intersim2/.svn/pristine/c5/c5213fecc8710817b2514c72787b0207849f9280.svn-base deleted file mode 100644 index 13bd09d..0000000 --- a/src/intersim2/.svn/pristine/c5/c5213fecc8710817b2514c72787b0207849f9280.svn-base +++ /dev/null @@ -1,80 +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. -*/ - -// ---------------------------------------------------------------------- -// -// RoundRobin: RoundRobin Arbiter -// -// ---------------------------------------------------------------------- - -#include "roundrobin_arb.hpp" -#include <iostream> -#include <limits> - -using namespace std ; - -RoundRobinArbiter::RoundRobinArbiter( Module *parent, const string &name, - int size ) - : Arbiter( parent, name, size ), _pointer( 0 ) { -} - -void RoundRobinArbiter::PrintState() const { - cout << "Round Robin Priority Pointer: " << endl ; - cout << " _pointer = " << _pointer << endl ; -} - -void RoundRobinArbiter::UpdateState() { - // update priority matrix using last grant - if ( _selected > -1 ) - _pointer = ( _selected + 1 ) % _size ; -} - -void RoundRobinArbiter::AddRequest( int input, int id, int pri ) -{ - if(!_request[input].valid || (_request[input].pri < pri)) { - if((_num_reqs == 0) || - Supersedes(input, pri, _best_input, _highest_pri, _pointer,_size )) { - _highest_pri = pri; - _best_input = input; - } - } - Arbiter::AddRequest(input, id, pri); -} - -int RoundRobinArbiter::Arbitrate( int* id, int* pri ) { - - _selected = _best_input; - - return Arbiter::Arbitrate(id, pri); -} - -void RoundRobinArbiter::Clear() -{ - _highest_pri = numeric_limits<int>::min(); - _best_input = -1; - Arbiter::Clear(); -} diff --git a/src/intersim2/.svn/pristine/cb/cb7c673e590ba7e01169bf437b3753f478aa55ac.svn-base b/src/intersim2/.svn/pristine/cb/cb7c673e590ba7e01169bf437b3753f478aa55ac.svn-base deleted file mode 100644 index 7f6b286..0000000 --- a/src/intersim2/.svn/pristine/cb/cb7c673e590ba7e01169bf437b3753f478aa55ac.svn-base +++ /dev/null @@ -1,71 +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. -*/ - -#include "buffer_monitor.hpp" - -#include "flit.hpp" - -BufferMonitor::BufferMonitor( int inputs, int classes ) -: _cycles(0), _inputs(inputs), _classes(classes) { - _reads.resize(inputs * classes, 0) ; - _writes.resize(inputs * classes, 0) ; -} - -int BufferMonitor::index( int input, int cl ) const { - assert((input >= 0) && (input < _inputs)); - assert((cl >= 0) && (cl < _classes)); - return cl + _classes * input ; -} - -void BufferMonitor::cycle() { - _cycles++ ; -} - -void BufferMonitor::write( int input, Flit const * f ) { - _writes[ index(input, f->cl) ]++ ; -} - -void BufferMonitor::read( int input, Flit const * f ) { - _reads[ index(input, f->cl) ]++ ; -} - -void BufferMonitor::display(ostream & os) const { - for ( int i = 0 ; i < _inputs ; i++ ) { - os << "[ " << i << " ] " ; - for ( int c = 0 ; c < _classes ; c++ ) { - os << "Type=" << c - << ":(R#" << _reads[ index( i, c) ] << "," - << "W#" << _writes[ index( i, c) ] << ")" << " " ; - } - os << endl ; - } -} - -ostream & operator<<( ostream & os, BufferMonitor const & obj ) { - obj.display(os); - return os ; -} diff --git a/src/intersim2/.svn/pristine/cd/cdcc1ba4154908a4bfefe5993832475af05a62e6.svn-base b/src/intersim2/.svn/pristine/cd/cdcc1ba4154908a4bfefe5993832475af05a62e6.svn-base deleted file mode 100644 index c1983d4..0000000 --- a/src/intersim2/.svn/pristine/cd/cdcc1ba4154908a4bfefe5993832475af05a62e6.svn-base +++ /dev/null @@ -1,53 +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. -*/ - -#ifndef _GLOBALS_HPP_ -#define _GLOBALS_HPP_ -#include <string> -#include <vector> -#include <iostream> - -/*all declared in main.cpp*/ - -int GetSimTime(); - -class Stats; -Stats * GetStats(const std::string & name); - -extern bool gPrintActivity; - -extern int gK; -extern int gN; -extern int gC; - -extern int gNodes; - -extern bool gTrace; - -extern std::ostream * gWatchOut; - -#endif diff --git a/src/intersim2/.svn/pristine/ce/ce3f71fc2f0c6cac1246ba0e26b6af41edef501d.svn-base b/src/intersim2/.svn/pristine/ce/ce3f71fc2f0c6cac1246ba0e26b6af41edef501d.svn-base deleted file mode 100644 index 1894af7..0000000 --- a/src/intersim2/.svn/pristine/ce/ce3f71fc2f0c6cac1246ba0e26b6af41edef501d.svn-base +++ /dev/null @@ -1,890 +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. -*/ - -#include <string> -#include <sstream> -#include <iostream> -#include <cstdlib> -#include <cassert> - -#include "event_router.hpp" -#include "stats.hpp" -#include "globals.hpp" - -EventRouter::EventRouter( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ) - : Router( config, - parent, name, - id, - inputs, outputs ) -{ - ostringstream module_name; - - _vcs = config.GetInt( "num_vcs" ); - - // Cut-through mode --- packets are not broken - // up and input buffers are assumed to be - // expressed in units of maximum size packets. - - _vct = config.GetInt( "vct" ); - - // Routing - - string rf = config.GetStr("routing_function") + "_" + config.GetStr("topology"); - map<string, tRoutingFunction>::iterator rf_iter = gRoutingFunctionMap.find(rf); - if(rf_iter == gRoutingFunctionMap.end()) { - Error("Invalid routing function: " + rf); - } - _rf = rf_iter->second; - - // Alloc VC's - - _buf.resize(_inputs); - _active.resize(_inputs); - - for ( int i = 0; i < _inputs; ++i ) { - module_name << "buf_" << i; - _buf[i] = new Buffer( config, _outputs, this, module_name.str( ) ); - module_name.seekp( 0, ios::beg ); - _active[i].resize(_vcs, false); - } - - // Alloc next VCs' state - - _output_state.resize(_outputs); - - for ( int o = 0; o < _outputs; ++o ) { - module_name << "output" << o << "_vc_state"; - _output_state[o] = new EventNextVCState(config, this, module_name.str()); - module_name.seekp( 0, ios::beg ); - } - - // Alloc arbiters - - _arrival_arbiter.resize(_outputs); - - for ( int o = 0; o < _outputs; ++o ) { - module_name << "arrival_arb_output" << o; - _arrival_arbiter[o] = - new PriorityArbiter( config, this, module_name.str( ), _inputs ); - module_name.seekp( 0, ios::beg ); - } - - _transport_arbiter.resize(_inputs); - - for ( int i = 0; i < _inputs; ++i ) { - module_name << "transport_arb_input" << i; - _transport_arbiter[i] = - new PriorityArbiter( config, this, module_name.str( ), _outputs ); - module_name.seekp( 0, ios::beg ); - } - - // Alloc pipelines (to simulate processing/transmission delays) - - _crossbar_pipe = - new PipelineFIFO<Flit>( this, "crossbar_pipeline", _outputs, - _crossbar_delay ); - - _credit_pipe = - new PipelineFIFO<Credit>( this, "credit_pipeline", _inputs, - _credit_delay ); - - _arrival_pipe = - new PipelineFIFO<tArrivalEvent>( this, "arrival_pipeline", _inputs, - 0 /* FIX THIS EVENTUALLY */); - - // Queues - - _input_buffer.resize(_inputs); - _output_buffer.resize(_outputs); - - _in_cred_buffer.resize(_inputs); - _out_cred_buffer.resize(_outputs); - - _arrival_queue.resize(_inputs); - _transport_queue.resize(_outputs); - - // Misc. - - _transport_free.resize(_inputs, true); - _transport_match.resize(_inputs, -1); -} - -EventRouter::~EventRouter( ) -{ - for ( int i = 0; i < _inputs; ++i ) { - delete _buf[i]; - } - - for ( int o = 0; o < _outputs; ++o ) { - delete _output_state[o]; - } - - for ( int o = 0; o < _outputs; ++o ) { - delete _arrival_arbiter[o]; - } - - for ( int i = 0; i < _inputs; ++i ) { - delete _transport_arbiter[i]; - } - - delete _crossbar_pipe; - delete _credit_pipe; - delete _arrival_pipe; -} - -void EventRouter::ReadInputs( ) -{ - _ReceiveFlits( ); - _ReceiveCredits( ); -} - -void EventRouter::_InternalStep( ) -{ - // Receive incoming flits - _IncomingFlits( ); - - // The input pipe simulates routing delay - _arrival_pipe->Advance( ); - - // Clear output requests - for ( int output = 0; output < _outputs; ++output ) { - _arrival_arbiter[output]->Clear( ); - } - - // Check input arrival queues and generate - // requests for the outputs - for ( int input = 0; input < _inputs; ++input ) { - _ArrivalRequests( input ); - } - - // Arbitrate between requests at outputs - for ( int output = 0; output < _outputs; ++output ) { - _ArrivalArb( output ); - } - - for ( int input = 0; input < _inputs; ++input ) { - _transport_arbiter[input]->Clear( ); - } - - _crossbar_pipe->WriteAll( 0 ); - _credit_pipe->WriteAll( 0 ); - - // Generate transport events and their - // requests for the inputs - for ( int output = 0; output < _outputs; ++output ) { - _TransportRequests( output ); - } - - // Arbitrate between requests at inputs - for ( int input = 0; input < _inputs; ++input ) { - _TransportArb( input ); - } - - _crossbar_pipe->Advance( ); - _credit_pipe->Advance( ); - - _OutputQueuing( ); -} - -void EventRouter::WriteOutputs( ) -{ - _SendFlits( ); - _SendCredits( ); -} - -void EventRouter::_ReceiveFlits( ) -{ - Flit *f; - - for ( int input = 0; input < _inputs; ++input ) { - f = _input_channels[input]->Receive(); - - if ( f ) { - _input_buffer[input].push( f ); - } - } -} - -void EventRouter::_ReceiveCredits( ) -{ - Credit *c; - - for ( int output = 0; output < _outputs; ++output ) { - c = _output_credits[output]->Receive(); - - if ( c ) { - _out_cred_buffer[output].push( c ); - } - } -} - -void EventRouter::_ProcessWaiting( int output, int out_vc ) -{ - // out_vc just sent the transport event for out_vc, - // check if any events are queued on that vc. if so, - // generate another transport event and set the - // owner of the vc, otherwise set the vc to idle. - - int credits; - - tTransportEvent *tevt; - - EventNextVCState::tWaiting *w; - - if ( _output_state[output]->IsWaiting( out_vc ) ) { - - // State remains as busy, but the waiting VC takes over - w = _output_state[output]->PopWaiting( out_vc ); - - _output_state[output]->SetState( out_vc, EventNextVCState::busy ); - _output_state[output]->SetInput( out_vc, w->input ); - _output_state[output]->SetInputVC( out_vc, w->vc ); - - if ( w->watch ) { - cout << "Dequeuing waiting arrival event at " << FullName() - << " for flit " << w->id << endl; - } - - credits = _output_state[output]->GetCredits( out_vc ); - - // Try to queue a transmit event for a waiting packet - if ( credits > 0 ) { - tevt = new tTransportEvent; - tevt->src_vc = w->vc; - tevt->dst_vc = out_vc; - tevt->input = w->input; - tevt->watch = w->watch; // just to have something here - tevt->id = w->id; - - _transport_queue[output].push( tevt ); - - if ( tevt->watch ) { - cout << "Injecting transport event at " << FullName() - << " for flit " << tevt->id << endl; - } - - credits--; - _output_state[output]->SetCredits( out_vc, credits ); - _output_state[output]->SetPresence( out_vc, w->pres - 1 ); - - } else { - // No credits available, just store presence - _output_state[output]->SetPresence( out_vc, w->pres ); - } - - delete w; - - } else { - // Tail sent, none waiting => VC is idle - _output_state[output]->SetState( out_vc, EventNextVCState::idle ); - } -} - -void EventRouter::_IncomingFlits( ) -{ - Flit *f; - Buffer *cur_buf; - - tArrivalEvent *aevt; - - _arrival_pipe->WriteAll( 0 ); - - for ( int input = 0; input < _inputs; ++input ) { - if ( !_input_buffer[input].empty( ) ) { - f = _input_buffer[input].front( ); - _input_buffer[input].pop( ); - - cur_buf = _buf[input]; - int vc = f->vc; - - cur_buf->AddFlit( vc, f ); - - // Head flit arriving at idle VC - if ( !_active[input][vc] ) { - - if ( !f->head ) { - cout << "Non-head flit:" << endl; - cout << *f; - Error( "Received non-head flit at idle VC" ); - } - - const OutputSet *route_set; - int out_vc, out_port; - - cur_buf->Route( vc, _rf, this, f, input ); - route_set = cur_buf->GetRouteSet( vc ); - - if ( !route_set->GetPortVC( &out_port, &out_vc ) ) { - Error( "The event-driven router requires routing functions with a single (port,vc) output" ); - } - - cur_buf->SetOutput( vc, out_port, out_vc ); - _active[input][vc] = true; - } else { - if ( f->head ) { - cout << *f; - Error( "Received head flit at non-idle VC." ); - } - } - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Received flit at " << FullName() << ". Output port = " - << cur_buf->GetOutputPort( vc ) << ", output VC = " - << cur_buf->GetOutputVC( vc ) << endl - << *f; - } - - // In cut-through mode, only head flits generate arrivals, - // otherwise all flits generate - - if ( ( !_vct ) || ( _vct && f->head ) ) { - // Add the arrival event to a delay pipeline to - // account for routing/decoding time - - aevt = new tArrivalEvent; - - aevt->input = input; - aevt->output = cur_buf->GetOutputPort( vc ); - aevt->src_vc = f->vc; - aevt->dst_vc = cur_buf->GetOutputVC( vc ); - aevt->head = f->head; - aevt->tail = f->tail; - - //if ( f->head && f->tail ) { - // Error( "Head/tail packets not supported." ); - //} - - aevt->watch = f->watch; - aevt->id = f->id; - - _arrival_pipe->Write( aevt, input ); - - if ( aevt->watch ) { - cout << "Injected arrival event at " << FullName() - << " for flit " << aevt->id << endl; - } - } - } - } -} - -void EventRouter::_ArrivalRequests( int input ) -{ - tArrivalEvent *aevt; - - aevt = _arrival_pipe->Read( input ); - if ( aevt ) { - _arrival_queue[input].push( aevt ); - } - - if ( !_arrival_queue[input].empty( ) ) { - aevt = _arrival_queue[input].front( ); - _arrival_arbiter[aevt->output]->AddRequest( input ); - } -} - -void EventRouter::_SendTransport( int input, int output, tArrivalEvent *aevt ) -{ - // Try to send a transport event - - tTransportEvent *tevt; - - int credits; - int pres; - - credits = _output_state[output]->GetCredits( aevt->dst_vc ); - - if ( credits > 0 ) { - // Take a credit and queue a transport event - credits--; - _output_state[output]->SetCredits( aevt->dst_vc, credits ); - - tevt = new tTransportEvent; - tevt->src_vc = aevt->src_vc; - tevt->dst_vc = aevt->dst_vc; - tevt->input = input; - tevt->watch = aevt->watch; - tevt->id = aevt->id; - - _transport_queue[output].push( tevt ); - - if ( tevt->watch ) { - cout << "Injecting transport event at " << FullName() - << " for flit " << tevt->id << endl; - } - } else { - if ( aevt->watch ) { - cout << "No credits available at " << FullName() - << " for flit " << aevt->id << " storing presence." << endl; - } - - // No credits available, just store presence - pres = _output_state[output]->GetPresence( aevt->dst_vc ); - _output_state[output]->SetPresence( aevt->dst_vc, pres + 1 ); - } -} - -void EventRouter::_ArrivalArb( int output ) -{ - tArrivalEvent *aevt; - tTransportEvent *tevt; - Credit *c; - - EventNextVCState::tWaiting *w; - - int input; - int credits; - int pres; - - // Incoming credits can produce or enable - // transport events --- process them first - - if ( !_out_cred_buffer[output].empty( ) ) { - c = _out_cred_buffer[output].front( ); - _out_cred_buffer[output].pop( ); - - assert( c->vc.size() == 1 ); - int vc = *c->vc.begin(); - - EventNextVCState::eNextVCState state = - _output_state[output]->GetState( vc ); - - credits = _output_state[output]->GetCredits( vc ); - pres = _output_state[output]->GetPresence( vc ); - - if ( _vct ) { - // In cut-through mode, only head credits indicate a change in - // channel state. - - if ( c->head ) { - credits++; - _output_state[output]->SetCredits( vc, credits ); - _ProcessWaiting( output, vc ); - } - } else { - credits++; - _output_state[output]->SetCredits( vc, credits ); - - if ( c->tail ) { // tail flit -- recycle VC - if ( state != EventNextVCState::busy ) { - Error( "Received tail credit at non-busy output VC" ); - } - - _ProcessWaiting( output, vc ); - } else if ( ( state == EventNextVCState::busy ) && ( pres > 0 ) ) { - // Flit is present => generate transport event - - tevt = new tTransportEvent; - tevt->input = _output_state[output]->GetInput( vc ); - tevt->src_vc = _output_state[output]->GetInputVC( vc ); - tevt->dst_vc = vc; - tevt->watch = false; - tevt->id = -1; - - _transport_queue[output].push( tevt ); - - pres--; - credits--; - _output_state[output]->SetPresence( vc, pres ); - _output_state[output]->SetCredits( vc, credits ); - } - } - - c->Free(); - } - - // Now process arrival events - - _arrival_arbiter[output]->Arbitrate( ); - input = _arrival_arbiter[output]->Match( ); - - if ( input != -1 ) { - // Winning arrival event gets access to output - - aevt = _arrival_queue[input].front( ); - _arrival_queue[input].pop( ); - - if ( aevt->watch ) { - cout << "Processing arrival event at " << FullName() - << " for flit " << aevt->id << endl; - } - - EventNextVCState::eNextVCState state = - _output_state[output]->GetState( aevt->dst_vc ); - - if ( aevt->head ) { // Head flits - if ( state == EventNextVCState::idle ) { - // Allocate the output VC and queue a transport event - _output_state[output]->SetState( aevt->dst_vc, EventNextVCState::busy ); - _output_state[output]->SetInput( aevt->dst_vc, input ); - _output_state[output]->SetInputVC( aevt->dst_vc, aevt->src_vc ); - - _SendTransport( input, output, aevt ); - } else { - // VC busy => queue a waiting event - - w = new EventNextVCState::tWaiting; - - w->input = input; - w->vc = aevt->src_vc; - w->id = aevt->id; - w->watch = aevt->watch; - w->pres = 1; - - _output_state[output]->PushWaiting( aevt->dst_vc, w ); - } - } else { - if ( _vct ) { - Error( "Received arrival event for non-head flit in cut-through mode" ); - } - - if ( state != EventNextVCState::busy ) { - cout << "flit id = " << aevt->id << endl; - Error( "Received a body flit at a non-busy output VC" ); - } - - if ( ( !_output_state[output]->IsInputWaiting( aevt->dst_vc, input, aevt->src_vc ) ) && - ( input == _output_state[output]->GetInput( aevt->dst_vc ) ) && - ( aevt->src_vc == _output_state[output]->GetInputVC( aevt->dst_vc ) ) ) { - // Body flit part of the current active VC => queue transport event - // (the weird IsInputWaiting call handles a body flit waiting in addition - // to a head flit) - - _SendTransport( input, output, aevt ); - } else { - - // VC busy with a differnet transaction => update waiting event - _output_state[output]->IncrWaiting( aevt->dst_vc, input, aevt->src_vc ); - } - } - - delete aevt; - } -} - -void EventRouter::_TransportRequests( int output ) -{ - tTransportEvent *tevt; - - if ( !_transport_queue[output].empty( ) ) { - tevt = _transport_queue[output].front( ); - _transport_arbiter[tevt->input]->AddRequest( output ); - } -} - -void EventRouter::_TransportArb( int input ) -{ - tTransportEvent *tevt; - - int output; - Buffer *cur_buf; - Flit *f; - Credit *c; - - if ( _transport_free[input] ) { - _transport_arbiter[input]->Arbitrate( ); - output = _transport_arbiter[input]->Match( ); - } else { - output = _transport_match[input]; - } - - if ( output != -1 ) { - // This completes the match from input to output => - // one flit can be transferred - - tevt = _transport_queue[output].front( ); - - if ( tevt->watch ) { - cout << "Processing transport event at " << FullName() - << " for flit " << tevt->id << endl; - } - - cur_buf = _buf[input]; - int vc = tevt->src_vc; - - // Some sanity checking first - - if ( !_active[input][vc] ) { - Error( "Non-active VC received grant." ); - } - - if ( cur_buf->Empty( vc ) ) { - return; //Error( "Empty VC received grant." ); - } - - if ( tevt->dst_vc != cur_buf->GetOutputVC( vc ) ) { - Error( "Transport event's VC does not match input's destination VC." ); - } - - f = cur_buf->RemoveFlit( vc ); - - if ( _vct ) { - if ( f->tail ) { - _transport_free[input] = true; - _transport_match[input] = -1; - - _transport_queue[output].pop( ); - delete tevt; - - _active[input][vc] = false; - } else { - _transport_free[input] = false; - _transport_match[input] = output; - } - } else { - _transport_free[input] = true; - _transport_match[input] = -1; - - _transport_queue[output].pop( ); - delete tevt; - - if ( f->tail ) { - _active[input][vc] = false; - } - } - - c = Credit::New( ); - c->vc.insert(f->vc); - c->head = f->head; - c->tail = f->tail; - c->id = f->id; - _credit_pipe->Write( c, input ); - - if ( f->watch && c->tail ) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << FullName() << " sending tail credit back for flit " << f->id << endl; - } - - // Update and forward the flit to the crossbar - - f->hops++; - f->vc = cur_buf->GetOutputVC( vc ); - _crossbar_pipe->Write( f, output ); - - if ( f->watch ) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Forwarding flit through crossbar at " << FullName() << ":" << endl - << *f; - } - } -} - -void EventRouter::_OutputQueuing( ) -{ - Flit *f; - Credit *c; - - for ( int output = 0; output < _outputs; ++output ) { - f = _crossbar_pipe->Read( output ); - - if ( f ) { - _output_buffer[output].push( f ); - } - } - - for ( int input = 0; input < _inputs; ++input ) { - c = _credit_pipe->Read( input ); - - if ( c ) { - _in_cred_buffer[input].push( c ); - } - } -} - -void EventRouter::_SendFlits( ) -{ - for ( int output = 0; output < _outputs; ++output ) { - if ( !_output_buffer[output].empty( ) ) { - Flit *f = _output_buffer[output].front( ); - _output_buffer[output].pop( ); - _output_channels[output]->Send( f ); - } - } -} - -void EventRouter::_SendCredits( ) -{ - for ( int input = 0; input < _inputs; ++input ) { - if ( !_in_cred_buffer[input].empty( ) ) { - Credit *c = _in_cred_buffer[input].front( ); - _in_cred_buffer[input].pop( ); - _input_credits[input]->Send( c ); - } - } -} - -void EventRouter::Display( ostream & os ) const -{ - for ( int input = 0; input < _inputs; ++input ) { - _buf[input]->Display( os ); - } -} - -EventNextVCState::EventNextVCState( const Configuration& config, - Module *parent, const string& name ) : - Module( parent, name ) -{ - _buf_size = config.GetInt( "vc_buf_size" ); - _vcs = config.GetInt( "num_vcs" ); - - _credits.resize(_vcs, _buf_size); - _presence.resize(_vcs, 0); - _input.resize(_vcs); - _inputVC.resize(_vcs); - _waiting.resize(_vcs); - _state.resize(_vcs, idle); -} - -EventNextVCState::eNextVCState EventNextVCState::GetState( int vc ) const -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return _state[vc]; -} - -int EventNextVCState::GetPresence( int vc ) const -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return _presence[vc]; -} - -int EventNextVCState::GetCredits( int vc ) const -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return _credits[vc]; -} - -int EventNextVCState::GetInput( int vc ) const -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return _input[vc]; -} - -int EventNextVCState::GetInputVC( int vc ) const -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return _inputVC[vc]; -} - -bool EventNextVCState::IsWaiting( int vc ) const -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - return !_waiting[vc].empty( ); -} - -void EventNextVCState::PushWaiting( int vc, tWaiting *w ) -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - - if ( w->watch ) { - cout << FullName() << " pushing flit " << w->id - << " onto a waiting queue of length " << _waiting[vc].size( ) << endl; - } - - _waiting[vc].push_back( w ); -} - -void EventNextVCState::IncrWaiting( int vc, int w_input, int w_vc ) -{ - list<tWaiting *>::iterator match; - - // search for match - for ( match = _waiting[vc].begin( ); match != _waiting[vc].end( ); match++ ) { - if ( ( (*match)->input == w_input ) && - ( (*match)->vc == w_vc ) ) break; - } - - if ( match != _waiting[vc].end( ) ) { - (*match)->pres++; - } else { - Error( "Did not find match in IncrWaiting" ); - } -} - -bool EventNextVCState::IsInputWaiting( int vc, int w_input, int w_vc ) const -{ - list<tWaiting *>::const_iterator match; - bool r; - - // search for match - for ( match = _waiting[vc].begin( ); match != _waiting[vc].end( ); match++ ) { - if ( ( (*match)->input == w_input ) && - ( (*match)->vc == w_vc ) ) break; - } - - if ( match != _waiting[vc].end( ) ) { - r = true; - } else { - r = false; - } - - return r; -} - -EventNextVCState::tWaiting *EventNextVCState::PopWaiting( int vc ) -{ - tWaiting *w; - - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - - w = _waiting[vc].front( ); - _waiting[vc].pop_front( ); - - return w; -} - -void EventNextVCState::SetState( int vc, eNextVCState state ) -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - _state[vc] = state; -} - -void EventNextVCState::SetCredits( int vc, int value ) -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - _credits[vc] = value; -} - -void EventNextVCState::SetPresence( int vc, int value ) -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - _presence[vc] = value; -} - -void EventNextVCState::SetInput( int vc, int input ) -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - _input[vc] = input; -} - -void EventNextVCState::SetInputVC( int vc, int in_vc ) -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - _inputVC[vc] = in_vc; -} diff --git a/src/intersim2/.svn/pristine/d0/d0f90a9d59a9b0c3aa0cf7a6059e041d762561d1.svn-base b/src/intersim2/.svn/pristine/d0/d0f90a9d59a9b0c3aa0cf7a6059e041d762561d1.svn-base deleted file mode 100644 index 3e4549a..0000000 --- a/src/intersim2/.svn/pristine/d0/d0f90a9d59a9b0c3aa0cf7a6059e041d762561d1.svn-base +++ /dev/null @@ -1,47 +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. -*/ - -#ifndef _PIM_HPP_ -#define _PIM_HPP_ - -#include <vector> - -#include "allocator.hpp" - -class PIM : public DenseAllocator { - int _PIM_iter; - -public: - PIM( Module *parent, const string& name, - int inputs, int outputs, int iters ); - - ~PIM( ); - - void Allocate( ); -}; - -#endif diff --git a/src/intersim2/.svn/pristine/d3/d37925d1e5c51c8adc54f266e526d96fd3468e65.svn-base b/src/intersim2/.svn/pristine/d3/d37925d1e5c51c8adc54f266e526d96fd3468e65.svn-base deleted file mode 100644 index 6fc6ffc..0000000 --- a/src/intersim2/.svn/pristine/d3/d37925d1e5c51c8adc54f266e526d96fd3468e65.svn-base +++ /dev/null @@ -1,86 +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. -*/ - -// ---------------------------------------------------------------------- -// -// Arbiter: Base class for Matrix and Round Robin Arbiter -// -// ---------------------------------------------------------------------- - -#ifndef _ARBITER_HPP_ -#define _ARBITER_HPP_ - -#include <vector> - -#include "module.hpp" - -class Arbiter : public Module { - -protected: - - typedef struct { - bool valid ; - int id ; - int pri ; - } entry_t ; - - vector<entry_t> _request ; - int _size ; - - int _selected ; - int _highest_pri; - int _best_input; - -public: - int _num_reqs ; - // Constructors - Arbiter( Module *parent, const string &name, int size ) ; - - // Print priority matrix to standard output - virtual void PrintState() const = 0 ; - - // Register request with arbiter - virtual void AddRequest( int input, int id, int pri ) ; - - // Update priority matrix based on last aribtration result - virtual void UpdateState() = 0 ; - - // Arbitrate amongst requests. Returns winning input and - // updates pointers to metadata when valid pointers are passed - virtual int Arbitrate( int* id = 0, int* pri = 0 ) ; - - virtual void Clear(); - - inline int LastWinner() const { - return _selected; - } - - static Arbiter *NewArbiter( Module *parent, const string &name, - const string &arb_type, int size ); -} ; - -#endif diff --git a/src/intersim2/.svn/pristine/d6/d61d8cfbf8e0ae5784d8d94c0bb085d6d1e7b214.svn-base b/src/intersim2/.svn/pristine/d6/d61d8cfbf8e0ae5784d8d94c0bb085d6d1e7b214.svn-base deleted file mode 100644 index 6d9a906..0000000 --- a/src/intersim2/.svn/pristine/d6/d61d8cfbf8e0ae5784d8d94c0bb085d6d1e7b214.svn-base +++ /dev/null @@ -1,60 +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. -*/ - -#ifndef _CREDIT_HPP_ -#define _CREDIT_HPP_ - -#include <set> -#include <stack> - -class Credit { - -public: - - set<int> vc; - - // these are only used by the event router - bool head, tail; - int id; - - void Reset(); - - static Credit * New(); - void Free(); - static void FreeAll(); - static int OutStanding(); -private: - - static stack<Credit *> _all; - static stack<Credit *> _free; - - Credit(); - ~Credit() {} - -}; - -#endif diff --git a/src/intersim2/.svn/pristine/d8/d829c556dee3dc27d19528e00200847c1b338e0e.svn-base b/src/intersim2/.svn/pristine/d8/d829c556dee3dc27d19528e00200847c1b338e0e.svn-base deleted file mode 100644 index 377d467..0000000 --- a/src/intersim2/.svn/pristine/d8/d829c556dee3dc27d19528e00200847c1b338e0e.svn-base +++ /dev/null @@ -1,37 +0,0 @@ -%{ - -int yylex(void); -void yyerror(char * msg); -void config_assign_string( char const * field, char const * value ); -void config_assign_int( char const * field, int value ); -void config_assign_float( char const * field, double value ); - -#ifdef _WIN32 -#pragma warning ( disable : 4102 ) -#pragma warning ( disable : 4244 ) -#endif - -%} - -%union { - char *name; - int num; - double fnum; -} - -%token <name> STR -%token <num> NUM -%token <fnum> FNUM - -%% - -commands : commands command - | command -; - -command : STR '=' STR ';' { config_assign_string( $1, $3 ); free( $1 ); free( $3 ); } - | STR '=' NUM ';' { config_assign_int( $1, $3 ); free( $1 ); } - | STR '=' FNUM ';' { config_assign_float( $1, $3 ); free( $1 ); } -; - -%% diff --git a/src/intersim2/.svn/pristine/da/dace18d8332403831e17e47c9f2dac7ee20fe786.svn-base b/src/intersim2/.svn/pristine/da/dace18d8332403831e17e47c9f2dac7ee20fe786.svn-base deleted file mode 100644 index eba0184..0000000 --- a/src/intersim2/.svn/pristine/da/dace18d8332403831e17e47c9f2dac7ee20fe786.svn-base +++ /dev/null @@ -1,125 +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. -*/ - -////////////////////////////////////////////////////////////////////// -// -// File Name: channel.hpp -// -// The Channel models a generic channel with a multi-cycle -// transmission delay. The channel latency can be specified as -// an integer number of simulator cycles. -// -///// -#ifndef _CHANNEL_HPP -#define _CHANNEL_HPP - -#include <queue> -#include <cassert> - -#include "globals.hpp" -#include "module.hpp" -#include "timed_module.hpp" - -using namespace std; - -template<typename T> -class Channel : public TimedModule { -public: - Channel(Module * parent, string const & name); - virtual ~Channel() {} - - // Physical Parameters - void SetLatency(int cycles); - int GetLatency() const { return _delay ; } - - // Send data - virtual void Send(T * data); - - // Receive data - virtual T * Receive(); - - virtual void ReadInputs(); - virtual void Evaluate() {} - virtual void WriteOutputs(); - -protected: - int _delay; - T * _input; - T * _output; - queue<pair<int, T *> > _wait_queue; - -}; - -template<typename T> -Channel<T>::Channel(Module * parent, string const & name) - : TimedModule(parent, name), _delay(1), _input(0), _output(0) { -} - -template<typename T> -void Channel<T>::SetLatency(int cycles) { - if(cycles <= 0) { - Error("Channel must have positive delay."); - } - _delay = cycles ; -} - -template<typename T> -void Channel<T>::Send(T * data) { - _input = data; -} - -template<typename T> -T * Channel<T>::Receive() { - return _output; -} - -template<typename T> -void Channel<T>::ReadInputs() { - if(_input) { - _wait_queue.push(make_pair(GetSimTime() + _delay - 1, _input)); - _input = 0; - } -} - -template<typename T> -void Channel<T>::WriteOutputs() { - _output = 0; - if(_wait_queue.empty()) { - return; - } - pair<int, T *> const & item = _wait_queue.front(); - int const & time = item.first; - if(GetSimTime() < time) { - return; - } - assert(GetSimTime() == time); - _output = item.second; - assert(_output); - _wait_queue.pop(); -} - -#endif 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 ); -} diff --git a/src/intersim2/.svn/pristine/e0/e0e6b10f519b612fdd24fcc64ea62b4d5fdf89fc.svn-base b/src/intersim2/.svn/pristine/e0/e0e6b10f519b612fdd24fcc64ea62b4d5fdf89fc.svn-base deleted file mode 100644 index 02228ef..0000000 --- a/src/intersim2/.svn/pristine/e0/e0e6b10f519b612fdd24fcc64ea62b4d5fdf89fc.svn-base +++ /dev/null @@ -1,74 +0,0 @@ -/* - 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. -*/ - - - -#ifndef _DragonFly_HPP_ -#define _DragonFly_HPP_ - -#include "network.hpp" -#include "routefunc.hpp" - -class DragonFlyNew : public Network { - - int _m; - int _n; - int _r; - int _k; - int _p, _a, _g; - int _radix; - int _net_size; - int _stageout; - int _numinput; - int _stages; - int _num_of_switch; - int _grp_num_routers; - int _grp_num_nodes; - - - void _ComputeSize( const Configuration &config ); - void _BuildNet( const Configuration &config ); - - - -public: - DragonFlyNew( const Configuration &config, const string & name ); - - int GetN( ) const; - int GetK( ) const; - - double Capacity( ) const; - static void RegisterRoutingFunctions(); - void InsertRandomFaults( const Configuration &config ); - -}; -int dragonfly_port(int rID, int source, int dest); - -void ugal_dragonflynew( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); -void min_dragonflynew( const Router *r, const Flit *f, int in_channel, - OutputSet *outputs, bool inject ); - -#endif diff --git a/src/intersim2/.svn/pristine/e2/e216ca41a2789704029b85d462988590d43813f3.svn-base b/src/intersim2/.svn/pristine/e2/e216ca41a2789704029b85d462988590d43813f3.svn-base deleted file mode 100644 index c27740f..0000000 --- a/src/intersim2/.svn/pristine/e2/e216ca41a2789704029b85d462988590d43813f3.svn-base +++ /dev/null @@ -1,108 +0,0 @@ -/* This program by D E Knuth is in the public domain and freely copyable. - * It is explained in Seminumerical Algorithms, 3rd edition, Section 3.6 - * (or in the errata to the 2nd edition --- see - * http://www-cs-faculty.stanford.edu/~knuth/taocp.html - * in the changes to Volume 2 on pages 171 and following). */ - -/* N.B. The MODIFICATIONS introduced in the 9th printing (2002) are - included here; there's no backwards compatibility with the original. */ - -/* This version also adopts Brendan McKay's suggestion to - accommodate naive users who forget to call ran_start(seed). */ - -/* If you find any bugs, please report them immediately to - * (and you will be rewarded if the bug is genuine). Thanks! */ - -/************ see the book for explanations and caveats! *******************/ -/************ in particular, you need two's complement arithmetic **********/ - -#define KK 100 /* the long lag */ -#define LL 37 /* the short lag */ -#define MM (1L<<30) /* the modulus */ -#define mod_diff(x,y) (((x)-(y))&(MM-1)) /* subtraction mod MM */ - -long ran_x[KK]; /* the generator state */ - -#ifdef __STDC__ -void ran_array(long aa[],int n) -#else -void ran_array(aa,n) /* put n new random numbers in aa */ - long *aa; /* destination */ - int n; /* array length (must be at least KK) */ -#endif -{ - register int i,j; - for (j=0;j<KK;j++) aa[j]=ran_x[j]; - for (;j<n;j++) aa[j]=mod_diff(aa[j-KK],aa[j-LL]); - for (i=0;i<LL;i++,j++) ran_x[i]=mod_diff(aa[j-KK],aa[j-LL]); - for (;i<KK;i++,j++) ran_x[i]=mod_diff(aa[j-KK],ran_x[i-LL]); -} - -/* the following routines are from exercise 3.6--15 */ -/* after calling ran_start, get new randoms by, e.g., "x=ran_arr_next()" */ - -#define QUALITY 1009 /* recommended quality level for high-res use */ -long ran_arr_buf[QUALITY]; -long ran_arr_dummy=-1, ran_arr_started=-1; -long *ran_arr_ptr=&ran_arr_dummy; /* the next random number, or -1 */ - -#define TT 70 /* guaranteed separation between streams */ -#define is_odd(x) ((x)&1) /* units bit of x */ - -#ifdef __STDC__ -void ran_start(long seed) -#else -void ran_start(seed) /* do this before using ran_array */ - long seed; /* selector for different streams */ -#endif -{ - register int t,j; - long x[KK+KK-1]; /* the preparation buffer */ - register long ss=(seed+2)&(MM-2); - for (j=0;j<KK;j++) { - x[j]=ss; /* bootstrap the buffer */ - ss<<=1; if (ss>=MM) ss-=MM-2; /* cyclic shift 29 bits */ - } - x[1]++; /* make x[1] (and only x[1]) odd */ - for (ss=seed&(MM-1),t=TT-1; t; ) { - for (j=KK-1;j>0;j--) x[j+j]=x[j], x[j+j-1]=0; /* "square" */ - for (j=KK+KK-2;j>=KK;j--) - x[j-(KK-LL)]=mod_diff(x[j-(KK-LL)],x[j]), - x[j-KK]=mod_diff(x[j-KK],x[j]); - if (is_odd(ss)) { /* "multiply by z" */ - for (j=KK;j>0;j--) x[j]=x[j-1]; - x[0]=x[KK]; /* shift the buffer cyclically */ - x[LL]=mod_diff(x[LL],x[KK]); - } - if (ss) ss>>=1; else t--; - } - for (j=0;j<LL;j++) ran_x[j+KK-LL]=x[j]; - for (;j<KK;j++) ran_x[j-LL]=x[j]; - for (j=0;j<10;j++) ran_array(x,KK+KK-1); /* warm things up */ - ran_arr_ptr=&ran_arr_started; -} - -#define ran_arr_next() (*ran_arr_ptr>=0? *ran_arr_ptr++: ran_arr_cycle()) -long ran_arr_cycle() -{ - if (ran_arr_ptr==&ran_arr_dummy) - ran_start(314159L); /* the user forgot to initialize */ - ran_array(ran_arr_buf,QUALITY); - ran_arr_buf[KK]=-1; - ran_arr_ptr=ran_arr_buf+1; - return ran_arr_buf[0]; -} - -#include <stdio.h> -int main() -{ - register int m; long a[2009]; - ran_start(310952L); - for (m=0;m<=2009;m++) ran_array(a,1009); - printf("%ld\n", a[0]); /* 995235265 */ - ran_start(310952L); - for (m=0;m<=1009;m++) ran_array(a,2009); - printf("%ld\n", a[0]); /* 995235265 */ - return 0; -} diff --git a/src/intersim2/.svn/pristine/e3/e3245c11796bcda90ba6909bb34dced14101b2c3.svn-base b/src/intersim2/.svn/pristine/e3/e3245c11796bcda90ba6909bb34dced14101b2c3.svn-base deleted file mode 100644 index e6f382c..0000000 --- a/src/intersim2/.svn/pristine/e3/e3245c11796bcda90ba6909bb34dced14101b2c3.svn-base +++ /dev/null @@ -1,346 +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. -*/ - -/*booksim_config.cpp - * - *Contains all the configurable parameters in a network - * - */ - - -#include "booksim.hpp" -#include "booksim_config.hpp" - -BookSimConfig::BookSimConfig( ) -{ - //======================================================== - // Network options - //======================================================== - - // Channel length listing file - AddStrField( "channel_file", "" ) ; - - // Physical sub-networks - _int_map["subnets"] = 1; - - //==== Topology options ======================= - AddStrField( "topology", "torus" ); - _int_map["k"] = 8; //network radix - _int_map["n"] = 2; //network dimension - _int_map["c"] = 1; //concentration - AddStrField( "routing_function", "none" ); - - //simulator tries to correclty adjust latency for node/router placement - _int_map["use_noc_latency"] = 1; - - - //used for noc latency calcualtion for network with concentration - _int_map["x"] = 8; //number of routers in X - _int_map["y"] = 8; //number of routers in Y - _int_map["xr"] = 1; //number of nodes per router in X only if c>1 - _int_map["yr"] = 1; //number of nodes per router in Y only if c>1 - - - _int_map["link_failures"] = 0; //legacy - _int_map["fail_seed"] = 0; //legacy - - //==== Single-node options =============================== - - _int_map["in_ports"] = 5; - _int_map["out_ports"] = 5; - - //======================================================== - // Router options - //======================================================== - - //==== General options =================================== - - AddStrField( "router", "iq" ); - - _int_map["output_delay"] = 0; - _int_map["credit_delay"] = 0; - _float_map["internal_speedup"] = 1.0; - - //with switch speedup flits requires otuput buffering - //full output buffer will cancel switch allocation requests - //default setting is unlimited - _int_map["output_buffer_size"] = -1; - - // enable next-hop-output queueing - _int_map["noq"] = 0; - - //==== Input-queued ====================================== - - // Control of virtual channel speculation - _int_map["speculative"] = 0 ; - _int_map["spec_check_elig"] = 1 ; - _int_map["spec_check_cred"] = 1 ; - _int_map["spec_mask_by_reqs"] = 0 ; - AddStrField("spec_sw_allocator", "prio"); - - _int_map["num_vcs"] = 16; - _int_map["vc_buf_size"] = 8; //per vc buffer size - _int_map["buf_size"] = -1; //shared buffer size - AddStrField("buffer_policy", "private"); //buffer sharing policy - - _int_map["private_bufs"] = -1; - _int_map["private_buf_size"] = 1; - AddStrField("private_buf_size", ""); - _int_map["private_buf_start_vc"] = -1; - AddStrField("private_buf_start_vc", ""); - _int_map["private_buf_end_vc"] = -1; - AddStrField("private_buf_end_vc", ""); - - _int_map["max_held_slots"] = -1; - - _int_map["feedback_aging_scale"] = 1; - _int_map["feedback_offset"] = 0; - - _int_map["wait_for_tail_credit"] = 0; // reallocate a VC before a tail credit? - _int_map["vc_busy_when_full"] = 0; // mark VCs as in use when they have no credit available - _int_map["vc_prioritize_empty"] = 0; // prioritize empty VCs over non-empty ones in VC allocation - _int_map["vc_priority_donation"] = 0; // allow high-priority flits to donate their priority to low-priority that they are queued up behind - _int_map["vc_shuffle_requests"] = 0; // rearrange VC allocator requests to avoid unfairness - - _int_map["hold_switch_for_packet"] = 0; // hold a switch config for the entire packet - - _int_map["input_speedup"] = 1; // expansion of input ports into crossbar - _int_map["output_speedup"] = 1; // expansion of output ports into crossbar - - _int_map["routing_delay"] = 1; - _int_map["vc_alloc_delay"] = 1; - _int_map["sw_alloc_delay"] = 1; - _int_map["st_prepare_delay"] = 0; - _int_map["st_final_delay"] = 1; - - //==== Event-driven ===================================== - - _int_map["vct"] = 0; - - //==== Allocators ======================================== - - AddStrField( "vc_allocator", "islip" ); - AddStrField( "sw_allocator", "islip" ); - - AddStrField( "arb_type", "round_robin" ); - - _int_map["alloc_iters"] = 1; - - //==== Traffic ======================================== - - _int_map["classes"] = 1; - - AddStrField( "traffic", "uniform" ); - - _int_map["class_priority"] = 0; - AddStrField("class_priority", ""); // workaraound to allow for vector specification - - _int_map["perm_seed"] = 0; // seed value for random permuation trafficpattern generator - - _float_map["injection_rate"] = 0.1; - AddStrField("injection_rate", ""); // workaraound to allow for vector specification - - _int_map["injection_rate_uses_flits"] = 0; - - // number of flits per packet - _int_map["packet_size"] = 1; - AddStrField("packet_size", ""); // workaraound to allow for vector specification - - // if multiple values are specified per class, set probabilities for each - _int_map["packet_size_rate"] = 1; - AddStrField("packet_size_rate", ""); // workaraound to allow for vector specification - - AddStrField( "injection_process", "bernoulli" ); - - _float_map["burst_alpha"] = 0.5; // burst interval - _float_map["burst_beta"] = 0.5; // burst length - _float_map["burst_r1"] = -1.0; // burst rate - - AddStrField( "priority", "none" ); // message priorities - - _int_map["batch_size"] = 1000; - _int_map["batch_count"] = 1; - _int_map["max_outstanding_requests"] = 0; // 0 = unlimited - - // Use read/write request reply scheme - _int_map["use_read_write"] = 0; - AddStrField("use_read_write", ""); // workaraound to allow for vector specification - _float_map["write_fraction"] = 0.5; - AddStrField("write_fraction", ""); - - // Control assignment of packets to VCs - _int_map["read_request_begin_vc"] = 0; - _int_map["read_request_end_vc"] = 5; - _int_map["write_request_begin_vc"] = 2; - _int_map["write_request_end_vc"] = 7; - _int_map["read_reply_begin_vc"] = 8; - _int_map["read_reply_end_vc"] = 13; - _int_map["write_reply_begin_vc"] = 10; - _int_map["write_reply_end_vc"] = 15; - - // Control Injection of Packets into Replicated Networks - _int_map["read_request_subnet"] = 0; - _int_map["read_reply_subnet"] = 0; - _int_map["write_request_subnet"] = 0; - _int_map["write_reply_subnet"] = 0; - - // Set packet length in flits - _int_map["read_request_size"] = 1; - AddStrField("read_request_size", ""); // workaraound to allow for vector specification - _int_map["write_request_size"] = 1; - AddStrField("write_request_size", ""); // workaraound to allow for vector specification - _int_map["read_reply_size"] = 1; - AddStrField("read_reply_size", ""); // workaraound to allow for vector specification - _int_map["write_reply_size"] = 1; - AddStrField("write_reply_size", ""); // workaraound to allow for vector specification - - //==== Simulation parameters ========================== - - // types: - // latency - average + latency distribution for a particular injection rate - // throughput - sustained throughput for a particular injection rate - - AddStrField( "sim_type", "latency" ); - - _int_map["warmup_periods"] = 3; // number of samples periods to "warm-up" the simulation - - _int_map["sample_period"] = 1000; // how long between measurements - _int_map["max_samples"] = 10; // maximum number of sample periods in a simulation - - // whether or not to measure statistics for a given traffic class - _int_map["measure_stats"] = 1; - AddStrField("measure_stats", ""); // workaround to allow for vector specification - //whether to enable per pair statistics, caution N^2 memory usage - _int_map["pair_stats"] = 0; - - // if avg. latency exceeds the threshold, assume unstable - _float_map["latency_thres"] = 500.0; - AddStrField("latency_thres", ""); // workaround to allow for vector specification - - // consider warmed up once relative change in latency / throughput between successive iterations is smaller than this - _float_map["warmup_thres"] = 0.05; - AddStrField("warmup_thres", ""); // workaround to allow for vector specification - _float_map["acc_warmup_thres"] = 0.05; - AddStrField("acc_warmup_thres", ""); // workaround to allow for vector specification - - // consider converged once relative change in latency / throughput between successive iterations is smaller than this - _float_map["stopping_thres"] = 0.05; - AddStrField("stopping_thres", ""); // workaround to allow for vector specification - _float_map["acc_stopping_thres"] = 0.05; - AddStrField("acc_stopping_thres", ""); // workaround to allow for vector specification - - _int_map["sim_count"] = 1; // number of simulations to perform - - - _int_map["include_queuing"] =1; // non-zero includes source queuing latency - - // _int_map["reorder"] = 0; // know what you're doing - - //_int_map["flit_timing"] = 0; // know what you're doing - //_int_map["split_packets"] = 0; // know what you're doing - - _int_map["seed"] = 0; //random seed for simulation, e.g. traffic - - _int_map["print_activity"] = 0; - - _int_map["print_csv_results"] = 0; - - _int_map["deadlock_warn_timeout"] = 256; - - _int_map["viewer_trace"] = 0; - - AddStrField("watch_file", ""); - - AddStrField("watch_flits", ""); - AddStrField("watch_packets", ""); - AddStrField("watch_transactions", ""); - - AddStrField("watch_out", ""); - - AddStrField("stats_out", ""); - -#ifdef TRACK_FLOWS - AddStrField("injected_flits_out", ""); - AddStrField("received_flits_out", ""); - AddStrField("stored_flits_out", ""); - AddStrField("sent_flits_out", ""); - AddStrField("outstanding_credits_out", ""); - AddStrField("ejected_flits_out", ""); - AddStrField("active_packets_out", ""); -#endif - -#ifdef TRACK_CREDITS - AddStrField("used_credits_out", ""); - AddStrField("free_credits_out", ""); - AddStrField("max_credits_out", ""); -#endif - - // batch only -- packet sequence numbers - AddStrField("sent_packets_out", ""); - - //==================Power model params===================== - _int_map["sim_power"] = 0; - AddStrField("power_output_file","pwr_tmp"); - AddStrField("tech_file", ""); - _int_map["channel_width"] = 128; - _int_map["channel_sweep"] = 0; - - //==================Network file=========================== - AddStrField("network_file",""); -} - - - -PowerConfig::PowerConfig( ) -{ - - _int_map["H_INVD2"] = 0; - _int_map["W_INVD2"] = 0; - _int_map["H_DFQD1"] = 0; - _int_map["W_DFQD1"] = 0; - _int_map["H_ND2D1"] = 0; - _int_map["W_ND2D1"] = 0; - _int_map["H_SRAM"] = 0; - _int_map["W_SRAM"] = 0; - _float_map["Vdd"] = 0; - _float_map["R"] = 0; - _float_map["IoffSRAM"] = 0; - _float_map["IoffP"] = 0; - _float_map["IoffN"] = 0; - _float_map["Cg_pwr"] = 0; - _float_map["Cd_pwr"] = 0; - _float_map["Cgdl"] = 0; - _float_map["Cg"] = 0; - _float_map["Cd"] = 0; - _float_map["LAMBDA"] = 0; - _float_map["MetalPitch"] = 0; - _float_map["Rw"] = 0; - _float_map["Cw_gnd"] = 0; - _float_map["Cw_cpl"] = 0; - _float_map["wire_length"] = 0; - -} diff --git a/src/intersim2/.svn/pristine/e6/e64fcd97a677ff77ec1692273171f513fe794507.svn-base b/src/intersim2/.svn/pristine/e6/e64fcd97a677ff77ec1692273171f513fe794507.svn-base deleted file mode 100644 index 265f6cd..0000000 --- a/src/intersim2/.svn/pristine/e6/e64fcd97a677ff77ec1692273171f513fe794507.svn-base +++ /dev/null @@ -1,132 +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. -*/ - -#ifndef _CHAOS_ROUTER_HPP_ -#define _CHAOS_ROUTER_HPP_ - -#include <string> -#include <queue> -#include <vector> - -#include "module.hpp" -#include "router.hpp" -#include "allocator.hpp" -#include "routefunc.hpp" -#include "outputset.hpp" -#include "buffer_state.hpp" -#include "pipefifo.hpp" -#include "vc.hpp" - -class ChaosRouter : public Router { - - tRoutingFunction _rf; - - vector<OutputSet*> _input_route; - vector<OutputSet*> _mq_route; - - enum eQState { - empty, // input avail - filling, // >**H ready to send - full, // T****H ready to send - leaving, // T***> input avail - cut_through, // >***> - shared // >**HT**> - }; - - PipelineFIFO<Flit> *_crossbar_pipe; - - int _multi_queue_size; - int _buffer_size; - - vector<queue<Flit *> > _input_frame; - vector<queue<Flit *> > _output_frame; - vector<queue<Flit *> > _multi_queue; - - vector<int> _next_queue_cnt; - - vector<queue<Credit *> > _credit_queue; - - vector<eQState> _input_state; - vector<eQState> _multi_state; - - vector<int> _input_output_match; - vector<int> _input_mq_match; - vector<int> _multi_match; - - vector<int> _mq_age; - - vector<bool> _output_matched; - vector<bool> _mq_matched; - - int _cur_channel; - int _read_stall; - - bool _IsInjectionChan( int chan ) const; - bool _IsEjectionChan( int chan ) const; - - bool _InputReady( int input ) const; - bool _OutputFull( int out ) const; - bool _OutputAvail( int out ) const; - bool _MultiQueueFull( int mq ) const; - - int _InputForOutput( int output ) const; - int _MultiQueueForOutput( int output ) const; - int _FindAvailMultiQueue( ) const; - - void _NextInterestingChannel( ); - void _OutputAdvance( ); - void _SendFlits( ); - void _SendCredits( ); - - virtual void _InternalStep( ); - -public: - ChaosRouter( const Configuration& config, - Module *parent, const string & name, int id, - int inputs, int outputs ); - - virtual ~ChaosRouter( ); - - virtual void ReadInputs( ); - virtual void WriteOutputs( ); - - virtual int GetUsedCredit(int out) const {return 0;} - virtual int GetBufferOccupancy(int i) const {return 0;} - -#ifdef TRACK_BUFFERS - virtual int GetUsedCreditForClass(int output, int cl) const {return 0;} - virtual int GetBufferOccupancyForClass(int input, int cl) const {return 0;} -#endif - - virtual vector<int> UsedCredits() const { return vector<int>(); } - virtual vector<int> FreeCredits() const { return vector<int>(); } - virtual vector<int> MaxCredits() const { return vector<int>(); } - - void Display( ostream & os = cout ) const; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/eb/ebec0a8c0098e95bd530e52b0baed6d9a60a33c1.svn-base b/src/intersim2/.svn/pristine/eb/ebec0a8c0098e95bd530e52b0baed6d9a60a33c1.svn-base deleted file mode 100644 index 9da2282..0000000 --- a/src/intersim2/.svn/pristine/eb/ebec0a8c0098e95bd530e52b0baed6d9a60a33c1.svn-base +++ /dev/null @@ -1,190 +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. -*/ - -#include <iostream> -#include <vector> -#include <cassert> -#include <limits> -#include "random_utils.hpp" -#include "injection.hpp" - -using namespace std; - -InjectionProcess::InjectionProcess(int nodes, double rate) - : _nodes(nodes), _rate(rate) -{ - if(nodes <= 0) { - cout << "Error: Number of nodes must be greater than zero." << endl; - exit(-1); - } - if((rate < 0.0) || (rate > 1.0)) { - cout << "Error: Injection process must have load between 0.0 and 1.0." - << endl; - exit(-1); - } -} - -void InjectionProcess::reset() -{ - -} - -InjectionProcess * InjectionProcess::New(string const & inject, int nodes, - double load, - Configuration const * const config) -{ - string process_name; - string param_str; - size_t left = inject.find_first_of('('); - if(left == string::npos) { - process_name = inject; - } else { - process_name = inject.substr(0, left); - size_t right = inject.find_last_of(')'); - if(right == string::npos) { - param_str = inject.substr(left+1); - } else { - param_str = inject.substr(left+1, right-left-1); - } - } - vector<string> params = tokenize_str(param_str); - - InjectionProcess * result = NULL; - if(process_name == "bernoulli") { - result = new BernoulliInjectionProcess(nodes, load); - } else if(process_name == "on_off") { - bool missing_params = false; - double alpha = numeric_limits<double>::quiet_NaN(); - if(params.size() < 1) { - if(config) { - alpha = config->GetFloat("burst_alpha"); - } else { - missing_params = true; - } - } else { - alpha = atof(params[0].c_str()); - } - double beta = numeric_limits<double>::quiet_NaN(); - if(params.size() < 2) { - if(config) { - beta = config->GetFloat("burst_beta"); - } else { - missing_params = true; - } - } else { - beta = atof(params[1].c_str()); - } - double r1 = numeric_limits<double>::quiet_NaN(); - if(params.size() < 3) { - r1 = config ? config->GetFloat("burst_r1") : -1.0; - } else { - r1 = atof(params[2].c_str()); - } - if(missing_params) { - cout << "Missing parameters for injection process: " << inject << endl; - exit(-1); - } - if((alpha < 0.0 && beta < 0.0) || - (alpha < 0.0 && r1 < 0.0) || - (beta < 0.0 && r1 < 0.0) || - (alpha >= 0.0 && beta >= 0.0 && r1 >= 0.0)) { - cout << "Invalid parameters for injection process: " << inject << endl; - exit(-1); - } - vector<int> initial(nodes); - if(params.size() > 3) { - initial = tokenize_int(params[2]); - initial.resize(nodes, initial.back()); - } else { - for(int n = 0; n < nodes; ++n) { - initial[n] = RandomInt(1); - } - } - result = new OnOffInjectionProcess(nodes, load, alpha, beta, r1, initial); - } else { - cout << "Invalid injection process: " << inject << endl; - exit(-1); - } - return result; -} - -//============================================================= - -BernoulliInjectionProcess::BernoulliInjectionProcess(int nodes, double rate) - : InjectionProcess(nodes, rate) -{ - -} - -bool BernoulliInjectionProcess::test(int source) -{ - assert((source >= 0) && (source < _nodes)); - return (RandomFloat() < _rate); -} - -//============================================================= - -OnOffInjectionProcess::OnOffInjectionProcess(int nodes, double rate, - double alpha, double beta, - double r1, vector<int> initial) - : InjectionProcess(nodes, rate), - _alpha(alpha), _beta(beta), _r1(r1), _initial(initial) -{ - assert(alpha <= 1.0); - assert(beta <= 1.0); - assert(r1 <= 1.0); - if(alpha < 0.0) { - assert(beta >= 0.0); - assert(r1 >= 0.0); - _alpha = beta * rate / (r1 - rate); - } else if(beta < 0.0) { - assert(alpha >= 0.0); - assert(r1 >= 0.0); - _beta = alpha * (r1 - rate) / rate; - } else { - assert(r1 < 0.0); - _r1 = rate * (alpha + beta) / alpha; - } - reset(); -} - -void OnOffInjectionProcess::reset() -{ - _state = _initial; -} - -bool OnOffInjectionProcess::test(int source) -{ - assert((source >= 0) && (source < _nodes)); - - // advance state - _state[source] = - _state[source] ? (RandomFloat() >= _beta) : (RandomFloat() < _alpha); - - // generate packet - return _state[source] && (RandomFloat() < _r1); -} diff --git a/src/intersim2/.svn/pristine/ec/ec23715e6e01d44320732e4a8fc186d6b209a3bb.svn-base b/src/intersim2/.svn/pristine/ec/ec23715e6e01d44320732e4a8fc186d6b209a3bb.svn-base deleted file mode 100644 index 8a9833d..0000000 --- a/src/intersim2/.svn/pristine/ec/ec23715e6e01d44320732e4a8fc186d6b209a3bb.svn-base +++ /dev/null @@ -1,120 +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. -*/ - -#include "booksim.hpp" -#include <iostream> - -#include "pim.hpp" -#include "random_utils.hpp" - -//#define DEBUG_PIM - -PIM::PIM( Module *parent, const string& name, - int inputs, int outputs, int iters ) : - DenseAllocator( parent, name, inputs, outputs ), - _PIM_iter(iters) -{ -} - -PIM::~PIM( ) -{ -} - -void PIM::Allocate( ) -{ - int input; - int output; - - int input_offset; - int output_offset; - - for ( int iter = 0; iter < _PIM_iter; ++iter ) { - // Grant phase --- outputs randomly choose - // between one of their requests - - vector<int> grants(_outputs, -1); - - for ( output = 0; output < _outputs; ++output ) { - - // A random arbiter between input requests - input_offset = RandomInt( _inputs - 1 ); - - for ( int i = 0; i < _inputs; ++i ) { - input = ( i + input_offset ) % _inputs; - - if ( ( _request[input][output].label != -1 ) && - ( _inmatch[input] == -1 ) && - ( _outmatch[output] == -1 ) ) { - - // Grant - grants[output] = input; - break; - } - } - } - - // Accept phase -- inputs randomly choose - // between input_speedup of their grants - - for ( input = 0; input < _inputs; ++input ) { - - // A random arbiter between output grants - output_offset = RandomInt( _outputs - 1 ); - - for ( int o = 0; o < _outputs; ++o ) { - output = ( o + output_offset ) % _outputs; - - if ( grants[output] == input ) { - - // Accept - _inmatch[input] = output; - _outmatch[output] = input; - - break; - } - } - } - } - -#ifdef DEBUG_PIM - if ( _outputs == 8 ) { - cout << "input match: " << endl; - for ( int i = 0; i < _inputs; ++i ) { - cout << " from " << i << " to " << _inmatch[i] << endl; - } - cout << endl; - } - - cout << "output match: "; - for ( int j = 0; j < _outputs; ++j ) { - cout << _outmatch[j] << " "; - } - cout << endl; -#endif -} - - diff --git a/src/intersim2/.svn/pristine/ef/ef53e3bc23eac89edf00c7903de88ebb2f4084b6.svn-base b/src/intersim2/.svn/pristine/ef/ef53e3bc23eac89edf00c7903de88ebb2f4084b6.svn-base deleted file mode 100644 index b4202ff..0000000 --- a/src/intersim2/.svn/pristine/ef/ef53e3bc23eac89edf00c7903de88ebb2f4084b6.svn-base +++ /dev/null @@ -1,76 +0,0 @@ -// $Id: dragonflyconfig 3555 2011-05-16 23:37:55Z dub $ - -// 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. - - -hold_switch_for_packet=1; - -vc_buf_size = 16; - - -wait_for_tail_credit = 0; - -// -// Router architecture -// -vc_allocator = separable_input_first; -sw_allocator = separable_input_first; -alloc_iters = 1; - -credit_delay = 2; -routing_delay = 0; -vc_alloc_delay = 1; -sw_alloc_delay = 1; -st_final_delay = 1; - -input_speedup = 1; -output_speedup = 1; -internal_speedup = 1.0; - - -warmup_periods = 3; -sim_count = 1; - -sample_period = 10000; - - - -routing_function = nca; -num_vcs = 4; - -priority = none; -traffic = uniform; - -injection_rate = 0.6; -packet_size = 1; -injection_rate_uses_flits=1; - -topology = fattree; - - -k = 4; -n = 3; - -watch_out=-;
\ No newline at end of file diff --git a/src/intersim2/.svn/pristine/f0/f0994d52a0bff0a75bf779e8ec53715b011bfd97.svn-base b/src/intersim2/.svn/pristine/f0/f0994d52a0bff0a75bf779e8ec53715b011bfd97.svn-base deleted file mode 100644 index c2640f9..0000000 --- a/src/intersim2/.svn/pristine/f0/f0994d52a0bff0a75bf779e8ec53715b011bfd97.svn-base +++ /dev/null @@ -1,112 +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. -*/ - -#include "booksim.hpp" -#include <iostream> - -#include "loa.hpp" -#include "random_utils.hpp" - -LOA::LOA( Module *parent, const string& name, - int inputs, int outputs ) : - DenseAllocator( parent, name, inputs, outputs ) -{ - _req.resize(inputs); - _counts.resize(outputs); - - _rptr.resize(inputs); - _gptr.resize(outputs); -} - -void LOA::Allocate( ) -{ - int input; - int output; - - int input_offset; - int output_offset; - - int lonely; - int lonely_cnt; - - // Count phase --- the number of requests - // per output is counted - - for ( int j = 0; j < _outputs; ++j ) { - _counts[j] = 0; - for ( int i = 0; i < _inputs; ++i ) { - _counts[j] += ( _request[i][j].label != -1 ) ? 1 : 0; - } - } - - // Request phase - for ( input = 0; input < _inputs; ++input ) { - - // Find the lonely output - output_offset = _rptr[input]; - lonely = -1; - lonely_cnt = _inputs + 1; - - for ( int o = 0; o < _outputs; ++o ) { - output = ( o + output_offset ) % _outputs; - - if ( ( _request[input][output].label != -1 ) && - ( _counts[output] < lonely_cnt ) ) { - lonely = output; - lonely_cnt = _counts[output]; - } - } - - // Request the lonely output (-1 for no request) - _req[input] = lonely; - } - - // Grant phase - for ( output = 0; output < _outputs; ++output ) { - input_offset = _gptr[output]; - - for ( int i = 0; i < _inputs; ++i ) { - input = ( i + input_offset ) % _inputs; - - if ( _req[input] == output ) { - // Grant! - - _inmatch[input] = output; - _outmatch[output] = input; - - _rptr[input] = ( _rptr[input] + 1 ) % _outputs; - _gptr[output] = ( _gptr[output] + 1 ) % _inputs; - - break; - } - } - } - - -} - - diff --git a/src/intersim2/.svn/pristine/f1/f18798b1a209786e47ee28ef3d5c7b5e908e0642.svn-base b/src/intersim2/.svn/pristine/f1/f18798b1a209786e47ee28ef3d5c7b5e908e0642.svn-base deleted file mode 100644 index 835d627..0000000 --- a/src/intersim2/.svn/pristine/f1/f18798b1a209786e47ee28ef3d5c7b5e908e0642.svn-base +++ /dev/null @@ -1,48 +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. -*/ - -#ifndef _ROUTEFUNC_HPP_ -#define _ROUTEFUNC_HPP_ - -#include "flit.hpp" -#include "router.hpp" -#include "outputset.hpp" -#include "config_utils.hpp" - -typedef void (*tRoutingFunction)( const Router *, const Flit *, int in_channel, OutputSet *, bool ); - -void InitializeRoutingMap( const Configuration & config ); - -extern map<string, tRoutingFunction> gRoutingFunctionMap; - -extern int gNumVCs; -extern int gReadReqBeginVC, gReadReqEndVC; -extern int gWriteReqBeginVC, gWriteReqEndVC; -extern int gReadReplyBeginVC, gReadReplyEndVC; -extern int gWriteReplyBeginVC, gWriteReplyEndVC; - -#endif diff --git a/src/intersim2/.svn/pristine/f3/f3f385cd24e067dc09ab89284d234593352ee0bf.svn-base b/src/intersim2/.svn/pristine/f3/f3f385cd24e067dc09ab89284d234593352ee0bf.svn-base deleted file mode 100644 index 7d5e0e3..0000000 --- a/src/intersim2/.svn/pristine/f3/f3f385cd24e067dc09ab89284d234593352ee0bf.svn-base +++ /dev/null @@ -1,153 +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. -*/ - -/*outputset.cpp - * - *output set assigns a flit which output to go to in a router - *used by the VC class - *the output assignment is done by the routing algorithms.. - * - */ - -#include <cassert> - -#include "booksim.hpp" -#include "outputset.hpp" - -void OutputSet::Clear( ) -{ - _outputs.clear( ); -} - -void OutputSet::Add( int output_port, int vc, int pri ) -{ - AddRange( output_port, vc, vc, pri ); -} - -void OutputSet::AddRange( int output_port, int vc_start, int vc_end, int pri ) -{ - - sSetElement s; - - s.vc_start = vc_start; - s.vc_end = vc_end; - s.pri = pri; - s.output_port = output_port; - _outputs.insert( s ); -} - -//legacy support, for performance, just use GetSet() -int OutputSet::NumVCs( int output_port ) const -{ - int total = 0; - set<sSetElement>::const_iterator i = _outputs.begin( ); - while(i!=_outputs.end( )){ - if(i->output_port == output_port){ - total += (i->vc_end - i->vc_start + 1); - } - i++; - } - return total; -} - -bool OutputSet::OutputEmpty( int output_port ) const -{ - set<sSetElement>::const_iterator i = _outputs.begin( ); - while(i!=_outputs.end( )){ - if(i->output_port == output_port){ - return false; - } - i++; - } - return true; -} - - -const set<OutputSet::sSetElement> & OutputSet::GetSet() const{ - return _outputs; -} - -//legacy support, for performance, just use GetSet() -int OutputSet::GetVC( int output_port, int vc_index, int *pri ) const -{ - - int range; - int remaining = vc_index; - int vc = -1; - - if ( pri ) { *pri = -1; } - - set<sSetElement>::const_iterator i = _outputs.begin( ); - while(i!=_outputs.end( )){ - if(i->output_port == output_port){ - range = i->vc_end - i->vc_start + 1; - if ( remaining >= range ) { - remaining -= range; - } else { - vc = i->vc_start + remaining; - if ( pri ) { - *pri = i->pri; - } - break; - } - } - i++; - } - return vc; -} - -//legacy support, for performance, just use GetSet() -bool OutputSet::GetPortVC( int *out_port, int *out_vc ) const -{ - - - bool single_output = false; - int used_outputs = 0; - - set<sSetElement>::const_iterator i = _outputs.begin( ); - if(i!=_outputs.end( )){ - used_outputs = i->output_port; - } - while(i!=_outputs.end( )){ - - if ( i->vc_start == i->vc_end ) { - *out_vc = i->vc_start; - *out_port = i->output_port; - single_output = true; - } else { - // multiple vc's selected - break; - } - if (used_outputs != i->output_port) { - // multiple outputs selected - single_output = false; - break; - } - i++; - } - return single_output; -} diff --git a/src/intersim2/.svn/pristine/f4/f47cc0dc517c023ddeaf70f92c90e0ecfe343030.svn-base b/src/intersim2/.svn/pristine/f4/f47cc0dc517c023ddeaf70f92c90e0ecfe343030.svn-base deleted file mode 100644 index c953713..0000000 --- a/src/intersim2/.svn/pristine/f4/f47cc0dc517c023ddeaf70f92c90e0ecfe343030.svn-base +++ /dev/null @@ -1,26 +0,0 @@ -// 2007 ITRS predictions for a 32nm high-performance library
-H_INVD2 = 8;//int
-W_INVD2 = 3;//int
-H_DFQD1 = 8;//int
-W_DFQD1 = 16;//int
-H_ND2D1 = 8;//int
-W_ND2D1 = 3;//int
-H_SRAM = 8;//int
-W_SRAM = 6;//int
-Vdd = 0.9;//float
-R = 606.321;//float
-IoffSRAM = 0.00000032;//float
-// 70 C
-IoffP = 0.00000102;//float
-IoffN = 0.00000102;//float
-Cg_pwr = 0.000000000000000534;//float
-Cd_pwr = 0.000000000000000267;//float
-Cgdl = 0.0000000000000001068;//float
-Cg = 0.000000000000000534;//float
-Cd = 0.000000000000000267;//float
-LAMBDA = 0.016;//float
-MetalPitch = 0.000080;//float
-Rw = 0.720044;//float
-Cw_gnd = 0.000000000000267339;//float
-Cw_cpl = 0.000000000000267339;//float
-wire_length = 2.0;//float
\ No newline at end of file diff --git a/src/intersim2/.svn/pristine/f4/f48f9ec9cbd794b900c47d4fa1af919f73f844ab.svn-base b/src/intersim2/.svn/pristine/f4/f48f9ec9cbd794b900c47d4fa1af919f73f844ab.svn-base deleted file mode 100644 index be47efa..0000000 --- a/src/intersim2/.svn/pristine/f4/f48f9ec9cbd794b900c47d4fa1af919f73f844ab.svn-base +++ /dev/null @@ -1,53 +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. -*/ - -#ifndef _FLY_HPP_ -#define _FLY_HPP_ - -#include "network.hpp" - -class KNFly : public Network { - - int _k; - int _n; - - void _ComputeSize( const Configuration &config ); - void _BuildNet( const Configuration &config ); - - int _OutChannel( int stage, int addr, int port ) const; - int _InChannel( int stage, int addr, int port ) const; - -public: - KNFly( const Configuration &config, const string & name ); - - int GetN( ) const; - int GetK( ) const; - static void RegisterRoutingFunctions(){}; - double Capacity( ) const; -}; - -#endif diff --git a/src/intersim2/.svn/pristine/f7/f7c0ca6108d1e538b05438c69b603d0d1903688f.svn-base b/src/intersim2/.svn/pristine/f7/f7c0ca6108d1e538b05438c69b603d0d1903688f.svn-base deleted file mode 100644 index b6b3ffb..0000000 --- a/src/intersim2/.svn/pristine/f7/f7c0ca6108d1e538b05438c69b603d0d1903688f.svn-base +++ /dev/null @@ -1,79 +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. -*/ - -/*credit.cpp - * - *A class for credits - */ - -#include "booksim.hpp" -#include "credit.hpp" - -stack<Credit *> Credit::_all; -stack<Credit *> Credit::_free; - -Credit::Credit() -{ - Reset(); -} - -void Credit::Reset() -{ - vc.clear(); - head = false; - tail = false; - id = -1; -} - -Credit * Credit::New() { - Credit * c; - if(_free.empty()) { - c = new Credit(); - _all.push(c); - } else { - c = _free.top(); - c->Reset(); - _free.pop(); - } - return c; -} - -void Credit::Free() { - _free.push(this); -} - -void Credit::FreeAll() { - while(!_all.empty()) { - delete _all.top(); - _all.pop(); - } -} - - -int Credit::OutStanding(){ - return _all.size()-_free.size(); -} diff --git a/src/intersim2/.svn/pristine/f8/f88e58811f1c40d35b795e6d317579cc2c3668d0.svn-base b/src/intersim2/.svn/pristine/f8/f88e58811f1c40d35b795e6d317579cc2c3668d0.svn-base deleted file mode 100644 index b2db309..0000000 --- a/src/intersim2/.svn/pristine/f8/f88e58811f1c40d35b795e6d317579cc2c3668d0.svn-base +++ /dev/null @@ -1,2385 +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. -*/ - -#include "iq_router.hpp" - -#include <string> -#include <sstream> -#include <iostream> -#include <iomanip> -#include <cstdlib> -#include <cassert> -#include <limits> - -#include "globals.hpp" -#include "random_utils.hpp" -#include "vc.hpp" -#include "routefunc.hpp" -#include "outputset.hpp" -#include "buffer.hpp" -#include "buffer_state.hpp" -#include "roundrobin_arb.hpp" -#include "allocator.hpp" -#include "switch_monitor.hpp" -#include "buffer_monitor.hpp" - -IQRouter::IQRouter( Configuration const & config, Module *parent, - string const & name, int id, int inputs, int outputs ) -: Router( config, parent, name, id, inputs, outputs ), _active(false) -{ - _vcs = config.GetInt( "num_vcs" ); - - _vc_busy_when_full = (config.GetInt("vc_busy_when_full") > 0); - _vc_prioritize_empty = (config.GetInt("vc_prioritize_empty") > 0); - _vc_shuffle_requests = (config.GetInt("vc_shuffle_requests") > 0); - - _speculative = (config.GetInt("speculative") > 0); - _spec_check_elig = (config.GetInt("spec_check_elig") > 0); - _spec_check_cred = (config.GetInt("spec_check_cred") > 0); - _spec_mask_by_reqs = (config.GetInt("spec_mask_by_reqs") > 0); - - _routing_delay = config.GetInt( "routing_delay" ); - _vc_alloc_delay = config.GetInt( "vc_alloc_delay" ); - if(!_vc_alloc_delay) { - Error("VC allocator cannot have zero delay."); - } - _sw_alloc_delay = config.GetInt( "sw_alloc_delay" ); - if(!_sw_alloc_delay) { - Error("Switch allocator cannot have zero delay."); - } - - // Routing - string const rf = config.GetStr("routing_function") + "_" + config.GetStr("topology"); - map<string, tRoutingFunction>::const_iterator rf_iter = gRoutingFunctionMap.find(rf); - if(rf_iter == gRoutingFunctionMap.end()) { - Error("Invalid routing function: " + rf); - } - _rf = rf_iter->second; - - // Alloc VC's - _buf.resize(_inputs); - for ( int i = 0; i < _inputs; ++i ) { - ostringstream module_name; - module_name << "buf_" << i; - _buf[i] = new Buffer(config, _outputs, this, module_name.str( ) ); - module_name.str(""); - } - - // Alloc next VCs' buffer state - _next_buf.resize(_outputs); - for (int j = 0; j < _outputs; ++j) { - ostringstream module_name; - module_name << "next_vc_o" << j; - _next_buf[j] = new BufferState( config, this, module_name.str( ) ); - module_name.str(""); - } - - // Alloc allocators - string vc_alloc_type = config.GetStr( "vc_allocator" ); - if(vc_alloc_type == "piggyback") { - if(!_speculative) { - Error("Piggyback VC allocation requires speculative switch allocation to be enabled."); - } - _vc_allocator = NULL; - _vc_rr_offset.resize(_outputs*_classes, -1); - } else { - _vc_allocator = Allocator::NewAllocator( this, "vc_allocator", - vc_alloc_type, - _vcs*_inputs, - _vcs*_outputs ); - - if ( !_vc_allocator ) { - Error("Unknown vc_allocator type: " + vc_alloc_type); - } - } - - string sw_alloc_type = config.GetStr( "sw_allocator" ); - _sw_allocator = Allocator::NewAllocator( this, "sw_allocator", - sw_alloc_type, - _inputs*_input_speedup, - _outputs*_output_speedup ); - - if ( !_sw_allocator ) { - Error("Unknown sw_allocator type: " + sw_alloc_type); - } - - string spec_sw_alloc_type = config.GetStr( "spec_sw_allocator" ); - if ( _speculative && ( spec_sw_alloc_type != "prio" ) ) { - _spec_sw_allocator = Allocator::NewAllocator( this, "spec_sw_allocator", - spec_sw_alloc_type, - _inputs*_input_speedup, - _outputs*_output_speedup ); - if ( !_spec_sw_allocator ) { - Error("Unknown spec_sw_allocator type: " + spec_sw_alloc_type); - } - } else { - _spec_sw_allocator = NULL; - } - - _sw_rr_offset.resize(_inputs*_input_speedup); - for(int i = 0; i < _inputs*_input_speedup; ++i) - _sw_rr_offset[i] = i % _input_speedup; - - _noq = config.GetInt("noq") > 0; - if(_noq) { - if(_routing_delay) { - Error("NOQ requires lookahead routing to be enabled."); - } - if(_vcs < _outputs) { - Error("NOQ requires at least as many VCs as router outputs."); - } - } - _noq_next_output_port.resize(_inputs, vector<int>(_vcs, -1)); - _noq_next_vc_start.resize(_inputs, vector<int>(_vcs, -1)); - _noq_next_vc_end.resize(_inputs, vector<int>(_vcs, -1)); - - // Output queues - _output_buffer_size = config.GetInt("output_buffer_size"); - _output_buffer.resize(_outputs); - _credit_buffer.resize(_inputs); - - // Switch configuration (when held for multiple cycles) - _hold_switch_for_packet = (config.GetInt("hold_switch_for_packet") > 0); - _switch_hold_in.resize(_inputs*_input_speedup, -1); - _switch_hold_out.resize(_outputs*_output_speedup, -1); - _switch_hold_vc.resize(_inputs*_input_speedup, -1); - - _bufferMonitor = new BufferMonitor(inputs, _classes); - _switchMonitor = new SwitchMonitor(inputs, outputs, _classes); - -#ifdef TRACK_FLOWS - for(int c = 0; c < _classes; ++c) { - _stored_flits[c].resize(_inputs, 0); - _active_packets[c].resize(_inputs, 0); - } - _outstanding_classes.resize(_outputs, vector<queue<int> >(_vcs)); -#endif -} - -IQRouter::~IQRouter( ) -{ - - if(gPrintActivity) { - cout << Name() << ".bufferMonitor:" << endl ; - cout << *_bufferMonitor << endl ; - - cout << Name() << ".switchMonitor:" << endl ; - cout << "Inputs=" << _inputs ; - cout << "Outputs=" << _outputs ; - cout << *_switchMonitor << endl ; - } - - for(int i = 0; i < _inputs; ++i) - delete _buf[i]; - - for(int j = 0; j < _outputs; ++j) - delete _next_buf[j]; - - delete _vc_allocator; - delete _sw_allocator; - if(_spec_sw_allocator) - delete _spec_sw_allocator; - - delete _bufferMonitor; - delete _switchMonitor; -} - -void IQRouter::AddOutputChannel(FlitChannel * channel, CreditChannel * backchannel) -{ - int alloc_delay = _speculative ? max(_vc_alloc_delay, _sw_alloc_delay) : (_vc_alloc_delay + _sw_alloc_delay); - int min_latency = 1 + _crossbar_delay + channel->GetLatency() + _routing_delay + alloc_delay + backchannel->GetLatency() + _credit_delay; - _next_buf[_output_channels.size()]->SetMinLatency(min_latency); - Router::AddOutputChannel(channel, backchannel); -} - -void IQRouter::ReadInputs( ) -{ - bool have_flits = _ReceiveFlits( ); - bool have_credits = _ReceiveCredits( ); - _active = _active || have_flits || have_credits; -} - -void IQRouter::_InternalStep( ) -{ - if(!_active) { - return; - } - - _InputQueuing( ); - bool activity = !_proc_credits.empty(); - - if(!_route_vcs.empty()) - _RouteEvaluate( ); - if(_vc_allocator) { - _vc_allocator->Clear(); - if(!_vc_alloc_vcs.empty()) - _VCAllocEvaluate( ); - } - if(_hold_switch_for_packet) { - if(!_sw_hold_vcs.empty()) - _SWHoldEvaluate( ); - } - _sw_allocator->Clear(); - if(_spec_sw_allocator) - _spec_sw_allocator->Clear(); - if(!_sw_alloc_vcs.empty()) - _SWAllocEvaluate( ); - if(!_crossbar_flits.empty()) - _SwitchEvaluate( ); - - if(!_route_vcs.empty()) { - _RouteUpdate( ); - activity = activity || !_route_vcs.empty(); - } - if(!_vc_alloc_vcs.empty()) { - _VCAllocUpdate( ); - activity = activity || !_vc_alloc_vcs.empty(); - } - if(_hold_switch_for_packet) { - if(!_sw_hold_vcs.empty()) { - _SWHoldUpdate( ); - activity = activity || !_sw_hold_vcs.empty(); - } - } - if(!_sw_alloc_vcs.empty()) { - _SWAllocUpdate( ); - activity = activity || !_sw_alloc_vcs.empty(); - } - if(!_crossbar_flits.empty()) { - _SwitchUpdate( ); - activity = activity || !_crossbar_flits.empty(); - } - - _active = activity; - - _OutputQueuing( ); - - _bufferMonitor->cycle( ); - _switchMonitor->cycle( ); -} - -void IQRouter::WriteOutputs( ) -{ - _SendFlits( ); - _SendCredits( ); -} - - -//------------------------------------------------------------------------------ -// read inputs -//------------------------------------------------------------------------------ - -bool IQRouter::_ReceiveFlits( ) -{ - bool activity = false; - for(int input = 0; input < _inputs; ++input) { - Flit * const f = _input_channels[input]->Receive(); - if(f) { - -#ifdef TRACK_FLOWS - ++_received_flits[f->cl][input]; -#endif - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Received flit " << f->id - << " from channel at input " << input - << "." << endl; - } - _in_queue_flits.insert(make_pair(input, f)); - activity = true; - } - } - return activity; -} - -bool IQRouter::_ReceiveCredits( ) -{ - bool activity = false; - for(int output = 0; output < _outputs; ++output) { - Credit * const c = _output_credits[output]->Receive(); - if(c) { - _proc_credits.push_back(make_pair(GetSimTime() + _credit_delay, - make_pair(c, output))); - activity = true; - } - } - return activity; -} - - -//------------------------------------------------------------------------------ -// input queuing -//------------------------------------------------------------------------------ - -void IQRouter::_InputQueuing( ) -{ - for(map<int, Flit *>::const_iterator iter = _in_queue_flits.begin(); - iter != _in_queue_flits.end(); - ++iter) { - - int const input = iter->first; - assert((input >= 0) && (input < _inputs)); - - Flit * const f = iter->second; - assert(f); - - int const vc = f->vc; - assert((vc >= 0) && (vc < _vcs)); - - Buffer * const cur_buf = _buf[input]; - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Adding flit " << f->id - << " to VC " << vc - << " at input " << input - << " (state: " << VC::VCSTATE[cur_buf->GetState(vc)]; - if(cur_buf->Empty(vc)) { - *gWatchOut << ", empty"; - } else { - assert(cur_buf->FrontFlit(vc)); - *gWatchOut << ", front: " << cur_buf->FrontFlit(vc)->id; - } - *gWatchOut << ")." << endl; - } - cur_buf->AddFlit(vc, f); - -#ifdef TRACK_FLOWS - ++_stored_flits[f->cl][input]; - if(f->head) ++_active_packets[f->cl][input]; -#endif - - _bufferMonitor->write(input, f) ; - - if(cur_buf->GetState(vc) == VC::idle) { - assert(cur_buf->FrontFlit(vc) == f); - assert(cur_buf->GetOccupancy(vc) == 1); - assert(f->head); - assert(_switch_hold_vc[input*_input_speedup + vc%_input_speedup] != vc); - if(_routing_delay) { - cur_buf->SetState(vc, VC::routing); - _route_vcs.push_back(make_pair(-1, make_pair(input, vc))); - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Using precomputed lookahead routing information for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - cur_buf->SetRouteSet(vc, &f->la_route_set); - cur_buf->SetState(vc, VC::vc_alloc); - if(_speculative) { - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc), - -1))); - } - if(_vc_allocator) { - _vc_alloc_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc), - -1))); - } - if(_noq) { - _UpdateNOQ(input, vc, f); - } - } - } else if((cur_buf->GetState(vc) == VC::active) && - (cur_buf->FrontFlit(vc) == f)) { - if(_switch_hold_vc[input*_input_speedup + vc%_input_speedup] == vc) { - _sw_hold_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc), - -1))); - } else { - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(make_pair(input, vc), - -1))); - } - } - } - _in_queue_flits.clear(); - - while(!_proc_credits.empty()) { - - pair<int, pair<Credit *, int> > const & item = _proc_credits.front(); - - int const time = item.first; - if(GetSimTime() < time) { - break; - } - - Credit * const c = item.second.first; - assert(c); - - int const output = item.second.second; - assert((output >= 0) && (output < _outputs)); - - BufferState * const dest_buf = _next_buf[output]; - -#ifdef TRACK_FLOWS - for(set<int>::const_iterator iter = c->vc.begin(); iter != c->vc.end(); ++iter) { - int const vc = *iter; - assert(!_outstanding_classes[output][vc].empty()); - int cl = _outstanding_classes[output][vc].front(); - _outstanding_classes[output][vc].pop(); - assert(_outstanding_credits[cl][output] > 0); - --_outstanding_credits[cl][output]; - } -#endif - - dest_buf->ProcessCredit(c); - c->Free(); - _proc_credits.pop_front(); - } -} - - -//------------------------------------------------------------------------------ -// routing -//------------------------------------------------------------------------------ - -void IQRouter::_RouteEvaluate( ) -{ - assert(_routing_delay); - - for(deque<pair<int, pair<int, int> > >::iterator iter = _route_vcs.begin(); - iter != _route_vcs.end(); - ++iter) { - - int const time = iter->first; - if(time >= 0) { - break; - } - iter->first = GetSimTime() + _routing_delay - 1; - - int const input = iter->second.first; - assert((input >= 0) && (input < _inputs)); - int const vc = iter->second.second; - assert((vc >= 0) && (vc < _vcs)); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::routing); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - assert(f->head); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Beginning routing for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - } -} - -void IQRouter::_RouteUpdate( ) -{ - assert(_routing_delay); - - while(!_route_vcs.empty()) { - - pair<int, pair<int, int> > const & item = _route_vcs.front(); - - int const time = item.first; - if((time < 0) || (GetSimTime() < time)) { - break; - } - assert(GetSimTime() == time); - - int const input = item.second.first; - assert((input >= 0) && (input < _inputs)); - int const vc = item.second.second; - assert((vc >= 0) && (vc < _vcs)); - - Buffer * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::routing); - - Flit * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - assert(f->head); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Completed routing for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - - cur_buf->Route(vc, _rf, this, f, input); - cur_buf->SetState(vc, VC::vc_alloc); - if(_speculative) { - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second, -1))); - } - if(_vc_allocator) { - _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second, -1))); - } - // NOTE: No need to handle NOQ here, as it requires lookahead routing! - _route_vcs.pop_front(); - } -} - - -//------------------------------------------------------------------------------ -// VC allocation -//------------------------------------------------------------------------------ - -void IQRouter::_VCAllocEvaluate( ) -{ - assert(_vc_allocator); - - bool watched = false; - - for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _vc_alloc_vcs.begin(); - iter != _vc_alloc_vcs.end(); - ++iter) { - - int const time = iter->first; - if(time >= 0) { - break; - } - - int const input = iter->second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = iter->second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - assert(iter->second.second == -1); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::vc_alloc); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - assert(f->head); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Beginning VC allocation for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - - OutputSet const * const route_set = cur_buf->GetRouteSet(vc); - assert(route_set); - - int const out_priority = cur_buf->GetPriority(vc); - set<OutputSet::sSetElement> const setlist = route_set->GetSet(); - - bool elig = false; - bool cred = false; - bool reserved = false; - - assert(!_noq || (setlist.size() == 1)); - - for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin(); - iset != setlist.end(); - ++iset) { - - int const out_port = iset->output_port; - assert((out_port >= 0) && (out_port < _outputs)); - - BufferState const * const dest_buf = _next_buf[out_port]; - - int vc_start; - int vc_end; - - if(_noq && _noq_next_output_port[input][vc] >= 0) { - assert(!_routing_delay); - vc_start = _noq_next_vc_start[input][vc]; - vc_end = _noq_next_vc_end[input][vc]; - } else { - vc_start = iset->vc_start; - vc_end = iset->vc_end; - } - assert(vc_start >= 0 && vc_start < _vcs); - assert(vc_end >= 0 && vc_end < _vcs); - assert(vc_end >= vc_start); - - for(int out_vc = vc_start; out_vc <= vc_end; ++out_vc) { - assert((out_vc >= 0) && (out_vc < _vcs)); - - int in_priority = iset->pri; - if(_vc_prioritize_empty && !dest_buf->IsEmptyFor(out_vc)) { - assert(in_priority >= 0); - in_priority += numeric_limits<int>::min(); - } - - // On the input input side, a VC might request several output VCs. - // These VCs can be prioritized by the routing function, and this is - // reflected in "in_priority". On the output side, if multiple VCs are - // requesting the same output VC, the priority of VCs is based on the - // actual packet priorities, which is reflected in "out_priority". - - if(!dest_buf->IsAvailableFor(out_vc)) { - if(f->watch) { - int const use_input_and_vc = dest_buf->UsedBy(out_vc); - int const use_input = use_input_and_vc / _vcs; - int const use_vc = use_input_and_vc % _vcs; - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " VC " << out_vc - << " at output " << out_port - << " is in use by VC " << use_vc - << " at input " << use_input; - Flit * cf = _buf[use_input]->FrontFlit(use_vc); - if(cf) { - *gWatchOut << " (front flit: " << cf->id << ")"; - } else { - *gWatchOut << " (empty)"; - } - *gWatchOut << "." << endl; - } - } else { - elig = true; - if(_vc_busy_when_full && dest_buf->IsFullFor(out_vc)) { - if(f->watch) - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " VC " << out_vc - << " at output " << out_port - << " is full." << endl; - reserved |= !dest_buf->IsFull(); - } else { - cred = true; - if(f->watch){ - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Requesting VC " << out_vc - << " at output " << out_port - << " (in_pri: " << in_priority - << ", out_pri: " << out_priority - << ")." << endl; - watched = true; - } - int const input_and_vc - = _vc_shuffle_requests ? (vc*_inputs + input) : (input*_vcs + vc); - _vc_allocator->AddRequest(input_and_vc, out_port*_vcs + out_vc, - 0, in_priority, out_priority); - } - } - } - } - if(!elig) { - iter->second.second = STALL_BUFFER_BUSY; - } else if(_vc_busy_when_full && !cred) { - iter->second.second = reserved ? STALL_BUFFER_RESERVED : STALL_BUFFER_FULL; - } - } - - if(watched) { - *gWatchOut << GetSimTime() << " | " << _vc_allocator->FullName() << " | "; - _vc_allocator->PrintRequests( gWatchOut ); - } - - _vc_allocator->Allocate(); - - if(watched) { - *gWatchOut << GetSimTime() << " | " << _vc_allocator->FullName() << " | "; - _vc_allocator->PrintGrants( gWatchOut ); - } - - for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _vc_alloc_vcs.begin(); - iter != _vc_alloc_vcs.end(); - ++iter) { - - int const time = iter->first; - if(time >= 0) { - break; - } - iter->first = GetSimTime() + _vc_alloc_delay - 1; - - int const input = iter->second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = iter->second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - if(iter->second.second < -1) { - continue; - } - - assert(iter->second.second == -1); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::vc_alloc); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - assert(f->head); - - int const input_and_vc - = _vc_shuffle_requests ? (vc*_inputs + input) : (input*_vcs + vc); - int const output_and_vc = _vc_allocator->OutputAssigned(input_and_vc); - - if(output_and_vc >= 0) { - - int const match_output = output_and_vc / _vcs; - assert((match_output >= 0) && (match_output < _outputs)); - int const match_vc = output_and_vc % _vcs; - assert((match_vc >= 0) && (match_vc < _vcs)); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Assigning VC " << match_vc - << " at output " << match_output - << " to VC " << vc - << " at input " << input - << "." << endl; - } - - iter->second.second = output_and_vc; - - } else { - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "VC allocation failed for VC " << vc - << " at input " << input - << "." << endl; - } - - iter->second.second = STALL_BUFFER_CONFLICT; - - } - } - - if(_vc_alloc_delay <= 1) { - return; - } - - for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _vc_alloc_vcs.begin(); - iter != _vc_alloc_vcs.end(); - ++iter) { - - int const time = iter->first; - assert(time >= 0); - if(GetSimTime() < time) { - break; - } - - assert(iter->second.second != -1); - - int const output_and_vc = iter->second.second; - - if(output_and_vc >= 0) { - - int const match_output = output_and_vc / _vcs; - assert((match_output >= 0) && (match_output < _outputs)); - int const match_vc = output_and_vc % _vcs; - assert((match_vc >= 0) && (match_vc < _vcs)); - - BufferState const * const dest_buf = _next_buf[match_output]; - - int const input = iter->second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = iter->second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::vc_alloc); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - assert(f->head); - - if(!dest_buf->IsAvailableFor(match_vc)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Discarding previously generated grant for VC " << vc - << " at input " << input - << ": VC " << match_vc - << " at output " << match_output - << " is no longer available." << endl; - } - iter->second.second = STALL_BUFFER_BUSY; - } else if(_vc_busy_when_full && dest_buf->IsFullFor(match_vc)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Discarding previously generated grant for VC " << vc - << " at input " << input - << ": VC " << match_vc - << " at output " << match_output - << " has become full." << endl; - } - iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED; - } - } - } -} - -void IQRouter::_VCAllocUpdate( ) -{ - assert(_vc_allocator); - - while(!_vc_alloc_vcs.empty()) { - - pair<int, pair<pair<int, int>, int> > const & item = _vc_alloc_vcs.front(); - - int const time = item.first; - if((time < 0) || (GetSimTime() < time)) { - break; - } - assert(GetSimTime() == time); - - int const input = item.second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = item.second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - assert(item.second.second != -1); - - Buffer * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::vc_alloc); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - assert(f->head); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Completed VC allocation for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - - int const output_and_vc = item.second.second; - - if(output_and_vc >= 0) { - - int const match_output = output_and_vc / _vcs; - assert((match_output >= 0) && (match_output < _outputs)); - int const match_vc = output_and_vc % _vcs; - assert((match_vc >= 0) && (match_vc < _vcs)); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Acquiring assigned VC " << match_vc - << " at output " << match_output - << "." << endl; - } - - BufferState * const dest_buf = _next_buf[match_output]; - assert(dest_buf->IsAvailableFor(match_vc)); - - dest_buf->TakeBuffer(match_vc, input*_vcs + vc); - - cur_buf->SetOutput(vc, match_output, match_vc); - cur_buf->SetState(vc, VC::active); - if(!_speculative) { - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, -1))); - } - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " No output VC allocated." << endl; - } - -#ifdef TRACK_STALLS - assert((output_and_vc == STALL_BUFFER_BUSY) || - (output_and_vc == STALL_BUFFER_CONFLICT)); - if(output_and_vc == STALL_BUFFER_BUSY) { - ++_buffer_busy_stalls[f->cl]; - } else if(output_and_vc == STALL_BUFFER_CONFLICT) { - ++_buffer_conflict_stalls[f->cl]; - } -#endif - - _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, -1))); - } - _vc_alloc_vcs.pop_front(); - } -} - - -//------------------------------------------------------------------------------ -// switch holding -//------------------------------------------------------------------------------ - -void IQRouter::_SWHoldEvaluate( ) -{ - assert(_hold_switch_for_packet); - - for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_hold_vcs.begin(); - iter != _sw_hold_vcs.end(); - ++iter) { - - int const time = iter->first; - if(time >= 0) { - break; - } - iter->first = GetSimTime(); - - int const input = iter->second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = iter->second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - assert(iter->second.second == -1); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::active); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Beginning held switch allocation for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - - int const expanded_input = input * _input_speedup + vc % _input_speedup; - assert(_switch_hold_vc[expanded_input] == vc); - - int const match_port = cur_buf->GetOutputPort(vc); - assert((match_port >= 0) && (match_port < _outputs)); - int const match_vc = cur_buf->GetOutputVC(vc); - assert((match_vc >= 0) && (match_vc < _vcs)); - - int const expanded_output = match_port*_output_speedup + input%_output_speedup; - assert(_switch_hold_in[expanded_input] == expanded_output); - - BufferState const * const dest_buf = _next_buf[match_port]; - - if(dest_buf->IsFullFor(match_vc)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Unable to reuse held connection from input " << input - << "." << (expanded_input % _input_speedup) - << " to output " << match_port - << "." << (expanded_output % _output_speedup) - << ": No credit available." << endl; - } - iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED; - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Reusing held connection from input " << input - << "." << (expanded_input % _input_speedup) - << " to output " << match_port - << "." << (expanded_output % _output_speedup) - << "." << endl; - } - iter->second.second = expanded_output; - } - } -} - -void IQRouter::_SWHoldUpdate( ) -{ - assert(_hold_switch_for_packet); - - while(!_sw_hold_vcs.empty()) { - - pair<int, pair<pair<int, int>, int> > const & item = _sw_hold_vcs.front(); - - int const time = item.first; - if(time < 0) { - break; - } - assert(GetSimTime() == time); - - int const input = item.second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = item.second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - assert(item.second.second != -1); - - Buffer * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert(cur_buf->GetState(vc) == VC::active); - - Flit * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Completed held switch allocation for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - - int const expanded_input = input * _input_speedup + vc % _input_speedup; - assert(_switch_hold_vc[expanded_input] == vc); - - int const expanded_output = item.second.second; - - if(expanded_output >= 0 && ( _output_buffer_size==-1 || _output_buffer[expanded_output].size()<size_t(_output_buffer_size))) { - - assert(_switch_hold_in[expanded_input] == expanded_output); - assert(_switch_hold_out[expanded_output] == expanded_input); - - int const output = expanded_output / _output_speedup; - assert((output >= 0) && (output < _outputs)); - assert(cur_buf->GetOutputPort(vc) == output); - - int const match_vc = cur_buf->GetOutputVC(vc); - assert((match_vc >= 0) && (match_vc < _vcs)); - - BufferState * const dest_buf = _next_buf[output]; - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Scheduling switch connection from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << "." << endl; - } - - cur_buf->RemoveFlit(vc); - -#ifdef TRACK_FLOWS - --_stored_flits[f->cl][input]; - if(f->tail) --_active_packets[f->cl][input]; -#endif - - _bufferMonitor->read(input, f) ; - - f->hops++; - f->vc = match_vc; - - if(!_routing_delay && f->head) { - const FlitChannel * channel = _output_channels[output]; - const Router * router = channel->GetSink(); - if(router) { - if(_noq) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Updating lookahead routing information for flit " << f->id - << " (NOQ)." << endl; - } - int next_output_port = _noq_next_output_port[input][vc]; - assert(next_output_port >= 0); - _noq_next_output_port[input][vc] = -1; - int next_vc_start = _noq_next_vc_start[input][vc]; - assert(next_vc_start >= 0 && next_vc_start < _vcs); - _noq_next_vc_start[input][vc] = -1; - int next_vc_end = _noq_next_vc_end[input][vc]; - assert(next_vc_end >= 0 && next_vc_end < _vcs); - _noq_next_vc_end[input][vc] = -1; - f->la_route_set.Clear(); - f->la_route_set.AddRange(next_output_port, next_vc_start, next_vc_end); - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Updating lookahead routing information for flit " << f->id - << "." << endl; - } - int in_channel = channel->GetSinkPort(); - _rf(router, f, in_channel, &f->la_route_set, false); - } - } else { - f->la_route_set.Clear(); - } - } - -#ifdef TRACK_FLOWS - ++_outstanding_credits[f->cl][output]; - _outstanding_classes[output][f->vc].push(f->cl); -#endif - - dest_buf->SendingFlit(f); - - _crossbar_flits.push_back(make_pair(-1, make_pair(f, make_pair(expanded_input, expanded_output)))); - - if(_out_queue_credits.count(input) == 0) { - _out_queue_credits.insert(make_pair(input, Credit::New())); - } - _out_queue_credits.find(input)->second->vc.insert(vc); - - if(cur_buf->Empty(vc)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Cancelling held connection from input " << input - << "." << (expanded_input % _input_speedup) - << " to " << output - << "." << (expanded_output % _output_speedup) - << ": No more flits." << endl; - } - _switch_hold_vc[expanded_input] = -1; - _switch_hold_in[expanded_input] = -1; - _switch_hold_out[expanded_output] = -1; - if(f->tail) { - cur_buf->SetState(vc, VC::idle); - } - } else { - Flit * const nf = cur_buf->FrontFlit(vc); - assert(nf); - assert(nf->vc == vc); - if(f->tail) { - assert(nf->head); - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Cancelling held connection from input " << input - << "." << (expanded_input % _input_speedup) - << " to " << output - << "." << (expanded_output % _output_speedup) - << ": End of packet." << endl; - } - _switch_hold_vc[expanded_input] = -1; - _switch_hold_in[expanded_input] = -1; - _switch_hold_out[expanded_output] = -1; - if(_routing_delay) { - cur_buf->SetState(vc, VC::routing); - _route_vcs.push_back(make_pair(-1, item.second.first)); - } else { - if(nf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Using precomputed lookahead routing information for VC " << vc - << " at input " << input - << " (front: " << nf->id - << ")." << endl; - } - cur_buf->SetRouteSet(vc, &nf->la_route_set); - cur_buf->SetState(vc, VC::vc_alloc); - if(_speculative) { - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } - if(_vc_allocator) { - _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } - if(_noq) { - _UpdateNOQ(input, vc, nf); - } - } - } else { - _sw_hold_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } - } - } else { - //when internal speedup >1.0, the buffer stall stats may not be accruate - assert((expanded_output == STALL_BUFFER_FULL) || - (expanded_output == STALL_BUFFER_RESERVED) || !( _output_buffer_size==-1 || _output_buffer[expanded_output].size()<size_t(_output_buffer_size))); - - int const held_expanded_output = _switch_hold_in[expanded_input]; - assert(held_expanded_output >= 0); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Cancelling held connection from input " << input - << "." << (expanded_input % _input_speedup) - << " to " << (held_expanded_output / _output_speedup) - << "." << (held_expanded_output % _output_speedup) - << ": Flit not sent." << endl; - } - _switch_hold_vc[expanded_input] = -1; - _switch_hold_in[expanded_input] = -1; - _switch_hold_out[held_expanded_output] = -1; - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } - _sw_hold_vcs.pop_front(); - } -} - - -//------------------------------------------------------------------------------ -// switch allocation -//------------------------------------------------------------------------------ - -bool IQRouter::_SWAllocAddReq(int input, int vc, int output) -{ - assert(input >= 0 && input < _inputs); - assert(vc >= 0 && vc < _vcs); - assert(output >= 0 && output < _outputs); - - // When input_speedup > 1, the virtual channel buffers are interleaved to - // create multiple input ports to the switch. Similarily, the output ports - // are interleaved based on their originating input when output_speedup > 1. - - int const expanded_input = input * _input_speedup + vc % _input_speedup; - int const expanded_output = output * _output_speedup + input % _output_speedup; - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert((cur_buf->GetState(vc) == VC::active) || - (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc))); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - - if((_switch_hold_in[expanded_input] < 0) && - (_switch_hold_out[expanded_output] < 0)) { - - Allocator * allocator = _sw_allocator; - int prio = cur_buf->GetPriority(vc); - - if(_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)) { - if(_spec_sw_allocator) { - allocator = _spec_sw_allocator; - } else { - assert(prio >= 0); - prio += numeric_limits<int>::min(); - } - } - - Allocator::sRequest req; - - if(allocator->ReadRequest(req, expanded_input, expanded_output)) { - if(RoundRobinArbiter::Supersedes(vc, prio, req.label, req.in_pri, - _sw_rr_offset[expanded_input], _vcs)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Replacing earlier request from VC " << req.label - << " for output " << output - << "." << (expanded_output % _output_speedup) - << " with priority " << req.in_pri - << " (" << ((cur_buf->GetState(vc) == VC::active) ? - "non-spec" : - "spec") - << ", pri: " << prio - << ")." << endl; - } - allocator->RemoveRequest(expanded_input, expanded_output, req.label); - allocator->AddRequest(expanded_input, expanded_output, vc, prio, prio); - return true; - } - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Output " << output - << "." << (expanded_output % _output_speedup) - << " was already requested by VC " << req.label - << " with priority " << req.in_pri - << " (pri: " << prio - << ")." << endl; - } - return false; - } - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Requesting output " << output - << "." << (expanded_output % _output_speedup) - << " (" << ((cur_buf->GetState(vc) == VC::active) ? - "non-spec" : - "spec") - << ", pri: " << prio - << ")." << endl; - } - allocator->AddRequest(expanded_input, expanded_output, vc, prio, prio); - return true; - } - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Ignoring output " << output - << "." << (expanded_output % _output_speedup) - << " due to switch hold ("; - if(_switch_hold_in[expanded_input] >= 0) { - *gWatchOut << "input: " << input - << "." << (expanded_input % _input_speedup); - if(_switch_hold_out[expanded_output] >= 0) { - *gWatchOut << ", "; - } - } - if(_switch_hold_out[expanded_output] >= 0) { - *gWatchOut << "output: " << output - << "." << (expanded_output % _output_speedup); - } - *gWatchOut << ")." << endl; - } - return false; -} - -void IQRouter::_SWAllocEvaluate( ) -{ - bool watched = false; - - for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_alloc_vcs.begin(); - iter != _sw_alloc_vcs.end(); - ++iter) { - - int const time = iter->first; - if(time >= 0) { - break; - } - - int const input = iter->second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = iter->second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - assert(iter->second.second == -1); - - assert(_switch_hold_vc[input * _input_speedup + vc % _input_speedup] != vc); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert((cur_buf->GetState(vc) == VC::active) || - (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc))); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Beginning switch allocation for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - - if(cur_buf->GetState(vc) == VC::active) { - - int const dest_output = cur_buf->GetOutputPort(vc); - assert((dest_output >= 0) && (dest_output < _outputs)); - int const dest_vc = cur_buf->GetOutputVC(vc); - assert((dest_vc >= 0) && (dest_vc < _vcs)); - - BufferState const * const dest_buf = _next_buf[dest_output]; - - if(dest_buf->IsFullFor(dest_vc) || ( _output_buffer_size!=-1 && _output_buffer[dest_output].size()>=(size_t)(_output_buffer_size))) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " VC " << dest_vc - << " at output " << dest_output - << " is full." << endl; - } - iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED; - continue; - } - bool const requested = _SWAllocAddReq(input, vc, dest_output); - watched |= requested && f->watch; - continue; - } - assert(_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)); - assert(f->head); - - // The following models the speculative VC allocation aspects of the - // pipeline. An input VC with a request in for an egress virtual channel - // will also speculatively bid for the switch regardless of whether the VC - // allocation succeeds. - - OutputSet const * const route_set = cur_buf->GetRouteSet(vc); - assert(route_set); - - set<OutputSet::sSetElement> const setlist = route_set->GetSet(); - - assert(!_noq || (setlist.size() == 1)); - - for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin(); - iset != setlist.end(); - ++iset) { - - int const dest_output = iset->output_port; - assert((dest_output >= 0) && (dest_output < _outputs)); - - // for lower levels of speculation, ignore credit availability and always - // issue requests for all output ports in route set - - BufferState const * const dest_buf = _next_buf[dest_output]; - - bool elig = false; - bool cred = false; - - if(_spec_check_elig) { - - // for higher levels of speculation, check if at least one suitable VC - // is available at the current output - - int vc_start; - int vc_end; - - if(_noq && _noq_next_output_port[input][vc] >= 0) { - assert(!_routing_delay); - vc_start = _noq_next_vc_start[input][vc]; - vc_end = _noq_next_vc_end[input][vc]; - } else { - vc_start = iset->vc_start; - vc_end = iset->vc_end; - } - assert(vc_start >= 0 && vc_start < _vcs); - assert(vc_end >= 0 && vc_end < _vcs); - assert(vc_end >= vc_start); - - for(int dest_vc = vc_start; dest_vc <= vc_end; ++dest_vc) { - assert((dest_vc >= 0) && (dest_vc < _vcs)); - - if(dest_buf->IsAvailableFor(dest_vc) && ( _output_buffer_size==-1 || _output_buffer[dest_output].size()<(size_t)(_output_buffer_size))) { - elig = true; - if(!_spec_check_cred || !dest_buf->IsFullFor(dest_vc)) { - cred = true; - break; - } - } - } - } - - if(_spec_check_elig && !elig) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Output " << dest_output - << " has no suitable VCs available." << endl; - } - iter->second.second = STALL_BUFFER_BUSY; - } else if(_spec_check_cred && !cred) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " All suitable VCs at output " << dest_output - << " are full." << endl; - } - iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED; - } else { - bool const requested = _SWAllocAddReq(input, vc, dest_output); - watched |= requested && f->watch; - } - } - } - - if(watched) { - *gWatchOut << GetSimTime() << " | " << _sw_allocator->FullName() << " | "; - _sw_allocator->PrintRequests(gWatchOut); - if(_spec_sw_allocator) { - *gWatchOut << GetSimTime() << " | " << _spec_sw_allocator->FullName() << " | "; - _spec_sw_allocator->PrintRequests(gWatchOut); - } - } - - _sw_allocator->Allocate(); - if(_spec_sw_allocator) - _spec_sw_allocator->Allocate(); - - if(watched) { - *gWatchOut << GetSimTime() << " | " << _sw_allocator->FullName() << " | "; - _sw_allocator->PrintGrants(gWatchOut); - if(_spec_sw_allocator) { - *gWatchOut << GetSimTime() << " | " << _spec_sw_allocator->FullName() << " | "; - _spec_sw_allocator->PrintGrants(gWatchOut); - } - } - - for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_alloc_vcs.begin(); - iter != _sw_alloc_vcs.end(); - ++iter) { - - int const time = iter->first; - if(time >= 0) { - break; - } - iter->first = GetSimTime() + _sw_alloc_delay - 1; - - int const input = iter->second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = iter->second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - if(iter->second.second < -1) { - continue; - } - - assert(iter->second.second == -1); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert((cur_buf->GetState(vc) == VC::active) || - (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc))); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - - int const expanded_input = input * _input_speedup + vc % _input_speedup; - - int expanded_output = _sw_allocator->OutputAssigned(expanded_input); - - if(expanded_output >= 0) { - assert((expanded_output % _output_speedup) == (input % _output_speedup)); - int const granted_vc = _sw_allocator->ReadRequest(expanded_input, expanded_output); - if(granted_vc == vc) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Assigning output " << (expanded_output / _output_speedup) - << "." << (expanded_output % _output_speedup) - << " to VC " << vc - << " at input " << input - << "." << (vc % _input_speedup) - << "." << endl; - } - _sw_rr_offset[expanded_input] = (vc + _input_speedup) % _vcs; - iter->second.second = expanded_output; - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Switch allocation failed for VC " << vc - << " at input " << input - << ": Granted to VC " << granted_vc << "." << endl; - } - iter->second.second = STALL_CROSSBAR_CONFLICT; - } - } else if(_spec_sw_allocator) { - expanded_output = _spec_sw_allocator->OutputAssigned(expanded_input); - if(expanded_output >= 0) { - assert((expanded_output % _output_speedup) == (input % _output_speedup)); - if(_spec_mask_by_reqs && - _sw_allocator->OutputHasRequests(expanded_output)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding speculative grant for VC " << vc - << " at input " << input - << "." << (vc % _input_speedup) - << " because output " << (expanded_output / _output_speedup) - << "." << (expanded_output % _output_speedup) - << " has non-speculative requests." << endl; - } - iter->second.second = STALL_CROSSBAR_CONFLICT; - } else if(!_spec_mask_by_reqs && - (_sw_allocator->InputAssigned(expanded_output) >= 0)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding speculative grant for VC " << vc - << " at input " << input - << "." << (vc % _input_speedup) - << " because output " << (expanded_output / _output_speedup) - << "." << (expanded_output % _output_speedup) - << " has a non-speculative grant." << endl; - } - iter->second.second = STALL_CROSSBAR_CONFLICT; - } else { - int const granted_vc = _spec_sw_allocator->ReadRequest(expanded_input, - expanded_output); - if(granted_vc == vc) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Assigning output " << (expanded_output / _output_speedup) - << "." << (expanded_output % _output_speedup) - << " to VC " << vc - << " at input " << input - << "." << (vc % _input_speedup) - << "." << endl; - } - _sw_rr_offset[expanded_input] = (vc + _input_speedup) % _vcs; - iter->second.second = expanded_output; - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Switch allocation failed for VC " << vc - << " at input " << input - << ": Granted to VC " << granted_vc << "." << endl; - } - iter->second.second = STALL_CROSSBAR_CONFLICT; - } - } - } else { - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Switch allocation failed for VC " << vc - << " at input " << input - << ": No output granted." << endl; - } - - iter->second.second = STALL_CROSSBAR_CONFLICT; - - } - } else { - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Switch allocation failed for VC " << vc - << " at input " << input - << ": No output granted." << endl; - } - - iter->second.second = STALL_CROSSBAR_CONFLICT; - - } - } - - if(!_speculative && (_sw_alloc_delay <= 1)) { - return; - } - - for(deque<pair<int, pair<pair<int, int>, int> > >::iterator iter = _sw_alloc_vcs.begin(); - iter != _sw_alloc_vcs.end(); - ++iter) { - - int const time = iter->first; - assert(time >= 0); - if(GetSimTime() < time) { - break; - } - - assert(iter->second.second != -1); - - int const expanded_output = iter->second.second; - - if(expanded_output >= 0) { - - int const output = expanded_output / _output_speedup; - assert((output >= 0) && (output < _outputs)); - - BufferState const * const dest_buf = _next_buf[output]; - - int const input = iter->second.first.first; - assert((input >= 0) && (input < _inputs)); - assert((input % _output_speedup) == (expanded_output % _output_speedup)); - int const vc = iter->second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - int const expanded_input = input * _input_speedup + vc % _input_speedup; - assert(_switch_hold_vc[expanded_input] != vc); - - Buffer const * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert((cur_buf->GetState(vc) == VC::active) || - (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc))); - - Flit const * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - - if((_switch_hold_in[expanded_input] >= 0) || - (_switch_hold_out[expanded_output] >= 0)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding grant from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << " due to conflict with held connection at "; - if(_switch_hold_in[expanded_input] >= 0) { - *gWatchOut << "input"; - } - if((_switch_hold_in[expanded_input] >= 0) && - (_switch_hold_out[expanded_output] >= 0)) { - *gWatchOut << " and "; - } - if(_switch_hold_out[expanded_output] >= 0) { - *gWatchOut << "output"; - } - *gWatchOut << "." << endl; - } - iter->second.second = STALL_CROSSBAR_CONFLICT; - } else if(_speculative && (cur_buf->GetState(vc) == VC::vc_alloc)) { - - assert(f->head); - - if(_vc_allocator) { // separate VC and switch allocators - - int const input_and_vc = - _vc_shuffle_requests ? (vc*_inputs + input) : (input*_vcs + vc); - int const output_and_vc = _vc_allocator->OutputAssigned(input_and_vc); - - if(output_and_vc < 0) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding grant from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << " due to misspeculation." << endl; - } - iter->second.second = -1; // stall is counted in VC allocation path! - } else if((output_and_vc / _vcs) != output) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding grant from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << " due to port mismatch between VC and switch allocator." << endl; - } - iter->second.second = STALL_BUFFER_CONFLICT; // count this case as if we had failed allocation - } else if(dest_buf->IsFullFor((output_and_vc % _vcs))) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding grant from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << " due to lack of credit." << endl; - } - iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED; - } - - } else { // VC allocation is piggybacked onto switch allocation - - OutputSet const * const route_set = cur_buf->GetRouteSet(vc); - assert(route_set); - - set<OutputSet::sSetElement> const setlist = route_set->GetSet(); - - bool busy = true; - bool full = true; - bool reserved = false; - - assert(!_noq || (setlist.size() == 1)); - - for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin(); - iset != setlist.end(); - ++iset) { - if(iset->output_port == output) { - - int vc_start; - int vc_end; - - if(_noq && _noq_next_output_port[input][vc] >= 0) { - assert(!_routing_delay); - vc_start = _noq_next_vc_start[input][vc]; - vc_end = _noq_next_vc_end[input][vc]; - } else { - vc_start = iset->vc_start; - vc_end = iset->vc_end; - } - assert(vc_start >= 0 && vc_start < _vcs); - assert(vc_end >= 0 && vc_end < _vcs); - assert(vc_end >= vc_start); - - for(int out_vc = vc_start; out_vc <= vc_end; ++out_vc) { - assert((out_vc >= 0) && (out_vc < _vcs)); - if(dest_buf->IsAvailableFor(out_vc)) { - busy = false; - if(!dest_buf->IsFullFor(out_vc)) { - full = false; - break; - } else if(!dest_buf->IsFull()) { - reserved = true; - } - } - } - if(!full) { - break; - } - } - } - - if(busy) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding grant from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << " because no suitable output VC for piggyback allocation is available." << endl; - } - iter->second.second = STALL_BUFFER_BUSY; - } else if(full) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Discarding grant from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << " because all suitable output VCs for piggyback allocation are full." << endl; - } - iter->second.second = reserved ? STALL_BUFFER_RESERVED : STALL_BUFFER_FULL; - } - - } - - } else { - assert(cur_buf->GetOutputPort(vc) == output); - - int const match_vc = cur_buf->GetOutputVC(vc); - assert((match_vc >= 0) && (match_vc < _vcs)); - - if(dest_buf->IsFullFor(match_vc)) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Discarding grant from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << " due to lack of credit." << endl; - } - iter->second.second = dest_buf->IsFull() ? STALL_BUFFER_FULL : STALL_BUFFER_RESERVED; - } - } - } - } -} - -void IQRouter::_SWAllocUpdate( ) -{ - while(!_sw_alloc_vcs.empty()) { - - pair<int, pair<pair<int, int>, int> > const & item = _sw_alloc_vcs.front(); - - int const time = item.first; - if((time < 0) || (GetSimTime() < time)) { - break; - } - assert(GetSimTime() == time); - - int const input = item.second.first.first; - assert((input >= 0) && (input < _inputs)); - int const vc = item.second.first.second; - assert((vc >= 0) && (vc < _vcs)); - - Buffer * const cur_buf = _buf[input]; - assert(!cur_buf->Empty(vc)); - assert((cur_buf->GetState(vc) == VC::active) || - (_speculative && (cur_buf->GetState(vc) == VC::vc_alloc))); - - Flit * const f = cur_buf->FrontFlit(vc); - assert(f); - assert(f->vc == vc); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Completed switch allocation for VC " << vc - << " at input " << input - << " (front: " << f->id - << ")." << endl; - } - - int const expanded_output = item.second.second; - - if(expanded_output >= 0) { - - int const expanded_input = input * _input_speedup + vc % _input_speedup; - assert(_switch_hold_vc[expanded_input] < 0); - assert(_switch_hold_in[expanded_input] < 0); - assert(_switch_hold_out[expanded_output] < 0); - - int const output = expanded_output / _output_speedup; - assert((output >= 0) && (output < _outputs)); - - BufferState * const dest_buf = _next_buf[output]; - - int match_vc; - - if(!_vc_allocator && (cur_buf->GetState(vc) == VC::vc_alloc)) { - - assert(f->head); - - int const cl = f->cl; - assert((cl >= 0) && (cl < _classes)); - - int const vc_offset = _vc_rr_offset[output*_classes+cl]; - - match_vc = -1; - int match_prio = numeric_limits<int>::min(); - - const OutputSet * route_set = cur_buf->GetRouteSet(vc); - set<OutputSet::sSetElement> const setlist = route_set->GetSet(); - - assert(!_noq || (setlist.size() == 1)); - - for(set<OutputSet::sSetElement>::const_iterator iset = setlist.begin(); - iset != setlist.end(); - ++iset) { - if(iset->output_port == output) { - - int vc_start; - int vc_end; - - if(_noq && _noq_next_output_port[input][vc] >= 0) { - assert(!_routing_delay); - vc_start = _noq_next_vc_start[input][vc]; - vc_end = _noq_next_vc_end[input][vc]; - } else { - vc_start = iset->vc_start; - vc_end = iset->vc_end; - } - assert(vc_start >= 0 && vc_start < _vcs); - assert(vc_end >= 0 && vc_end < _vcs); - assert(vc_end >= vc_start); - - for(int out_vc = vc_start; out_vc <= vc_end; ++out_vc) { - assert((out_vc >= 0) && (out_vc < _vcs)); - - int vc_prio = iset->pri; - if(_vc_prioritize_empty && !dest_buf->IsEmptyFor(out_vc)) { - assert(vc_prio >= 0); - vc_prio += numeric_limits<int>::min(); - } - - // FIXME: This check should probably be performed in Evaluate(), - // not Update(), as the latter can cause the outcome to depend on - // the order of evaluation! - if(dest_buf->IsAvailableFor(out_vc) && - !dest_buf->IsFullFor(out_vc) && - ((match_vc < 0) || - RoundRobinArbiter::Supersedes(out_vc, vc_prio, - match_vc, match_prio, - vc_offset, _vcs))) { - match_vc = out_vc; - match_prio = vc_prio; - } - } - } - } - assert(match_vc >= 0); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Allocating VC " << match_vc - << " at output " << output - << " via piggyback VC allocation." << endl; - } - - cur_buf->SetState(vc, VC::active); - cur_buf->SetOutput(vc, output, match_vc); - dest_buf->TakeBuffer(match_vc, input*_vcs + vc); - - _vc_rr_offset[output*_classes+cl] = (match_vc + 1) % _vcs; - - } else { - - assert(cur_buf->GetOutputPort(vc) == output); - - match_vc = cur_buf->GetOutputVC(vc); - - } - assert((match_vc >= 0) && (match_vc < _vcs)); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " Scheduling switch connection from input " << input - << "." << (vc % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << "." << endl; - } - - cur_buf->RemoveFlit(vc); - -#ifdef TRACK_FLOWS - --_stored_flits[f->cl][input]; - if(f->tail) --_active_packets[f->cl][input]; -#endif - - _bufferMonitor->read(input, f) ; - - f->hops++; - f->vc = match_vc; - - if(!_routing_delay && f->head) { - const FlitChannel * channel = _output_channels[output]; - const Router * router = channel->GetSink(); - if(router) { - if(_noq) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Updating lookahead routing information for flit " << f->id - << " (NOQ)." << endl; - } - int next_output_port = _noq_next_output_port[input][vc]; - assert(next_output_port >= 0); - _noq_next_output_port[input][vc] = -1; - int next_vc_start = _noq_next_vc_start[input][vc]; - assert(next_vc_start >= 0 && next_vc_start < _vcs); - _noq_next_vc_start[input][vc] = -1; - int next_vc_end = _noq_next_vc_end[input][vc]; - assert(next_vc_end >= 0 && next_vc_end < _vcs); - _noq_next_vc_end[input][vc] = -1; - f->la_route_set.Clear(); - f->la_route_set.AddRange(next_output_port, next_vc_start, next_vc_end); - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Updating lookahead routing information for flit " << f->id - << "." << endl; - } - int in_channel = channel->GetSinkPort(); - _rf(router, f, in_channel, &f->la_route_set, false); - } - } else { - f->la_route_set.Clear(); - } - } - -#ifdef TRACK_FLOWS - ++_outstanding_credits[f->cl][output]; - _outstanding_classes[output][f->vc].push(f->cl); -#endif - - dest_buf->SendingFlit(f); - - _crossbar_flits.push_back(make_pair(-1, make_pair(f, make_pair(expanded_input, expanded_output)))); - - if(_out_queue_credits.count(input) == 0) { - _out_queue_credits.insert(make_pair(input, Credit::New())); - } - _out_queue_credits.find(input)->second->vc.insert(vc); - - if(cur_buf->Empty(vc)) { - if(f->tail) { - cur_buf->SetState(vc, VC::idle); - } - } else { - Flit * const nf = cur_buf->FrontFlit(vc); - assert(nf); - assert(nf->vc == vc); - if(f->tail) { - assert(nf->head); - if(_routing_delay) { - cur_buf->SetState(vc, VC::routing); - _route_vcs.push_back(make_pair(-1, item.second.first)); - } else { - if(nf->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Using precomputed lookahead routing information for VC " << vc - << " at input " << input - << " (front: " << nf->id - << ")." << endl; - } - cur_buf->SetRouteSet(vc, &nf->la_route_set); - cur_buf->SetState(vc, VC::vc_alloc); - if(_speculative) { - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } - if(_vc_allocator) { - _vc_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } - if(_noq) { - _UpdateNOQ(input, vc, nf); - } - } - } else { - if(_hold_switch_for_packet) { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Setting up switch hold for VC " << vc - << " at input " << input - << "." << (expanded_input % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << "." << endl; - } - _switch_hold_vc[expanded_input] = vc; - _switch_hold_in[expanded_input] = expanded_output; - _switch_hold_out[expanded_output] = expanded_input; - _sw_hold_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } else { - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, - -1))); - } - } - } - } else { - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << " No output port allocated." << endl; - } - -#ifdef TRACK_STALLS - assert((expanded_output == -1) || // for stalls that are accounted for in VC allocation path - (expanded_output == STALL_BUFFER_BUSY) || - (expanded_output == STALL_BUFFER_CONFLICT) || - (expanded_output == STALL_BUFFER_FULL) || - (expanded_output == STALL_BUFFER_RESERVED) || - (expanded_output == STALL_CROSSBAR_CONFLICT)); - if(expanded_output == STALL_BUFFER_BUSY) { - ++_buffer_busy_stalls[f->cl]; - } else if(expanded_output == STALL_BUFFER_CONFLICT) { - ++_buffer_conflict_stalls[f->cl]; - } else if(expanded_output == STALL_BUFFER_FULL) { - ++_buffer_full_stalls[f->cl]; - } else if(expanded_output == STALL_BUFFER_RESERVED) { - ++_buffer_reserved_stalls[f->cl]; - } else if(expanded_output == STALL_CROSSBAR_CONFLICT) { - ++_crossbar_conflict_stalls[f->cl]; - } -#endif - - _sw_alloc_vcs.push_back(make_pair(-1, make_pair(item.second.first, -1))); - } - _sw_alloc_vcs.pop_front(); - } -} - - -//------------------------------------------------------------------------------ -// switch traversal -//------------------------------------------------------------------------------ - -void IQRouter::_SwitchEvaluate( ) -{ - for(deque<pair<int, pair<Flit *, pair<int, int> > > >::iterator iter = _crossbar_flits.begin(); - iter != _crossbar_flits.end(); - ++iter) { - - int const time = iter->first; - if(time >= 0) { - break; - } - iter->first = GetSimTime() + _crossbar_delay - 1; - - Flit const * const f = iter->second.first; - assert(f); - - int const expanded_input = iter->second.second.first; - int const expanded_output = iter->second.second.second; - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Beginning crossbar traversal for flit " << f->id - << " from input " << (expanded_input / _input_speedup) - << "." << (expanded_input % _input_speedup) - << " to output " << (expanded_output / _output_speedup) - << "." << (expanded_output % _output_speedup) - << "." << endl; - } - } -} - -void IQRouter::_SwitchUpdate( ) -{ - while(!_crossbar_flits.empty()) { - - pair<int, pair<Flit *, pair<int, int> > > const & item = _crossbar_flits.front(); - - int const time = item.first; - if((time < 0) || (GetSimTime() < time)) { - break; - } - assert(GetSimTime() == time); - - Flit * const f = item.second.first; - assert(f); - - int const expanded_input = item.second.second.first; - int const input = expanded_input / _input_speedup; - assert((input >= 0) && (input < _inputs)); - int const expanded_output = item.second.second.second; - int const output = expanded_output / _output_speedup; - assert((output >= 0) && (output < _outputs)); - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Completed crossbar traversal for flit " << f->id - << " from input " << input - << "." << (expanded_input % _input_speedup) - << " to output " << output - << "." << (expanded_output % _output_speedup) - << "." << endl; - } - _switchMonitor->traversal(input, output, f) ; - - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Buffering flit " << f->id - << " at output " << output - << "." << endl; - } - _output_buffer[output].push(f); - //the output buffer size isn't precise due to flits in flight - //but there is a maximum bound based on output speed up and ST traversal - assert(_output_buffer[output].size()<=(size_t)_output_buffer_size+ _crossbar_delay* _output_speedup+( _output_speedup-1) ||_output_buffer_size==-1); - _crossbar_flits.pop_front(); - } -} - - -//------------------------------------------------------------------------------ -// output queuing -//------------------------------------------------------------------------------ - -void IQRouter::_OutputQueuing( ) -{ - for(map<int, Credit *>::const_iterator iter = _out_queue_credits.begin(); - iter != _out_queue_credits.end(); - ++iter) { - - int const input = iter->first; - assert((input >= 0) && (input < _inputs)); - - Credit * const c = iter->second; - assert(c); - assert(!c->vc.empty()); - - _credit_buffer[input].push(c); - } - _out_queue_credits.clear(); -} - -//------------------------------------------------------------------------------ -// write outputs -//------------------------------------------------------------------------------ - -void IQRouter::_SendFlits( ) -{ - for ( int output = 0; output < _outputs; ++output ) { - if ( !_output_buffer[output].empty( ) ) { - Flit * const f = _output_buffer[output].front( ); - assert(f); - _output_buffer[output].pop( ); - -#ifdef TRACK_FLOWS - ++_sent_flits[f->cl][output]; -#endif - - if(f->watch) - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Sending flit " << f->id - << " to channel at output " << output - << "." << endl; - if(gTrace) { - cout << "Outport " << output << endl << "Stop Mark" << endl; - } - _output_channels[output]->Send( f ); - } - } -} - -void IQRouter::_SendCredits( ) -{ - for ( int input = 0; input < _inputs; ++input ) { - if ( !_credit_buffer[input].empty( ) ) { - Credit * const c = _credit_buffer[input].front( ); - assert(c); - _credit_buffer[input].pop( ); - _input_credits[input]->Send( c ); - } - } -} - - -//------------------------------------------------------------------------------ -// misc. -//------------------------------------------------------------------------------ - -void IQRouter::Display( ostream & os ) const -{ - for ( int input = 0; input < _inputs; ++input ) { - _buf[input]->Display( os ); - } -} - -int IQRouter::GetUsedCredit(int o) const -{ - assert((o >= 0) && (o < _outputs)); - BufferState const * const dest_buf = _next_buf[o]; - return dest_buf->Occupancy(); -} - -int IQRouter::GetBufferOccupancy(int i) const { - assert(i >= 0 && i < _inputs); - return _buf[i]->GetOccupancy(); -} - -#ifdef TRACK_BUFFERS -int IQRouter::GetUsedCreditForClass(int output, int cl) const -{ - assert((output >= 0) && (output < _outputs)); - BufferState const * const dest_buf = _next_buf[output]; - return dest_buf->OccupancyForClass(cl); -} - -int IQRouter::GetBufferOccupancyForClass(int input, int cl) const -{ - assert((input >= 0) && (input < _inputs)); - return _buf[input]->GetOccupancyForClass(cl); -} -#endif - -vector<int> IQRouter::UsedCredits() const -{ - vector<int> result(_outputs*_vcs); - for(int o = 0; o < _outputs; ++o) { - for(int v = 0; v < _vcs; ++v) { - result[o*_vcs+v] = _next_buf[o]->OccupancyFor(v); - } - } - return result; -} - -vector<int> IQRouter::FreeCredits() const -{ - vector<int> result(_outputs*_vcs); - for(int o = 0; o < _outputs; ++o) { - for(int v = 0; v < _vcs; ++v) { - result[o*_vcs+v] = _next_buf[o]->AvailableFor(v); - } - } - return result; -} - -vector<int> IQRouter::MaxCredits() const -{ - vector<int> result(_outputs*_vcs); - for(int o = 0; o < _outputs; ++o) { - for(int v = 0; v < _vcs; ++v) { - result[o*_vcs+v] = _next_buf[o]->LimitFor(v); - } - } - return result; -} - -void IQRouter::_UpdateNOQ(int input, int vc, Flit const * f) { - assert(!_routing_delay); - assert(f); - assert(f->vc == vc); - assert(f->head); - set<OutputSet::sSetElement> sl = f->la_route_set.GetSet(); - assert(sl.size() == 1); - int out_port = sl.begin()->output_port; - const FlitChannel * channel = _output_channels[out_port]; - const Router * router = channel->GetSink(); - if(router) { - int in_channel = channel->GetSinkPort(); - OutputSet nos; - _rf(router, f, in_channel, &nos, false); - sl = nos.GetSet(); - assert(sl.size() == 1); - OutputSet::sSetElement const & se = *sl.begin(); - int next_output_port = se.output_port; - assert(next_output_port >= 0); - assert(_noq_next_output_port[input][vc] < 0); - _noq_next_output_port[input][vc] = next_output_port; - int next_vc_count = (se.vc_end - se.vc_start + 1) / router->NumOutputs(); - int next_vc_start = se.vc_start + next_output_port * next_vc_count; - assert(next_vc_start >= 0 && next_vc_start < _vcs); - assert(_noq_next_vc_start[input][vc] < 0); - _noq_next_vc_start[input][vc] = next_vc_start; - int next_vc_end = se.vc_start + (next_output_port + 1) * next_vc_count - 1; - assert(next_vc_end >= 0 && next_vc_end < _vcs); - assert(_noq_next_vc_end[input][vc] < 0); - _noq_next_vc_end[input][vc] = next_vc_end; - assert(next_vc_start <= next_vc_end); - if(f->watch) { - *gWatchOut << GetSimTime() << " | " << FullName() << " | " - << "Computing lookahead routing information for flit " << f->id - << " (NOQ)." << endl; - } - } -} diff --git a/src/intersim2/.svn/pristine/f9/f9cf31dbae18e4e1930dc0632175d9c420d3c067.svn-base b/src/intersim2/.svn/pristine/f9/f9cf31dbae18e4e1930dc0632175d9c420d3c067.svn-base deleted file mode 100644 index d58d4a1..0000000 --- a/src/intersim2/.svn/pristine/f9/f9cf31dbae18e4e1930dc0632175d9c420d3c067.svn-base +++ /dev/null @@ -1,107 +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. -*/ - -/*flit.cpp - * - *flit struct is a flit, carries all the control signals that a flit needs - *Add additional signals as necessary. Flits has no concept of length - *it is a singluar object. - * - *When adding objects make sure to set a default value in this constructor - */ - -#include "booksim.hpp" -#include "flit.hpp" - -stack<Flit *> Flit::_all; -stack<Flit *> Flit::_free; - -ostream& operator<<( ostream& os, const Flit& f ) -{ - os << " Flit ID: " << f.id << " (" << &f << ")" - << " Packet ID: " << f.pid - << " Type: " << f.type - << " Head: " << f.head - << " Tail: " << f.tail << endl; - os << " Source: " << f.src << " Dest: " << f.dest << " Intm: "<<f.intm<<endl; - os << " Creation time: " << f.ctime << " Injection time: " << f.itime << " Arrival time: " << f.atime << " Phase: "<<f.ph<< endl; - os << " VC: " << f.vc << endl; - return os; -} - -Flit::Flit() -{ - Reset(); -} - -void Flit::Reset() -{ - type = ANY_TYPE ; - vc = -1 ; - cl = -1 ; - head = false ; - tail = false ; - ctime = -1 ; - itime = -1 ; - atime = -1 ; - id = -1 ; - pid = -1 ; - hops = 0 ; - watch = false ; - record = false ; - intm = 0; - src = -1; - dest = -1; - pri = 0; - intm =-1; - ph = -1; - data = 0; -} - -Flit * Flit::New() { - Flit * f; - if(_free.empty()) { - f = new Flit; - _all.push(f); - } else { - f = _free.top(); - f->Reset(); - _free.pop(); - } - return f; -} - -void Flit::Free() { - _free.push(this); -} - -void Flit::FreeAll() { - while(!_all.empty()) { - delete _all.top(); - _all.pop(); - } -} diff --git a/src/intersim2/.svn/pristine/f9/f9ef776d4727c7e2a1e057f5839da76e854ccae5.svn-base b/src/intersim2/.svn/pristine/f9/f9ef776d4727c7e2a1e057f5839da76e854ccae5.svn-base deleted file mode 100644 index 024104e..0000000 --- a/src/intersim2/.svn/pristine/f9/f9ef776d4727c7e2a1e057f5839da76e854ccae5.svn-base +++ /dev/null @@ -1,40 +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. - -//simple 8X8 torus under injection mode - - -// Topology -topology = torus; -k = 8; -n = 2; -// Routing -routing_function = dim_order; -// Flow control -num_vcs = 2; -// Traffic -traffic = uniform; -injection_rate = 0.15; diff --git a/src/intersim2/.svn/pristine/fa/fad571d200d6232ee119a96b2ae1820f3d6903fa.svn-base b/src/intersim2/.svn/pristine/fa/fad571d200d6232ee119a96b2ae1820f3d6903fa.svn-base deleted file mode 100644 index 174d030..0000000 --- a/src/intersim2/.svn/pristine/fa/fad571d200d6232ee119a96b2ae1820f3d6903fa.svn-base +++ /dev/null @@ -1,676 +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. -*/ - -/*buffer_state.cpp - * - * This class is the buffere state of the next router down the channel - * tracks the credit and how much of the buffer is in use - */ - -#include <iostream> -#include <sstream> -#include <cstdlib> -#include <cassert> -#include <limits> - -#include "booksim.hpp" -#include "buffer_state.hpp" -#include "random_utils.hpp" -#include "globals.hpp" - -//#define DEBUG_FEEDBACK -//#define DEBUG_SIMPLEFEEDBACK - -BufferState::BufferPolicy::BufferPolicy(Configuration const & config, BufferState * parent, const string & name) -: Module(parent, name), _buffer_state(parent) -{ -} - -void BufferState::BufferPolicy::TakeBuffer(int vc) { -} - -void BufferState::BufferPolicy::SendingFlit(Flit const * const f) { -} - -void BufferState::BufferPolicy::FreeSlotFor(int vc) { -} - -BufferState::BufferPolicy * BufferState::BufferPolicy::New(Configuration const & config, BufferState * parent, const string & name) -{ - BufferPolicy * sp = NULL; - string buffer_policy = config.GetStr("buffer_policy"); - if(buffer_policy == "private") { - sp = new PrivateBufferPolicy(config, parent, name); - } else if(buffer_policy == "shared") { - sp = new SharedBufferPolicy(config, parent, name); - } else if(buffer_policy == "limited") { - sp = new LimitedSharedBufferPolicy(config, parent, name); - } else if(buffer_policy == "dynamic") { - sp = new DynamicLimitedSharedBufferPolicy(config, parent, name); - } else if(buffer_policy == "shifting") { - sp = new ShiftingDynamicLimitedSharedBufferPolicy(config, parent, name); - } else if(buffer_policy == "feedback") { - sp = new FeedbackSharedBufferPolicy(config, parent, name); - } else if(buffer_policy == "simplefeedback") { - sp = new SimpleFeedbackSharedBufferPolicy(config, parent, name); - } else { - cout << "Unknown buffer policy: " << buffer_policy << endl; - } - return sp; -} - -BufferState::PrivateBufferPolicy::PrivateBufferPolicy(Configuration const & config, BufferState * parent, const string & name) - : BufferPolicy(config, parent, name) -{ - int const vcs = config.GetInt( "num_vcs" ); - int const buf_size = config.GetInt("buf_size"); - if(buf_size <= 0) { - _vc_buf_size = config.GetInt("vc_buf_size"); - } else { - _vc_buf_size = buf_size / vcs; - } - assert(_vc_buf_size > 0); -} - -void BufferState::PrivateBufferPolicy::SendingFlit(Flit const * const f) -{ - int const vc = f->vc; - if(_buffer_state->OccupancyFor(vc) > _vc_buf_size) { - ostringstream err; - err << "Buffer overflow for VC " << vc; - Error(err.str()); - } -} - -bool BufferState::PrivateBufferPolicy::IsFullFor(int vc) const -{ - return (_buffer_state->OccupancyFor(vc) >= _vc_buf_size); -} - -int BufferState::PrivateBufferPolicy::AvailableFor(int vc) const -{ - return _vc_buf_size - _buffer_state->OccupancyFor(vc); -} - -int BufferState::PrivateBufferPolicy::LimitFor(int vc) const -{ - return _vc_buf_size; -} - -BufferState::SharedBufferPolicy::SharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name) - : BufferPolicy(config, parent, name), _shared_buf_occupancy(0) -{ - int const vcs = config.GetInt( "num_vcs" ); - int num_private_bufs = config.GetInt("private_bufs"); - if(num_private_bufs < 0) { - num_private_bufs = vcs; - } else if(num_private_bufs == 0) { - num_private_bufs = 1; - } - - _private_buf_occupancy.resize(num_private_bufs, 0); - - _buf_size = config.GetInt("buf_size"); - if(_buf_size < 0) { - _buf_size = vcs * config.GetInt("vc_buf_size"); - } - - _private_buf_size = config.GetIntArray("private_buf_size"); - if(_private_buf_size.empty()) { - int const bs = config.GetInt("private_buf_size"); - if(bs < 0) { - _private_buf_size.push_back(_buf_size / num_private_bufs); - } else { - _private_buf_size.push_back(bs); - } - } - _private_buf_size.resize(num_private_bufs, _private_buf_size.back()); - - vector<int> start_vc = config.GetIntArray("private_buf_start_vc"); - if(start_vc.empty()) { - int const sv = config.GetInt("private_buf_start_vc"); - if(sv < 0) { - start_vc.resize(num_private_bufs); - for(int i = 0; i < num_private_bufs; ++i) { - start_vc[i] = i * vcs / num_private_bufs; - } - } else { - start_vc.push_back(sv); - } - } - - vector<int> end_vc = config.GetIntArray("private_buf_end_vc"); - if(end_vc.empty()) { - int const ev = config.GetInt("private_buf_end_vc"); - if(ev < 0) { - end_vc.resize(num_private_bufs); - for(int i = 0; i < num_private_bufs; ++i) { - end_vc[i] = (i + 1) * vcs / num_private_bufs - 1; - } - } else { - end_vc.push_back(ev); - } - } - - _private_buf_vc_map.resize(vcs, -1); - _shared_buf_size = _buf_size; - for(int i = 0; i < num_private_bufs; ++i) { - _shared_buf_size -= _private_buf_size[i]; - assert(start_vc[i] <= end_vc[i]); - for(int v = start_vc[i]; v <= end_vc[i]; ++v) { - assert(_private_buf_vc_map[v] < 0); - _private_buf_vc_map[v] = i; - } - } - assert(_shared_buf_size >= 0); - - _reserved_slots.resize(vcs, 0); -} - -void BufferState::SharedBufferPolicy::ProcessFreeSlot(int vc) -{ - int i = _private_buf_vc_map[vc]; - --_private_buf_occupancy[i]; - if(_private_buf_occupancy[i] < 0) { - ostringstream err; - err << "Private buffer occupancy fell below zero for buffer " << i; - Error(err.str()); - } else if(_private_buf_occupancy[i] >= _private_buf_size[i]) { - --_shared_buf_occupancy; - if(_shared_buf_occupancy < 0) { - Error("Shared buffer occupancy fell below zero."); - } - } -} - -void BufferState::SharedBufferPolicy::SendingFlit(Flit const * const f) -{ - int const vc = f->vc; - if(_reserved_slots[vc] > 0) { - --_reserved_slots[vc]; - } else { - int i = _private_buf_vc_map[vc]; - ++_private_buf_occupancy[i]; - if(_private_buf_occupancy[i] > _private_buf_size[i]) { - ++_shared_buf_occupancy; - if(_shared_buf_occupancy > _shared_buf_size) { - Error("Shared buffer overflow."); - } - } - } - if(f->tail) { - while(_reserved_slots[vc]) { - --_reserved_slots[vc]; - ProcessFreeSlot(vc); - } - } -} - -void BufferState::SharedBufferPolicy::FreeSlotFor(int vc) -{ - if(!_buffer_state->IsAvailableFor(vc) && _buffer_state->IsEmptyFor(vc)) { - ++_reserved_slots[vc]; - } else { - ProcessFreeSlot(vc); - } -} - -bool BufferState::SharedBufferPolicy::IsFullFor(int vc) const -{ - int i = _private_buf_vc_map[vc]; - return ((_reserved_slots[vc] == 0) && - (_private_buf_occupancy[i] >= _private_buf_size[i]) && - (_shared_buf_occupancy >= _shared_buf_size)); -} - -int BufferState::SharedBufferPolicy::AvailableFor(int vc) const -{ - int i = _private_buf_vc_map[vc]; - return (_reserved_slots[vc] + - max(_private_buf_size[i] - _private_buf_occupancy[i], 0) + - (_shared_buf_size - _shared_buf_occupancy)); -} - -int BufferState::SharedBufferPolicy::LimitFor(int vc) const -{ - int i = _private_buf_vc_map[vc]; - return (_private_buf_size[i] + _shared_buf_size); -} - -BufferState::LimitedSharedBufferPolicy::LimitedSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name) - : SharedBufferPolicy(config, parent, name), _active_vcs(0) -{ - _vcs = config.GetInt("num_vcs"); - _max_held_slots = config.GetInt("max_held_slots"); - if(_max_held_slots < 0) { - _max_held_slots = _buf_size; - } -} - -void BufferState::LimitedSharedBufferPolicy::TakeBuffer(int vc) -{ - ++_active_vcs; - if(_active_vcs > _vcs) { - Error("Number of active VCs is too large."); - } -} - -void BufferState::LimitedSharedBufferPolicy::SendingFlit(Flit const * const f) -{ - SharedBufferPolicy::SendingFlit(f); - if(f->tail) { - --_active_vcs; - if(_active_vcs < 0) { - Error("Number of active VCs fell below zero."); - } - } -} - -bool BufferState::LimitedSharedBufferPolicy::IsFullFor(int vc) const -{ - return (SharedBufferPolicy::IsFullFor(vc) || - (_buffer_state->OccupancyFor(vc) >= _max_held_slots)); -} - -int BufferState::LimitedSharedBufferPolicy::AvailableFor(int vc) const -{ - return min(SharedBufferPolicy::AvailableFor(vc), - _max_held_slots - _buffer_state->OccupancyFor(vc)); -} - -int BufferState::LimitedSharedBufferPolicy::LimitFor(int vc) const -{ - return min(SharedBufferPolicy::LimitFor(vc), _max_held_slots); -} - -BufferState::DynamicLimitedSharedBufferPolicy::DynamicLimitedSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name) - : LimitedSharedBufferPolicy(config, parent, name) -{ - _max_held_slots = _buf_size; -} - -void BufferState::DynamicLimitedSharedBufferPolicy::TakeBuffer(int vc) -{ - LimitedSharedBufferPolicy::TakeBuffer(vc); - assert(_active_vcs > 0); - _max_held_slots = _buf_size / _active_vcs; - assert(_max_held_slots > 0); -} - -void BufferState::DynamicLimitedSharedBufferPolicy::SendingFlit(Flit const * const f) -{ - LimitedSharedBufferPolicy::SendingFlit(f); - if(f->tail && _active_vcs) { - _max_held_slots = _buf_size / _active_vcs; - } - assert(_max_held_slots > 0); -} - -BufferState::ShiftingDynamicLimitedSharedBufferPolicy::ShiftingDynamicLimitedSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name) - : DynamicLimitedSharedBufferPolicy(config, parent, name) -{ - -} - -void BufferState::ShiftingDynamicLimitedSharedBufferPolicy::TakeBuffer(int vc) -{ - LimitedSharedBufferPolicy::TakeBuffer(vc); - assert(_active_vcs); - int i = _active_vcs - 1; - _max_held_slots = _buf_size; - while(i) { - _max_held_slots >>= 1; - i >>= 1; - } - assert(_max_held_slots > 0); -} - -void BufferState::ShiftingDynamicLimitedSharedBufferPolicy::SendingFlit(Flit const * const f) -{ - LimitedSharedBufferPolicy::SendingFlit(f); - if(f->tail && _active_vcs) { - int i = _active_vcs - 1; - _max_held_slots = _buf_size; - while(i) { - _max_held_slots >>= 1; - i >>= 1; - } - } - assert(_max_held_slots > 0); -} - -BufferState::FeedbackSharedBufferPolicy::FeedbackSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name) - : SharedBufferPolicy(config, parent, name) -{ - _aging_scale = config.GetInt("feedback_aging_scale"); - _offset = config.GetInt("feedback_offset"); - _vcs = config.GetInt("num_vcs"); - - _occupancy_limit.resize(_vcs, _buf_size); - _round_trip_time.resize(_vcs, -1); - _flit_sent_time.resize(_vcs); - _total_mapped_size = _buf_size * _vcs; - _min_latency = -1; -} - -void BufferState::FeedbackSharedBufferPolicy::SetMinLatency(int min_latency) -{ -#ifdef DEBUG_FEEDBACK - cerr << FullName() << ": Setting minimum latency to " - << min_latency << "." << endl; -#endif - _min_latency = min_latency; -} - -void BufferState::FeedbackSharedBufferPolicy::SendingFlit(Flit const * const f) -{ - SharedBufferPolicy::SendingFlit(f); - _flit_sent_time[f->vc].push(GetSimTime()); -} - -int BufferState::FeedbackSharedBufferPolicy::_ComputeRTT(int vc, int last_rtt) const -{ - // compute moving average of round-trip time - int rtt = _round_trip_time[vc]; - if(rtt < 0) { - return last_rtt; - } - return ((rtt << _aging_scale) + last_rtt - rtt) >> _aging_scale; -} - -int BufferState::FeedbackSharedBufferPolicy::_ComputeLimit(int rtt) const -{ - // for every cycle that the measured average round trip time exceeded the - // observed minimum round trip time, reduce buffer occupancy limit by one - assert(_min_latency >= 0); - return max((_min_latency << 1) - rtt + _offset, 1); -} - -int BufferState::FeedbackSharedBufferPolicy::_ComputeMaxSlots(int vc) const -{ - int max_slots = _occupancy_limit[vc]; - if(!_flit_sent_time[vc].empty()) { - int min_rtt = GetSimTime() - _flit_sent_time[vc].front(); - int rtt = _ComputeRTT(vc, min_rtt); - int limit = _ComputeLimit(rtt); - max_slots = min(max_slots, limit); - } - return max_slots; -} - -void BufferState::FeedbackSharedBufferPolicy::FreeSlotFor(int vc) -{ - SharedBufferPolicy::FreeSlotFor(vc); - assert(!_flit_sent_time[vc].empty()); - int const last_rtt = GetSimTime() - _flit_sent_time[vc].front(); -#ifdef DEBUG_FEEDBACK - cerr << FullName() << ": Probe for VC " - << vc << " came back after " - << last_rtt << " cycles." - << endl; -#endif - _flit_sent_time[vc].pop(); - - int rtt = _ComputeRTT(vc, last_rtt); -#ifdef DEBUG_FEEDBACK - int old_rtt = _round_trip_time[vc]; - if(rtt != old_rtt) { - cerr << FullName() << ": Updating RTT estimate for VC " - << vc << " from " - << old_rtt << " to " - << rtt << " cycles." - << endl; - } -#endif - _round_trip_time[vc] = rtt; - - int limit = _ComputeLimit(rtt); -#ifdef DEBUG_FEEDBACK - int old_limit = _occupancy_limit[vc]; - int old_mapped_size = _total_mapped_size; -#endif - _total_mapped_size += (limit - _occupancy_limit[vc]); - _occupancy_limit[vc] = limit; -#ifdef DEBUG_FEEDBACK - if(limit != old_limit) { - cerr << FullName() << ": Occupancy limit for VC " - << vc << " changed from " - << old_limit << " to " - << limit << " slots." - << endl; - cerr << FullName() << ": Total mapped buffer space changed from " - << old_mapped_size << " to " - << _total_mapped_size << " slots." - << endl; - } -#endif -} - -bool BufferState::FeedbackSharedBufferPolicy::IsFullFor(int vc) const -{ - if(SharedBufferPolicy::IsFullFor(vc)) { - return true; - } - return (_buffer_state->OccupancyFor(vc) >= _ComputeMaxSlots(vc)); -} - -int BufferState::FeedbackSharedBufferPolicy::AvailableFor(int vc) const -{ - return min(SharedBufferPolicy::AvailableFor(vc), - _ComputeMaxSlots(vc) - _buffer_state->OccupancyFor(vc)); -} - -int BufferState::FeedbackSharedBufferPolicy::LimitFor(int vc) const -{ - return min(SharedBufferPolicy::LimitFor(vc), _ComputeMaxSlots(vc)); -} - -BufferState::SimpleFeedbackSharedBufferPolicy::SimpleFeedbackSharedBufferPolicy(Configuration const & config, BufferState * parent, const string & name) - : FeedbackSharedBufferPolicy(config, parent, name) -{ - _pending_credits.resize(_vcs, 0); -} - -void BufferState::SimpleFeedbackSharedBufferPolicy::SendingFlit(Flit const * const f) -{ - int const & vc = f->vc; - if(_flit_sent_time[vc].empty()) { - assert(_buffer_state->OccupancyFor(vc) > 0); - _pending_credits[vc] = _buffer_state->OccupancyFor(vc) - 1; -#ifdef DEBUG_SIMPLEFEEDBACK - cerr << FullName() << ": Sending probe flit for VC " - << vc << "; " - << _pending_credits[vc] << " non-probe flits in flight." - << endl; -#endif - FeedbackSharedBufferPolicy::SendingFlit(f); - return; - } - SharedBufferPolicy::SendingFlit(f); -} - -void BufferState::SimpleFeedbackSharedBufferPolicy::FreeSlotFor(int vc) -{ - if(!_flit_sent_time[vc].empty() && _pending_credits[vc] == 0) { -#ifdef DEBUG_SIMPLEFEEDBACK - cerr << FullName() << ": Probe credit for VC " - << vc << " came back." << endl; -#endif - FeedbackSharedBufferPolicy::FreeSlotFor(vc); - return; - } - if(_pending_credits[vc] > 0) { - assert(!_flit_sent_time[vc].empty()); - --_pending_credits[vc]; -#ifdef DEBUG_SIMPLEFEEDBACK - cerr << FullName() << ": Ignoring non-probe credit for VC " - << vc << "; " - << _pending_credits[vc] << " remaining." - << endl; -#endif - } - SharedBufferPolicy::FreeSlotFor(vc); -} - -BufferState::BufferState( const Configuration& config, Module *parent, const string& name ) : - Module( parent, name ), _occupancy(0) -{ - _vcs = config.GetInt( "num_vcs" ); - _size = config.GetInt("buf_size"); - if(_size < 0) { - _size = _vcs * config.GetInt("vc_buf_size"); - } - - _buffer_policy = BufferPolicy::New(config, this, "policy"); - - _wait_for_tail_credit = config.GetInt( "wait_for_tail_credit" ); - - _vc_occupancy.resize(_vcs, 0); - - _in_use_by.resize(_vcs, -1); - _tail_sent.resize(_vcs, false); - - _last_id.resize(_vcs, -1); - _last_pid.resize(_vcs, -1); - -#ifdef TRACK_BUFFERS - _classes = config.GetInt("classes"); - _outstanding_classes.resize(_vcs); - _class_occupancy.resize(_classes, 0); -#endif -} - -BufferState::~BufferState() -{ - delete _buffer_policy; -} - -void BufferState::ProcessCredit( Credit const * const c ) -{ - assert( c ); - - set<int>::iterator iter = c->vc.begin(); - while(iter != c->vc.end()) { - - int const vc = *iter; - - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - - if ( ( _wait_for_tail_credit ) && - ( _in_use_by[vc] < 0 ) ) { - ostringstream err; - err << "Received credit for idle VC " << vc; - Error( err.str() ); - } - --_occupancy; - if(_occupancy < 0) { - Error("Buffer occupancy fell below zero."); - } - --_vc_occupancy[vc]; - if(_vc_occupancy[vc] < 0) { - ostringstream err; - err << "Buffer occupancy fell below zero for VC " << vc; - Error(err.str()); - } - if(_wait_for_tail_credit && !_vc_occupancy[vc] && _tail_sent[vc]) { - assert(_in_use_by[vc] >= 0); - _in_use_by[vc] = -1; - } - -#ifdef TRACK_BUFFERS - assert(!_outstanding_classes[vc].empty()); - int cl = _outstanding_classes[vc].front(); - _outstanding_classes[vc].pop(); - assert((cl >= 0) && (cl < _classes)); - assert(_class_occupancy[cl] > 0); - --_class_occupancy[cl]; -#endif - - _buffer_policy->FreeSlotFor(vc); - - ++iter; - } -} - - -void BufferState::SendingFlit( Flit const * const f ) -{ - int const vc = f->vc; - - assert( f && ( vc >= 0 ) && ( vc < _vcs ) ); - - ++_occupancy; - if(_occupancy > _size) { - Error("Buffer overflow."); - } - - ++_vc_occupancy[vc]; - - _buffer_policy->SendingFlit(f); - -#ifdef TRACK_BUFFERS - _outstanding_classes[vc].push(f->cl); - ++_class_occupancy[f->cl]; -#endif - - if ( f->tail ) { - _tail_sent[vc] = true; - - if ( !_wait_for_tail_credit ) { - assert(_in_use_by[vc] >= 0); - _in_use_by[vc] = -1; - } - } - _last_id[vc] = f->id; - _last_pid[vc] = f->pid; -} - -void BufferState::TakeBuffer( int vc, int tag ) -{ - assert( ( vc >= 0 ) && ( vc < _vcs ) ); - - if ( _in_use_by[vc] >= 0 ) { - ostringstream err; - err << "Buffer taken while in use for VC " << vc; - Error( err.str() ); - } - _in_use_by[vc] = tag; - _tail_sent[vc] = false; - _buffer_policy->TakeBuffer(vc); -} - -void BufferState::Display( ostream & os ) const -{ - os << FullName() << " :" << endl; - os << " occupied = " << _occupancy << endl; - for ( int v = 0; v < _vcs; ++v ) { - os << " VC " << v << ": "; - os << "in_use_by = " << _in_use_by[v] - << ", tail_sent = " << _tail_sent[v] - << ", occupied = " << _vc_occupancy[v] << endl; - } -} diff --git a/src/intersim2/.svn/pristine/fc/fc7b3404406776df7852a99657a25fb9feadbc84.svn-base b/src/intersim2/.svn/pristine/fc/fc7b3404406776df7852a99657a25fb9feadbc84.svn-base deleted file mode 100644 index 2388b6c..0000000 --- a/src/intersim2/.svn/pristine/fc/fc7b3404406776df7852a99657a25fb9feadbc84.svn-base +++ /dev/null @@ -1,55 +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. -*/ - -#ifndef _SELALLOC_HPP_ -#define _SELALLOC_HPP_ - -#include <vector> - -#include "allocator.hpp" - -class SelAlloc : public SparseAllocator { - int _iter; - - vector<int> _aptrs; - vector<int> _gptrs; - - vector<int> _outmask; - -public: - SelAlloc( Module *parent, const string& name, - int inputs, int outputs, int iters ); - - void Allocate( ); - - void MaskOutput( int out, int mask = 1 ); - - virtual void PrintRequests( ostream * os = NULL ) const; - -}; - -#endif diff --git a/src/intersim2/.svn/wc.db b/src/intersim2/.svn/wc.db Binary files differdeleted file mode 100644 index 4c38197..0000000 --- a/src/intersim2/.svn/wc.db +++ /dev/null |
