[bug#77330,v2] gnu: nextpnr: split devices.

Message ID 50db8630c9ee69345a7fe2be4da217932021365e.1743155290.git.csantosb@inventati.org
State New
Headers
Series [bug#77330,v2] gnu: nextpnr: split devices. |

Commit Message

Cayetano Santos March 28, 2025, 9:48 a.m. UTC
  From: Cayetano Santos via Guix-patches via <guix-patches@gnu.org>

* gnu/packages/fpga.scm (nextpnr): split-devices.

Change-Id: I681dfa90a0ace3b507f3b56f3ac7d90227345606

Replace old nextpnr-ice40 by a common nextpnr package, plus a
device specific nextpnr-ice40 which inherits from it. Other device
packages will follow.

- compliant with #77067 (ice40 depends on icestorm)
- update to 0.8
- update substitutions in Makefiles
- addapt config and make flags to each package
- include tests from icestorm in nextpnr-ice40

Change-Id: Icbf9459347fefdcaaa43e7a6a5682eb0fb33ffe0
---
 gnu/packages/fpga.scm | 205 +++++++++++++++++++++++-------------------
 1 file changed, 115 insertions(+), 90 deletions(-)


base-commit: 0b6d9901ec11c9365f9c77da21c2d0bf4e07c6d9
  

Patch

diff --git a/gnu/packages/fpga.scm b/gnu/packages/fpga.scm
index 893e875276..20ee787e0f 100644
--- a/gnu/packages/fpga.scm
+++ b/gnu/packages/fpga.scm
@@ -313,102 +313,127 @@  (define-public icestorm
 Includes the actual FTDI connector.")
     (license license:isc))))
 
