Yentl Van Tendeloo пре 9 година
родитељ
комит
62872361ce
1 измењених фајлова са 18 додато и 11 уклоњено
  1. 18 11
      model/model.py

+ 18 - 11
model/model.py

@@ -125,8 +125,8 @@ class MvKState(object):
     def __init__(self):
         self.mvk = None
         self.waiting = False
-        self.inputs = []
-        self.outputs = []
+        self.inputs = {}
+        self.outputs = {}
         self.users = []
         self.reply = None
         self.phase = None
@@ -160,10 +160,12 @@ class ModelverseKernel(AtomicDEVS):
         if self.from_mvi in inputs:
             # Got input from MvI, so we queue it
             for inp in inputs[self.from_mvi]:
-                if inp is not None:
-                    self.state.inputs.extend(inp)
+                username = inp[0]
+                data = inp[1]
+                if data is not None:
+                    self.state.inputs.setdefault(username, []).extend(data)
                 else:
-                    self.state.outputs.append(None)
+                    self.state.outputs.setdefault(username, []).append(None)
 
         if self.from_mvs in inputs:
             # Got input from MvS, so we can continue processing
@@ -213,13 +215,13 @@ class ModelverseKernel(AtomicDEVS):
                     commands = None
             elif self.state.phase == "input":
                 # Process inputs
-                if self.state.inputs:
-                    element_type, value = self.state.inputs[0]
+                if self.state.inputs.get(self.state.current_user, None):
+                    element_type, value = self.state.inputs[self.state.current_user][0]
                     print(str((element_type, value)))
                     print(self.state.reply)
                     commands = self.state.mvk.execute_yields(self.state.current_user, "set_input", [element_type, value], self.state.reply)
                     if commands is None:
-                        self.state.inputs.pop(0)
+                        self.state.inputs[self.state.current_user].pop(0)
                 else:
                     commands = None
 
@@ -281,7 +283,7 @@ class MvIState():
 
 class ModelverseInterface(AtomicDEVS):
     def __init__(self, username, operations):
-        AtomicDEVS.__init__(self, "MvI")
+        AtomicDEVS.__init__(self, "MvI_%s" % username)
         self.state = MvIState()
         self.state.operations = operations
         self.username = username
@@ -316,7 +318,7 @@ class ModelverseInterface(AtomicDEVS):
                 send.append(("R", self.memory[i]))
             elif not isinstance(i, int):
                 send.append(("V", i))
-        return {self.to_mvk: [send]}
+        return {self.to_mvk: [(self.username, send)]}
 
     def timeAdvance(self):
         if self.state.init:
@@ -397,6 +399,10 @@ class System(CoupledDEVS):
                 delete_edge):
         CoupledDEVS.__init__(self, "System")
 
+        self.mvi_manager = self.addSubModel(ModelverseInterface(\
+                            username            = "user_manager",
+                            operations          = [username],
+                        ))
         self.mvi = self.addSubModel(ModelverseInterface(\
                             username            = username,
                             operations          = operations
@@ -442,6 +448,7 @@ class System(CoupledDEVS):
                             bandwidth   = mvk2mvi_bandwidth
                         ))
 
+        self.connectPorts(self.mvi_manager.to_mvk, self.mvk.from_mvi)
         self.connectPorts(self.mvi.to_mvk, self.mvi2mvk.input_port)
         self.connectPorts(self.mvi2mvk.output_port, self.mvk.from_mvi)
         self.connectPorts(self.mvk.to_mvs, self.mvk2mvs.input_port)
@@ -487,6 +494,6 @@ args = {
 
 model = System(**args)
 sim = Simulator(model)
-sim.setTerminationTime(20)
+sim.setTerminationTime(100)
 sim.setVerbose()
 sim.simulate()