build: add toolchain check before running build script and improve error reporting.

This commit is contained in:
Florent Kermarrec 2020-11-04 09:38:46 +01:00
parent f8cadc7b04
commit db836e8e5d
10 changed files with 88 additions and 16 deletions

View File

@ -10,6 +10,7 @@ import os
import subprocess
import sys
import math
from shutil import which
from migen.fhdl.structure import _Fragment
@ -156,8 +157,13 @@ def _run_script(script):
else:
shell = ["bash"]
if which("quartus_map") is None:
msg = "Unable to find Quartus toolchain, please:\n"
msg += "- Add Quartus toolchain to your $PATH."
raise OSError(msg)
if subprocess.call(shell + [script]) != 0:
raise OSError("Subprocess failed")
raise OSError("Error occured during Quartus's script execution.")
# AlteraQuartusToolchain ---------------------------------------------------------------------------

View File

@ -7,6 +7,7 @@
import os
import subprocess
from shutil import which
from migen.fhdl.structure import _Fragment
@ -26,7 +27,7 @@ def _build_cst(named_sc, named_pc):
for name, pin, other in flat_sc:
lines.append(f"IO_LOC \"{name}\" {pin};")
for c in other:
if isinstance(c, IOStandard):
lines.append(f"IO_PORT \"{name}\" IO_TYPE={c.name};")
@ -97,7 +98,7 @@ class GowinToolchain():
v_file = build_name + ".v"
v_output.write(v_file)
platform.add_source(v_file)
if platform.verilog_include_paths:
self.options['include_path'] = '{' + ';'.join(platform.verilog_include_paths) + '}'
@ -115,7 +116,13 @@ class GowinToolchain():
# Run
if run:
subprocess.run(["gw_sh", "run.tcl"])
if which("gw_sh") is None:
msg = "Unable to find Gowin toolchain, please:\n"
msg += "- Add Gowin toolchain to your $PATH."
raise OSError(msg)
if subprocess.call(["gw_sh", "run.tcl"]) != 0:
raise OSError("Error occured during Gowin's script execution.")
os.chdir(cwd)

View File

@ -12,6 +12,7 @@ import sys
import math
import subprocess
import shutil
from shutil import which
from migen.fhdl.structure import _Fragment
@ -147,8 +148,13 @@ def _run_script(script):
else:
shell = ["bash"]
if which("diamondc") is None:
msg = "Unable to find Diamond toolchain, please:\n"
msg += "- Add Diamond toolchain to your $PATH.\n"
raise OSError(msg)
if subprocess.call(shell + [script]) != 0:
raise OSError("Subprocess failed")
raise OSError("Error occured during Diamond's script execution.")
def _check_timing(build_name):
lines = open("impl/{}_impl.par".format(build_name), "r").readlines()

View File

@ -9,6 +9,7 @@
import os
import sys
import subprocess
from shutil import which
from migen.fhdl.structure import _Fragment
@ -132,8 +133,13 @@ def _run_script(script):
else:
shell = ["bash"]
if which("yosys") is None or which("nextpnr-ice40") is None:
msg = "Unable to find Yosys/Nextpnr toolchain, please:\n"
msg += "- Add Yosys/Nextpnr toolchain to your $PATH."
raise OSError(msg)
if subprocess.call(shell + [script]) != 0:
raise OSError("Subprocess failed")
raise OSError("Error occured during Yosys/Nextpnr's script execution.")
# LatticeIceStormToolchain -------------------------------------------------------------------------

View File

@ -13,6 +13,7 @@ import sys
import math
import subprocess
import shutil
from shutil import which
from migen.fhdl.structure import _Fragment
@ -63,8 +64,13 @@ synth_nexus -top {build_name} -vm {build_name}_yosys.vm
ys_name = build_name + ".ys"
tools.write_to_file(ys_name, ys_contents)
r = subprocess.call(["yosys", ys_name])
if r != 0:
if which("yosys") is None:
msg = "Unable to find Yosys toolchain, please:\n"
msg += "- Add Yosys toolchain to your $PATH."
raise OSError(msg)
if subprocess.call(["yosys", ys_name]) != 0:
raise OSError("Subprocess failed")
# Constraints (.ldc) -------------------------------------------------------------------------------
@ -195,11 +201,18 @@ def _build_script(build_name, device):
def _run_script(script):
if sys.platform in ("win32", "cygwin"):
shell = ["cmd", "/c"]
tool = "pnmainc"
else:
shell = ["bash"]
tool = "radiantc"
if which(tool) is None:
msg = "Unable to find Radiant toolchain, please:\n"
msg += "- Add Radiant toolchain to your $PATH."
raise OSError(msg)
if subprocess.call(shell + [script]) != 0:
raise OSError("Subprocess failed")
raise OSError("Error occured during Radiant's script execution.")
def _check_timing(build_name):
lines = open("impl/{}_impl.par".format(build_name), "r").readlines()

