|
|
@@ -13,7 +13,7 @@ AtomicDEVSBlock Initial {
|
|
|
"""
|
|
|
|
|
|
outputFnc = """
|
|
|
- return {self.control_out: {}}
|
|
|
+ return {self.my_ports['control_out']: {}}
|
|
|
"""
|
|
|
|
|
|
intTransition = """
|
|
|
@@ -78,7 +78,7 @@ AtomicDEVSBlock ResourceHandler {
|
|
|
"""
|
|
|
|
|
|
outputFnc = """
|
|
|
- return {self.resource_out: {'id': self.state['queue'][0]}}
|
|
|
+ return {self.my_ports['resource_out']: {'id': self.state['queue'][0]}}
|
|
|
"""
|
|
|
|
|
|
intTransition = """
|
|
|
@@ -89,7 +89,7 @@ AtomicDEVSBlock ResourceHandler {
|
|
|
"""
|
|
|
|
|
|
extTransition = """
|
|
|
- for inp in inputs[self.resource_in]:
|
|
|
+ for inp in inputs[self.my_ports['resource_in']]:
|
|
|
if inp['type'] == 'request':
|
|
|
# Queue the request
|
|
|
self.state['queue'].append(inp['id'])
|
|
|
@@ -139,10 +139,10 @@ AtomicDEVSBlock Activity {
|
|
|
outputFnc = """
|
|
|
if self.state.mode == 'active':
|
|
|
# Output the control token to the next model in line, and release the resources
|
|
|
- return {self.control_out: {}, self.resource_out: [{'type': 'release'}]}
|
|
|
+ return {self.my_ports['control_out']: {}, self.my_ports['resource_out']: [{'type': 'release'}]}
|
|
|
elif self.state.mode == 'request_resource':
|
|
|
# Output a request for resources with a specified ID (used to find out whether this was our request)
|
|
|
- return {self.resource_out: [{'type': 'request', 'id': '%s-%s' % (self.state.name, self.state.counter)}]}
|
|
|
+ return {self.my_ports['resource_out']: [{'type': 'request', 'id': '%s-%s' % (self.state.name, self.state.counter)}]}
|
|
|
else:
|
|
|
return {}
|
|
|
"""
|
|
|
@@ -164,13 +164,13 @@ AtomicDEVSBlock Activity {
|
|
|
|
|
|
extTransition = """
|
|
|
self.state.timer -= self.elapsed
|
|
|
- if self.state.mode == 'inactive' and self.control_in in inputs:
|
|
|
+ if self.state.mode == 'inactive' and self.my_ports['control_in'] in inputs:
|
|
|
# Got control token, so ask for the required resources
|
|
|
self.state.mode = 'request_resource'
|
|
|
self.state.timer = 0.0
|
|
|
# NOTE this violates DEVS, though is easy to debug
|
|
|
#print('Activate ' + str(self.state.name) + ' at time ' + str(self.time_last[0] + self.elapsed))
|
|
|
- elif self.state.mode == 'wait_resource' and self.resource_in in inputs and inputs[self.resource_in]['id'] == '%s-%s' % (self.state.name, self.state.counter):
|
|
|
+ elif self.state.mode == 'wait_resource' and self.my_ports['resource_in'] in inputs and inputs[self.my_ports['resource_in']]['id'] == '%s-%s' % (self.state.name, self.state.counter):
|
|
|
# Got required resources, so start execution
|
|
|
self.state.mode = 'active'
|
|
|
self.state.timer = self.state.random_sample()
|
|
|
@@ -189,6 +189,17 @@ OutputPort act_ro {
|
|
|
DEVSBlockToPort (Activity, act_ri) {}
|
|
|
DEVSBlockToPort (Activity, act_ro) {}
|
|
|
|
|
|
+InputPort act_ci {
|
|
|
+ name = "control_in"
|
|
|
+}
|
|
|
+
|
|
|
+OutputPort act_co {
|
|
|
+ name = "control_out"
|
|
|
+}
|
|
|
+
|
|
|
+DEVSBlockToPort (Activity, act_ci) {}
|
|
|
+DEVSBlockToPort (Activity, act_co) {}
|
|
|
+
|
|
|
AtomicDEVSBlock ParallelSplit {
|
|
|
name = "ParallelSplit"
|
|
|
|
|
|
@@ -204,7 +215,7 @@ AtomicDEVSBlock ParallelSplit {
|
|
|
"""
|
|
|
|
|
|
outputFnc = """
|
|
|
- return {self.control_out: {}}
|
|
|
+ return {self.my_ports['control_out']: {}}
|
|
|
"""
|
|
|
|
|
|
intTransition = """
|
|
|
@@ -242,7 +253,7 @@ AtomicDEVSBlock Synchronization {
|
|
|
"""
|
|
|
|
|
|
outputFnc = """
|
|
|
- return {self.control_out: {}}
|
|
|
+ return {self.my_ports['control_out']: {}}
|
|
|
"""
|
|
|
|
|
|
intTransition = """
|
|
|
@@ -295,9 +306,9 @@ AtomicDEVSBlock ExclusiveChoice {
|
|
|
|
|
|
outputFnc = """
|
|
|
if self.state.choice == 0:
|
|
|
- return {self.control_out1: {}}
|
|
|
+ return {self.my_ports['control_out1']: {}}
|
|
|
else:
|
|
|
- return {self.control_out2: {}}
|
|
|
+ return {self.my_ports['control_out2']: {}}
|
|
|
"""
|
|
|
|
|
|
intTransition = """
|
|
|
@@ -344,7 +355,7 @@ AtomicDEVSBlock SimpleMerge {
|
|
|
"""
|
|
|
|
|
|
outputFnc = """
|
|
|
- return {self.control_out: {}}
|
|
|
+ return {self.my_ports['control_out']: {}}
|
|
|
"""
|
|
|
|
|
|
intTransition = """
|
|
|
@@ -388,7 +399,7 @@ AtomicDEVSBlock MultiInstance {
|
|
|
def task_time(self):
|
|
|
return self.distribution(self.counter)
|
|
|
|
|
|
- self.state, self.elapsed = MultiInstanceState(self.parameters[0], self.parameters[1], self.parameters[2])
|
|
|
+ self.state, self.elapsed = MultiInstanceState(self.parameters[0], self.parameters[1], self.parameters[2]), 0.0
|
|
|
"""
|
|
|
|
|
|
timeAdvance = """
|
|
|
@@ -405,13 +416,13 @@ AtomicDEVSBlock MultiInstance {
|
|
|
outputFnc = """
|
|
|
if self.state.mode == 'request_resources':
|
|
|
# Request all resources in one go
|
|
|
- return {self.resource_out: [{'type': 'request', 'id': i} for i in self.state.requested]}
|
|
|
+ return {self.my_ports['resource_out']: [{'type': 'request', 'id': i} for i in self.state.requested]}
|
|
|
elif self.state.mode == 'active':
|
|
|
# Finished an instance, so release it
|
|
|
- return {self.resource_out: [{'type': 'release'}]}
|
|
|
+ return {self.my_ports['resource_out']: [{'type': 'release'}]}
|
|
|
elif self.state.mode == 'finish':
|
|
|
# Finished execution of all, so pass on token
|
|
|
- return {self.control_out: {}}
|
|
|
+ return {self.my_ports['control_out']: {}}
|
|
|
else:
|
|
|
return {}
|
|
|
"""
|
|
|
@@ -443,11 +454,11 @@ AtomicDEVSBlock MultiInstance {
|
|
|
for t in self.state.running_tasks:
|
|
|
t[0] -= self.elapsed
|
|
|
|
|
|
- if self.state.mode == 'inactive' and self.control_in in inputs:
|
|
|
+ if self.state.mode == 'inactive' and self.my_ports['control_in'] in inputs:
|
|
|
self.state.mode = 'request_resources'
|
|
|
self.state.requested = ['%s-%s-%s' % (self.state.name, self.state.counter, i) for i in range(self.state.spawned)]
|
|
|
|
|
|
- if self.state.mode in ['active', 'release_resource'] and self.resource_in in inputs:
|
|
|
+ if self.state.mode in ['active', 'release_resource'] and self.my_ports['resource_in'] in inputs:
|
|
|
# Got a resource, so allocate it to an activity
|
|
|
self.state.running_tasks.append([self.state.task_time(), self.state.requested.pop(0)])
|
|
|
# NOTE this violates DEVS, though is easy to debug
|