source: trunk/IPs/systemC/Environment/Queue/include/Sort_Queue_Dynamic.h @ 80

Last change on this file since 80 was 80, checked in by rosiere, 16 years ago

Oups, Environnement is french :P

File size: 4.9 KB
Line 
1#ifndef ENVIRONMENT_QUEUE_SORT_QUEUE_DYNAMIC_H
2#define ENVIRONMENT_QUEUE_SORT_QUEUE_DYNAMIC_H
3
4#include <stdint.h>
5#include <iostream>
6#include "Parameters.h"
7#include "Queue.h"
8
9namespace environment {
10namespace queue {
11
12#define PERCENT_USE_MAX 90
13#define PERCENT_USE_MIN 33
14 
15    /*
16     * Queue, sort by delay with a dynamic size
17     */
18   
19    template <class T>
20    class Sort_Queue_Dynamic : public Queue<T>
21    {
22      // *****[ variables ]*****
23    private   : uint32_t _factor   ;
24    private   : uint32_t _size_base;
25
26      // *****[ constructor ]*****
27    public : Sort_Queue_Dynamic (std::string name, Parameters * param) : Queue <T> (name, param->_size)
28      {
29        _size_base = param->_size;
30        _factor    = 1;
31      };
32     
33      // *****[ destructor ]*****
34    public : ~Sort_Queue_Dynamic ()
35      {
36      };
37     
38      // *****[ must_decrease ]*****
39      // Test if the queue must be decrease
40    private : bool must_decrease (void)
41      {
42        return ( (_factor > 1 ) and
43                 (((100*Queue <T>::_nb_slot)/Queue <T>::_size) <= PERCENT_USE_MIN));
44      }
45
46      // *****[ must_increase ]*****
47      // Test if the queue must be increase
48    private : bool must_increase (void)
49      {
50        return (((100*Queue <T>::_nb_slot)/Queue <T>::_size) >= PERCENT_USE_MAX);
51      }
52
53      // *****[ increase ]*****
54      // increase the queue
55    private : void increase (void)
56      {
57        _factor ++;
58        change_size (_factor*_size_base);
59      }
60     
61      // *****[ decrease ]*****
62      // decrease the queue
63    private : void decrease (void)
64      {
65        _factor --;
66        change_size (_factor*_size_base);
67      }
68
69      // *****[ change_size ]*****
70      // decrease the queue
71    private : void change_size (uint32_t new_size)
72      {
73        slot_t<T> * new_slot = new slot_t<T> [new_size];
74
75        // copy data
76        for (uint32_t it = 0; it < Queue <T>::_nb_slot; it ++)
77          {
78            new_slot [it] = Queue <T>::_slot [it];
79          }
80        // Change information
81
82        delete [] Queue <T>::_slot;
83
84        Queue <T>::_slot = new_slot;
85        Queue <T>::_size = new_size;
86      }
87     
88      // *****[ reset ]*****
89      // Reset the queue in the empty state
90    public : void reset (void)
91      {
92        Queue <T>::_nb_slot   = 0;
93      };
94     
95      // *****[ transition ]*****
96      // Decrease the delay at all cycle
97    public : void transition ()
98      {
99        for (uint32_t it = 0; it < Queue <T>::_nb_slot; it ++)
100          {
101            if (Queue <T>::_slot[it]._delay != 0)
102              Queue <T>::_slot[it] ._delay --;
103          }
104      }
105     
106      // *****[ read ]*****
107      // return the n-eme slot.
108      // (first = 0)
109    public : slot_t<T> read (uint32_t num)
110      {
111        if (num >= Queue <T>::_nb_slot)
112          {
113            std::cerr << "<Sort_Queue_Dynamic.read> {ERROR} can't read because : num (" << num << ") >= _nb_slot (" << Queue <T>::_nb_slot << ")" << std::endl;
114            exit(1);
115          }
116
117        return Queue <T>::_slot[num];
118      };
119     
120      // *****[ pop ]*****
121      // read the queue, and update the pointer
122    public : T pop  ()
123      {
124        return pop (0);
125      }
126
127      // *****[ pop ]*****
128      // read the queue, and update the pointer
129    public : T pop  (uint32_t num)
130      {
131        if (num >= Queue <T>::_nb_slot)
132          {
133            std::cerr << "<Sort_Queue_Dynamic.pop> {ERROR} can't read because : num (" << num << ") >= _nb_slot (" << Queue <T>::_nb_slot << ")" << std::endl;
134            exit(1);
135          }
136
137        // If full -> quit
138        if (must_decrease() == true)
139          decrease();
140
141        T val = Queue <T>::_slot [num]._data;
142       
143        // Reorganize the queue
144
145        for (uint32_t it = num; it < Queue <T>::_nb_slot; it ++)
146          {
147            uint32_t ptr      = (it);
148            uint32_t ptr_next = (it+1);
149
150            Queue <T>::_slot [ptr] = Queue <T>::_slot [ptr_next];
151          }
152
153        Queue <T>::_nb_slot --;
154       
155        return val;
156      }
157     
158      // *****[ push ]*****
159      // Push a new value (they must have a slot free)
160      // Is sort by delay
161    public : bool push (uint32_t delay, T val)
162      {
163//      std::cout << val << std::endl;
164
165        // Test if must increase the queue (never full)
166        if (must_increase() == true)
167          increase();
168
169        uint32_t ptr = Queue <T>::_nb_slot;
170       
171        // Scan the fill to find the good position (keep the sort)
172        for (uint32_t it = 0; it < Queue <T>::_nb_slot; it ++)
173          {
174            uint32_t ptr_scan = ptr-1; // ptr > 0
175
176            if (Queue <T>::_slot[ptr_scan]._delay <= delay)
177              break; //find
178           
179            // reformor the queue
180            Queue <T>::_slot [ptr] = Queue <T>::_slot [ptr_scan];
181            ptr                  = ptr_scan;
182          }
183
184        Queue <T>::_slot [ptr] = slot_t <T> (delay,val);
185        Queue <T>::_nb_slot ++;
186       
187        return true;
188      }
189      // *****[ print ]*****
190    public    : friend std::ostream& operator<< (std::ostream& output, const Sort_Queue_Dynamic & x)
191      {
192        output << "<" << x._name << ">" << std::endl;
193        output << " * nb_slot     : " << x._nb_slot   << std::endl;
194        output << " * size        : " << x._size      << std::endl;
195        output << " * factor      : " << x._factor    << std::endl;
196       
197        for (uint32_t it = 0; it < x._nb_slot; it ++)
198          {
199            output << x._slot [it] << std::endl;
200          }
201       
202        return output;
203      };
204     
205
206    };
207 
208};
209};
210#endif
Note: See TracBrowser for help on using the repository browser.