View File

@ -9,6 +9,7 @@
import os
import subprocess
import sys
from shutil import which
from migen.fhdl.structure import _Fragment
@ -160,8 +161,13 @@ def _run_script(script):
else:
shell = ["bash"]
if which("yosys") is None or which("nextpnr-ecp5") is None:
msg = "Unable to find Yosys/Nextpnr toolchain, please:\n"
msg += "- Add Yosys/Nextpnr toolchain to your $PATH."
raise OSError(msg)
if subprocess.call(shell + [script]) != 0:
raise OSError("Subprocess failed")
raise OSError("Error occured during Yosys/Nextpnr's script execution.")
# LatticeTrellisToolchain --------------------------------------------------------------------------

View File

@ -8,6 +8,7 @@
import os
import sys
import subprocess
from shutil import which
from migen.fhdl.structure import _Fragment
from litex import get_data_mod
@ -226,6 +227,11 @@ class SimVerilatorToolchain:
# Run
if run:
if which("verilator") is None:
msg = "Unable to find Verilator toolchain, please either:\n"
msg += "- Install Verilator.\n"
msg += "- Add Verilator toolchain to your $PATH."
raise OSError(msg)
_compile_sim(build_name, verbose)
run_as_root = False
if sim_config.has_module("ethernet"):

View File

@ -13,6 +13,7 @@
import os
import subprocess
import sys
from shutil import which
from migen.fhdl.structure import _Fragment
@ -159,9 +160,16 @@ bitgen {bitgen_opt} {build_name}.ncd {build_name}.bit{fail_stmt}
build_script_file = "build_" + build_name + script_ext
tools.write_to_file(build_script_file, build_script_contents, force_unix=False)
command = shell + [build_script_file]
r = tools.subprocess_call_filtered(command, common.colors)
if r != 0:
raise OSError("Subprocess failed")
if which("ise") is None:
msg = "Unable to find or source ISE toolchain, please either:\n"
msg += "- Source ISE's settings manually."
msg += "- Or set LITEX_ISE_VIVADO environment variant to ISE's settings path.\n"
msg += "- Or add ISE toolchain to your $PATH."
raise OSError(msg)
if tools.subprocess_call_filtered(command, common.colors) != 0:
raise OSError("Error occured during ISE's script execution.")
# XilinxISEToolchain --------------------------------------------------------------------------------

View File

@ -11,6 +11,7 @@ import sys
import math
from typing import NamedTuple, Union, List
import re
from shutil import which
from migen.fhdl.structure import _Fragment, wrap, Constant
from migen.fhdl.specials import Instance
@ -94,8 +95,13 @@ class _MakefileGenerator:
def _run_make():
if tools.subprocess_call_filtered("make", []) != 0:
raise OSError("Subprocess failed")
if which("symbiflow_synth") is None:
msg = "Unable to find Symbiflow toolchain, please:\n"
msg += "- Add Symbiflow toolchain to your $PATH."
raise OSError(msg)
if tools.subprocess_call_filtered(shell + [script], common.colors) != 0:
raise OSError("Error occured during Symbiflow's script execution.")
# SymbiflowToolchain -------------------------------------------------------------------------------

View File

@ -8,6 +8,7 @@ import os
import subprocess
import sys
import math
from shutil import which
from migen.fhdl.structure import _Fragment
@ -89,8 +90,15 @@ def _run_script(script):
else:
shell = ["bash"]
if which("vivado") is None:
msg = "Unable to find or source Vivado toolchain, please either:\n"
msg += "- Source Vivado's settings manually."
msg += "- Or set LITEX_ENV_VIVADO environment variant to Vivado's settings path.\n"
msg += "- Or add Vivado toolchain to your $PATH."
raise OSError(msg)
if tools.subprocess_call_filtered(shell + [script], common.colors) != 0:
raise OSError("Subprocess failed")
raise OSError("Error occured during Vivado's script execution.")
# XilinxVivadoToolchain ----------------------------------------------------------------------------