diff options
| author | Dongdong Li <[email protected]> | 2013-11-22 11:32:14 -0800 |
|---|---|---|
| committer | Andrew Boktor <[email protected]> | 2014-08-14 13:50:59 -0700 |
| commit | bdc0e550448f04c7c8f030b7421209bae37e651d (patch) | |
| tree | d59135ebbc05d7ddcd77c3b647e647e159073359 /src/intersim2/.svn/pristine/5f | |
| parent | 3f74773ce1ffe8ed5044a103d84459b56d4e9c20 (diff) | |
Add .svn file so other people can keep update with changes from Stanford
Code Review: Issue 103001
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 17411]
Diffstat (limited to 'src/intersim2/.svn/pristine/5f')
| -rw-r--r-- | src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base b/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base new file mode 100644 index 0000000..44d597c --- /dev/null +++ b/src/intersim2/.svn/pristine/5f/5f655d8c1cb25991e3f079611f3bad0ba05c6b6d.svn-base @@ -0,0 +1,187 @@ +// $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; +} |
