nixpkgs/pkgs/development/compilers/yosys/default.nix

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

183 lines
4.7 KiB
Nix
Raw Normal View History

2021-03-31 21:11:34 +00:00
{
stdenv,
lib,
2020-01-07 15:06:23 +00:00
bison,
boost,
2020-01-07 15:06:23 +00:00
fetchFromGitHub,
flex,
libffi,
2022-01-07 14:10:18 +00:00
makeWrapper,
pkg-config,
2020-01-07 15:06:23 +00:00
python3,
readline,
2022-01-07 14:10:18 +00:00
symlinkJoin,
2020-01-07 15:06:23 +00:00
tcl,
iverilog,
2020-01-07 15:06:23 +00:00
zlib,
2022-01-07 14:10:18 +00:00
yosys,
yosys-bluespec,
yosys-ghdl,
yosys-symbiflow,
enablePython ? true, # enable python binding
}:
2015-12-29 16:31:18 +00:00
# NOTE: as of late 2020, yosys has switched to an automation robot that
# automatically tags their repository Makefile with a new build number every
# day when changes are committed. please MAKE SURE that the version number in
# the 'version' field exactly matches the YOSYS_VER field in the Yosys
# makefile!
#
# if a change in yosys isn't yet available under a build number like this (i.e.
# it was very recently merged, within an hour), wait a few hours for the
# automation robot to tag the new version, like so:
#
# https://github.com/YosysHQ/yosys/commit/71ca9a825309635511b64b3ec40e5e5e9b6ad49b
#
# note that while most nix packages for "unstable versions" use a date-based
# version scheme, synchronizing the nix package version here with the unstable
# yosys version number helps users report better bugs upstream, and is
# ultimately less confusing than using dates.
2022-01-07 14:10:18 +00:00
let
# Provides a wrapper for creating a yosys with the specifed plugins preloaded
#
# Example:
#
# my_yosys = yosys.withPlugins (with yosys.allPlugins; [
# fasm
# bluespec
# ]);
withPlugins =
plugins:
let
paths = lib.closePropagation plugins;
module_flags =
with builtins;
concatStringsSep " " (map (n: "--add-flags -m --add-flags ${n.plugin}") plugins);
in
lib.appendToName "with-plugins" (symlinkJoin {
inherit (yosys) name;
paths = paths ++ [ yosys ];
nativeBuildInputs = [ makeWrapper ];
2022-01-07 14:10:18 +00:00
postBuild = ''
wrapProgram $out/bin/yosys \
--set NIX_YOSYS_PLUGIN_DIRS $out/share/yosys/plugins \
${module_flags}
'';
});
allPlugins = {
bluespec = yosys-bluespec;
ghdl = yosys-ghdl;
} // (yosys-symbiflow);
boost_python = boost.override {
enablePython = true;
python = python3;
};
2022-01-07 14:10:18 +00:00
2023-11-08 13:39:42 +00:00
in
stdenv.mkDerivation (finalAttrs: {
pname = "yosys";
version = "0.47";
2015-12-29 16:31:18 +00:00
src = fetchFromGitHub {
owner = "YosysHQ";
repo = "yosys";
rev = "refs/tags/${finalAttrs.version}";
hash = "sha256-9u9aAPTZyt9vzZwryor3GRCGzs/mu2/XtM0XzV7uHfk=";
fetchSubmodules = true;
leaveDotGit = true;
postFetch = ''
# set up git hashes as if we used the tarball
pushd $out
git rev-parse HEAD > .gitcommit
cd $out/abc
git rev-parse HEAD > .gitcommit
popd
# remove .git now that we are through with it
find "$out" -name .git -print0 | xargs -0 rm -rf
'';
};
2015-12-29 16:31:18 +00:00
enableParallelBuilding = true;
nativeBuildInputs = [
pkg-config
bison
flex
];
propagatedBuildInputs = [
tcl
readline
libffi
zlib
(python3.withPackages (
pp: with pp; [
click
]
))
] ++ lib.optional enablePython boost_python;
makeFlags = [ "PREFIX=${placeholder "out"}" ];
patches = [
./plugin-search-dirs.patch
./fix-clang-build.patch # see https://github.com/YosysHQ/yosys/issues/2011
];
postPatch = ''
substituteInPlace ./Makefile \
--replace-fail 'echo UNKNOWN' 'echo ${builtins.substring 0 10 finalAttrs.src.rev}'
patchShebangs tests ./misc/yosys-config.in
'';
preBuild =
''
chmod -R u+w .
2018-04-11 20:08:51 +00:00
make config-${if stdenv.cc.isClang or false then "clang" else "gcc"}
if ! grep -q "YOSYS_VER := $version" Makefile; then
2023-11-08 13:39:42 +00:00
echo "ERROR: yosys version in Makefile isn't equivalent to version of the nix package (allegedly ${finalAttrs.version}), failing."
exit 1
fi
''
+ lib.optionalString enablePython ''
echo "ENABLE_PYOSYS := 1" >> Makefile.conf
echo "PYTHON_DESTDIR := $out/${python3.sitePackages}" >> Makefile.conf
echo "BOOST_PYTHON_LIB := -lboost_python${lib.versions.major python3.version}${lib.versions.minor python3.version}" >> Makefile.conf
2015-12-29 16:31:18 +00:00
'';
preCheck = ''
# autotest.sh automatically compiles a utility during startup if it's out of date.
# having N check jobs race to do that creates spurious codesigning failures on macOS.
# run it once without asking it to do anything so that compilation is done before the jobs start.
tests/tools/autotest.sh
'';
checkTarget = "test";
2019-09-27 14:06:42 +00:00
doCheck = true;
nativeCheckInputs = [ iverilog ];
2019-09-27 14:06:42 +00:00
yosys: enable loading "out of band" plugins By default, when yosys looks for plugins with the `-m` flag or `plugin` command, it always looks in `YOSYS_PREFIX/share/yosys/plugins` for a `.so` file, and loads that. By design, this is intended to be a single, global, mutable location such as `/usr/share/yosys/...` on disk, and plugins are supposed to install their `.so` files here after yosys is installed, and they all coexist together. Obviously, this won't work for us, but users might expect these plugins to still work. More importantly, they won't want to add special cases to their build systems. Instead, to allow Nix users to use yosys plugins with the same UX (e.g. natively call `plugin bluespec` or `-m ghdl`), we add a patch to yosys that allows it to search a new `NIX_YOSYS_PLUGIN_DIRS` search path environment variable. In tandem, we add a setup hook that adds to this search path if a package has a `$out/share/yosys/plugins` directory. Thus, it's enough to just include `yosys`, and any package that has a yosys plugin in `$out/share/yosys/plugins`, and you can load it with `-m` or the `plugin` command. We could use a style like the haskellPackages set, where the set of packages are "encased" in a lambda, and we pass packages that are compatible with that version of the compiler: haskell.packages.ghc8102.ghcWithPackages (p: with p; [ ... ]) but, realistically, there will probably only ever be one version of yosys and one set of compatible plugins, so this seems overdone. Signed-off-by: Austin Seipp <aseipp@pobox.com>
2021-01-15 05:52:23 +00:00
setupHook = ./setup-hook.sh;
2022-01-07 14:10:18 +00:00
passthru = {
inherit withPlugins allPlugins;
};
meta = with lib; {
description = "Open RTL synthesis framework and tools";
homepage = "https://yosyshq.net/yosys/";
license = licenses.isc;
platforms = platforms.all;
maintainers = with maintainers; [
shell
thoughtpolice
Luflosi
];
2015-12-29 16:31:18 +00:00
};
2023-11-08 13:39:42 +00:00
})