summaryrefslogtreecommitdiff
path: root/pt
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-09-22 11:29:07 -0700
committerJulian Blake Kongslie2022-09-22 11:29:07 -0700
commiteb3fd68203fee7c63245c702914c2acd3332d65a (patch)
tree7796707c0372e7fbe4a8bac70aad95f619e8ba29 /pt
downloadprocmodel-eb3fd68203fee7c63245c702914c2acd3332d65a.tar.xz
Initial commit.
Diffstat (limited to 'pt')
-rwxr-xr-xpt95
1 files changed, 95 insertions, 0 deletions
diff --git a/pt b/pt
new file mode 100755
index 0000000..6797565
--- /dev/null
+++ b/pt
@@ -0,0 +1,95 @@
1#!/usr/bin/ruby
2
3$filter = ARGV
4
5$parents = {}
6$events = {}
7$has = {}
8$data = {}
9$horiz = {}
10$maxtime = -1
11
12$stdin.each_line do | line |
13 case line
14
15 when /^(\d+) parent (\d+)$/
16 child = $1.to_i
17 parent = $2.to_i
18 $parents[child] = parent
19
20 when /^@(\d+) (\d+) (\S*) (.*)$/
21 time = $1.to_i
22 rec = $2.to_i
23 event = $3
24 data = $4
25 if event.size > 0
26 $events[rec] ||= {}
27 $events[rec][time] = event
28 $has[rec] ||= {}
29 $has[rec][event] = true
30 $horiz[event] ||= ""
31 $horiz[event] = $horiz[event].ljust(time)
32 $horiz[event][time] = event
33 end
34 if data.size > 0
35 $data[rec] ||= ""
36 $data[rec] += " #{event}@#{time}:" if event.size > 0
37 $data[rec] += " #{data}"
38 end
39 $maxtime = [$maxtime, time+1].max
40
41 else
42 raise "Unexpected line: #{line}"
43 end
44end
45
46$hier = {}
47$hier_direct = {}
48
49$events.each_key do | rec |
50 subhier = {}
51 $hier_direct[rec] = subhier
52 if $parents.key?(rec)
53 $hier_direct[$parents[rec]][rec] = subhier
54 else
55 $hier[rec] = subhier
56 end
57end
58
59$order = []
60
61def flatten(hier)
62 hier.each do | rec, subhier |
63 $order << rec
64 flatten(subhier)
65 end
66end
67flatten($hier)
68
69rwidth = $order.map { | x | x.to_s.size }.max
70
71$horiz.keys.sort.each do | occ |
72 $stdout.write(" " * rwidth + " #{$horiz[occ].ljust($maxtime)}")
73 count = $horiz[occ].delete(" ").size
74 $stdout.write(" #{($maxtime.to_f / count.to_f).round(2).to_s.rjust(5)} cyc/evt\n")
75end
76
77mwidth = 0
78
79$order.each do | rec |
80 estr = ""
81 filter_match = $filter.empty?
82 $has[rec].each_key do | event |
83 filter_match ||= $filter.include?(event)
84 end
85 next unless filter_match
86 $events[rec].keys.sort.each do | time |
87 estr = estr.ljust(time + 1, estr.size == 0 ? " " : "-")
88 estr[time] = $events[rec][time] if $events[rec][time].size > 0
89 end
90 estr += " " * 5
91 estr = estr.ljust(mwidth - 1)
92 estr = estr.ljust(estr.size + 20 - estr.size % 20)
93 mwidth = [mwidth, estr.size].max
94 $stdout.write(rec.to_s.rjust(rwidth) + ": #{estr}#{$data[rec]}\n")
95end