summaryrefslogtreecommitdiff
path: root/src/intersim/allocator.hpp
blob: ac77a3a62ff0017287dafccdf505e27e1d246c46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#ifndef _ALLOCATOR_HPP_
#define _ALLOCATOR_HPP_

#include <string>
#include <list>

#include "module.hpp"
#include "config_utils.hpp"

class Allocator : public Module {
protected:
   const int _inputs;
   const int _outputs;

   int *_inmatch;
   int *_outmatch;

   int *_outmask;

   void _ClearMatching( );
public:

   struct sRequest {
      int port;
      int label;
      int in_pri;
      int out_pri;
   };

   Allocator( const Configuration &config,
              Module *parent, const string& name,
              int inputs, int outputs );
   virtual ~Allocator( );

   virtual void Clear( ) = 0;

   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 ) = 0;
   virtual void RemoveRequest( int in, int out, int label = 1 ) = 0;

   virtual void Allocate( ) = 0;

   void MaskOutput( int out, int mask = 1 );

   int OutputAssigned( int in ) const;
   int InputAssigned( int out ) const;

   virtual void PrintRequests( ) const = 0;

   static Allocator *NewAllocator( const Configuration &config,
                                   Module *parent, const string& name,
                                   const string &alloc_type, 
                                   int inputs, int input_speedup,
                                   int outputs, int output_speedup );
};

//==================================================
// A dense allocator stores the entire request
// matrix.
//==================================================

class DenseAllocator : public Allocator {
protected:
   sRequest **_request;

public:
   DenseAllocator( const Configuration &config,
                   Module *parent, const string& name,
                   int inputs, int outputs );
   virtual ~DenseAllocator( );

   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 );

   virtual void Allocate( ) = 0;

   void PrintRequests( ) const;
};

//==================================================
// A sparse allocator only stores the requests
// (allows for a more efficient implementation).
//==================================================

class SparseAllocator : public Allocator {
protected:
   list<int> _in_occ;
   list<int> _out_occ;

   list<sRequest> *_in_req;
   list<sRequest> *_out_req;

public:
   SparseAllocator( const Configuration &config,
                    Module *parent, const string& name,
                    int inputs, int outputs );
   virtual ~SparseAllocator( );

   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 );

   virtual void Allocate( ) = 0;

   void PrintRequests( ) const;
};

#endif