depot/third_party/nixpkgs/pkgs/development/compilers/yosys/default.nix
Default email cc49d46d4f Project import generated by Copybara.
GitOrigin-RevId: 2deeb58f49480f468adca6b08291322de4dbce6b
2020-11-12 23:50:31 +00:00

106 lines
3.5 KiB
Nix

{ stdenv
, abc-verifier
, bash
, bison
, fetchFromGitHub
, flex
, libffi
, pkgconfig
, protobuf
, python3
, readline
, tcl
, verilog
, zlib
}:
# 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.
stdenv.mkDerivation rec {
pname = "yosys";
version = "0.9+3675";
src = fetchFromGitHub {
owner = "YosysHQ";
repo = "yosys";
rev = "71ca9a825309635511b64b3ec40e5e5e9b6ad49b";
sha256 = "03jlhfvm5rxx8yybf94nqd3ld2y6brp8r0k6gfi56chv3iqqavy3";
};
enableParallelBuilding = true;
nativeBuildInputs = [ pkgconfig ];
buildInputs = [ tcl readline libffi python3 bison flex protobuf zlib ];
makeFlags = [ "ENABLE_PROTOBUF=1" "PREFIX=${placeholder "out"}"];
patchPhase = ''
substituteInPlace ./Makefile \
--replace 'CXX = clang' "" \
--replace 'LD = clang++' 'LD = $(CXX)' \
--replace 'CXX = gcc' "" \
--replace 'LD = gcc' 'LD = $(CXX)' \
--replace 'ABCMKARGS = CC="$(CXX)" CXX="$(CXX)"' 'ABCMKARGS =' \
--replace 'echo UNKNOWN' 'echo ${builtins.substring 0 10 src.rev}'
substituteInPlace ./misc/yosys-config.in \
--replace '/bin/bash' '${bash}/bin/bash'
patchShebangs tests
'';
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
# we have to do this ourselves for some reason...
(cd misc && ${protobuf}/bin/protoc --cpp_out ../backends/protobuf/ ./yosys.proto)
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 (${version}), failing."
exit 1
fi
'';
checkTarget = "test";
doCheck = true;
checkInputs = [ 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";
meta = with stdenv.lib; {
description = "Open RTL synthesis framework and tools";
homepage = "http://www.clifford.at/yosys/";
license = licenses.isc;
platforms = platforms.all;
maintainers = with maintainers; [ shell thoughtpolice emily ];
};
}