def _preprocess(self): # Set time offsets starttime = min([ trace.get_init_time() for trace in self.traces ]) for trace in self.traces: trace.time_offset = trace.get_init_time() - starttime trace_times = [ trace.get_next_event_time() for trace in self.traces ] if self.export_data: place_counters = [place_counter_name(p) for p in self.project.nets[0].places() if p.trace_tokens] ri = ExportRunInstance( self, [ t for t in self.project.nets[0].transitions() if t.trace_fire ], [ (p, i) for p in self.project.nets[0].places() for i, tracing in enumerate(p.trace_tokens_functions) if tracing.return_numpy_type != 'O' ], ExportRunInstance.basic_header + place_counters) else: ri = RunInstance( self.project, self.process_count) index = 0 timeline = Table([("process", "<i4"), ("pointer", "<i4")], 100) full_timeline = Table([("process", "<i4"), ("pointer", "<i4")], 100) while True: # Searching for trace with minimal event time minimal_time_index = utils.index_of_minimal_value(trace_times) if minimal_time_index is None: break trace = self.traces[minimal_time_index] full_timeline.add_row((minimal_time_index, trace.pointer)) # Timeline update if trace.is_next_event_visible(): timeline.add_row(full_timeline[index]) trace.process_event(ri) trace_times[minimal_time_index] = trace.get_next_event_time() index += 1 self.data = Table([], 0) if self.export_data: self.data = ri.get_table() timeline.trim() full_timeline.trim() self.timeline, self.full_timeline = timeline, full_timeline self.missed_receives = ri.missed_receives
def __init__(self, filename, export_data=False): self.filename = filename self.export_data = export_data self._read_header() self.traces = [None] * self.process_count for process_id in xrange(self.process_count): self._read_trace(process_id) self.first_runinstance = RunInstance(self.project, self.process_count) self._preprocess()
def reports_callback(line): root = xml.fromstring(line) net_id = utils.xml_int(root, "net-id") runinstance = RunInstance(self.project, self.process_count) for process_id, e in enumerate(root.findall("process")): runinstance.event_spawn(process_id, 0, net_id) for pe in e.findall("place"): place_id = utils.xml_int(pe, "id") for te in pe.findall("token"): name = te.get("value") source = te.get("source") if source is not None: name = "{{{0}}} {1}".format(source, name) runinstance.add_token(place_id, 0, name) runinstance.clear_removed_and_new_tokens() for tre in e.findall("enabled"): runinstance.add_enabled_transition(utils.xml_int(tre, "id")) for e in root.findall("activation"): process_id = utils.xml_int(e, "process-id") transition_id = utils.xml_int(e, "transition-id") runinstance.transition_fired(process_id, 0, transition_id, []) if utils.xml_bool(e, "blocked", False): runinstance.transition_blocked(process_id) for e in root.findall("packet"): origin_id = utils.xml_int(e, "origin-id") target_id = utils.xml_int(e, "target-id") size = utils.xml_int(e, "size") edge_id = utils.xml_int(e, "edge-id") runinstance.event_send(origin_id, 0, target_id, size, edge_id) runinstance.reset_last_event_info() self.runinstance = runinstance self.history_instances.append(runinstance) if self.state != "finished" and utils.xml_bool(root, "quit"): self.state = "finished" self.emit_event("error", "Program finished\n") if callback: callback() self.emit_event("changed", True)