nixpkgs/pkgs/development/compilers/yosys/default.nix
Thomas Watson 65b289f68a yosys: 0.37 -> 0.38
Also fix test issues on macOS.
2024-02-10 15:59:39 -06:00

176 lines
5.3 KiB
Nix

{ stdenv
, lib
, abc-verifier
, bash
, bison
, boost
, fetchFromGitHub
, flex
, libffi
, makeWrapper
, pkg-config
, python3
, readline
, symlinkJoin
, tcl
, verilog
, zlib
, yosys
, yosys-bluespec
, yosys-ghdl
, yosys-symbiflow
, enablePython ? true # enable python binding
}:
# 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.
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 ];
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;
};
in stdenv.mkDerivation (finalAttrs: {
pname = "yosys";
version = "0.38";
src = fetchFromGitHub {
owner = "YosysHQ";
repo = "yosys";
rev = "refs/tags/${finalAttrs.pname}-${finalAttrs.version}";
hash = "sha256-mzMBhnIEgToez6mGFOvO7zBA+rNivZ9OnLQsjBBDamA=";
};
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}'
# https://github.com/YosysHQ/yosys/pull/4199
substituteInPlace ./tests/various/clk2fflogic_effects.sh \
--replace-fail 'tail +3' 'tail -n +3'
chmod +x ./misc/yosys-config.in
patchShebangs tests ./misc/yosys-config.in
'';
preBuild = let
shortAbcRev = builtins.substring 0 7 abc-verifier.rev;
in ''
chmod -R u+w .
make config-${if stdenv.cc.isClang or false then "clang" else "gcc"}
echo 'ABCEXTERNAL = ${abc-verifier}/bin/abc' >> Makefile.conf
if ! grep -q "ABCREV = ${shortAbcRev}" Makefile; then
echo "ERROR: yosys isn't compatible with the provided abc (${shortAbcRev}), failing."
exit 1
fi
if ! grep -q "YOSYS_VER := $version" Makefile; then
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
'';
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";
doCheck = true;
nativeCheckInputs = [ verilog ];
# Internally, yosys knows to use the specified hardcoded ABCEXTERNAL binary.
# But other tools (like mcy or symbiyosys) can't know how yosys was built, so
# they just assume that 'yosys-abc' is available -- but it's not installed
# when using ABCEXTERNAL
#
# add a symlink to fake things so that both variants work the same way. this
# is also needed at build time for the test suite.
postBuild = "ln -sfv ${abc-verifier}/bin/abc ./yosys-abc";
postInstall = "ln -sfv ${abc-verifier}/bin/abc $out/bin/yosys-abc";
setupHook = ./setup-hook.sh;
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 emily Luflosi ];
};
})