summaryrefslogtreecommitdiffstats
path: root/unit_trace/viz/graph.py
diff options
context:
space:
mode:
authorMac Mollison <mollison@cs.unc.edu>2011-01-31 16:40:54 -0500
committerMac Mollison <mollison@cs.unc.edu>2011-01-31 16:40:54 -0500
commitd2240e7a9b15d18dfd0f3cbe75f3adf1c9e7fabf (patch)
treef7d164c21716b55f3d9195f055db73505bbf951d /unit_trace/viz/graph.py
parent85a089c42749e1394ae12321564109f25fa8154f (diff)
Added support for visualizing arbitrary actions.
(By Jonathan, cherry-picked by Mac) Conflicts: unit_trace/trace_reader.py unit_trace/viz/canvas.py unit_trace/viz/graph.py unit_trace/viz/schedule.py
Diffstat (limited to 'unit_trace/viz/graph.py')
-rw-r--r--unit_trace/viz/graph.py94
1 files changed, 87 insertions, 7 deletions
diff --git a/unit_trace/viz/graph.py b/unit_trace/viz/graph.py
index a10d9bd..f2021ce 100644
--- a/unit_trace/viz/graph.py
+++ b/unit_trace/viz/graph.py
@@ -8,11 +8,12 @@ than the canvas classes (time and task/cpu number rather than plain coordinates)
8update themselves, unlike the Canvas which can only overwrite itself.""" 8update themselves, unlike the Canvas which can only overwrite itself."""
9 9
10class Graph(object): 10class Graph(object):
11 DEF_BAR_PLIST = [Pattern([(0.0, 0.9, 0.9)]), Pattern([(0.9, 0.3, 0.0)]), Pattern([(0.9, 0.7, 0.0)]), 11 DEF_BAR_PLIST = [Pattern([(0.0, 0.9, 0.9)]), Pattern([(0.9, 0.3, 0.0)]),
12 Pattern([(0.0, 0.0, 0.8)]), Pattern([(0.0, 0.2, 0.9)]), Pattern([(0.0, 0.6, 0.6)]), 12 Pattern([(0.9, 0.7, 0.0)]), Pattern([(0.0, 0.0, 0.8)]),
13 Pattern([(0.0, 0.2, 0.9)]), Pattern([(0.0, 0.6, 0.6)]),
13 Pattern([(0.75, 0.75, 0.75)])] 14 Pattern([(0.75, 0.75, 0.75)])]
14 DEF_ITEM_CLIST = [(0.3, 0.0, 0.0), (0.0, 0.3, 0.0), (0.0, 0.0, 0.3), (0.3, 0.3, 0.0), (0.0, 0.3, 0.3), 15 DEF_ITEM_CLIST = [(0.3, 0.0, 0.0), (0.0, 0.3, 0.0), (0.0, 0.0, 0.3),
15 (0.3, 0.0, 0.3)] 16 (0.3, 0.3, 0.0), (0.0, 0.3, 0.3), (0.3, 0.0, 0.3)]
16 17
17 def __init__(self, CanvasType, surface, start_time, end_time, y_item_list, attrs=GraphFormat(), 18 def __init__(self, CanvasType, surface, start_time, end_time, y_item_list, attrs=GraphFormat(),
18 item_clist=DEF_ITEM_CLIST, bar_plist=DEF_BAR_PLIST): 19 item_clist=DEF_ITEM_CLIST, bar_plist=DEF_BAR_PLIST):
@@ -106,9 +107,12 @@ class Graph(object):
106 """get x so that x is at instant ``time'' on the graph""" 107 """get x so that x is at instant ``time'' on the graph"""
107 return self.origin[0] + GraphFormat.X_AXIS_MEASURE_OFS + 1.0 * (time - self.start_time) / self.attrs.time_per_maj * self.attrs.maj_sep 108 return self.origin[0] + GraphFormat.X_AXIS_MEASURE_OFS + 1.0 * (time - self.start_time) / self.attrs.time_per_maj * self.attrs.maj_sep
108 109
110 def get_item_yorigin(self, item_no):
111 return self.origin[1] - self._get_y_axis_height() + self.attrs.y_item_size * item_no;
112
109 def get_item_ypos(self, item_no): 113 def get_item_ypos(self, item_no):
110 """get y so that y is where the top of a bar would be in item #n's area""" 114 """get y so that y is where the top of a bar would be in item #n's area"""
111 return self.origin[1] - self._get_y_axis_height() + self.attrs.y_item_size * (item_no + 0.5 - GraphFormat.BAR_SIZE_FACTOR / 2.0) 115 return self.get_item_yorigin(item_no) + self.attrs.y_item_size * (0.5 - GraphFormat.BAR_SIZE_FACTOR / 2.0)
112 116
113 def _get_bar_width(self, start_time, end_time): 117 def _get_bar_width(self, start_time, end_time):
114 return 1.0 * (end_time - start_time) / self.attrs.time_per_maj * self.attrs.maj_sep 118 return 1.0 * (end_time - start_time) / self.attrs.time_per_maj * self.attrs.maj_sep
@@ -167,7 +171,29 @@ class Graph(object):
167 raise NotImplementedError 171 raise NotImplementedError
168 172
169 def get_events_to_render(self, sched, regions, selectable=False): 173 def get_events_to_render(self, sched, regions, selectable=False):
170 raise NotImplementedError 174 slots = {}
175
176 self.min_time, self.max_time, self.min_item, self.max_item = None, None, None, None
177 for region in regions:
178 x, y, width, height = region
179 start_time, end_time, start_item, end_item = self.get_offset_params(x, y, width, height)
180 self._recomp_min_max(start_time, end_time, start_item, end_item)
181
182 sched.get_time_slot_array().get_slots(slots,
183 start_time, end_time, start_item, end_item,
184 self.list_type)
185
186 events_to_render = {}
187 for layer in Canvas.LAYERS:
188 events_to_render[layer] = {}
189
190 for event in sched.get_time_slot_array().get_events(slots,
191 self.list_type, schedule.EVENT_LIST):
192 events_to_render[event.get_layer()][event] = None
193 for event in sched.get_jobless():
194 events_to_render[event.get_layer()][event] = None
195
196 return events_to_render
171 197
172 def render_surface(self, sched, regions, selectable=False): 198 def render_surface(self, sched, regions, selectable=False):
173 if not selectable: 199 if not selectable:
@@ -269,6 +295,16 @@ class Graph(object):
269 a certain time.""" 295 a certain time."""
270 raise NotImplementedError 296 raise NotImplementedError
271 297
298 def draw_action_symbol_at_time(self, time, task_no, cpu_no, action,
299 job_no, selected=False):
300 """Draws an action symbol at a certain time for some task and job"""
301 raise NotImplementedError
302
303 def add_sel_action_symbol_at_time(self, time, task_no, cpu_no, event):
304 """Same as above, except instead of drawing adds a selectable region at
305 a certain time."""
306 raise NotImplementedError
307
272 def draw_bar_at_time(self, start_time, end_time, task_no, cpu_no, job_no=None, clip_side=None): 308 def draw_bar_at_time(self, start_time, end_time, task_no, cpu_no, job_no=None, clip_side=None):
273 """Draws a bar over a certain time period for some task, optionally labelling it.""" 309 """Draws a bar over a certain time period for some task, optionally labelling it."""
274 raise NotImplementedError 310 raise NotImplementedError
@@ -391,6 +427,33 @@ class TaskGraph(Graph):
391 427
392 self.canvas.add_sel_deadline_arrow_big(x, y, height, event) 428 self.canvas.add_sel_deadline_arrow_big(x, y, height, event)
393 429
430 def draw_action_symbol_at_time(self, time, task_no, cpu_no, action,
431 job_no=None, selected=False):
432 x = self.get_time_xpos(time)
433 y = None
434
435 if task_no != -1:
436 y = self.get_item_ypos(task_no)
437 else:
438 y = self.origin[1]
439
440 height = 1.5 * (self.get_item_ypos(0) - self.get_item_yorigin(0))
441
442 self.canvas.draw_action_symbol(cpu_no, action, x, y, height, selected)
443
444 def add_sel_action_symbol_at_time(self, time, task_no, cpu_no, event):
445 x = self.get_time_xpos(time)
446 y = None
447
448 if task_no != -1:
449 y = self.get_item_ypos(task_no)
450 else:
451 y = self.origin[1]
452
453 height = 1.5 * (self.get_item_ypos(0) - self.get_item_yorigin(0))
454
455 self.canvas.add_sel_action_symbol(x, y, height, event)
456
394 def draw_bar_at_time(self, start_time, end_time, task_no, cpu_no, job_no=None, clip_side=None, selected=False): 457 def draw_bar_at_time(self, start_time, end_time, task_no, cpu_no, job_no=None, clip_side=None, selected=False):
395 if start_time > end_time: 458 if start_time > end_time:
396 raise ValueError("Litmus is not a time machine") 459 raise ValueError("Litmus is not a time machine")
@@ -599,10 +662,27 @@ class CpuGraph(Graph):
599 height = self._get_bar_height() * GraphFormat.SMALL_ARROW_FACTOR 662 height = self._get_bar_height() * GraphFormat.SMALL_ARROW_FACTOR
600 663
601 x = self.get_time_xpos(time) 664 x = self.get_time_xpos(time)
602 y = self.origin[1] - height 665 y = self.get_item_ypos(task_no)
603 666
604 self.canvas.add_sel_deadline_arrow_small(x, y, height, event) 667 self.canvas.add_sel_deadline_arrow_small(x, y, height, event)
605 668
669 def draw_action_symbol_at_time(self, time, task_no, cpu_no, action,
670 job_no=None, selected=False):
671 x = self.get_time_xpos(time)
672 y = self.get_item_ypos(cpu_no)
673
674 height = 1.5 * (y - self.get_item_yorigin(cpu_no))
675
676 self.canvas.draw_action_symbol(task_no, action, x, y, height, selected)
677
678 def add_sel_action_symbol_at_time(self, time, task_no, cpu_no, event):
679 x = self.get_time_xpos(time)
680 y = self.get_item_ypos(cpu_no)
681
682 height = 1.5 * (y - self.get_item_yorigin(cpu_no))
683
684 self.canvas.add_sel_action_symbol(x, y, height, event)
685
606 def draw_bar_at_time(self, start_time, end_time, task_no, cpu_no, job_no=None, clip_side=None, selected=False): 686 def draw_bar_at_time(self, start_time, end_time, task_no, cpu_no, job_no=None, clip_side=None, selected=False):
607 if start_time > end_time: 687 if start_time > end_time:
608 raise ValueError("Litmus is not a time machine") 688 raise ValueError("Litmus is not a time machine")