-(define-public nextpnr-ice40
-  (let* ((version "0.7")
-         (tag (string-append "nextpnr-" version)))
-    (package
-      (name "nextpnr-ice40")
-      (version version)
-      (source
-       (origin
-         (method git-fetch)
-         (uri (git-reference
-               (url "https://github.com/YosysHQ/nextpnr")
-               (commit tag)
-               (recursive? #t)))
-         (file-name (git-file-name name version))
-         (sha256
-          (base32
-           "0sbhqscgmlk4q2207rsqsw99qx4fyrxx1hsd669lrk42gmk3s9lm"))
-         (modules '((guix build utils)))
-         (snippet
-          #~(begin
-              ;; Remove bundled source code for which Guix has packages.
-              ;; Note the bundled copies of json11 and python-console contain
-              ;; modifications, while QtPropertyBrowser appears to be
-              ;; abandoned and without an official source.
-              ;; fpga-interchange-schema is used only by the
-              ;; "fpga_interchange" architecture target, which this package
-              ;; doesn't build.
+
+(define nextpnr
+  (package
+    (name "nextpnr")
+    (version "0.8")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/YosysHQ/nextpnr/")
+             (commit (string-append "nextpnr-" version))
+             (recursive? #t)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0p53a2gl89hf3hfwdxs6pykxyrk82j4lqpwd1fqia2y0c9r2gjlm"))))
+    (build-system qt-build-system)
+    (arguments
+     (list
+      #:cmake cmake
+      #:out-of-source? #t
+      #:configure-flags
+      #~(list "-DBUILD_GUI=OFF"
+              "-DUSE_OPENMP=yes"
+              "-DBUILD_TESTS=ON"
+              (string-append "-DCURRENT_GIT_VERSION=nextpnr-" #$version)
+              "-DUSE_IPO=OFF")
+      #:phases
+      #~(modify-phases %standard-phases
+          ;; Remove bundled source code for which Guix has packages.
+          ;; Note the bundled copies of json11 and python-console contain
+          ;; modifications, while QtPropertyBrowser appears to be
+          ;; abandoned and without an official source.
+          ;; fpga-interchange-schema is used only by the
+          ;; "fpga_interchange" architecture target, which this package
+          ;; doesn't build.
+          (add-after 'unpack 'remove-deps
+            (lambda _
               (with-directory-excursion "3rdparty"
                 (for-each delete-file-recursively
                           '("googletest" "imgui" "pybind11" "qtimgui"
-                            "sanitizers-cmake")))
-
-              ;; Remove references to unbundled code and link against external
-              ;; libraries instead.
+                            "sanitizers-cmake" "corrosion")))))
+          ;; Remove references to unbundled code and link against external
+          ;; libraries instead.
+          (add-after 'remove-deps 'patch-source
+            (lambda* (#:key inputs #:allow-other-keys)
               (substitute* "CMakeLists.txt"
-                (("^\\s+add_subdirectory\\(3rdparty/googletest.*") "")
-                (("^(\\s+target_link_libraries.*)( gtest_main\\))"
-                  _ prefix suffix)
-                 (string-append prefix " gtest" suffix)))
+                ;; Use the system sanitizers-cmake module.
+                (("\\$\\{CMAKE_SOURCE_DIR\\}/3rdparty/sanitizers-cmake/cmake")
+                 (string-append #$(this-package-native-input "sanitizers-cmake")
+                                "/share/sanitizers-cmake/cmake"))
+                ;; Use the system googletest and corrosion modules
+                (("^\\s+add_subdirectory\\(3rdparty/googletest.*")
+                 "")
+                (("^\\s+add_subdirectory\\(3rdparty/corrosion.*")
+                 "")
+                ;; replace gtest_main by gtest
+                (("^(\\s+target_link_libraries.*)( gtest_main)" _ prefix suffix)
+                 (string-append prefix " gtest")))
+              ;; gui
               (substitute* "gui/CMakeLists.txt"
-                (("^\\s+../3rdparty/(qt)?imgui.*") "")
-                (("^(target_link_libraries.*)\\)" _ prefix)
-                 (string-append prefix " imgui qt_imgui_widgets)")))))))
-      (native-inputs
-       (list googletest sanitizers-cmake))
-      (inputs
-       (list boost
-             eigen
-             icestorm
-             imgui-1.86
-             pybind11
-             python
-             qtbase-5
-             qtwayland-5
-             qtimgui
-             yosys))
-      (build-system qt-build-system)
-      (arguments
-       (list
-        #:configure-flags
-        #~(list "-DARCH=ice40"
-                "-DBUILD_GUI=ON"
-                "-DBUILD_TESTS=ON"
-                (string-append "-DCURRENT_GIT_VERSION=" #$tag)
-                (string-append "-DICESTORM_INSTALL_PREFIX="
-                               #$(this-package-input "icestorm"))
-                "-DUSE_IPO=OFF")
-        #:phases
-        #~(modify-phases %standard-phases
-            (add-after 'unpack 'patch-source
+                (("\\$\\{CMAKE_SOURCE_DIR\\}(/3rdparty/imgui)")
+                 (string-append #$(this-package-input "imgui") "/include/imgui"))
+                (("\\$\\{CMAKE_SOURCE_DIR\\}(/3rdparty/qtimgui)")
+                 (string-append #$(this-package-input "qtimgui") "/include/qtimgui"))
+                (("^\\s+../3rdparty/(qt)?imgui.*")
+                 "")))))))
+    (native-inputs (list googletest sanitizers-cmake))
+    (inputs (list boost
+                  eigen
+                  corrosion
+                  imgui
+                  pybind11
+                  python
+                  qtbase-5
+                  qtwayland-5
+                  qtimgui))
+    (synopsis "Place-and-Route tool for FPGAs")
+    (description "Nextpnr is a portable FPGA place and route tool.")
+    (home-page "https://github.com/YosysHQ/nextpnr/")
+    (license license:isc)))
+
+(define-public nextpnr-ice40
+  (package
+    (inherit nextpnr)
+    (name "nextpnr-ice40")
+    (arguments
+     (substitute-keyword-arguments (package-arguments nextpnr)
+       ;; tests
+       ((#:phases phases #~%standard-phases)
+        #~(modify-phases #$phases
+            ;; get icestorm/examples
+            (add-after 'compress-documentation 'get-icestorm
               (lambda* (#:key inputs #:allow-other-keys)
-                (substitute* "CMakeLists.txt"
-                  ;; Use the system sanitizers-cmake module.
-                  (("\\$\\{CMAKE_SOURCE_DIR\\}/3rdparty/sanitizers-cmake/cmake")
-                   (string-append
-                    #$(this-package-native-input "sanitizers-cmake")
-                    "/share/sanitizers-cmake/cmake")))
-                (substitute* "gui/CMakeLists.txt"
-                  ;; Compile with system imgui and qtimgui headers.
-                  (("^(target_include_directories.*)../3rdparty/imgui(.*)$"
-                    _ prefix suffix)
-                   (string-append prefix
-                                  (search-input-directory inputs
-                                                          "include/imgui")
-                                  suffix))
-                  (("^(target_include_directories.*)../3rdparty/qtimgui/(.*)$"
-                    _ prefix suffix)
-                   (string-append prefix
-                                  (search-input-directory inputs
-                                                          "include/qtimgui")
-                                  suffix))))))))
-      (synopsis "Place-and-Route tool for FPGAs")
-      (description "Nextpnr aims to be a vendor neutral, timing driven, FOSS
-FPGA place and route tool.")
-      (home-page "https://github.com/YosysHQ/nextpnr")
-      (license license:expat))))
+                (copy-recursively
+                 #$(origin (inherit (package-source icestorm)))
+                 "icestorm")))
+            ;; run all examples as tests
+            (add-after 'get-icestorm 'test
+              (lambda* _
+                (let ((dir (opendir "icestorm/examples")))
+                  (do ((entry (readdir dir)
+                              (readdir dir)))
+                      ((eof-object? entry))
+                    (when (not (member entry '("." "..")))
+                      (setenv "PATH"
+                              (string-append (string-append #$output "/bin")
+                                             ":"
+                                             (getenv "PATH")))
+                      (invoke "make" "-C"
+                              (string-append "icestorm/examples/" entry))))
+                  (closedir dir))))))
+       ((#:configure-flags original-flags #~(list))
+        #~(append #$original-flags
+                  `("-DARCH=ice40"
+                    ,(string-append "-DICESTORM_INSTALL_PREFIX="
+                                    #$(this-package-input "icestorm")))))))
+    (propagated-inputs (modify-inputs (package-propagated-inputs nextpnr)
+                         (prepend icestorm)))
+    ;; tests
+    (native-inputs (modify-inputs (package-native-inputs nextpnr)
+                     (prepend yosys)))))
 
 (define-public gtkwave
   (package