build/nextpnr_wrapper: a NextPNR wrapper
This commit is contained in:
parent
b2adabbece
commit
32c750c12e
|
@ -0,0 +1,87 @@
|
||||||
|
#
|
||||||
|
# This file is part of LiteX.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2022 Gwenhael Goavec-Merou <gwenhael.goavec-merou@trabucayre.com>
|
||||||
|
# SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
|
||||||
|
|
||||||
|
#from litex.build import *
|
||||||
|
from litex.build import tools
|
||||||
|
|
||||||
|
|
||||||
|
class NextPNRWrapper():
|
||||||
|
"""
|
||||||
|
NextPNRWrapper NexPNR wrapper
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, family="", architecture="", package="", build_name="",
|
||||||
|
in_format="", out_format="", constr_format="",
|
||||||
|
pnr_opts="", **kwargs):
|
||||||
|
"""
|
||||||
|
Parameters
|
||||||
|
==========
|
||||||
|
family: str
|
||||||
|
device family (ice40, ecp5, nexus).
|
||||||
|
architecture: str
|
||||||
|
device architecture.
|
||||||
|
package: str
|
||||||
|
device package.
|
||||||
|
build_name: str
|
||||||
|
gateware name.
|
||||||
|
in_format: str
|
||||||
|
NextPNR input file format.
|
||||||
|
out_format: str
|
||||||
|
NextPNR output file format.
|
||||||
|
constr_format: str
|
||||||
|
gateware constraints format.
|
||||||
|
pnr_opts: str
|
||||||
|
options to pass to nextpnr-xxx
|
||||||
|
kwargs: dict
|
||||||
|
alternate options key/value
|
||||||
|
"""
|
||||||
|
self.name = f"nextpnr-{family}"
|
||||||
|
self._target = family
|
||||||
|
self._build_name = build_name
|
||||||
|
self._in_format = in_format
|
||||||
|
self._out_format = out_format
|
||||||
|
self._constr_format = constr_format
|
||||||
|
self._pnr_opts = pnr_opts + " "
|
||||||
|
self._pnr_opts += f"--{architecture} " if architecture != "" else ""
|
||||||
|
self._pnr_opts += f"--package {package} " if package != "" else ""
|
||||||
|
for key,value in kwargs.items():
|
||||||
|
key = key.replace("_","-")
|
||||||
|
if isinstance(value, bool):
|
||||||
|
self._pnr_opts += f"--{key} " if value else ""
|
||||||
|
else:
|
||||||
|
if value != "":
|
||||||
|
self._pnr_opts += f"--{key} {value} "
|
||||||
|
|
||||||
|
def get_call(self, target="script"):
|
||||||
|
"""built a script command or a Makefile rule + command
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
==========
|
||||||
|
target : str
|
||||||
|
selects if it's a script command or a Makefile rule to be returned
|
||||||
|
|
||||||
|
Returns
|
||||||
|
=======
|
||||||
|
str containing instruction and/or rule
|
||||||
|
"""
|
||||||
|
cmd = "{pnr_name} --{in_fmt} {build_name}.{in_fmt} --{constr_fmt}" + \
|
||||||
|
" {build_name}.{constr_fmt}" + \
|
||||||
|
" --{out_fmt} {build_name}.{out_ext} {pnr_opts}\n"
|
||||||
|
base_cmd = cmd.format(
|
||||||
|
pnr_name=self.name,
|
||||||
|
build_name=self._build_name,
|
||||||
|
in_fmt=self._in_format,
|
||||||
|
out_fmt="textcfg" if self._out_format == "config" else self._out_format,
|
||||||
|
out_ext=self._out_format,
|
||||||
|
constr_fmt=self._constr_format,
|
||||||
|
pnr_opts=self._pnr_opts)
|
||||||
|
if target == "makefile":
|
||||||
|
return f"{self._build_name}.{self._out_format}:\n\t" + base_cmd
|
||||||
|
elif target == "script":
|
||||||
|
return base_cmd
|
||||||
|
else:
|
||||||
|
raise ValueError("Invalid target type")
|
Loading…
Reference in New Issue