def _build_script(source, build_template, build_name, architecture, package, speed_grade, timingstrict, ignoreloops, bootaddr, seed, spimode): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n\n" fail_stmt = " || exit /b" else: script_ext = ".sh" script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" fail_stmt = "" for s in build_template: s_fail = s + "{fail_stmt}\n" # Required so Windows scripts fail early. script_contents += s_fail.format( build_name=build_name, architecture=architecture, package=package, speed_grade=speed_grade, timefailarg="--timing-allow-fail" if not timingstrict else "", ignoreloops="--ignore-loops" if ignoreloops else "", bootaddr=bootaddr, fail_stmt=fail_stmt, seed=seed, spimode="" if spimode is None else "--spimode {}".format(spimode)) script_file = "build_" + build_name + script_ext tools.write_to_file(script_file, script_contents, force_unix=False) return script_file
def _build_script(build_name, create_rbf): if sys.platform in ["win32", "cygwin"]: script_contents = "REM Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) script_file = "build_" + build_name + ".bat" else: script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) script_file = "build_" + build_name + ".sh" script_contents += """ quartus_map --read_settings_files=on --write_settings_files=off {build_name} -c {build_name} quartus_fit --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_asm --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_sta {build_name} -c {build_name}""" if create_rbf: script_contents += """ if [ -f "{build_name}.sof" ] then quartus_cpf -c {build_name}.sof {build_name}.rbf fi """ script_contents = script_contents.format(build_name=build_name) tools.write_to_file(script_file, script_contents, force_unix=True) return script_file
def _run_quartus(build_name, quartus_path, create_rbf): if sys.platform == "win32" or sys.platform == "cygwin": build_script_contents = "REM Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" build_script_file = "build_" + build_name + ".bat" command = build_script_file else: build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" build_script_file = "build_" + build_name + ".sh" command = ["bash", build_script_file] build_script_contents += """ set -e quartus_map --read_settings_files=on --write_settings_files=off {build_name} -c {build_name} quartus_fit --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_asm --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_sta {build_name} -c {build_name}""" if create_rbf: build_script_contents += """ if [ -f "{build_name}.sof" ] then quartus_cpf -c {build_name}.sof {build_name}.rbf fi """ build_script_contents = build_script_contents.format( build_name=build_name) # noqa tools.write_to_file(build_script_file, build_script_contents, force_unix=True) if subprocess.call(command): raise OSError("Subprocess failed")
def _build_script(build_name, device): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n\n" copy_stmt = "copy" fail_stmt = " || exit /b" else: script_ext = ".sh" script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" copy_stmt = "cp" fail_stmt = "" script_contents += "diamondc {tcl_script}{fail_stmt}\n".format( tcl_script=build_name + ".tcl", fail_stmt=fail_stmt) for ext in (".bit", ".jed"): if ext == ".jed" and not _produces_jedec(device): continue script_contents += "{copy_stmt} {diamond_product} {migen_product} {fail_stmt}\n".format( copy_stmt=copy_stmt, fail_stmt=fail_stmt, diamond_product=os.path.join("impl", build_name + "_impl" + ext), migen_product=build_name + ext) build_script_file = "build_" + build_name + script_ext tools.write_to_file(build_script_file, script_contents, force_unix=False) return build_script_file
def _build_script(source, build_template, build_name, architecture, package, freq_constraint): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" build_script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n\n" fail_stmt = " || exit /b" else: script_ext = ".sh" build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" fail_stmt = "" for s in build_template: s_fail = s + "{fail_stmt}\n" # Required so Windows scripts fail early. build_script_contents += s_fail.format(build_name=build_name, architecture=architecture, package=package, freq_constraint=freq_constraint, fail_stmt=fail_stmt) build_script_file = "build_" + build_name + script_ext tools.write_to_file(build_script_file, build_script_contents, force_unix=False) return build_script_file
def _build_script(build_name, vivado_path, source, ver=None): if sys.platform in ["win32", "cygwin"]: script_contents = "REM Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" script_file = "build_" + build_name + ".bat" tools.write_to_file(script_file, script_contents) else: script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" # Only source Vivado settings if not already in our $PATH if not find_executable("vivado"): # For backwards compatibility with ISE paths, also # look for a version in a subdirectory named "Vivado" # under the current directory. paths_to_try = [vivado_path, os.path.join(vivado_path, "Vivado")] for p in paths_to_try: try: settings = common.settings(p, ver) except OSError: continue break else: raise OSError("Unable to locate Vivado directory or settings.") script_contents += "source " + settings + "\n" script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" script_file = "build_" + build_name + ".sh" tools.write_to_file(script_file, script_contents) return script_file
def _run_vivado(build_name, vivado_path, source, ver=None): if sys.platform == "win32" or sys.platform == "cygwin": build_script_contents = "REM Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" build_script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" build_script_file = "build_" + build_name + ".bat" tools.write_to_file(build_script_file, build_script_contents) command = build_script_file else: build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" # Only source Vivado settings if not already in our $PATH if not find_executable("vivado"): # For backwards compatibility with ISE paths, also # look for a version in a subdirectory named "Vivado" # under the current directory. paths_to_try = [vivado_path, os.path.join(vivado_path, "Vivado")] for p in paths_to_try: try: settings = common.settings(p, ver) except OSError: continue break else: raise OSError("Unable to locate Vivado directory or settings.") build_script_contents += "source " + settings + "\n" build_script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" build_script_file = "build_" + build_name + ".sh" tools.write_to_file(build_script_file, build_script_contents) command = ["bash", build_script_file] r = tools.subprocess_call_filtered(command, common.colors) if r != 0: raise OSError("Subprocess failed")
def _build_script(build_name, device): if sys.platform in ("win32", "cygwin"): tool = "pnmainc" script_ext = ".bat" script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n\n" copy_stmt = "copy" fail_stmt = " || exit /b" else: tool = "radiantc" script_ext = ".sh" script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" copy_stmt = "cp" fail_stmt = "" script_contents += "{tool} {tcl_script}{fail_stmt}\n".format( tool=tool, tcl_script=build_name + ".tcl", fail_stmt=fail_stmt) script_contents += "{copy_stmt} {radiant_product} {migen_product} {fail_stmt}\n".format( copy_stmt=copy_stmt, fail_stmt=fail_stmt, radiant_product=os.path.join("impl", build_name + "_impl.bit"), migen_product=build_name + ".bit") build_script_file = "build_" + build_name + script_ext tools.write_to_file(build_script_file, script_contents, force_unix=False) return build_script_file
def _run_ise(build_name, ise_path, source, mode, ngdbuild_opt, toolchain, platform, ver=None): if sys.platform == "win32" or sys.platform == "cygwin": source_cmd = "call " script_ext = ".bat" shell = ["cmd", "/c"] build_script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n" fail_stmt = " || exit /b" else: source_cmd = "source " script_ext = ".sh" shell = ["bash"] build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\nset -e\n" fail_stmt = "" if source: settings = common.settings(ise_path, ver, "ISE_DS") build_script_contents += source_cmd + tools.cygpath(settings) + "\n" if mode == "edif": ext = "edif" else: ext = "ngc" build_script_contents += """ xst -ifn {build_name}.xst{fail_stmt} """ # This generates a .v file for post synthesis simulation build_script_contents += """ netgen -ofmt verilog -w -sim {build_name}.{ext} {build_name}_synth.v """ build_script_contents += """ ngdbuild {ngdbuild_opt} -uc {build_name}.ucf {build_name}.{ext} {build_name}.ngd{fail_stmt} """ if mode == "cpld": build_script_contents += """ cpldfit -ofmt verilog {par_opt} -p {device} {build_name}.ngd{fail_stmt} taengine -f {build_name}.vm6 -detail -iopath -l {build_name}.tim{fail_stmt} hprep6 -s IEEE1532 -i {build_name}.vm6{fail_stmt} """ else: build_script_contents += """ map {map_opt} -o {build_name}_map.ncd {build_name}.ngd {build_name}.pcf{fail_stmt} par {par_opt} {build_name}_map.ncd {build_name}.ncd {build_name}.pcf{fail_stmt} bitgen {bitgen_opt} {build_name}.ncd {build_name}.bit{fail_stmt} """ build_script_contents = build_script_contents.format(build_name=build_name, ngdbuild_opt=ngdbuild_opt, bitgen_opt=toolchain.bitgen_opt, ext=ext, par_opt=toolchain.par_opt, map_opt=toolchain.map_opt, device=platform.device, fail_stmt=fail_stmt) build_script_contents += toolchain.ise_commands.format(build_name=build_name) 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")
def build_script(self): # Translate device to Nextpnr architecture/package (family, size, speed_grade, package) = self.nextpnr_ecp5_parse_device(self.platform.device) architecture = self.nextpnr_ecp5_architectures[(family + "-" + size)] if sys.platform in ("win32", "cygwin"): script_ext = ".bat" script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n\n" fail_stmt = " || exit /b" else: script_ext = ".sh" script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" fail_stmt = "" # Validate options ecp5_mclk_freqs = [ 2.4, 4.8, 9.7, 19.4, 38.8, 62.0, ] if self._freq is not None: assert self._freq in ecp5_mclk_freqs, "Invalid MCLK frequency. Valid frequencies: " + str( ecp5_mclk_freqs) for s in self._build_template: s_fail = s + "{fail_stmt}\n" # Required so Windows scripts fail early. script_contents += s_fail.format( build_name=self._build_name, architecture=architecture, package=package, speed_grade=speed_grade, timefailarg="--timing-allow-fail" if not self._timingstrict else "", ignoreloops="--ignore-loops" if self._ignoreloops else "", bootaddr=self._bootaddr, fail_stmt=fail_stmt, seed=self._seed, spimode="" if self._spimode is None else f"--spimode {self._spimode}", freq="" if self._freq is None else "--freq {}".format(self._freq), compress="" if not self._compress else "--compress") script_file = "build_" + self._build_name + script_ext tools.write_to_file(script_file, script_contents, force_unix=False) return script_file
def _build_script(build_name): if sys.platform in ["win32", "cygwin"]: script_contents = "REM Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" script_file = "build_" + build_name + ".bat" tools.write_to_file(script_file, script_contents) else: script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" script_file = "build_" + build_name + ".sh" tools.write_to_file(script_file, script_contents) return script_file
def _build_script(build_name): if sys.platform in ["win32", "cygwin"]: script_contents = "REM Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n" script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" script_file = "build_" + build_name + ".bat" tools.write_to_file(script_file, script_contents) else: script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\nset -e\n" if os.getenv("LITEX_ENV_VIVADO", False): script_contents += "source " + os.path.join(os.getenv("LITEX_ENV_VIVADO"), "settings64.sh\n") script_contents += "vivado -mode batch -source " + build_name + ".tcl\n" script_file = "build_" + build_name + ".sh" tools.write_to_file(script_file, script_contents) return script_file
def get_git_header(jinja_env): from litex.build.tools import get_migen_git_revision, get_litex_git_revision return jinja_env.get_template("git.h.jinja").render( generated_banner=generated_banner("//"), migen_git_revision=get_migen_git_revision(), litex_git_revision=get_litex_git_revision() )
def _build_script(build_name, device, toolchain_path, ver=None): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" build_script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n\n" copy_stmt = "copy" fail_stmt = " || exit /b" else: script_ext = ".sh" build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n" copy_stmt = "cp" fail_stmt = " || exit 1" build_script_file = "build_" + build_name + script_ext tools.write_to_file(build_script_file, build_script_contents, force_unix=False) return build_script_file
def header(self, build_name, partnumber): header = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() header += """ import os import sys import pprint home = '{0}' os.environ['EFXPT_HOME'] = home + '/pt' os.environ['EFXPGM_HOME'] = home + '/pgm' os.environ['EFXDBG_HOME'] = home + '/debugger' os.environ['EFXIPM_HOME'] = home + '/ipm' sys.path.append(home + '/pt/bin') sys.path.append(home + '/lib/python3.8/site-packages') from api_service.design import DesignAPI from api_service.device import DeviceAPI is_verbose = {1} design = DesignAPI(is_verbose) device = DeviceAPI(is_verbose) design.create('{2}', '{3}', './../gateware', overwrite=True) """ return header.format(self.efinity_path, 'True', build_name, partnumber)
def _generate_makefile(self, platform, build_name): Var = _MakefileGenerator.Var Rule = _MakefileGenerator.Rule makefile = _MakefileGenerator([ "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n", Var("TOP", build_name), Var("PARTNAME", self._partname), Var("DEVICE", self.symbiflow_device), Var("BITSTREAM_DEVICE", self.bitstream_device), "", Var("VERILOG", [ f for f, language, _ in platform.sources if language in ["verilog", "system_verilog"] ]), Var("MEM_INIT", [f"{name}" for name in os.listdir() if name.endswith(".init")]), Var("PCF", f"{build_name}.pcf"), Var("SDC", f"{build_name}.sdc"), Var("XDC", f"{build_name}.xdc"), Var("ARTIFACTS", [ "$(TOP).eblif", "$(TOP).frames", "$(TOP).ioplace", "$(TOP).net", "$(TOP).place", "$(TOP).route", "$(TOP)_synth.*", "*.bit", "*.fasm", "*.json", "*.log", "*.rpt", "constraints.place" ]), Rule("all", ["$(TOP).bit"], phony=True), Rule( "$(TOP).eblif", ["$(VERILOG)", "$(MEM_INIT)", "$(XDC)"], commands=[ "synth -t $(TOP) -v $(VERILOG) -d $(BITSTREAM_DEVICE) -p $(PARTNAME) -x $(XDC) > /dev/null" ]), Rule("$(TOP).net", ["$(TOP).eblif", "$(SDC)"], commands=[ "pack -e $(TOP).eblif -d $(DEVICE) -s $(SDC) > /dev/null" ]), Rule( "$(TOP).place", ["$(TOP).net", "$(PCF)"], commands=[ "place -e $(TOP).eblif -d $(DEVICE) -p $(PCF) -n $(TOP).net -P $(PARTNAME) -s $(SDC) > /dev/null" ]), Rule("$(TOP).route", ["$(TOP).place"], commands=[ "route -e $(TOP).eblif -d $(DEVICE) -s $(SDC) > /dev/null" ]), Rule("$(TOP).fasm", ["$(TOP).route"], commands=[ "write_fasm -e $(TOP).eblif -d $(DEVICE) > /dev/null" ]), Rule( "$(TOP).bit", ["$(TOP).fasm"], commands=[ "write_bitstream -d $(BITSTREAM_DEVICE) -f $(TOP).fasm -p $(PARTNAME) -b $(TOP).bit > /dev/null" ]), Rule("clean", phony=True, commands=["rm -f $(ARTIFACTS)"]), ]) tools.write_to_file("Makefile", makefile.generate())
def build_script(self): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" script_contents = "@echo off\nREM Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n\n" copy_stmt = "copy" fail_stmt = " || exit /b" else: script_ext = ".sh" script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n" copy_stmt = "cp" fail_stmt = " || exit 1" script_file = "build_" + self._build_name + script_ext tools.write_to_file(script_file, script_contents, force_unix=False) return script_file
def header(self, build_name, partnumber): header = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() header += """ import os import sys import pprint home = "{0}" os.environ["EFXPT_HOME"] = home + "/pt" os.environ["EFXPGM_HOME"] = home + "/pgm" os.environ["EFXDBG_HOME"] = home + "/debugger" os.environ["EFXIPM_HOME"] = home + "/ipm" sys.path.append(home + "/pt/bin") sys.path.append(home + "/lib/python3.8/site-packages") from api_service.design import DesignAPI from api_service.device import DeviceAPI is_verbose = {1} design = DesignAPI(is_verbose) device = DeviceAPI(is_verbose) design.create("{2}", "{3}", "./../gateware", overwrite=True) """ return header.format(self.efinity_path, "True", build_name, partnumber)
def get_git_header(): from litex.build.tools import get_migen_git_revision, get_litex_git_revision r = generated_banner("//") r += "#ifndef __GENERATED_GIT_H\n#define __GENERATED_GIT_H\n\n" r += "#define MIGEN_GIT_SHA1 \"{}\"\n".format(get_migen_git_revision()) r += "#define LITEX_GIT_SHA1 \"{}\"\n".format(get_litex_git_revision()) r += "#endif\n" return r
def build_script(self): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n\n" fail_stmt = " || exit /b" else: script_ext = ".sh" script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\nset -e\n" fail_stmt = "" for s in self.build_template: s_fail = s + "{fail_stmt}\n" # Required so Windows scripts fail early. script_contents += s_fail.format( build_name = self._build_name, fail_stmt = fail_stmt, pnr_opts = self._pnr_opts) script_file = "build_" + self._build_name + script_ext tools.write_to_file(script_file, script_contents, force_unix=False) return script_file
def _build_script(build_name, device, toolchain_path, ver=None): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" build_script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n\n" copy_stmt = "copy" fail_stmt = " || exit /b" else: script_ext = ".sh" build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" copy_stmt = "cp" fail_stmt = "" if sys.platform not in ("win32", "cygwin"): build_script_contents += "bindir={}\n".format(toolchain_path) build_script_contents += ". ${{bindir}}/diamond_env{fail_stmt}\n".format( fail_stmt=fail_stmt) build_script_contents += "{pnmainc} {tcl_script}{fail_stmt}\n".format( pnmainc=os.path.join(toolchain_path, "pnmainc"), tcl_script=build_name + ".tcl", fail_stmt=fail_stmt) for ext in (".bit", ".jed"): if ext == ".jed" and not _produces_jedec(device): continue build_script_contents += "{copy_stmt} {diamond_product} {migen_product}" \ "{fail_stmt}\n".format( copy_stmt=copy_stmt, fail_stmt=fail_stmt, diamond_product=os.path.join("impl", build_name + "_impl" + ext), migen_product=build_name + ext) build_script_file = "build_" + build_name + script_ext tools.write_to_file(build_script_file, build_script_contents, force_unix=False) return build_script_file
def build_script(self): if sys.platform in ("win32", "cygwin"): script_ext = ".bat" script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n\n" fail_stmt = " || exit /b" else: script_ext = ".sh" script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\nset -e\n" fail_stmt = "" for s in self.build_template: s_fail = s + "{fail_stmt}\n" # Required so Windows scripts fail early. script_contents += s_fail.format( build_name = self._build_name, device = "ES" if self._es_device else self.platform.device, timefailarg = "--timing-allow-fail" if not self._timingstrict else "", ignoreloops = "--ignore-loops" if self._ignoreloops else "", fail_stmt = fail_stmt, seed = self._seed, ) script_file = "build_" + self._build_name + script_ext tools.write_to_file(script_file, script_contents, force_unix=False) return script_file
def build_script(self): build_name = self._build_name if sys.platform in ["win32", "cygwin"]: script_file = "build_" + build_name + ".bat" script_contents = "REM Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" else: script_file = "build_" + build_name + ".sh" script_contents = "#!/usr/bin/env bash\n" script_contents += "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" script_contents += "set -e -u -x -o pipefail\n" script_contents += """ quartus_map --read_settings_files=on --write_settings_files=off {build_name} -c {build_name} quartus_fit --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_asm --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_sta {build_name} -c {build_name}""" if self.platform.create_rbf: if sys.platform in ["win32", "cygwin"]: script_contents += """ if exist "{build_name}.sof" ( quartus_cpf -c {build_name}.sof {build_name}.rbf ) """ else: script_contents += """ if [ -f "{build_name}.sof" ] then quartus_cpf -c {build_name}.sof {build_name}.rbf fi """ script_contents = script_contents.format(build_name=build_name) tools.write_to_file(script_file, script_contents, force_unix=True) return script_file
def build_script(self): Var = _MakefileGenerator.Var Rule = _MakefileGenerator.Rule makefile = _MakefileGenerator([ "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n", Var("TOP", self._build_name), Var("PARTNAME", self._partname), Var("DEVICE", self.f4pga_device), Var("BITSTREAM_DEVICE", self.bitstream_device), "", Var("DB_DIR", "/usr/share/nextpnr/prjxray-db"), #FIXME: resolve path Var("CHIPDB_DIR", "/usr/share/nextpnr/xilinx-chipdb"), #FIXME: resolve path "", Var("VERILOG", [f for f,language,_ in self.platform.sources if language in ["verilog", "system_verilog"]]), Var("MEM_INIT", [f"{name}" for name in os.listdir() if name.endswith(".init")]), Var("SDC", f"{self._build_name}.sdc"), Var("XDC", f"{self._build_name}.xdc"), Var("ARTIFACTS", [ "$(TOP).fasm", "$(TOP).frames", "*.bit", "*.fasm", "*.json", "*.log", "*.rpt", "constraints.place" ]), Rule("all", ["$(TOP).bit"], phony=True), Rule("$(TOP).json", ["$(VERILOG)", "$(MEM_INIT)", "$(XDC)"], commands=[ #"symbiflow_synth -t $(TOP) -v $(VERILOG) -d $(BITSTREAM_DEVICE) -p $(PARTNAME) -x $(XDC) > /dev/null" #yosys -p "synth_xilinx -flatten -abc9 -nosrl -noclkbuf -nodsp -iopad -nowidelut" #forum: symbiflow_synth 'yosys -p "synth_xilinx -flatten -abc9 -nobram -arch xc7 -top $(TOP); write_json $(TOP).json" $(VERILOG) > /dev/null' ]), Rule("$(TOP).fasm", ["$(TOP).json"], commands=[ #"symbiflow_write_fasm -e $(TOP).eblif -d $(DEVICE) > /dev/null" 'nextpnr-xilinx --chipdb $(CHIPDB_DIR)/$(DEVICE).bin --xdc $(XDC) --json $(TOP).json --write $(TOP)_routed.json --fasm $(TOP).fasm > /dev/null' ]), Rule("$(TOP).frames", ["$(TOP).fasm"], commands=[ 'fasm2frames.py --part $(PARTNAME) --db-root $(DB_DIR)/$(BITSTREAM_DEVICE) $(TOP).fasm > $(TOP).frames' ]), Rule("$(TOP).bit", ["$(TOP).frames"], commands=[ #"symbiflow_write_bitstream -d $(BITSTREAM_DEVICE) -f $(TOP).fasm -p $(PARTNAME) -b $(TOP).bit > /dev/null" 'xc7frames2bit --part_file $(DB_DIR)/$(BITSTREAM_DEVICE)/$(PARTNAME)/part.yaml --part_name $(PARTNAME) --frm_file $(TOP).frames --output_file $(TOP).bit > /dev/null' ]), Rule("clean", phony=True, commands=[ "rm -f $(ARTIFACTS)" ]), ]) tools.write_to_file("Makefile", makefile.generate()) return "Makefile"
def _print_banner(filename, device): return """\ // ----------------------------------------------------------------------------- // Auto-Generated by: __ _ __ _ __ // / / (_) /____ | |/_/ // / /__/ / __/ -_)> < // /____/_/\\__/\\__/_/|_| // Build your hardware, easily! // https://github.com/enjoy-digital/litex // // Filename : {filename}.v // Device : {device} // LiteX sha1 : {revision} // Date : {date} //------------------------------------------------------------------------------\n """.format( device = device, filename = filename, revision = get_litex_git_revision(), date = datetime.datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d %H:%M:%S") )
def _run_quartus(build_name, quartus_path): build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" build_script_contents += """ set -e quartus_map --read_settings_files=on --write_settings_files=off {build_name} -c {build_name} quartus_fit --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_asm --read_settings_files=off --write_settings_files=off {build_name} -c {build_name} quartus_sta {build_name} -c {build_name} if [ -f "{build_name}.sof" ] then quartus_cpf -c {build_name}.sof {build_name}.rbf fi """.format(build_name=build_name) # noqa build_script_file = "build_" + build_name + ".sh" tools.write_to_file(build_script_file, build_script_contents, force_unix=True) if subprocess.call(["bash", build_script_file]): raise OSError("Subprocess failed")
def _run_ise(build_name, mode, ngdbuild_opt, toolchain, platform): if sys.platform == "win32" or sys.platform == "cygwin": script_ext = ".bat" shell = ["cmd", "/c"] build_script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" fail_stmt = " || exit /b" else: script_ext = ".sh" shell = ["bash"] build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" if os.getenv("LITEX_ENV_ISE", False): build_script_contents += "source " + os.path.join( os.getenv("LITEX_ENV_ISE"), "settings64.sh\n") fail_stmt = "" if mode == "edif": ext = "ngo" build_script_contents += """ edif2ngd {build_name}.edif {build_name}.{ext}{fail_stmt} """ else: ext = "ngc" build_script_contents += """ xst -ifn {build_name}.xst{fail_stmt} """ # This generates a .v file for post synthesis simulation build_script_contents += """ netgen -ofmt verilog -w -sim {build_name}.{ext} {build_name}_synth.v """ build_script_contents += """ ngdbuild {ngdbuild_opt} -uc {build_name}.ucf {build_name}.{ext} {build_name}.ngd{fail_stmt} """ if mode == "cpld": build_script_contents += """ cpldfit -ofmt verilog {par_opt} -p {device} {build_name}.ngd{fail_stmt} taengine -f {build_name}.vm6 -detail -iopath -l {build_name}.tim{fail_stmt} hprep6 -s IEEE1532 -i {build_name}.vm6{fail_stmt} """ else: build_script_contents += """ map {map_opt} -o {build_name}_map.ncd {build_name}.ngd {build_name}.pcf{fail_stmt} par {par_opt} {build_name}_map.ncd {build_name}.ncd {build_name}.pcf{fail_stmt} bitgen {bitgen_opt} {build_name}.ncd {build_name}.bit{fail_stmt} """ build_script_contents = build_script_contents.format( build_name=build_name, ngdbuild_opt=ngdbuild_opt, bitgen_opt=toolchain.bitgen_opt, ext=ext, par_opt=toolchain.par_opt, map_opt=toolchain.map_opt, device=platform.device, fail_stmt=fail_stmt) build_script_contents += toolchain.ise_commands.format( build_name=build_name) 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] if which("ise") is None and os.getenv("LITEX_ENV_ISE", False) == False: msg = "Unable to find or source ISE toolchain, please either:\n" msg += "- Source ISE's settings manually.\n" msg += "- Or set LITEX_ENV_ISE 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.")
def build_script(self): if sys.platform == "win32" or sys.platform == "cygwin": script_ext = ".bat" shell = ["cmd", "/c"] build_script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\n" fail_stmt = " || exit /b" else: script_ext = ".sh" shell = ["bash"] build_script_contents = "# Autogenerated by LiteX / git: " + tools.get_litex_git_revision( ) + "\nset -e\n" if os.getenv("LITEX_ENV_ISE", False): build_script_contents += "source " + os.path.join( os.getenv("LITEX_ENV_ISE"), "settings64.sh\n") fail_stmt = "" if self._isemode == "edif": ext = "ngo" build_script_contents += """ edif2ngd {build_name}.edif {build_name}.{ext}{fail_stmt} """ else: ext = "ngc" build_script_contents += """ xst -ifn {build_name}.xst{fail_stmt} """ # This generates a .v file for post synthesis simulation build_script_contents += """ netgen -ofmt verilog -w -sim {build_name}.{ext} {build_name}_synth.v """ build_script_contents += """ ngdbuild {ngdbuild_opt} -uc {build_name}.ucf {build_name}.{ext} {build_name}.ngd{fail_stmt} """ if self._isemode == "cpld": build_script_contents += """ cpldfit -ofmt verilog {par_opt} -p {device} {build_name}.ngd{fail_stmt} taengine -f {build_name}.vm6 -detail -iopath -l {build_name}.tim{fail_stmt} hprep6 -s IEEE1532 -i {build_name}.vm6{fail_stmt} """ else: build_script_contents += """ map {map_opt} -o {build_name}_map.ncd {build_name}.ngd {build_name}.pcf{fail_stmt} par {par_opt} {build_name}_map.ncd {build_name}.ncd {build_name}.pcf{fail_stmt} bitgen {bitgen_opt} {build_name}.ncd {build_name}.bit{fail_stmt} """ build_script_contents = build_script_contents.format( build_name=self._build_name, ngdbuild_opt=self.ngdbuild_opt, bitgen_opt=self.bitgen_opt, ext=ext, par_opt=self.par_opt, map_opt=self.map_opt, device=self.platform.device, fail_stmt=fail_stmt) build_script_contents += self.ise_commands.format( build_name=self._build_name) build_script_file = "build_" + self._build_name + script_ext tools.write_to_file(build_script_file, build_script_contents, force_unix=False) return build_script_file