|
| 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 |
0 commit comments