about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/nextpnr/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/nextpnr/default.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/nextpnr/default.nix75
1 files changed, 75 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/nextpnr/default.nix b/nixpkgs/pkgs/development/compilers/nextpnr/default.nix
new file mode 100644
index 000000000000..ec5deb4e22aa
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/nextpnr/default.nix
@@ -0,0 +1,75 @@
+{ stdenv, fetchFromGitHub, cmake, makeWrapper
+, boost, python3, eigen
+, icestorm, trellis
+
+# TODO(thoughtpolice) Currently the GUI build seems broken at runtime on my
+# laptop (and over a remote X server on my server...), so mark it broken for
+# now, with intent to fix later.
+, enableGui ? false
+, qtbase
+}:
+
+let
+  boostPython = boost.override { python = python3; enablePython = true; };
+
+  # This is a massive hack. For now, Trellis doesn't really support
+  # installation through an already-built package; you have to build it once to
+  # get the tools, then reuse the build directory to build nextpnr -- the
+  # 'install' phase doesn't install everything it needs.  This will be fixed in
+  # the future but for now we can do this horrific thing.
+  trellisRoot = trellis.overrideAttrs (_: {
+    installPhase = ''
+      mkdir -p $out
+      cp *.so ..
+      cd ../../.. && cp -R trellis database $out/
+    '';
+  });
+in
+stdenv.mkDerivation rec {
+  name = "nextpnr-${version}";
+  version = "2019.04.19";
+
+  src = fetchFromGitHub {
+    owner  = "yosyshq";
+    repo   = "nextpnr";
+    rev    = "5344bc3b65f4e06f983db781e9a82d30b3f1512b";
+    sha256 = "1y14jpa948cwk0i19bsfqh7yxsxkgskm4xym4z179sjcvcdvrn3a";
+  };
+
+  nativeBuildInputs = [ cmake makeWrapper ];
+  buildInputs
+     = [ boostPython python3 eigen ]
+    ++ (stdenv.lib.optional enableGui qtbase);
+
+  enableParallelBuilding = true;
+  cmakeFlags =
+    [ "-DARCH=generic;ice40;ecp5"
+      "-DICEBOX_ROOT=${icestorm}/share/icebox"
+      "-DTRELLIS_ROOT=${trellisRoot}/trellis"
+      "-DUSE_OPENMP=ON"
+    ] ++ (stdenv.lib.optional (!enableGui) "-DBUILD_GUI=OFF");
+
+  # Fix the version number. This is a bit stupid (and fragile) in practice
+  # but works ok. We should probably make this overrideable upstream.
+  patchPhase = with builtins; ''
+    substituteInPlace ./CMakeLists.txt \
+      --replace 'git log -1 --format=%h' 'echo ${substring 0 11 src.rev}'
+  '';
+
+  postInstall = stdenv.lib.optionalString enableGui ''
+    for x in generic ice40 ecp5; do
+      wrapProgram $out/bin/nextpnr-$x \
+        --prefix QT_PLUGIN_PATH : "${qtbase}/${qtbase.qtPluginPrefix}"
+    done
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Place and route tool for FPGAs";
+    homepage    = https://github.com/yosyshq/nextpnr;
+    license     = licenses.isc;
+    platforms   = platforms.linux;
+    maintainers = with maintainers; [ thoughtpolice ];
+
+    broken = enableGui;
+  };
+}