Skip to content

Commit 03c9c0f

Browse files
committed
Re-organize structure
1 parent 7610d7d commit 03c9c0f

File tree

8 files changed

+267
-249
lines changed

8 files changed

+267
-249
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
__pycache__
66
pipelineviewer/version.py
77
*~
8+
.vscode

pipelineviewer/ariane.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Ariane is currently not supported
2+
3+
class PipelineArianeText(Pipeline):
4+
stages = ["IF", "DE", "IS", "EX", "C"]
5+
6+
# IF log is "<cycle> IF <id> <mode> <addr>"
7+
trace_if = re.compile(r"^\s*(\d+) IF \s*(\d+) (\w) ([0-9A-Fa-f]+)")
8+
# DE log is "<cycle> DE <id> <addr> <insn>"
9+
trace_de = re.compile(r"^\s*(\d+) DE \s*(\d+) ([0-9A-Fa-f]+) (.*)")
10+
# IS log is "<cycle> IS <id>"
11+
trace_is = re.compile(r"^\s*(\d+) IS \s*(\d+)")
12+
# EX log is "<cycle> EX <id>"
13+
trace_ex = re.compile(r"^\s*(\d+) EX \s*(\d+)")
14+
# C log is "<cycle> C <id>"
15+
trace_c = re.compile(r"^\s*(\d+) C \s*(\d+)")
16+
17+
# BHT log is "<cycle> BHT <id> <pc> <index> <valid> <taken>: <old>-><new>"
18+
trace_bht = re.compile(
19+
r"^\s*(\d+) BHT\s+(\d+) ([0-9A-Fa-f]+)\s+(\d+) \[(\d)\] (\d): (\d+)->(\d+)")
20+
# BP STATIC log is "<cycle> BP STATIC <id> <pc> <index> <direction>"
21+
trace_bp_static = re.compile(
22+
r"^\s*(\d+) BP STATIC \s*(\d+) ([0-9A-Fa-f]+)\s+(\d+) (\d)")
23+
# BP STATIC log is "<cycle> BP DYNAMIC <id> <pc> <index> <direction>"
24+
trace_bp_dynamic = re.compile(
25+
r"^\s*(\d+) BP DYNAMIC \s*(\d+) ([0-9A-Fa-f]+)\s+(\d+) (\d+)")
26+
27+
def __init__(self, file):
28+
log = {}
29+
30+
for line in file:
31+
m = self.trace_if.match(line)
32+
if m:
33+
id = int(m.group(2))
34+
log[id] = AttrDict({"pc": int(m.group(4), 16), "insn": None, "mode": m.group(3), "IF": int(m.group(1)),
35+
"DE": None, "IS": None, "EX": None, "C": None, "BHT": None, "BP": None})
36+
continue
37+
m = self.trace_de.match(line)
38+
if m:
39+
id = int(m.group(2))
40+
pc = int(m.group(3), 16)
41+
assert pc & ~3 == log[id].pc, "{} pc = {:x} logpc = {:x}".format(
42+
id, pc, log[id].pc)
43+
log[id].pc = pc
44+
log[id].DE = int(m.group(1))
45+
log[id].insn = m.group(4)
46+
continue
47+
m = self.trace_is.match(line)
48+
if m:
49+
id = int(m.group(2))
50+
log[id].IS = int(m.group(1))
51+
continue
52+
m = self.trace_ex.match(line)
53+
if m:
54+
id = int(m.group(2))
55+
log[id].EX = int(m.group(1))
56+
continue
57+
m = self.trace_c.match(line)
58+
if m:
59+
id = int(m.group(2))
60+
log[id].C = int(m.group(1))
61+
continue
62+
m = self.trace_bht.match(line)
63+
if m:
64+
id = int(m.group(2))
65+
log[id].BHT = AttrDict(index=int(m.group(4)), taken=int(m.group(6)), oldcounter=int(m.group(7), 2),
66+
newcounter=int(m.group(8), 2))
67+
continue
68+
m = self.trace_bp_static.match(line)
69+
if m:
70+
id = int(m.group(2))
71+
log[id].BP = AttrDict(type="static", index=int(
72+
m.group(4)), taken=int(m.group(5)))
73+
continue
74+
m = self.trace_bp_dynamic.match(line)
75+
if m:
76+
id = int(m.group(2))
77+
log[id].BP = AttrDict(type="dynamic", index=int(
78+
m.group(4)), taken=(int(m.group(5), 2) >= 2))
79+
continue
80+
81+
self.log = log

pipelineviewer/base.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
class Pipeline(object):
3+
def read(self, file):
4+
pass
5+
6+
riscv_priv_modes = {3: "M", 2: "H", 1: "S", 0: "U"}
7+
8+

