dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / fsm / scd_stm_base.cpp
1 #include "fsm/scd_stm_base.h"
2
3 #include "scd_logging.h"
4 #include "scd_exception.h"
5 #include "scd_cont_man_master.h"
6 #include "scd_command.h"
7 #include "scd_cont_man.h"
8
9
10 scd_stm_base::scd_stm_base(scd_simulator& sim, scd_cont_man_master& fsm):
11     scd_cont_state(sim), _fsm(fsm), _slaves(fsm._slaves),
12     _time_step(fsm._time_step),
13     _st_init(fsm._st_init), _st_busy(fsm._st_busy), _st_idle(fsm._st_idle),
14     _st_done(fsm._st_done), _st_time_req(fsm._st_time_req),
15     _st_time(fsm._st_time), _st_term_req(fsm._st_term_req),
16     _st_terminate(fsm._st_terminate), _st_terminated(fsm._st_terminated),
17     _st_fail(fsm._st_fail), _st_failed(fsm._st_failed)
18 {
19 }
20
21
22 void scd_stm_base::set_fail()
23 {
24     std::list<scd_cont_slave_wrapper*>::iterator it;
25
26     for (it = _slaves.begin(); it != _slaves.end(); it++)
27     {
28         (*it)->set_fail();
29     }
30
31     _fsm.set_state(_st_fail);
32 } // set_fail()
33
34
35 void scd_stm_base::process()
36 {
37     // check for failed slaves and react
38     if (!_check_slaves())
39         return;
40 }
41
42
43 bool scd_stm_base::active() const { return true; }
44
45
46 bool scd_stm_base::busy() const { return false; }
47
48
49 bool scd_stm_base::failed() const { return false; }
50
51
52 bool scd_stm_base::advance_time() const { return false; }
53
54
55 const sc_core::sc_time& scd_stm_base::get_time_step()
56 {
57     scd_error("illegal call to get_time_step()");
58     throw scd_exception("illegal call");
59 }
60
61
62 bool scd_stm_base::_check_slaves()
63 {
64
65     std::list<scd_cont_slave_wrapper*>::iterator iter;
66
67     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
68     {
69         if ( (*iter)->failed() )
70         {
71             scd_error("slave \"" + (*iter)->get_name() + "\" failed");
72             set_fail();
73             return false;
74         }
75     }
76
77     return true;
78
79 } // _check_slaves()
80
81
82 bool scd_stm_base::_some_slaves_active()
83 {
84     std::list<scd_cont_slave_wrapper*>::iterator iter;
85
86     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
87     {
88         if ( (*iter)->active() )
89             return true;
90     }
91
92     return false;
93
94 } // _some_slaves_active()
95
96
97 void scd_stm_base::_close_slaves()
98 {
99     std::list<scd_cont_slave_wrapper*>::iterator iter;
100
101     for (iter = _slaves.begin(); iter != _slaves.end(); iter++)
102         (*iter)->close();
103 }