Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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")
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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")
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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")
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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
Ejemplo n.º 13
0
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()
    )
Ejemplo n.º 14
0
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
Ejemplo n.º 15
0
    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)
Ejemplo n.º 16
0
    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())
Ejemplo n.º 17
0
    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
Ejemplo n.º 18
0
    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)
Ejemplo n.º 19
0
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
Ejemplo n.º 20
0
    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
Ejemplo n.º 21
0
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
Ejemplo n.º 22
0
    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
Ejemplo n.º 23
0
    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
Ejemplo n.º 24
0
    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"
Ejemplo n.º 25
0
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")
Ejemplo n.º 27
0
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.")
Ejemplo n.º 28
0
    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