mirror of
https://github.com/YosysHQ/sby.git
synced 2025-04-05 14:04:07 +00:00
Only implements the POSIX jobserver and will break on windows. Unbreaking it on windows will be done as a follow up. Not used for autotune, that needs some more changes.
101 lines
3 KiB
Python
101 lines
3 KiB
Python
import shutil
|
|
|
|
REQUIRED_TOOLS = {
|
|
("smtbmc", "yices"): ["yices-smt2"],
|
|
("smtbmc", "z3"): ["z3"],
|
|
("smtbmc", "cvc4"): ["cvc4"],
|
|
("smtbmc", "cvc5"): ["cvc5"],
|
|
("smtbmc", "mathsat"): ["mathsat"],
|
|
("smtbmc", "boolector"): ["boolector"],
|
|
("smtbmc", "bitwuzla"): ["bitwuzla"],
|
|
("smtbmc", "abc"): ["yosys-abc"],
|
|
("aiger", "suprove"): ["suprove", "yices"],
|
|
("aiger", "avy"): ["avy", "yices"],
|
|
("aiger", "aigbmc"): ["aigbmc", "yices"],
|
|
("btor", "btormc"): ["btormc", "btorsim"],
|
|
("btor", "pono"): ["pono", "btorsim"],
|
|
("abc"): ["yices"],
|
|
}
|
|
|
|
|
|
def found_tools():
|
|
with open("make/rules/found_tools") as found_tools_file:
|
|
return [tool.strip() for tool in found_tools_file.readlines()]
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
from pathlib import Path
|
|
|
|
args = sys.argv[1:]
|
|
|
|
if args and args[0] == "run":
|
|
target, command, *required_tools = args[1:]
|
|
|
|
with open("make/rules/found_tools") as found_tools_file:
|
|
found_tools = set(tool.strip() for tool in found_tools_file.readlines())
|
|
|
|
if 'verific' in required_tools:
|
|
result = subprocess.run(["yosys", "-qp", "read -verific"], capture_output=True)
|
|
if result.returncode:
|
|
print()
|
|
print(f"SKIPPING {target}: requires yosys with verific support")
|
|
print()
|
|
exit()
|
|
required_tools.remove('verific')
|
|
|
|
missing_tools = sorted(
|
|
f"`{tool}`" for tool in required_tools if tool not in found_tools
|
|
)
|
|
if missing_tools:
|
|
noskip = "NOSKIP" in os.environ.get("MAKEFLAGS", "")
|
|
print()
|
|
print(f"SKIPPING {target}: {', '.join(missing_tools)} not found")
|
|
if noskip:
|
|
print("NOSKIP was set, treating this as an error")
|
|
print()
|
|
exit(noskip)
|
|
|
|
print(command, flush=True)
|
|
exit(subprocess.call(command, shell=True, close_fds=False))
|
|
|
|
found_tools = []
|
|
check_tools = set()
|
|
for tools in REQUIRED_TOOLS.values():
|
|
check_tools.update(tools)
|
|
|
|
for tool in sorted(check_tools):
|
|
if not shutil.which(tool):
|
|
continue
|
|
|
|
if tool == "btorsim":
|
|
error_msg = subprocess.run(
|
|
["btorsim", "--vcd"],
|
|
capture_output=True,
|
|
text=True,
|
|
).stderr
|
|
if "invalid command line option" in error_msg:
|
|
print(
|
|
"found `btorsim` binary is too old "
|
|
"to support the `--vcd` option, ignoring"
|
|
)
|
|
continue
|
|
|
|
found_tools.append(tool)
|
|
|
|
found_tools = "\n".join(found_tools + [""])
|
|
|
|
try:
|
|
with open("make/rules/found_tools") as found_tools_file:
|
|
if found_tools_file.read() == found_tools:
|
|
exit(0)
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
Path("make/rules").mkdir(exist_ok=True)
|
|
|
|
with open("make/rules/found_tools", "w") as found_tools_file:
|
|
found_tools_file.write(found_tools)
|