|
@@ -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()
|