From 91b61cc502d8bd1d28e86b5589f8a0e59013dcea Mon Sep 17 00:00:00 2001 From: whitequark Date: Mon, 19 Aug 2019 23:28:33 +0000 Subject: [PATCH] back.verilog: parse output of `yosys -V`. See #55. --- nmigen/back/verilog.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/nmigen/back/verilog.py b/nmigen/back/verilog.py index 9761427..85a7d44 100644 --- a/nmigen/back/verilog.py +++ b/nmigen/back/verilog.py @@ -1,4 +1,5 @@ import os +import re import subprocess from . import rtlil @@ -11,13 +12,9 @@ class YosysError(Exception): pass -def _convert_il_text(il_text, strip_src): +def _yosys_version(): try: - popen = subprocess.Popen([os.getenv("YOSYS", "yosys"), "-q", "-"], - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - encoding="utf-8") + version = subprocess.check_output([os.getenv("YOSYS", "yosys"), "-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 " @@ -26,11 +23,21 @@ def _convert_il_text(il_text, strip_src): raise YosysError("Could not find Yosys in PATH. Place `yosys` in PATH or specify " "path explicitly via the YOSYS environment variable") from e + m = re.match(r"^Yosys ([\d.]+)\+(\d+)", version) + tag, offset = m[1], m[2] + return tuple(map(int, tag.split("."))), offset + + +def _convert_il_text(il_text, strip_src): + version, offset = _yosys_version() + if version < (0, 8): + raise YosysError("Yosys %d.%d is not suppored", *version) + attr_map = [] if strip_src: attr_map.append("-remove src") - verilog_text, error = popen.communicate(""" + script = """ # Convert nMigen's RTLIL to readable Verilog. read_ilang <