dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / fsm / scd_stm_time_req.cpp
1 #include "fsm/scd_stm_time_req.h"
2
3 #include "scd_logging.h"
4 #include "scd_exception.h"
5 #include "scd_cont_man_master.h"
6
7
8 void scd_stm_time_req::set_busy()
9 {
10     _send_time_nack();
11     _fsm.load_state();
12 }
13
14
15 void scd_stm_time_req::process()
16 {
17     if (!_check_slaves())
18             return;
19
20     std::list<scd_cont_slave_wrapper*>::iterator iter;
21     sc_core::sc_time min_step = _time_step;
22
23     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
24     {
25         if ( !(*iter)->time_req() && !(*iter)->time_ack() )
26         {
27             // received time_nack from this slave
28             _send_time_nack();
29             _fsm.load_state();
30             return;
31         }
32         else if ( !(*iter)->time_ack() )
33         {
34             // this slave did not respond yet
35             return;
36         }
37         else
38         {
39             // received time_ack => search the smallest step
40             sc_core::sc_time time_slave = (*iter)->get_time_step();
41             if (min_step == sc_core::SC_ZERO_TIME)
42                 min_step = time_slave;
43             else if (min_step > time_slave &&
44                     time_slave != sc_core::SC_ZERO_TIME)
45                 min_step = time_slave;
46         }
47     }
48
49     // all slaves acknkowledged
50     _time_step = min_step;
51     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
52         (*iter)->send_time(min_step);
53
54     _fsm.set_state(_st_time);
55 }
56
57
58 void scd_stm_time_req::_send_time_nack()
59 {
60     std::list<scd_cont_slave_wrapper*>::iterator iter;
61
62     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
63         (*iter)->send_time_nack();
64 }