• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""Generate the list of uop IDs.
2Reads the instruction definitions from bytecodes.c.
3Writes the IDs to pycore_uop_ids.h by default.
4"""
5
6import argparse
7import os.path
8import sys
9
10from analyzer import (
11    Analysis,
12    Instruction,
13    analyze_files,
14)
15from generators_common import (
16    DEFAULT_INPUT,
17    ROOT,
18    write_header,
19)
20from cwriter import CWriter
21from typing import TextIO
22
23
24DEFAULT_OUTPUT = ROOT / "Include/internal/pycore_uop_ids.h"
25
26
27def generate_uop_ids(
28    filenames: list[str], analysis: Analysis, outfile: TextIO, distinct_namespace: bool
29) -> None:
30    write_header(__file__, filenames, outfile)
31    out = CWriter(outfile, 0, False)
32    with out.header_guard("Py_CORE_UOP_IDS_H"):
33        next_id = 1 if distinct_namespace else 300
34        # These two are first by convention
35        out.emit(f"#define _EXIT_TRACE {next_id}\n")
36        next_id += 1
37        out.emit(f"#define _SET_IP {next_id}\n")
38        next_id += 1
39        PRE_DEFINED = {"_EXIT_TRACE", "_SET_IP"}
40
41        uops = [(uop.name, uop) for uop in analysis.uops.values()]
42        # Sort so that _BASE comes immediately before _BASE_0, etc.
43        for name, uop in sorted(uops):
44            if name in PRE_DEFINED:
45                continue
46            if uop.properties.tier == 1:
47                continue
48            if uop.implicitly_created and not distinct_namespace and not uop.replicated:
49                out.emit(f"#define {name} {name[1:]}\n")
50            else:
51                out.emit(f"#define {name} {next_id}\n")
52                next_id += 1
53
54        out.emit(f"#define MAX_UOP_ID {next_id-1}\n")
55
56
57arg_parser = argparse.ArgumentParser(
58    description="Generate the header file with all uop IDs.",
59    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
60)
61
62arg_parser.add_argument(
63    "-o", "--output", type=str, help="Generated code", default=DEFAULT_OUTPUT
64)
65arg_parser.add_argument(
66    "-n",
67    "--namespace",
68    help="Give uops a distinct namespace",
69    action="store_true",
70)
71
72arg_parser.add_argument(
73    "input", nargs=argparse.REMAINDER, help="Instruction definition file(s)"
74)
75
76if __name__ == "__main__":
77    args = arg_parser.parse_args()
78    if len(args.input) == 0:
79        args.input.append(DEFAULT_INPUT)
80    data = analyze_files(args.input)
81    with open(args.output, "w") as outfile:
82        generate_uop_ids(args.input, data, outfile, args.namespace)
83