Parcourir la source

kernel/pdevs: add simulator attribute in Dynamics class and input/output ports management method

Eric Ramat il y a 6 ans
Parent
commit
3c8aa14ff9

+ 2 - 2
src/artis-star/common/Links.hpp

@@ -103,11 +103,11 @@ public:
     {
         std::stringstream ss;
 
-        ss << common::spaces(level * 2) << "Links:" << std::endl;
+        ss << common::String::make_spaces(level * 2) << "Links:" << std::endl;
         for (typename Links < Time >::const_iterator it =
                  Links < Time >::begin();
              it != Links < Time >::end(); ++it) {
-            ss << common::spaces((level + 1) * 2)
+            ss << common::String::make_spaces((level + 1) * 2)
                << it->first.get_model()->get_name() << "::"
                << it->first.get_port_name()
                << " -> "

+ 12 - 8
src/artis-star/common/utils/String.hpp

@@ -25,21 +25,25 @@
  */
 
 #ifndef COMMON_UTILS_STRING
-#define COMMON_UTILS_STRING 1
+#define COMMON_UTILS_STRING
 
 #include <string>
 
 namespace artis { namespace common {
 
-std::string spaces(unsigned int number)
+class String
 {
-    std::string str;
-
-    for (unsigned int i = 0; i < number; ++i) {
-        str += " ";
+public:
+    static std::string make_spaces(unsigned int number)
+    {
+        std::string str;
+
+        for (unsigned int i = 0; i < number; ++i) {
+            str += " ";
+        }
+        return str;
     }
-    return str;
-}
+};
 
 } }  // namespace artis common
 

+ 3 - 2
src/artis-star/kernel/pdevs/CMakeLists.txt

@@ -9,9 +9,10 @@ LINK_DIRECTORIES(
   ${GLIBMM_LIBRARY_DIRS}
   ${LIBXML_LIBRARY_DIR})
 
-SET(PDEVS_HPP Coordinator.hpp Dynamics.hpp GraphManager.hpp Simulator.hpp)
+SET(PDEVS_HPP Coordinator.hpp Dynamics.hpp GraphManager.hpp
+  Simulator.hpp)
 
 INSTALL(FILES ${PDEVS_HPP} DESTINATION ${ARTIS_INCLUDE_DIRS}/kernel/pdevs)
 
 ADD_SUBDIRECTORY(multithreading)
-ADD_SUBDIRECTORY(mpi)
+ADD_SUBDIRECTORY(mpi)

+ 1 - 1
src/artis-star/kernel/pdevs/Coordinator.hpp

@@ -69,7 +69,7 @@ public:
     {
         std::ostringstream ss;
 
-        ss << common::spaces(level * 2) << "p-devs coordinator \""
+        ss << common::String::make_spaces(level * 2) << "p-devs coordinator \""
            << type::get_name() << "\":" << std::endl;
         ss << _graph_manager.to_string(level + 1);
         return ss.str();

+ 41 - 5
src/artis-star/kernel/pdevs/Dynamics.hpp

@@ -1,5 +1,5 @@
 /**
- * @file Dynamics.hpp
+ * @file kernel/pdevs/Dynamics.hpp
  * @author The ARTIS Development Team
  * See the AUTHORS or Authors.txt file
  */
@@ -30,19 +30,28 @@
 #include <artis-star/common/Bag.hpp>
 #include <artis-star/common/ExternalEvent.hpp>
 #include <artis-star/common/Parameters.hpp>
+#include <artis-star/kernel/pdevs/Simulator.hpp>
 
 #include <string>
 #include <vector>
 
 namespace artis { namespace pdevs {
 
-template < class Time,
-           class Parameters = common::NoParameters >
+template < class Time, class Dyn, class Parameters = common::NoParameters >
 class Dynamics
 {
+    typedef pdevs::Simulator < Time, Dyn, Parameters > Simulator;
+
 public:
-    Dynamics(const std::string& name, const Parameters& /* parameters */) :
-        _name(name)
+    struct port
+    {
+        unsigned int index;
+        std::string  name;
+    };
+
+    Dynamics(const std::string& name,
+             const Context < Time, Dyn, Parameters >& context) :
+        _name(name), _simulator(context.simulator())
     { }
 
     virtual ~Dynamics()
@@ -78,8 +87,35 @@ public:
     const std::string& get_name() const
     { return _name; }
 
+    void input_port(port p)
+    {
+        _simulator->add_in_port(p.name);
+    }
+
+    void input_ports(std::initializer_list < port > list)
+    {
+        for (typename std::initializer_list < port >::iterator it =
+                 list.begin(); it != list.end(); ++it) {
+            _simulator->add_in_port(it->name);
+        }
+    }
+
+    void output_port(port p)
+    {
+        _simulator->add_out_port(p.name);
+    }
+
+    void output_ports(std::initializer_list < port > list)
+    {
+        for (typename std::initializer_list < port >::iterator it =
+                 list.begin(); it != list.end(); ++it) {
+            _simulator->add_out_port(it->name);
+        }
+    }
+
 private:
     std::string _name;
+    Simulator*  _simulator;
 };
 
 } } // namespace artis pdevs

+ 1 - 1
src/artis-star/kernel/pdevs/GraphManager.hpp

@@ -139,7 +139,7 @@ public:
     {
     	std::ostringstream ss;
 
-    	ss << common::spaces(level * 2) << "Childs :" << std::endl;
+    	ss << common::String::make_spaces(level * 2) << "Childs :" << std::endl;
         for (auto & child : common::GraphManager < Time >::_children) {
             ss << child->to_string(level + 1);
         }

+ 32 - 3
src/artis-star/kernel/pdevs/Simulator.hpp

@@ -25,7 +25,7 @@
  */
 
 #ifndef PDEVS_SIMULATOR
-#define PDEVS_SIMULATOR 1
+#define PDEVS_SIMULATOR
 
 #include <artis-star/common/Coordinator.hpp>
 #include <artis-star/common/Parameters.hpp>
@@ -37,6 +37,34 @@
 
 namespace artis { namespace pdevs {
 
+template < class Time, class Dynamics, class Parameters >
+class Simulator;
+
+template < class Time, class Dynamics,
+           class Parameters = common::NoParameters >
+class Context
+{
+    typedef pdevs::Simulator < Time, Dynamics, Parameters > Simulator;
+
+public:
+    Context(const Parameters& parameters, Simulator* simulator) :
+        _parameters(parameters), _simulator(simulator)
+    { }
+
+    virtual ~Context()
+    { }
+
+    const Parameters& parameters() const
+    { return _parameters; }
+
+    Simulator* simulator() const
+    { return _simulator; }
+
+private:
+    const Parameters& _parameters;
+    Simulator*        _simulator;
+};
+
 template < class Time, class Dynamics,
            class Parameters = common::NoParameters >
 class Simulator : public common::Simulator < Time >
@@ -47,7 +75,8 @@ public :
     Simulator(const std::string& name, const Parameters& parameters) :
         common::Model < Time >(name),
         common::Simulator < Time >(name),
-        _dynamics(name, parameters)
+        _dynamics(name, Context < Time, Dynamics, Parameters >(parameters,
+                                                               this))
     { }
 
     ~Simulator()
@@ -57,7 +86,7 @@ public :
     {
         std::ostringstream ss;
 
-        ss << common::spaces(level * 2) << "p-devs simulator \""
+        ss << common::String::make_spaces(level * 2) << "p-devs simulator \""
            << type::get_name() << "\""<< std::endl;
         return ss.str();
     }