xref: /XiangShan/scripts/perfcct.py (revision 1592abd11eecf7bec0f1453ffe4a7617167f8ba9)
1import sqlite3 as sql
2import argparse
3
4
5
6parser = argparse.ArgumentParser()
7parser.add_argument('sqldb')
8parser.add_argument('-v', '--visual', action='store_true', default=False)
9parser.add_argument('-z', '--zoom', action='store', type=float, default=1)
10parser.add_argument('-p', '--period', action='store', default=333)
11
12args = parser.parse_args()
13
14sqldb = args.sqldb
15
16tick_per_cycle = int(args.period)
17cycle_per_line = int(100 * args.zoom)
18
19stages = ['f','d','r','D','i','a','g','e','b','w','c']
20
21
22def non_stage():
23    return '.'
24
25def stage(x):
26    return stages[x]
27
28def dump_visual(pos, records):
29    pos_start = pos[0] % cycle_per_line
30    line = ''
31    line += '[' + non_stage() * pos_start
32    pos_next = pos_start
33    last_index = 0
34    for i in range(1, len(pos)):
35        if (pos[i] == pos[last_index]) or pos[i] == 0:
36            continue
37        if pos[i] - pos[last_index] >= cycle_per_line - pos_next:
38            diff = cycle_per_line - pos_next
39            line += f'{stage(last_index)}' * diff + ']\n'
40            diff_line = ((pos[i] - pos[last_index]) - diff - 1) // cycle_per_line
41            if diff_line > 0:
42                line += '[' + f'{stage(last_index)}' * cycle_per_line + ']\n'
43
44            pos_next = pos[i] % cycle_per_line
45            line += '[' + f'{stage(last_index)}' * pos_next
46        else:
47            diff = pos[i] - pos[last_index]
48            pos_next = pos[i] % cycle_per_line
49            line += f'{stage(last_index)}' * diff
50        last_index = i
51    if cycle_per_line - pos_next == 0:
52        line += ']\n'
53        line += f'[{stage(i)}{non_stage() * (cycle_per_line - 1)}]\n'
54    else:
55        line += f'{stage(i)}' + non_stage() * (cycle_per_line - pos_next - 1) + ']'
56    line += str(records)
57    print(line)
58
59
60def dump_txt(pos, records):
61    for i in range(len(pos)):
62        print(f'{stage(i)}{pos[i]}', end=' ')
63    print(records)
64
65
66dump = dump_txt
67if args.visual:
68    dump = dump_visual
69
70with sql.connect(sqldb) as con:
71    cur = con.cursor()
72    cur.execute("SELECT * FROM LifeTimeCommitTrace")
73    col_name = [i[0] for i in cur.description]
74    col_name = col_name[1:]
75    col_name = [i.lower() for i in col_name]
76    rows = cur.fetchall()
77    for row in rows:
78        row = row[1:]
79        pos = []
80        records = []
81        i = 0
82        for val in row:
83            if col_name[i].startswith('at'):
84                pos.append(val//tick_per_cycle)
85            elif col_name[i].startswith('pc'):
86                if val < 0:
87                    val = val + 1 << 64
88                records.append(hex(val))
89            else:
90                records.append(val)
91            i += 1
92        dump(pos, records)