From 69f2911e04ffb1b19eef1fafb8c040af271f656e Mon Sep 17 00:00:00 2001 From: Tor Aamodt Date: Thu, 15 Jul 2010 18:09:46 -0800 Subject: creating branch for adding support for CUDA 3.x and Fermi [git-p4: depot-paths = "//depot/gpgpu_sim_research/fermi/distribution/": change = 6829] --- src/intersim/pipefifo.hpp | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/intersim/pipefifo.hpp (limited to 'src/intersim/pipefifo.hpp') diff --git a/src/intersim/pipefifo.hpp b/src/intersim/pipefifo.hpp new file mode 100644 index 0000000..8d434d8 --- /dev/null +++ b/src/intersim/pipefifo.hpp @@ -0,0 +1,76 @@ +#ifndef _PIPEFIFO_HPP_ +#define _PIPEFIFO_HPP_ + +#include "module.hpp" + +template class PipelineFIFO : public Module { + int _lanes; + int _depth; + + int _pipe_len; + int _pipe_ptr; + + 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 PipelineFIFO::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 = new T ** [_lanes]; + for ( int l = 0; l < _lanes; ++l ) { + _data[l] = new T * [_pipe_len]; + + for ( int d = 0; d < _pipe_len; ++d ) { + _data[l][d] = 0; + } + } +} + +template PipelineFIFO::~PipelineFIFO( ) +{ + for ( int l = 0; l < _lanes; ++l ) { + delete [] _data[l]; + } + delete [] _data; +} + +template void PipelineFIFO::Write( T* val, int lane ) +{ + _data[lane][_pipe_ptr] = val; +} + +template void PipelineFIFO::WriteAll( T* val ) +{ + for ( int l = 0; l < _lanes; ++l ) { + _data[l][_pipe_ptr] = val; + } +} + +template T* PipelineFIFO::Read( int lane ) +{ + return _data[lane][_pipe_ptr]; +} + +template void PipelineFIFO::Advance( ) +{ + _pipe_ptr = ( _pipe_ptr + 1 ) % _pipe_len; +} + +#endif -- cgit v1.3