diff options
| author | Dongdong Li <[email protected]> | 2013-08-08 00:15:58 -0800 |
|---|---|---|
| committer | Andrew Boktor <[email protected]> | 2014-08-14 13:50:58 -0700 |
| commit | 7f49fe9feb174d34efc2a011bad79b38522a360b (patch) | |
| tree | ab5b7b66e40315a81871acbf386722981020f866 /src/intersim2/routers/router.cpp | |
| parent | 5f91e7435742bab74dfbeca18afc63e466498f36 (diff) | |
Intesim2 Integration
Details: See Review 80001 https://gpgpu-sim-code-review.appspot.com/80001/
[git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 16747]
Diffstat (limited to 'src/intersim2/routers/router.cpp')
| -rw-r--r-- | src/intersim2/routers/router.cpp | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/intersim2/routers/router.cpp b/src/intersim2/routers/router.cpp new file mode 100644 index 0000000..cb6f078 --- /dev/null +++ b/src/intersim2/routers/router.cpp @@ -0,0 +1,155 @@ +// $Id: router.cpp 5188 2012-08-30 00:31:31Z 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. +*/ + +/*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; +} + + + + + |
