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