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
|