|
|
@@ -0,0 +1,233 @@
|
|
|
+
|
|
|
+ == ASSEMBLER ==
|
|
|
+
|
|
|
+ outputFnc:
|
|
|
+
|
|
|
+ if self.state['name'] == 'producing':
|
|
|
+ return {self.my_ports['ass_out']: [self.state['finishedProduct']], self.my_ports['ass_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
|
|
|
+ elif self.state['name'] == 'looking_for_op':
|
|
|
+ return {self.my_ports['ass_op_out']: [{'type': 'query', 'req_name': id(self)}]}
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ return {self.my_ports['ass_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
|
|
|
+ else:
|
|
|
+ return AtomicDEVS.outputFnc(self)
|
|
|
+
|
|
|
+ extTransition:
|
|
|
+
|
|
|
+ if self.state['name'] == 'producing':
|
|
|
+ self.wait_time -= self.elapsed()
|
|
|
+
|
|
|
+ import helpers, random
|
|
|
+ if self.my_ports['ass_in'] in my_inputs:
|
|
|
+ self.queue.append(my_inputs[self.my_ports['ass_in']][0]['type'])
|
|
|
+ if (self.state['name'] == 'waiting' and (helpers.canWarAPC() or helpers.canRiotAPC())):
|
|
|
+ self.state['name'] = 'looking_for_op'
|
|
|
+ if self.state['name'] == 'looking_for_op' and self.my_ports['ass_op_in'] in my_inputs:
|
|
|
+ msgs = self.my_ports['ass_op_in']
|
|
|
+ free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and msg['free']]
|
|
|
+ notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and not msg['free']]
|
|
|
+ if free:
|
|
|
+ self.state['op_to_send'] = free[0]
|
|
|
+ else:
|
|
|
+ self.state['op_to_send'] = notfree[0]
|
|
|
+ self.state['name'] = 'sending_req_to_op'
|
|
|
+ elif self.state['name'] == 'waiting_for_op' and self.my_ports['ass_op_in'] in my_inputs:
|
|
|
+ forme = [msg for msg in self.my_ports['ass_op_in'] if msg['req_name'] == id(self) and msg['type'] = 'allocate']
|
|
|
+ if forme:
|
|
|
+ self.state['op_name'] = my_inputs[self.my_ports['ass_op_in']][0]['op_name']
|
|
|
+ if helpers.isWarAPC(self.state['queue']):
|
|
|
+ self.state['finishedProduct'] = {'type': 'WarAPC', 'broken': (random.random() < 0.05)}
|
|
|
+ elif helpers.isRiotAPC(self.state['queue']):
|
|
|
+ self.state['finishedProduct'] = {'type': 'RiotAPC', 'broken': (random.random() < 0.05)}
|
|
|
+ self.state['name'] = 'producing'
|
|
|
+ self.wait_time = 2
|
|
|
+ return self.state
|
|
|
+
|
|
|
+ intTransition:
|
|
|
+
|
|
|
+ if self.state['name'] == 'producing':
|
|
|
+ self.state['name'] = 'waiting'
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ self.state['name'] = 'waiting_for_op'
|
|
|
+ return self.state
|
|
|
+
|
|
|
+ timeAdvance:
|
|
|
+
|
|
|
+ if self.state['name'] == 'waiting':
|
|
|
+ return INFINITY
|
|
|
+ elif self.state['name'] == 'looking_for_op':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'waiting_for_op':
|
|
|
+ return INFINITY
|
|
|
+ elif self.state['name'] == 'producing':
|
|
|
+ return self.wait_time
|
|
|
+
|
|
|
+ == REPAIR ==
|
|
|
+
|
|
|
+ outputFnc:
|
|
|
+
|
|
|
+ if self.state['name'] == 'repairing':
|
|
|
+ return {self.my_ports['rep_out']: [self.state['item']], self.my_ports['rep_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
|
|
|
+ elif self.state['name'] == 'looking_for_op':
|
|
|
+ return {self.my_ports['rep_op_out']: [{'type': 'query', 'req_name': id(self)}]}
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ return {self.my_ports['rep_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
|
|
|
+ else:
|
|
|
+ return AtomicDEVS.outputFnc(self)
|
|
|
+
|
|
|
+ extTransition:
|
|
|
+
|
|
|
+ if self.state['name'] == 'repairing':
|
|
|
+ self.wait_time -= self.elapsed()
|
|
|
+
|
|
|
+ if self.state['name'] == 'waiting' and self.my_ports['rep_in'] in my_inputs:
|
|
|
+ self.state['item'] = my_inputs[self.my_ports['rep_in']][0]
|
|
|
+ elif self.state['name'] == 'looking_for_op' and self.my_ports['rep_op_in'] in my_inputs:
|
|
|
+ msgs = self.my_ports['rep_op_in']
|
|
|
+ free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and msg['free']]
|
|
|
+ notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and not msg['free']]
|
|
|
+ if free:
|
|
|
+ self.state['op_to_send'] = free[0]
|
|
|
+ else:
|
|
|
+ self.state['op_to_send'] = notfree[0]
|
|
|
+ self.state['name'] = 'sending_req_to_op'
|
|
|
+ elif self.state['name'] == 'waiting_for_op' and self.my_ports['rep_op_in'] in my_inputs:
|
|
|
+ forme = [msg for msg in self.my_ports['rep_op_in'] if msg['req_name'] == id(self) and msg['type'] = 'allocate']
|
|
|
+ if forme:
|
|
|
+ self.state['op_name'] = my_inputs[self.my_ports['rep_op_in']][0]['op_name']
|
|
|
+ self.state['item']['broken'] = False
|
|
|
+ self.state['name'] = 'repairing'
|
|
|
+ self.wait_time = 2
|
|
|
+ return self.state
|
|
|
+
|
|
|
+ intTransition:
|
|
|
+
|
|
|
+ if self.state['name'] == 'repairing':
|
|
|
+ self.state['name'] = 'waiting'
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ self.state['name'] = 'waiting_for_op'
|
|
|
+ return self.state
|
|
|
+
|
|
|
+ timeAdvance:
|
|
|
+
|
|
|
+ if self.state['name'] == 'waiting':
|
|
|
+ return INFINITY
|
|
|
+ elif self.state['name'] == 'looking_for_op':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'waiting_for_op':
|
|
|
+ return INFINITY
|
|
|
+ elif self.state['name'] == 'repairing':
|
|
|
+ return self.wait_time
|
|
|
+
|
|
|
+ == QUALITYCONTROL ==
|
|
|
+
|
|
|
+ outputFnc:
|
|
|
+
|
|
|
+ if self.state['name'] == 'checking':
|
|
|
+ if self.state['item']['broken']:
|
|
|
+ return {self.my_ports['qc_out_broken']: [self.state['item']], self.my_ports['qc_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
|
|
|
+ else:
|
|
|
+ return {self.my_ports['qc_out_working']: [self.state['item']], self.my_ports['qc_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
|
|
|
+ elif self.state['name'] == 'looking_for_op':
|
|
|
+ return {self.my_ports['qc_op_out']: [{'type': 'query', 'req_name': id(self)}]}
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ return {self.my_ports['qc_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
|
|
|
+ else:
|
|
|
+ return AtomicDEVS.outputFnc(self)
|
|
|
+
|
|
|
+ extTransition:
|
|
|
+
|
|
|
+ if self.state['name'] == 'repairing':
|
|
|
+ self.wait_time -= self.elapsed()
|
|
|
+
|
|
|
+ if self.state['name'] == 'waiting' and self.my_ports['rep_in'] in my_inputs:
|
|
|
+ self.state['item'] = my_inputs[self.my_ports['rep_in']][0]
|
|
|
+ elif self.state['name'] == 'looking_for_op' and self.my_ports['qc_op_in'] in my_inputs:
|
|
|
+ msgs = self.my_ports['qc_op_in']
|
|
|
+ free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and msg['free']]
|
|
|
+ notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] = 'response' and not msg['free']]
|
|
|
+ if free:
|
|
|
+ self.state['op_to_send'] = free[0]
|
|
|
+ else:
|
|
|
+ self.state['op_to_send'] = notfree[0]
|
|
|
+ self.state['name'] = 'sending_req_to_op'
|
|
|
+ elif self.state['name'] == 'waiting_for_op' and self.my_ports['qc_op_in'] in my_inputs:
|
|
|
+ forme = [msg for msg in self.my_ports['qc_op_in'] if msg['req_name'] == id(self) and msg['type'] = 'allocate']
|
|
|
+ if forme:
|
|
|
+ self.state['name'] = 'checking'
|
|
|
+ return self.state
|
|
|
+
|
|
|
+ intTransition:
|
|
|
+
|
|
|
+ if self.state['name'] == 'checking':
|
|
|
+ self.state['name'] = 'waiting'
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ self.state['name'] = 'waiting_for_op'
|
|
|
+ return self.state
|
|
|
+
|
|
|
+ timeAdvance:
|
|
|
+
|
|
|
+ if self.state['name'] == 'waiting':
|
|
|
+ return INFINITY
|
|
|
+ elif self.state['name'] == 'looking_for_op':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'sending_req_to_op':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'waiting_for_op':
|
|
|
+ return INFINITY
|
|
|
+ elif self.state['name'] == 'checking':
|
|
|
+ return self.wait_time
|
|
|
+
|
|
|
+ == OPERATOR ==
|
|
|
+
|
|
|
+ outputFnc:
|
|
|
+
|
|
|
+ output = {self.my_ports['op_out']: []}
|
|
|
+ if self.state['query_queue']:
|
|
|
+ for it in self.state['query_queue']:
|
|
|
+ self.my_ports['op_out'].append({'type': 'response', 'req_name': it, 'op_name': id(self), 'free': self.state['name'] == 'waiting'})
|
|
|
+ if self.state['name'] == 'allocating':
|
|
|
+ self.my_ports['op_out'].append({'type': 'allocate', 'req_name': self.state['requester'], 'op_name': id(self)})
|
|
|
+
|
|
|
+ extTransition:
|
|
|
+
|
|
|
+ msgs = self.my_ports[self.my_ports['op_in']]
|
|
|
+ release_msgs = msgs.filter(lambda it: it['type'] == 'release' and it['op_name'] == id(self))
|
|
|
+ req_msgs = msgs.filter(lambda it: it['type'] == 'request' and it['op_name'] == id(self))
|
|
|
+ query_msgs = msgs.filter(lambda it: it['type'] == 'query')
|
|
|
+
|
|
|
+ if release_msgs:
|
|
|
+ self.state['name'] = 'requested' if self.state['req_queue'] else 'waiting'
|
|
|
+ for r_m in req_msgs:
|
|
|
+ self.state['req_queue'].append(r_m['req_name'])
|
|
|
+ self.state['name'] = 'requested'
|
|
|
+ for q_m in query_msgs:
|
|
|
+ self.state['query_queue'].append(q_m['req_name'])
|
|
|
+
|
|
|
+ intTransition:
|
|
|
+
|
|
|
+ if self.state['name'] == 'requested':
|
|
|
+ self.state['name'] = 'allocating'
|
|
|
+ self.state['requester'] = self.state['req_queue'].pop()
|
|
|
+ if self.state['name'] == 'allocating':
|
|
|
+ self.state['name'] = 'allocated'
|
|
|
+ if self.state['query_queue']:
|
|
|
+ self.state['query_queue'] = []
|
|
|
+ return self.state
|
|
|
+
|
|
|
+ timeAdvance:
|
|
|
+
|
|
|
+ if self.state['query_queue']:
|
|
|
+ return 0
|
|
|
+ elif self.state['waiting']:
|
|
|
+ return INFINITY
|
|
|
+ elif self.state['name'] == 'requested':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'allocating':
|
|
|
+ return 0
|
|
|
+ elif self.state['name'] == 'allocated':
|
|
|
+ return INFINITY
|