|
| 1 | +import sys |
| 2 | +import subprocess |
| 3 | +from collections import namedtuple |
| 4 | +import os |
| 5 | + |
| 6 | +RunArguments = namedtuple("RunArguments", "split_cwd_tail tool_version") |
| 7 | +RunArgumentsDefaults = RunArguments(split_cwd_tail=0, tool_version=None) |
| 8 | + |
| 9 | +def split_path(path, depth): |
| 10 | + base = path |
| 11 | + tail = "" |
| 12 | + for d in range(depth): |
| 13 | + base, t = os.path.split(base) |
| 14 | + tail = os.path.join(t, tail) |
| 15 | + return (base, tail) |
| 16 | + |
| 17 | +ToolContainer = namedtuple("Toolcontainer", "image projectpath default_version") |
| 18 | + |
| 19 | +tools = { |
| 20 | + "verilator": ToolContainer( |
| 21 | + image="verilator/verilator", |
| 22 | + projectpath="/work", |
| 23 | + default_version="latest"), |
| 24 | + "openlane": ToolContainer( |
| 25 | + image="edalize/openlane-sky130", |
| 26 | + projectpath="/project", |
| 27 | + default_version="v0.12") |
| 28 | +} |
| 29 | + |
| 30 | +def run(toolname, args, toolargs): |
| 31 | + if toolname not in tools: |
| 32 | + raise RuntimeError(f"Unknown Tool: {toolname}") |
| 33 | + |
| 34 | + tool = tools[toolname] |
| 35 | + |
| 36 | + version = os.getenv("TOOL_VERSION", args.tool_version) |
| 37 | + |
| 38 | + root, tail = split_path(os.getcwd(), int(os.getenv("SPLIT_CWD_TAIL", args.split_cwd_tail))) |
| 39 | + workdir = os.path.join(tool.projectpath, tail) |
| 40 | + |
| 41 | + cmd = ["docker", "run", "-ti", |
| 42 | + "-v", f"{root}:{tool.projectpath}", |
| 43 | + "-u", f"{os.getuid()}:{os.getgid()}", |
| 44 | + "-w", f"{workdir}", |
| 45 | + f"{tool.image}:{version}" |
| 46 | + ] + toolargs |
| 47 | + |
| 48 | + return subprocess.call(" ".join(cmd), shell=True) |
0 commit comments