summary refs log tree commit diff
path: root/flake.nix
diff options
context:
space:
mode:
Diffstat (limited to 'flake.nix')
-rw-r--r--flake.nix99
1 files changed, 99 insertions, 0 deletions
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..1517d5a
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,99 @@
+{
+  inputs = {
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
+    flake-utils.url = "github:numtide/flake-utils";
+  };
+
+  outputs = { nixpkgs, flake-utils, self }:
+    flake-utils.lib.eachDefaultSystem (system: 
+  let
+    name = "Blinker";
+    family = "Cyclone V";
+    device = "5CGXFC5C6F27C7";
+    hdl = "vhdl";
+    src = ./.;
+ 
+    pkgs = import nixpkgs { inherit system; config.allowUnfree = true; };
+    hpkgs = pkgs.haskellPackages.override {
+      overrides = self: super: {
+        clash-prelude = super.callHackageDirect {
+        pkg = "clash-prelude";
+        ver = "1.8.1";
+        sha256 = "sha256-HUt8Aw5vMFWThp26e/FdVkcjGQK8rvUV/ZMlv/KvHgg=";
+      } {};
+        clash-ghc = super.callHackageDirect {
+        pkg = "clash-ghc";
+        ver = "1.8.1";
+        sha256 = "sha256-oMK756+7WA5rGSRLkJ6Rpdkb2IkJ2VA6S82HGGyiK7Y=";
+      } {};
+        clash-lib = super.callHackageDirect {
+        pkg = "clash-lib";
+        ver = "1.8.1";
+        sha256 = "sha256-/dFgCj9e+gkyyUDAB1n1ukaEnkugCR7cRkP+SFJmjjY=";
+      } {};
+      };
+    };
+    hpkg = pkgs.haskell.lib.overrideCabal (hpkgs.callCabal2nix name src {}) (drv: {
+        enableLibraryProfiling = false;
+
+        postBuild = ''
+          ${hpkgs.clash-ghc}/bin/clash -package-db dist/package.conf.inplace ${name} --${hdl}
+        '';
+
+        postInstall = ''
+          mkdir -p "$out/share"
+          cp -r "${hdl}/" "$out/share/${hdl}"
+        '';
+    });
+
+    f = "${hpkg}/share/${hdl}/${name}.topEntity";
+    hdls = builtins.filter (x: pkgs.lib.hasSuffix hdl x) (builtins.attrNames (builtins.readDir f));
+    # qsys = pkgs.lib.findFirst (x: pkgs.lib.hasSuffix "qsys" x) (throw "no qsys found") (builtins.attrNames (builtins.readDir f));
+    qsf = pkgs.lib.concatStringsSep "\n" ([
+      "set_global_assignment -name DEVICE ${device}"
+      "set_global_assignment -name FAMILY \"${family}\""
+      "set_global_assignment -name TOP_LEVEL_ENTITY ${name}"
+      "set_global_assignment -name SDC_FILE ${name}.sdc"
+      # "set_global_assignment -name QSYS_FILE ${qsys}"
+    ] ++ (map (x: "set_global_assignment -name VHDL_FILE ${x}") hdls));
+  in
+    {
+      packages.default = hpkg;
+      packages.sof = pkgs.runCommand "${name}.sof" {
+        buildInputs = [ pkgs.quartus-prime-lite ];
+        src = pkgs.symlinkJoin {
+          name = "${name}.topEntity";
+          paths = [
+            "${hpkg}/share/${hdl}/${name}.topEntity"
+            (pkgs.writeTextDir "${name}.qsf" qsf)
+            (pkgs.writeTextDir "${name}.qpf" ''
+              PROJECT_REVISION = "${name}"
+            '')
+          ];
+        };
+      } ''
+        mkdir $out
+        ln -s $src/* .
+        # quartus_map --read_settings_files=on --write_settings_files=off Blinker -c Blinker
+        quartus_sh --flow compile ${name}
+        cp -r * $out
+      '';
+
+      devShells.default = hpkgs.shellFor {
+        packages = p: [ hpkg ];
+        nativeBuildInputs = [
+          pkgs.cabal-install
+          hpkgs.haskell-language-server
+          hpkgs.clash-ghc
+
+          (pkgs.writeShellScriptBin "flash" ''
+            quartus_pgm -m jtag -o "p;$1"
+          '')
+        ];
+        buildInputs = [ pkgs.quartus-prime-lite ];
+      };
+
+      formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt;
+    }
+  );
+}