build: Remove openfpga build backend (Replaced by osfpga build backend).
OpenFPGA build backend was an experimental build backend for OpenFPGA/SOFA chips. OpenFPGA is now providing a new FOEDAG build framework abstracting things and providing a regular .tcl/.sdc based toolchain.
This commit is contained in:
parent
aaf03b3860
commit
04f6b17d03
|
@ -1 +0,0 @@
|
||||||
from litex.build.openfpga.platform import OpenFPGAPlatform
|
|
|
@ -1,44 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
#
|
|
||||||
# This file is part of LiteX.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2022 Florent Kermarrec <florent@enjoy-digital.fr>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
from migen import *
|
|
||||||
|
|
||||||
from litex.build.generic_platform import Pins
|
|
||||||
from litex.build.openfpga import OpenFPGAPlatform
|
|
||||||
|
|
||||||
# export LITEX_ENV_OPENFPGA=/home/florent/dev/openfpga/OpenFPGA
|
|
||||||
# export LITEX_ENV_OPENFPGA_SOFA=/home/florent/dev/openfpga/SOFA
|
|
||||||
|
|
||||||
# Minimal Platform ---------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
_io = [
|
|
||||||
("clk", 0, Pins(1)),
|
|
||||||
("led", 0, Pins(1))
|
|
||||||
]
|
|
||||||
|
|
||||||
class Platform(OpenFPGAPlatform):
|
|
||||||
def __init__(self):
|
|
||||||
OpenFPGAPlatform.__init__(self, "FPGA1212_QLSOFA_HD", _io)
|
|
||||||
|
|
||||||
# Minimal Design -----------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
platform = Platform()
|
|
||||||
clk = platform.request("clk")
|
|
||||||
led = platform.request("led")
|
|
||||||
module = Module()
|
|
||||||
module.clock_domains.cd_sys = ClockDomain("sys")
|
|
||||||
module.comb += module.cd_sys.clk.eq(clk)
|
|
||||||
counter = Signal(26)
|
|
||||||
module.comb += led.eq(counter[25])
|
|
||||||
module.sync += counter.eq(counter + 1)
|
|
||||||
|
|
||||||
# Build --------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
platform.build(module, run=True)
|
|
|
@ -1,9 +0,0 @@
|
||||||
#
|
|
||||||
# This file is part of LiteX.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2022 Florent Kermarrec <florent@enjoy-digital.fr>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
|
|
||||||
# OpenFPGA Special Overrides ---------------------------------------------------------------------
|
|
||||||
|
|
||||||
openfpga_special_overrides = {}
|
|
|
@ -1,152 +0,0 @@
|
||||||
#
|
|
||||||
# This file is part of LiteX.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2022 Florent Kermarrec <florent@enjoy-digital.fr>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
from shutil import which
|
|
||||||
|
|
||||||
from migen.fhdl.structure import _Fragment
|
|
||||||
|
|
||||||
from litex.build.generic_platform import *
|
|
||||||
from litex.build import tools
|
|
||||||
from litex.build.openfpga import common
|
|
||||||
|
|
||||||
# Check Setup --------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def _check_setup():
|
|
||||||
if os.getenv("LITEX_ENV_OPENFPGA", False) == False:
|
|
||||||
msg = "Unable to find OpenFPGA toolchain, please:\n"
|
|
||||||
msg += "- Set LITEX_ENV_OPENFPGA environment variant to OpenFPGA's settings path.\n"
|
|
||||||
raise OSError(msg)
|
|
||||||
|
|
||||||
if os.getenv("LITEX_ENV_OPENFPGA_SOFA", False) == False:
|
|
||||||
msg = "Unable to find OpenFPGA's SOFA project, please:\n"
|
|
||||||
msg += "- Set LITEX_ENV_OPENFPGA_SOFA environment variant to OpenFPGA's SOFA settings path.\n"
|
|
||||||
raise OSError(msg)
|
|
||||||
|
|
||||||
# Task Config -------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
def _build_task_conf(platform, sources, build_dir, build_name):
|
|
||||||
# Get Environnment variables.
|
|
||||||
openfpga_path = os.getenv("LITEX_ENV_OPENFPGA")
|
|
||||||
openfpga_sofa_path = os.getenv("LITEX_ENV_OPENFPGA_SOFA")
|
|
||||||
|
|
||||||
# Get PnR/Task directories from OPENFPGA/SOFA paths.
|
|
||||||
pnr_path = os.path.join(openfpga_sofa_path, platform.device + "_PNR")
|
|
||||||
task_path = os.path.join(pnr_path, platform.device + "_task")
|
|
||||||
|
|
||||||
# Get Config file.
|
|
||||||
task_conf = os.path.join(task_path, "config", "task_simulation.conf")
|
|
||||||
|
|
||||||
# Helpers.
|
|
||||||
def replace_openfpga_task_section(filename, section, contents):
|
|
||||||
lines = []
|
|
||||||
# Read file and replace section with contents.
|
|
||||||
copy = True
|
|
||||||
for line in open(filename, "r"):
|
|
||||||
if not copy and line.startswith("["):
|
|
||||||
copy = True
|
|
||||||
if line.startswith(section):
|
|
||||||
copy = False
|
|
||||||
lines.append(section + "\n")
|
|
||||||
for l in contents:
|
|
||||||
lines.append(l + "\n")
|
|
||||||
lines.append("\n")
|
|
||||||
if copy:
|
|
||||||
lines.append(line)
|
|
||||||
|
|
||||||
# Save file to .orig.
|
|
||||||
os.system(f"mv {filename} {filename}.orig")
|
|
||||||
|
|
||||||
# Write file with replaced section.
|
|
||||||
with open(filename, "w") as f:
|
|
||||||
f.write("".join(lines))
|
|
||||||
|
|
||||||
# Add sources.
|
|
||||||
bench_sources = []
|
|
||||||
for filename, language, library in sources:
|
|
||||||
if language is None:
|
|
||||||
continue
|
|
||||||
if language not in ["verilog"]:
|
|
||||||
raise ValueError("OpenFPGA flow only supports verilog")
|
|
||||||
bench_sources.append(filename)
|
|
||||||
replace_openfpga_task_section(task_conf, "[BENCHMARKS]", [f"bench0={' '.join(bench_sources)}"])
|
|
||||||
|
|
||||||
# Set Top-Level.
|
|
||||||
replace_openfpga_task_section(task_conf, "[SYNTHESIS_PARAM]", [f"bench0_top={build_name}"])
|
|
||||||
|
|
||||||
def _run_task(device):
|
|
||||||
# Get Environnment variables.
|
|
||||||
openfpga_path = os.getenv("LITEX_ENV_OPENFPGA")
|
|
||||||
openfpga_sofa_path = os.getenv("LITEX_ENV_OPENFPGA_SOFA")
|
|
||||||
|
|
||||||
# Get PnR/Task directories from OPENFPGA/SOFA paths.
|
|
||||||
pnr_path = os.path.join(openfpga_sofa_path, device + "_PNR")
|
|
||||||
task_path = os.path.join(pnr_path, device + "_task")
|
|
||||||
|
|
||||||
# Set OPENFPGA_PATH.
|
|
||||||
os.environ["OPENFPGA_PATH"] = os.getenv("LITEX_ENV_OPENFPGA")
|
|
||||||
|
|
||||||
# Run OpenFPGA flow.
|
|
||||||
build_cmd = ["make", "-C", pnr_path, "clean", "runOpenFPGA"]
|
|
||||||
if subprocess.call(build_cmd) != 0:
|
|
||||||
raise OSError("Error occured during OpenFPGA's flow execution.")
|
|
||||||
|
|
||||||
# Copy artifacts.
|
|
||||||
os.system("rm -rf run001")
|
|
||||||
os.system(f"cp -r {task_path}/run001 run001")
|
|
||||||
|
|
||||||
# Display log. FIXME: Do it during build?
|
|
||||||
os.system("cat run001/vpr_arch/top/MIN_ROUTE_CHAN_WIDTH/openfpgashell.log")
|
|
||||||
|
|
||||||
# OpenFPGAToolchain --------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class OpenFPGAToolchain:
|
|
||||||
attr_translate = {}
|
|
||||||
|
|
||||||
special_overrides = common.openfpga_special_overrides
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.clocks = dict()
|
|
||||||
self.false_paths = set()
|
|
||||||
|
|
||||||
def build(self, platform, fragment,
|
|
||||||
build_dir = "build",
|
|
||||||
build_name = "top",
|
|
||||||
run = False,
|
|
||||||
**kwargs):
|
|
||||||
|
|
||||||
# Create Build Directory.
|
|
||||||
os.makedirs(build_dir, exist_ok=True)
|
|
||||||
cwd = os.getcwd()
|
|
||||||
os.chdir(build_dir)
|
|
||||||
|
|
||||||
# Finalize Design.
|
|
||||||
if not isinstance(fragment, _Fragment):
|
|
||||||
fragment = fragment.get_fragment()
|
|
||||||
platform.finalize(fragment)
|
|
||||||
|
|
||||||
# Generate Verilog.
|
|
||||||
v_output = platform.get_verilog(fragment, name=build_name, **kwargs)
|
|
||||||
named_sc, named_pc = platform.resolve_signals(v_output.ns)
|
|
||||||
top_file = build_name + ".v"
|
|
||||||
v_output.write(top_file)
|
|
||||||
platform.add_source(top_file)
|
|
||||||
|
|
||||||
# Check Setup.
|
|
||||||
_check_setup()
|
|
||||||
|
|
||||||
# Generate Task Config.
|
|
||||||
_build_task_conf(platform, platform.sources, build_dir, build_name)
|
|
||||||
|
|
||||||
# Run Task.
|
|
||||||
if run:
|
|
||||||
_run_task(platform.device)
|
|
||||||
|
|
||||||
os.chdir(cwd)
|
|
||||||
|
|
||||||
return v_output.ns
|
|
|
@ -1,28 +0,0 @@
|
||||||
#
|
|
||||||
# This file is part of LiteX.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2022 Florent Kermarrec <florent@enjoy-digital.fr>
|
|
||||||
# SPDX-License-Identifier: BSD-2-Clause
|
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
from litex.build.generic_platform import GenericPlatform
|
|
||||||
from litex.build.openfpga import common, openfpga
|
|
||||||
|
|
||||||
# OpenFPGAPlatform -------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class OpenFPGAPlatform(GenericPlatform):
|
|
||||||
def __init__(self, device, *args, **kwargs):
|
|
||||||
GenericPlatform.__init__(self, device, *args, **kwargs)
|
|
||||||
self.toolchain = openfpga.OpenFPGAToolchain()
|
|
||||||
|
|
||||||
def get_verilog(self, *args, special_overrides=dict(), **kwargs):
|
|
||||||
so = dict(common.openfpga_special_overrides)
|
|
||||||
so.update(special_overrides)
|
|
||||||
return GenericPlatform.get_verilog(self, *args,
|
|
||||||
special_overrides = so,
|
|
||||||
attr_translate = self.toolchain.attr_translate,
|
|
||||||
**kwargs)
|
|
||||||
|
|
||||||
def build(self, *args, **kwargs):
|
|
||||||
return self.toolchain.build(self, *args, **kwargs)
|
|
Loading…
Reference in New Issue