blob: f2de95ac56314450e92d9054242f38de9378a0d5 [file] [log] [blame]
Daniel Wagner1d44e982022-06-29 17:42:39 +02001#!/usr/bin/env python3
2import argparse
3import platform
4import json
5
6# Transform rtla hist out data into the same format as rt-tests
7# framework is producing.
8
9
10def parse_args():
11 parser = argparse.ArgumentParser()
12 parser.add_argument(
13 "-r",
14 "--result-file",
15 dest="result_file",
16 required=True,
17 default="./result.txt",
18 help="Specify test result file.",
19 )
20 parser.add_argument(
21 "-t",
22 "--test-name",
23 required=True,
24 help="Specify test name.",
25 )
26 parser.add_argument(
27 "-o",
28 "--output",
29 dest="output",
30 help="Specify output file.",
31 )
32
33 args = parser.parse_args()
34 return args
35
36
37def get_sysinfo():
38 sysinfo = {}
39
40 uname = platform.uname()
41 sysinfo["sysname"] = uname.system
42 sysinfo["nodename"] = uname.node
43 sysinfo["release"] = uname.release
44 sysinfo["version"] = uname.version
45 sysinfo["machine"] = uname.machine
46
47 realtime = 0
48 try:
49 with open("/sys/kernel/realtime", "r") as rfl:
50 realtime = int(rfl.read(1))
51 except IOError:
52 pass
53 sysinfo["realtime"] = realtime
54
55 return sysinfo
56
57
Daniel Wagnere523bea2024-09-16 16:13:01 +020058def get_field_name(col):
59 if col[0].endswith(":"):
60 return col[0][:-1]
61 return None
62
63
Daniel Wagner1d44e982022-06-29 17:42:39 +020064def parse_histogram(col, sel, i, hist):
65 if i not in hist:
66 hist[i] = {}
67 hist[i]["histogram"] = {}
68
Daniel Wagnere523bea2024-09-16 16:13:01 +020069 name = get_field_name(col)
70 if name:
Daniel Wagner1d44e982022-06-29 17:42:39 +020071 hist[i][name] = int(col[sel])
72 else:
73 hist[i]["histogram"][col[0]] = int(col[sel])
74
75
76def parse_osnoise(result_file):
77 data = {}
78 threads = {}
Daniel Wagnere523bea2024-09-16 16:13:01 +020079 num_cols = 0
80
Daniel Wagner1d44e982022-06-29 17:42:39 +020081 for line in result_file.readlines():
82 if line.startswith(" "):
83 continue
84
85 col = line.split()
Daniel Wagnere523bea2024-09-16 16:13:01 +020086 name = get_field_name(col)
87 if name == "ALL":
88 break
Daniel Wagner1d44e982022-06-29 17:42:39 +020089
90 num_cols = len(col) - 1
91
92 for i, sel in zip(range(0, num_cols), range(1, len(col), 1)):
93 parse_histogram(col, sel, i, threads)
94
95 data["file_version"] = 2
96 data["return_code"] = 0
97 data["sysinfo"] = get_sysinfo()
98 data["num_threads"] = num_cols
99 data["resolution_in_ns"] = 0
100 data["thread"] = threads
101
102 return data
103
104
Daniel Wagnerccd0ff92022-06-30 09:45:08 +0200105def parse_timerlat(result_file):
106 data = {}
107 threads = {}
108 irqs = {}
109 num_cols = 0
Daniel Wagnere523bea2024-09-16 16:13:01 +0200110
Daniel Wagnerccd0ff92022-06-30 09:45:08 +0200111 for line in result_file.readlines():
112 if line.startswith(" "):
113 continue
114
115 col = line.split()
Daniel Wagnere523bea2024-09-16 16:13:01 +0200116 name = get_field_name(col)
117 if name == "ALL":
118 break
Daniel Wagnerccd0ff92022-06-30 09:45:08 +0200119
120 num_cols = len(col) - 1
121
122 for i, sel in zip(range(0, num_cols), range(1, len(col), 2)):
123 parse_histogram(col, sel, i, irqs)
124 for i, sel in zip(range(0, num_cols), range(2, len(col), 2)):
125 parse_histogram(col, sel, i, threads)
126
127 data["file_version"] = 2
128 data["return_code"] = 0
129 data["sysinfo"] = get_sysinfo()
130 data["num_threads"] = num_cols / 2
131 data["num_irqs"] = num_cols / 2
132 data["resolution_in_ns"] = 0
133 data["thread"] = threads
134 data["irq"] = irqs
135
136 return data
137
138
Daniel Wagner1d44e982022-06-29 17:42:39 +0200139def main(args):
140 with open(args.result_file, "r") as infile:
141 if args.test_name == "osnoise":
142 data = parse_osnoise(infile)
Daniel Wagnerccd0ff92022-06-30 09:45:08 +0200143 else:
144 data = parse_timerlat(infile)
Daniel Wagner1d44e982022-06-29 17:42:39 +0200145
146 if args.output:
147 with open(args.output, "w") as outfile:
148 outfile.write(json.dumps(data, indent=2))
149 else:
150 print(json.dumps(data, indent=2))
151
152
153if __name__ == "__main__":
154 main(parse_args())