From fd3d778c781e1f5a9d2cfdd170a4f3dc4f3e110d Mon Sep 17 00:00:00 2001 From: whitequark Date: Wed, 28 Aug 2019 11:32:18 +0000 Subject: [PATCH] _toolchain: new module, for injecting dependencies in e.g. Nix. --- nmigen/_toolchain.py | 13 +++++++++++++ nmigen/back/verilog.py | 8 ++++++-- nmigen/build/plat.py | 5 +---- 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 nmigen/_toolchain.py diff --git a/nmigen/_toolchain.py b/nmigen/_toolchain.py new file mode 100644 index 0000000..43fd53d --- /dev/null +++ b/nmigen/_toolchain.py @@ -0,0 +1,13 @@ +import os + + +__all__ = ["get_tool"] + + +def get_tool(name): + return os.environ.get(name.upper().replace("-", "_"), overrides.get(name, name)) + + +# Packages for systems like Nix can inject full paths to certain tools by adding them in +# this dictionary, e.g. ``overrides = {"yosys": "/full/path/to/yosys"}``. +overrides = {} diff --git a/nmigen/back/verilog.py b/nmigen/back/verilog.py index 2552df0..190f31a 100644 --- a/nmigen/back/verilog.py +++ b/nmigen/back/verilog.py @@ -2,6 +2,7 @@ import os import re import subprocess +from .._toolchain import * from . import rtlil @@ -13,15 +14,18 @@ class YosysError(Exception): def _yosys_version(): + yosys_path = get_tool("yosys") try: - version = subprocess.check_output([os.getenv("YOSYS", "yosys"), "-V"], encoding="utf-8") + version = subprocess.check_output([yosys_path, "-V"], encoding="utf-8") except FileNotFoundError as e: if os.getenv("YOSYS"): raise YosysError("Could not find Yosys in {} as specified via the YOSYS environment " "variable".format(os.getenv("YOSYS"))) from e - else: + elif yosys_path == "yosys": raise YosysError("Could not find Yosys in PATH. Place `yosys` in PATH or specify " "path explicitly via the YOSYS environment variable") from e + else: + raise m = re.match(r"^Yosys ([\d.]+)(?:\+(\d+))?", version) tag, offset = m[1], m[2] or 0 diff --git a/nmigen/build/plat.py b/nmigen/build/plat.py index 20c0e3d..477e17a 100644 --- a/nmigen/build/plat.py +++ b/nmigen/build/plat.py @@ -6,6 +6,7 @@ import re import jinja2 from .. import __version__ +from .._toolchain import * from ..hdl.ast import * from ..hdl.cd import * from ..hdl.dsl import * @@ -263,10 +264,6 @@ class TemplatedPlatform(Platform): assert False return "\n".join(commands) - def get_tool(tool): - tool_env = tool.upper().replace("-", "_") - return os.environ.get(tool_env, tool) - def get_override(var): var_env = "NMIGEN_{}".format(var) if var_env in os.environ: -- 2.30.2