_toolchain: new module, for injecting dependencies in e.g. Nix.
authorwhitequark <cz@m-labs.hk>
Wed, 28 Aug 2019 11:32:18 +0000 (11:32 +0000)
committerwhitequark <cz@m-labs.hk>
Wed, 28 Aug 2019 11:32:18 +0000 (11:32 +0000)
nmigen/_toolchain.py [new file with mode: 0644]
nmigen/back/verilog.py
nmigen/build/plat.py

diff --git a/nmigen/_toolchain.py b/nmigen/_toolchain.py
new file mode 100644 (file)
index 0000000..43fd53d
--- /dev/null
@@ -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 = {}
index 2552df0dbab051daf466ecf822a5c6e6b2859af5..190f31a3788f3554480c47f0f46f3037873006b0 100644 (file)
@@ -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
index 20c0e3db51ca344369f32fafe91a567f639f77b3..477e17a6f2f1f40d12688f302af9fe231f28421f 100644 (file)
@@ -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: