dol: initial dol commit
[jump.git] / dol / src / dol / visitor / hdsd / scd / scd_cont_man_master.h
diff --git a/dol/src/dol/visitor/hdsd/scd/scd_cont_man_master.h b/dol/src/dol/visitor/hdsd/scd/scd_cont_man_master.h
new file mode 100644 (file)
index 0000000..f240321
--- /dev/null
@@ -0,0 +1,86 @@
+#ifndef SCD_CONT_MAN_MASTER_H
+#define SCD_CONT_MAN_MASTER_H
+
+#include <list>
+
+#include "scd_simulator.h"
+#include "scd_cont_man.h"
+#include "scd_cont_slave_wrapper.h"
+#include "fsm/scd_cont_fsm.h"
+
+#include "fsm/scd_stm_init.h"
+#include "fsm/scd_stm_busy.h"
+#include "fsm/scd_stm_idle.h"
+#include "fsm/scd_stm_done.h"
+#include "fsm/scd_stm_time_req.h"
+#include "fsm/scd_stm_time.h"
+#include "fsm/scd_stm_term_req.h"
+#include "fsm/scd_stm_terminate.h"
+#include "fsm/scd_stm_terminated.h"
+#include "fsm/scd_stm_fail.h"
+#include "fsm/scd_stm_failed.h"
+
+/**
+ * Control manager for the master. Waits for all slaves to connect.
+ * Synchronizes the global simulation state.
+ */
+class scd_cont_man_master : public scd_cont_man, public scd_cont_fsm
+{
+    friend class scd_stm_base;
+
+public:
+    /**
+     * Constructor.
+     * \param sim the simulation environment
+     */
+    scd_cont_man_master(scd_simulator& sim);
+
+    virtual ~scd_cont_man_master();
+
+    /**
+     * Connects a slave. Is called from an in-connector.
+     * \param c the register command that has been received by the in-connector
+     * (contains the slave name).
+     * \param sock the incomming connection
+     */
+    void connect_slave(const scd_command& c, scd_socket* sock);
+
+    /* scd_cont_man */
+    void set_master(const std::string& host, uint16_t port);
+    void register_slave(const std::string& name);
+
+    /* scd_cont_fsm_if */
+    void set_idle(const sc_core::sc_time& t) { return _state->set_idle(t); }
+    void set_busy() { return _state->set_busy(); }
+    void set_done() { return _state->set_done(); }
+    void set_fail() { return _state->set_fail(); }
+    void process();
+    bool active() const { return _state->active(); }
+    bool busy() const { return _state->busy(); }
+    bool failed() const { return _state->failed(); }
+    bool advance_time() const { return _state->advance_time(); }
+    const sc_core::sc_time& get_time_step() { return _state->get_time_step(); }
+
+private:
+    scd_simulator& _sim;
+    std::list<scd_cont_slave_wrapper*> _slaves;
+    sc_core::sc_time _time_step;
+    
+    /* states */
+    scd_stm_init _st_init;
+    scd_stm_busy _st_busy;
+    scd_stm_idle _st_idle;
+    scd_stm_done _st_done;
+    scd_stm_time_req _st_time_req;
+    scd_stm_time _st_time;
+    scd_stm_term_req _st_term_req;
+    scd_stm_terminate _st_terminate;
+    scd_stm_terminated _st_terminated;
+    scd_stm_fail _st_fail;
+    scd_stm_failed _st_failed;
+
+    /* member functions */
+    scd_cont_slave_wrapper* _get_slave(const std::string& name);
+};
+
+#endif