|
@@ -84,25 +84,36 @@ class ModelverseState(AtomicDEVS):
|
|
|
|
|
|
def extTransition(self, inputs):
|
|
|
self.state.timer -= self.elapsed
|
|
|
- self.state.queue.extend(inputs[self.from_mvk])
|
|
|
+ self.state.queue.append(inputs[self.from_mvk])
|
|
|
+ if len(self.state.queue) == 1:
|
|
|
+ # First message, so set the timer
|
|
|
+ # And already compute the result so it is ready to output
|
|
|
+ self.state.output = []
|
|
|
+ self.state.timer = 0.0
|
|
|
+ print("Got input: " + str(inputs[self.from_mvk]))
|
|
|
+ for v in self.state.queue[0]:
|
|
|
+ self.state.output.append(getattr(self.state.mvs, translate(v[0]))(*v[1])[0])
|
|
|
+ self.state.timer += self.timings[translate(v[0])]()
|
|
|
+ else:
|
|
|
+ # Just append the message to process
|
|
|
+ pass
|
|
|
return self.state
|
|
|
|
|
|
def outputFnc(self):
|
|
|
- if self.state.output is not None:
|
|
|
- return {self.to_mvk: [self.state.output]}
|
|
|
- else:
|
|
|
- return {}
|
|
|
+ return {self.to_mvk: [self.state.output]}
|
|
|
|
|
|
def intTransition(self):
|
|
|
- self.state.output = None
|
|
|
- if self.state.queue:
|
|
|
- self.state.output = []
|
|
|
- value = self.state.queue.pop(0)
|
|
|
+ self.state.queue.pop(0)
|
|
|
+ self.state.output = []
|
|
|
+ if len(self.state.queue) > 0:
|
|
|
+ self.state.timer = 0.0
|
|
|
# Value contains a list of operations to do
|
|
|
- # So do them and calculate how long it took!
|
|
|
- for v in value:
|
|
|
+ # So do them and calculate how long it takes
|
|
|
+ for v in self.state.queue[0]:
|
|
|
self.state.output.append(getattr(self.state.mvs, translate(v[0]))(*v[1])[0])
|
|
|
- self.state.timer += self.timings[translate(v[0])]
|
|
|
+ self.state.timer += self.timings[translate(v[0])]()
|
|
|
+ else:
|
|
|
+ self.state.timer = float("inf")
|
|
|
|
|
|
return self.state
|
|
|
|
|
@@ -197,7 +208,7 @@ class ModelverseInterface(AtomicDEVS):
|
|
|
send.append(("R", self.memory[i]))
|
|
|
elif not isinstance(i, int):
|
|
|
send.append(("V", i))
|
|
|
- return {self.to_mvk: [json.dumps(send)]}
|
|
|
+ return {self.to_mvk: [send]}
|
|
|
|
|
|
def timeAdvance(self):
|
|
|
if self.state.processing and (not isinstance(self.state.processing[0], int) or self.state.processing[0] in self.memory):
|
|
@@ -231,11 +242,15 @@ class Network(AtomicDEVS):
|
|
|
|
|
|
def extTransition(self, inputs):
|
|
|
self.state.timer -= self.elapsed
|
|
|
- self.state.processing.extend(inputs[self.input_port])
|
|
|
+ if self.state.timer == float("inf"):
|
|
|
+ self.state.timer = 0
|
|
|
+ self.state.processing.append(json.dumps(inputs[self.input_port]))
|
|
|
+ if len(self.state.processing) > 0:
|
|
|
+ self.state.timer = int(len(self.state.processing[0]) / float(self.bandwidth) + self.latency)
|
|
|
return self.state
|
|
|
|
|
|
def outputFnc(self):
|
|
|
- return {self.output_port: [self.state.processing[0]]}
|
|
|
+ return {self.output_port: [json.loads(self.state.processing[0])]}
|
|
|
|
|
|
def timeAdvance(self):
|
|
|
return self.state.timer
|
|
@@ -358,5 +373,6 @@ args = {
|
|
|
|
|
|
model = System(**args)
|
|
|
sim = Simulator(model)
|
|
|
-sim.setTerminationTime(1000)
|
|
|
+sim.setTerminationTime(10)
|
|
|
+sim.setVerbose()
|
|
|
sim.simulate()
|