From 7f49fe9feb174d34efc2a011bad79b38522a360b Mon Sep 17 00:00:00 2001 From: Dongdong Li Date: Thu, 8 Aug 2013 00:15:58 -0800 Subject: 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] --- src/intersim2/allocators/allocator.hpp | 158 +++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/intersim2/allocators/allocator.hpp (limited to 'src/intersim2/allocators/allocator.hpp') diff --git a/src/intersim2/allocators/allocator.hpp b/src/intersim2/allocators/allocator.hpp new file mode 100644 index 0000000..ea4441a --- /dev/null +++ b/src/intersim2/allocators/allocator.hpp @@ -0,0 +1,158 @@ +// $Id: allocator.hpp 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. +*/ + +#ifndef _ALLOCATOR_HPP_ +#define _ALLOCATOR_HPP_ + +#include +#include +#include +#include + +#include "module.hpp" +#include "config_utils.hpp" + +class Allocator : public Module { +protected: + const int _inputs; + const int _outputs; + + bool _dirty; + + vector _inmatch; + vector _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 > _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 _in_occ; + set _out_occ; + + vector > _in_req; + vector > _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 -- cgit v1.3