summaryrefslogtreecommitdiff
path: root/pt
blob: 67975652061599db6c98be67bf00a3ca47321baa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/ruby

$filter = ARGV

$parents = {}
$events = {}
$has = {}
$data = {}
$horiz = {}
$maxtime = -1

$stdin.each_line do | line |
  case line

    when /^(\d+) parent (\d+)$/
      child = $1.to_i
      parent = $2.to_i
      $parents[child] = parent

    when /^@(\d+) (\d+) (\S*) (.*)$/
      time = $1.to_i
      rec = $2.to_i
      event = $3
      data = $4
      if event.size > 0
        $events[rec] ||= {}
        $events[rec][time] = event
        $has[rec] ||= {}
        $has[rec][event] = true
        $horiz[event] ||= ""
        $horiz[event] = $horiz[event].ljust(time)
        $horiz[event][time] = event
      end
      if data.size > 0
        $data[rec] ||= ""
        $data[rec] += " #{event}@#{time}:" if event.size > 0
        $data[rec] += " #{data}"
      end
      $maxtime = [$maxtime, time+1].max

    else
      raise "Unexpected line: #{line}"
  end
end

$hier = {}
$hier_direct = {}

$events.each_key do | rec |
  subhier = {}
  $hier_direct[rec] = subhier
  if $parents.key?(rec)
    $hier_direct[$parents[rec]][rec] = subhier
  else
    $hier[rec] = subhier
  end
end

$order = []

def flatten(hier)
  hier.each do | rec, subhier |
    $order << rec
    flatten(subhier)
  end
end
flatten($hier)

rwidth = $order.map { | x | x.to_s.size }.max

$horiz.keys.sort.each do | occ |
  $stdout.write(" " * rwidth + "  #{$horiz[occ].ljust($maxtime)}")
  count = $horiz[occ].delete(" ").size
  $stdout.write(" #{($maxtime.to_f / count.to_f).round(2).to_s.rjust(5)} cyc/evt\n")
end

mwidth = 0

$order.each do | rec |
  estr = ""
  filter_match = $filter.empty?
  $has[rec].each_key do | event |
    filter_match ||= $filter.include?(event)
  end
  next unless filter_match
  $events[rec].keys.sort.each do | time |
    estr = estr.ljust(time + 1, estr.size == 0 ? " " : "-")
    estr[time] = $events[rec][time] if $events[rec][time].size > 0
  end
  estr += " " * 5
  estr = estr.ljust(mwidth - 1)
  estr = estr.ljust(estr.size + 20 - estr.size % 20)
  mwidth = [mwidth, estr.size].max
  $stdout.write(rec.to_s.rjust(rwidth) + ": #{estr}#{$data[rec]}\n")
end