pipelineviewer/boom.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from .base import Pipeline
2+
3+
import re
4+
5+
class PipelineBOOM(Pipeline):
6+
stages = ["IF", "DE", "RN", "IS", "C", "RE"]
7+
8+
trace_if = re.compile(
9+
r"\s*(\d+); O3PipeView:fetch:\s*(\d+):0x([0-9A-Fa-f]+):0:\s*\d+:(.*)")
10+
trace_de = re.compile(r"\s*(\d+); O3PipeView:decode:\s*(\d+)")
11+
trace_rn = re.compile(r"\s*(\d+); O3PipeView:rename:\s*(\d+)")
12+
trace_is = re.compile(r"\s*(\d+); O3PipeView:dispatch:\s*(\d+)")
13+
trace_c = re.compile(r"\s*(\d+); O3PipeView:complete:\s*(\d+)")
14+
trace_re = re.compile(
15+
r"\s*(\d+); O3PipeView:retire:\s*(\d+):store: 0:(\d)")
16+
17+
modemap = ["U", "S", "H", "M"]
18+
scale = 1000
19+
20+
def __init__(self, file):
21+
log = {}
22+
guess_mode = "M"
23+
24+
for line in file:
25+
m = self.trace_if.match(line)
26+
if m:
27+
id = int(m.group(1))
28+
log[id] = AttrDict({"pc": int(m.group(3), 16), "insn": m.group(4), "mode": guess_mode,
29+
"IF": int(int(m.group(2))/self.scale), "DE": None, "RN": None, "IS": None, "C": None, "RE": None})
30+
continue
31+
m = self.trace_de.match(line)
32+
if m:
33+
id = int(m.group(1))
34+
log[id].DE = int(int(m.group(2))/self.scale)
35+
m = self.trace_rn.match(line)
36+
if m:
37+
id = int(m.group(1))
38+
log[id].RN = int(int(m.group(2))/self.scale)
39+
m = self.trace_is.match(line)
40+
if m:
41+
id = int(m.group(1))
42+
log[id].IS = int(int(m.group(2))/self.scale)
43+
m = self.trace_c.match(line)
44+
if m:
45+
id = int(m.group(1))
46+
log[id].C = int(int(m.group(2))/self.scale)
47+
m = self.trace_re.match(line)
48+
if m:
49+
id = int(m.group(1))
50+
log[id].RE = int(int(m.group(2))/self.scale)
51+
log[id].mode = self.modemap[int(m.group(3))]
52+
guess_mode = self.modemap[int(m.group(3))]
53+
54+
self.log = log
55+

pipelineviewer/ctf.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
try:
2+
from babeltrace import TraceCollection
3+
except ImportError:
4+
print("babeltrace needed and needs to be installed manually (e.g., python3-babeltrace in Debian/Ubuntu)")
5+
exit(1)
6+
7+
class CTFReader():
8+
def __init__(self, path):
9+
self.babelreader = CTFBabeltrace(path)
10+
11+
def get_events(self):
12+
for event in self.babelreader.get_events():
13+
yield event
14+
15+
16+
class CTFBabeltrace():
17+
def __init__(self, path):
18+
self.traces = dict()
19+
self.tc = TraceCollection()
20+
if self.tc:
21+
# add traces to the collection
22+
if self.tc.add_traces_recursive(path, "ctf") is None:
23+
raise RuntimeError('Cannot add trace')
24+
else:
25+
print("no TraceCollection available...")
26+
27+
def get_events(self):
28+
if self.tc:
29+
for event in self.tc.events:
30+
yield event
31+

pipelineviewer/ibex.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from .base import Pipeline, riscv_priv_modes
2+
3+
from attrdict import AttrDict
4+
5+
class PipelineIbex(Pipeline):
6+
stages = ["IF", "IDEX"]
7+
event_name = {"IF": 0, "IDEX": 1,
8+
"IDEX_MULTCYCLE_START": 2, "IDEX_MULTCYCLE_END": 3}
9+
10+
def __init__(self, tracepath):
11+
log = {}
12+
13+
self.ctf_reader = CTFReader(tracepath)
14+
for event in self.ctf_reader.get_events():
15+
id = 0
16+
pc = 0
17+
insn = ""
18+
insn_type = ""
19+
20+
id = event["id"]
21+
id_str = list(self.event_name)[id]
22+
timestamp = event['timestamp']
23+
pc = (event["pc"])
24+
25+
if id_str == "IF":
26+
keys = event.keys()
27+
28+
if "insn" in keys:
29+
insn = str(event["insn"])
30+
if "insn_type" in keys:
31+
insn_type = str(event["insn_type"])
32+
log[event["insn_id"]] = AttrDict(
33+
{"pc": pc, "insn_type": insn_type, "insn": insn, "mode": riscv_priv_modes[event["mode"]], "IF": timestamp, "IDEX": None, "end": None})
34+
35+
elif id_str == "IDEX":
36+
log[event["insn_id"]]["IDEX"] = event["timestamp"]
37+
log[event["insn_id"]]["end"] = event["timestamp"]
38+
elif id_str == "IDEX_MULTCYCLE_START":
39+
log[event["insn_id"]]["IDEX"] = event["timestamp"]
40+
elif id_str == "IDEX_MULTCYCLE_END":
41+
log[event["insn_id"]]["end"] = event["timestamp"]
42+
43+
self.log = log

0 commit comments

Comments
 (0)