1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#!/usr/bin/python
2f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
3f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar# This creates a CSV file from the output of the debug output of subtarget:
4f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#   llvm-tblgen --gen-subtarget --debug-only=subtarget-emitter
5f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar# With thanks to Dave Estes for mentioning the idea at 2014 LLVM Developers' Meeting
6f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
7f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarimport os;
8f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarimport sys;
9f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarimport re;
10f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarimport operator;
11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainartable = {}
13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarmodels = set()
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarfilt = None
15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainardef add(instr, model, resource=None):
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    global table, models
18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    entry = table.setdefault(instr, dict())
20f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    entry[model] = resource
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    models.add(model)
22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainardef filter_model(m):
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    global filt
25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    if m and filt:
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        return filt.search(m) != None
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    else:
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        return True
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainardef display():
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    global table, models
33f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
34f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ordered_table  = sorted(table.items(), key=operator.itemgetter(0))
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    ordered_models = filter(filter_model, sorted(models))
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    # print header
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    sys.stdout.write("instruction")
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    for model in ordered_models:
40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        if not model: model = "default"
41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        sys.stdout.write(", {}".format(model))
42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    sys.stdout.write(os.linesep)
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    for (instr, mapping) in ordered_table:
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        sys.stdout.write(instr)
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        for model in ordered_models:
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            if model in mapping:
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                sys.stdout.write(", {}".format(mapping[model]))
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            else:
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                sys.stdout.write(", ")
51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        sys.stdout.write(os.linesep)
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainardef machineModelCover(path):
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    # The interesting bits
56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    re_sched_default  = re.compile("SchedRW machine model for ([^ ]*) (.*)\n");
57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    re_sched_no_default = re.compile("No machine model for ([^ ]*)\n");
58f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    re_sched_spec = re.compile("InstRW on ([^ ]*) for ([^ ]*) (.*)\n");
59f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    re_sched_no_spec = re.compile("No machine model for ([^ ]*) on processor (.*)\n");
60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    # scan the file
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    with open(path, 'r') as f:
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar        for line in f.readlines():
64f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            match = re_sched_default.match(line)
65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            if match: add(match.group(1), None, match.group(2))
66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            match = re_sched_no_default.match(line)
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            if match: add(match.group(1), None)
68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            match = re_sched_spec.match(line)
69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            if match: add(match.group(2), match.group(1), match.group(3))
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            match = re_sched_no_default.match(line)
71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar            if match: add(match.group(1), None)
72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    display()
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarif len(sys.argv) > 2:
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    filt = re.compile(sys.argv[2], re.IGNORECASE)
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarmachineModelCover(sys.argv[1])
78