_yosys: add a way to retrieve Yosys data directory.

This is important for CXXRTL, since that's where its include files
are located.
This commit is contained in:
whitequark 2020-06-14 00:04:18 +00:00
parent 45c61969fc
commit eddc397509
2 changed files with 36 additions and 1 deletions

View file

@ -3,6 +3,7 @@ import sys
import re
import subprocess
import warnings
import pathlib
try:
from importlib import metadata as importlib_metadata # py3.8+ stdlib
except ImportError:
@ -10,6 +11,14 @@ except ImportError:
import importlib_metadata # py3.7- shim
except ImportError:
importlib_metadata = None # not installed
try:
from importlib import resources as importlib_resources
try:
importlib_resources.files # py3.9+ stdlib
except AttributeError:
import importlib_resources # py3.8- shim
except ImportError:
import importlib_resources # py3.6- shim
from ._toolchain import has_tool, require_tool
@ -53,6 +62,17 @@ class YosysBinary:
"""
raise NotImplementedError
@classmethod
def data_dir(cls):
"""Get Yosys data directory.
Returns
-------
data_dir : pathlib.Path
Yosys data directory (also known as "datdir").
"""
raise NotImplementedError
@classmethod
def run(cls, args, stdin=""):
"""Run Yosys process.
@ -107,6 +127,10 @@ class _BuiltinYosys(YosysBinary):
match = re.match(r"^(\d+)\.(\d+)(?:\.post(\d+))?", version)
return (int(match[1]), int(match[2]), int(match[3] or 0))
@classmethod
def data_dir(cls):
return importlib_resources.files(cls.YOSYS_PACKAGE) / "share"
@classmethod
def run(cls, args, stdin="", *, ignore_warnings=False, src_loc_at=0):
popen = subprocess.Popen([sys.executable, "-m", cls.YOSYS_PACKAGE, *args],
@ -129,6 +153,16 @@ class _SystemYosys(YosysBinary):
match = re.match(r"^Yosys (\d+)\.(\d+)(?:\+(\d+))?", version)
return (int(match[1]), int(match[2]), int(match[3] or 0))
@classmethod
def data_dir(cls):
popen = subprocess.Popen([require_tool(cls.YOSYS_BINARY) + "-config", "--datdir"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
encoding="utf-8")
stdout, stderr = popen.communicate()
if popen.returncode:
raise YosysError(stderr.strip())
return pathlib.Path(stdout.strip())
@classmethod
def run(cls, args, stdin="", *, ignore_warnings=False, src_loc_at=0):
popen = subprocess.Popen([require_tool(cls.YOSYS_BINARY), *args],

View file

@ -26,6 +26,7 @@ setup(
setup_requires=["setuptools", "setuptools_scm"],
install_requires=[
"importlib_metadata; python_version<'3.8'", # for nmigen._yosys
"importlib_resources; python_version<'3.9'", # for nmigen._yosys
"pyvcd~=0.2.0", # for nmigen.pysim
"Jinja2~=2.11", # for nmigen.build
],