{ description = "A very basic flake"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; outputs = { self, nixpkgs }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; runScriptPrefix = package: '' # Search for an imperative declaration of the installation directory of ${package} if [[ -f ~/.config/${package}/nix.sh ]]; then source ~/.config/${package}/nix.sh else echo "nix-${package}-error: Did not find ~/.config/${package}/nix.sh" >&2 exit 1 fi if [[ ! -d "$INSTALL_DIR" ]]; then echo "nix-${package}-error: INSTALL_DIR $INSTALL_DIR isn't a directory" >&2 exit 2 '' + '' fi ''; liberoMultiPkgs = pkgs: with pkgs; [ xlights glib glibc.dev fontconfig freetype gcc.cc.libgcc gcc.cc.libgcc.lib xorg.libICE xorg.libX11 xorg.libXau libpng xorg.libSM xorg.libXcursor xorg.libXdmcp xorg.libXext xorg.libXfixes xorg.libXinerama xorg.libXi motif xorg.libXmu xorg.libXp xorg.libXrandr xorg.libXrender xorg.libXt xorg.libXtst zlib glib ksh # xorg-x11-fonts-75dpi # xorg-x11-fonts-100dpi # xorg-x11-fonts-Type1 libuuid.lib libsForQt5.full libglvnd libxslt libxml2 sqlite libkrb5 systemd xorg.libxcb xorg.xcbutilimage xorg.xcbutilkeysyms libxkbcommon glibc_multi ncurses5 ncurses ]; motif3-compat = pkgs.stdenv.mkDerivation { name = "motif3-compat"; phases = ["installPhase"]; installPhase = '' mkdir -p $out/lib ln -s ${pkgs.motif}/lib/libXm.so.4 $out/lib/libXm.so.3 ''; }; # pkgs for Xilinx tools xilinxTargetPkgs = pkgs: with pkgs; [ gnumake coreutils stdenv.cc.cc ncurses5 ncurses zlib xorg.libX11 xorg.libXrender xorg.libxcb xorg.libXext xorg.libXtst xorg.libXi freetype gtk2 glib libxcrypt-legacy gperftools glibc.dev fontconfig liberation_ttf # Xilinx ISE glib iproute2 libstdcxx5 libusb-compat-0_1 libuuid motif motif3-compat xorg.libXcursor xorg.libXft xorg.libXmu xorg.libXp xorg.libXt xorg.libXrandr xorg.libSM xorg.libICE ]; in { packages.${system} = { libero-shell = pkgs.buildFHSEnv { multiPkgs = liberoMultiPkgs; targetPkgs = liberoMultiPkgs; name = "libero-shell"; runScript = pkgs.writeScript "libero-shell" '' export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH exec bash ''; }; vivado-shell = pkgs.buildFHSEnv { targetPkgs = xilinxTargetPkgs; name = "vivado-shell"; runScript = pkgs.writeScript "vivado-shell" '' source $INSTALL_DIR/Vivado/2023.1/settings64.sh export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH exec bash ''; }; vivado = pkgs.buildFHSEnv { targetPkgs = xilinxTargetPkgs; name = "vivado-runner"; runScript = pkgs.writeScript "vivado-runner" '' ${runScriptPrefix "vivado"} export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH exec $INSTALL_DIR/Vivado/2023.1/bin/vivado "$@" ''; }; ise-shell = pkgs.buildFHSEnv { targetPkgs = pkgs: xilinxTargetPkgs pkgs ++ [ self.packages.${system}.ise-fw ]; name = "ise-shell"; runScript = pkgs.writeScript "ise-shell" '' ${runScriptPrefix "ise"} source $INSTALL_DIR/14.7/ISE_DS/settings64.sh $INSTALL_DIR/14.7/ISE_DS exec bash ''; }; ise = pkgs.buildFHSEnv { targetPkgs = xilinxTargetPkgs; name = "xilinx-runner"; runScript = '' ${runScriptPrefix "ise"} source $INSTALL_DIR/14.7/ISE_DS/settings64.sh $INSTALL_DIR/14.7/ISE_DS $INSTALL_DIR/14.7/ISE_DS/ISE/bin/lin64/ise ''; }; ise-fw = pkgs.stdenv.mkDerivation { name = "xilinx-jtag-fw"; phases = ["unpackPhase" "installPhase"]; src = ./xilinx/ise/fw; installPhase = '' mkdir -p $out/share cp * $out/share/ ''; }; ise-udev-rules = pkgs.writeTextFile (let ise-fw = self.packages.${system}.ise-fw; in { name = "ise-udev-rules"; destination = "/etc/udev/rules.d/05-xilinx-ise.rules"; text = '' # version 0003 SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0008", MODE="666" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0007", RUN+="${pkgs.fxload} -v -t fx2 -I ${ise-fw}/share/xusbdfwu.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0009", RUN+="${pkgs.fxload} -v -t fx2 -I ${ise-fw}/share/xusb_xup.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000d", RUN+="${pkgs.fxload} -v -t fx2 -I ${ise-fw}/share/xusb_emb.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="000f", RUN+="${pkgs.fxload} -v -t fx2 -I ${ise-fw}/share/xusb_xlp.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0013", RUN+="${pkgs.fxload} -v -t fx2 -I ${ise-fw}/share/xusb_xp2.hex -D $tempnode" BUS=="usb", ACTION=="add", SYSFS{idVendor}=="03fd", SYSFS{idProduct}=="0015", RUN+="${pkgs.fxload} -v -t fx2 -I ${ise-fw}/share/xusb_xse.hex -D $tempnode" ''; }); vivado-udev-rules = pkgs.writeTextFile { name = "vivado-udev-rules"; destination = "/etc/udev/rules.d/10-xilinx-vivado.rules"; text = '' # xilinx-ftdi-usb.rules ACTION=="add", ATTR{idVendor}=="0403", ATTR{manufacturer}=="Xilinx", MODE:="666" # xilinx-digilent-usb.rules ATTR{idVendor}=="1443", MODE:="666" ACTION=="add", ATTR{idVendor}=="0403", ATTR{manufacturer}=="Digilent", MODE:="666" # xilinx-pcusb.rules ATTR{idVendor}=="03fd", ATTR{idProduct}=="0008", MODE="666" ATTR{idVendor}=="03fd", ATTR{idProduct}=="0007", MODE="666" ATTR{idVendor}=="03fd", ATTR{idProduct}=="0009", MODE="666" ATTR{idVendor}=="03fd", ATTR{idProduct}=="000d", MODE="666" ATTR{idVendor}=="03fd", ATTR{idProduct}=="000f", MODE="666" ATTR{idVendor}=="03fd", ATTR{idProduct}=="0013", MODE="666" ATTR{idVendor}=="03fd", ATTR{idProduct}=="0015", MODE="666" ''; }; }; }; }