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)