dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / fsm / scd_stm_idle.cpp
1 #include "fsm/scd_stm_idle.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_idle::set_busy()
9 {
10     _fsm.set_state(_st_busy);
11 }
12
13
14 void scd_stm_idle::set_done()
15 {
16     _time_step = sc_core::SC_ZERO_TIME;
17     _fsm.set_state(_st_done);
18 }
19
20
21 void scd_stm_idle::process()
22 {
23     if (!_check_slaves())
24         return;
25     
26     std::list<scd_cont_slave_wrapper*>::iterator iter;
27
28     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
29     {
30         if (!(*iter)->idle() && !(*iter)->done())
31         {
32             // this slave is not ready yet
33             return;
34         }
35     }
36
37     /* all slaves seem idle or done. wait a short moment, to prevent
38      * race conditions (channel data in transit but both endpoints done).
39      * if no socket activity occured we can move on, else we cancel.
40      */
41     if (_sim.get_poller().wait(SCD_CONT_DELAY))
42         return;
43
44     // all slaves seem to be ready to advance time
45     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
46         (*iter)->send_time_req();
47
48     _fsm.save_state();
49     _fsm.set_state(_st_time_req);
50 }