summaryrefslogtreecommitdiff
path: root/src/intersim/arbiter.hpp
blob: 23b5232d18c03554900a066b1851836196d4437f (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
#ifndef _ARBITER_HPP_
#define _ARBITER_HPP_

#include <list>

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

class Arbiter : public Module {
protected:
   const int _inputs;

   struct sRequest {
      int in;
      int label;
      int pri;
   };

   list<sRequest> _requests;

   int _match;

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

   void Clear( );

   void AddRequest( int in, int label = 0, int pri = 0 );
   void RemoveRequest( int in, int label = 0 );

   virtual void Arbitrate( ) = 0;

   int Match( ) const;
};

class PriorityArbiter : public Arbiter {
   int _rr_ptr;

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

   void Arbitrate( );
};

#endif