1
0
forked from M-Labs/artiq
artiq/flake.nix

576 lines
22 KiB
Nix
Raw Normal View History

2021-08-12 12:44:42 +08:00
{
description = "A leading-edge control system for quantum information experiments";
2023-12-03 11:18:25 +08:00
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-23.11;
inputs.mozilla-overlay = { url = github:mozilla/nixpkgs-mozilla; flake = false; };
2022-02-12 10:59:10 +08:00
inputs.sipyco.url = github:m-labs/sipyco;
inputs.sipyco.inputs.nixpkgs.follows = "nixpkgs";
2021-08-12 12:44:42 +08:00
inputs.src-pythonparser = { url = github:m-labs/pythonparser; flake = false; };
2022-02-13 17:15:25 +08:00
inputs.artiq-comtools.url = github:m-labs/artiq-comtools;
inputs.artiq-comtools.inputs.nixpkgs.follows = "nixpkgs";
inputs.artiq-comtools.inputs.sipyco.follows = "sipyco";
2021-08-12 12:44:42 +08:00
2021-08-16 16:38:55 +08:00
inputs.src-migen = { url = github:m-labs/migen; flake = false; };
2021-08-25 12:49:18 +08:00
inputs.src-misoc = { type = "git"; url = "https://github.com/m-labs/misoc.git"; submodules = true; flake = false; };
2021-08-16 16:38:55 +08:00
2022-02-13 17:15:25 +08:00
outputs = { self, nixpkgs, mozilla-overlay, sipyco, src-pythonparser, artiq-comtools, src-migen, src-misoc }:
let
pkgs = import nixpkgs { system = "x86_64-linux"; overlays = [ (import mozilla-overlay) ]; };
2022-07-08 11:35:17 +08:00
pkgs-aarch64 = import nixpkgs { system = "aarch64-linux"; };
2022-01-19 19:58:55 +08:00
2022-07-08 18:49:40 +08:00
artiqVersionMajor = 8;
2022-01-19 19:58:55 +08:00
artiqVersionMinor = self.sourceInfo.revCount or 0;
artiqVersionId = self.sourceInfo.shortRev or "unknown";
2023-04-30 16:55:49 +08:00
artiqVersion = (builtins.toString artiqVersionMajor) + "." + (builtins.toString artiqVersionMinor) + "+" + artiqVersionId + ".beta";
artiqRev = self.sourceInfo.rev or "unknown";
2022-01-19 19:58:55 +08:00
rustManifest = pkgs.fetchurl {
url = "https://static.rust-lang.org/dist/2021-01-29/channel-rust-nightly.toml";
sha256 = "sha256-EZKgw89AH4vxaJpUHmIMzMW/80wAFQlfcxRoBD9nz0c=";
2021-08-12 12:44:42 +08:00
};
2021-09-10 17:19:32 +08:00
targets = [];
rustChannelOfTargets = _channel: _date: targets:
(pkgs.lib.rustLib.fromManifestFile rustManifest {
inherit (pkgs) stdenv lib fetchurl patchelf;
}).rust.override {
inherit targets;
extensions = ["rust-src"];
};
rust = rustChannelOfTargets "nightly" null targets;
rustPlatform = pkgs.recurseIntoAttrs (pkgs.makeRustPlatform {
rustc = rust;
cargo = rust;
});
2021-09-10 17:19:32 +08:00
cargo-xbuild = pkgs.cargo-xbuild.overrideAttrs(oa: {
postPatch = "substituteInPlace src/sysroot.rs --replace 2021 2018";
});
vivadoDeps = pkgs: with pkgs; let
# Apply patch from https://github.com/nix-community/nix-environments/pull/54
# to fix ncurses libtinfo.so's soname issue
ncurses' = ncurses5.overrideAttrs (old: {
configureFlags = old.configureFlags ++ [ "--with-termlib" ];
postFixup = "";
});
in [
2023-05-27 17:16:31 +08:00
libxcrypt-legacy
(ncurses'.override { unicodeSupport = false; })
zlib
libuuid
xorg.libSM
xorg.libICE
xorg.libXrender
xorg.libX11
xorg.libXext
xorg.libXtst
xorg.libXi
freetype
fontconfig
];
2021-08-12 12:44:42 +08:00
2021-09-10 17:19:32 +08:00
pythonparser = pkgs.python3Packages.buildPythonPackage {
2022-02-12 17:48:35 +08:00
pname = "pythonparser";
version = "1.4";
2021-09-10 17:19:32 +08:00
src = src-pythonparser;
doCheck = false;
propagatedBuildInputs = with pkgs.python3Packages; [ regex ];
};
2021-08-12 12:44:42 +08:00
2021-09-10 17:19:32 +08:00
qasync = pkgs.python3Packages.buildPythonPackage rec {
pname = "qasync";
2023-05-23 11:26:30 +08:00
version = "0.24.1";
2021-09-10 17:19:32 +08:00
src = pkgs.fetchFromGitHub {
owner = "CabbageDevelopment";
repo = "qasync";
rev = "v${version}";
2023-05-23 11:26:30 +08:00
sha256 = "sha256-DAzmobw+c29Pt/URGO3bWXHBxgu9bDHhdTUBE9QJDe4=";
2021-08-12 12:44:42 +08:00
};
2021-09-10 17:19:32 +08:00
propagatedBuildInputs = [ pkgs.python3Packages.pyqt5 ];
2023-05-27 17:16:31 +08:00
nativeCheckInputs = [ pkgs.python3Packages.pytest-runner pkgs.python3Packages.pytestCheckHook ];
disabledTestPaths = [ "tests/test_qeventloop.py" ];
2021-09-10 17:19:32 +08:00
};
2021-08-12 12:44:42 +08:00
2021-09-10 17:19:32 +08:00
outputcheck = pkgs.python3Packages.buildPythonApplication rec {
pname = "outputcheck";
version = "0.4.2";
src = pkgs.fetchFromGitHub {
owner = "stp";
repo = "OutputCheck";
rev = "e0f533d3c5af2949349856c711bf4bca50022b48";
sha256 = "1y27vz6jq6sywas07kz3v01sqjd0sga9yv9w2cksqac3v7wmf2a0";
};
2021-09-10 17:19:32 +08:00
prePatch = "echo ${version} > RELEASE-VERSION";
postPatch = ''
substituteInPlace OutputCheck/Driver.py \
--replace "argparse.FileType('rU')" "argparse.FileType('r')"
'';
2021-09-10 17:19:32 +08:00
};
2021-08-12 12:44:42 +08:00
2021-09-10 17:19:32 +08:00
libartiq-support = pkgs.stdenv.mkDerivation {
name = "libartiq-support";
src = self;
buildInputs = [ rust ];
2021-09-10 17:19:32 +08:00
buildPhase = ''
rustc $src/artiq/test/libartiq_support/lib.rs -Cpanic=unwind -g
'';
installPhase = ''
2022-02-02 16:33:17 +08:00
mkdir -p $out/lib $out/bin
cp libartiq_support.so $out/lib
cat > $out/bin/libartiq-support << EOF
#!/bin/sh
echo $out/lib/libartiq_support.so
EOF
chmod 755 $out/bin/libartiq-support
2021-09-10 17:19:32 +08:00
'';
};
2023-08-07 23:02:23 +08:00
llvmlite-new = pkgs.python3Packages.buildPythonPackage rec {
pname = "llvmlite";
version = "0.40.1";
src = pkgs.fetchFromGitHub {
owner = "numba";
repo = "llvmlite";
rev = "v${version}";
sha256 = "sha256-gPEda9cMEsruvBt8I2VFfsTKZaPsNDgqx2Y9n0MSc4Y=";
};
nativeBuildInputs = [ pkgs.llvm_14 ];
# Disable static linking
# https://github.com/numba/llvmlite/issues/93
postPatch = ''
substituteInPlace ffi/Makefile.linux --replace "-static-libstdc++" ""
substituteInPlace llvmlite/tests/test_binding.py --replace "test_linux" "nope"
'';
# Set directory containing llvm-config binary
preConfigure = ''
export LLVM_CONFIG=${pkgs.llvm_14.dev}/bin/llvm-config
'';
};
artiq-upstream = pkgs.python3Packages.buildPythonPackage rec {
2021-09-10 17:19:32 +08:00
pname = "artiq";
2022-01-19 19:58:55 +08:00
version = artiqVersion;
2021-09-10 17:19:32 +08:00
src = self;
2021-08-12 12:44:42 +08:00
preBuild =
''
export VERSIONEER_OVERRIDE=${version}
export VERSIONEER_REV=${artiqRev}
'';
2021-08-12 12:44:42 +08:00
2021-09-10 17:19:32 +08:00
nativeBuildInputs = [ pkgs.qt5.wrapQtAppsHook ];
# keep llvm_x and lld_x in sync with llvmlite
2023-08-07 23:02:23 +08:00
propagatedBuildInputs = [ pkgs.llvm_14 pkgs.lld_14 sipyco.packages.x86_64-linux.sipyco pythonparser llvmlite-new pkgs.qt5.qtsvg artiq-comtools.packages.x86_64-linux.artiq-comtools ]
++ (with pkgs.python3Packages; [ pyqtgraph pygit2 numpy dateutil scipy prettytable pyserial levenshtein h5py pyqt5 qasync tqdm lmdb jsonschema ]);
2021-08-12 12:44:42 +08:00
2021-09-10 17:19:32 +08:00
dontWrapQtApps = true;
postFixup = ''
wrapQtApp "$out/bin/artiq_dashboard"
wrapQtApp "$out/bin/artiq_browser"
wrapQtApp "$out/bin/artiq_session"
'';
2021-08-12 12:44:42 +08:00
2023-05-27 17:16:31 +08:00
preFixup =
''
# Ensure that wrapProgram uses makeShellWrapper rather than makeBinaryWrapper
# brought in by wrapQtAppsHook. Only makeShellWrapper supports --run.
wrapProgram() { wrapProgramShell "$@"; }
'';
## Modifies PATH to pass the wrapped python environment (i.e. python3.withPackages(...) to subprocesses.
## Allows subprocesses using python to find all packages you have installed
2021-09-10 17:19:32 +08:00
makeWrapperArgs = [
''--run 'if [ ! -z "$NIX_PYTHONPREFIX" ]; then export PATH=$NIX_PYTHONPREFIX/bin:$PATH;fi' ''
"--set FONTCONFIG_FILE ${pkgs.fontconfig.out}/etc/fonts/fonts.conf"
];
2021-08-12 12:44:42 +08:00
2023-08-07 18:28:44 +08:00
# FIXME: automatically propagate lld_14 llvm_14 dependencies
# cacert is required in the check stage only, as certificates are to be
# obtained from system elsewhere
2023-08-07 18:28:44 +08:00
nativeCheckInputs = [ pkgs.lld_14 pkgs.llvm_14 libartiq-support pkgs.lit outputcheck pkgs.cacert ];
2021-09-10 17:19:32 +08:00
checkPhase = ''
python -m unittest discover -v artiq.test
2021-08-12 12:44:42 +08:00
2021-09-10 17:19:32 +08:00
TESTDIR=`mktemp -d`
cp --no-preserve=mode,ownership -R $src/artiq/test/lit $TESTDIR
2022-02-02 16:33:17 +08:00
LIBARTIQ_SUPPORT=`libartiq-support` lit -v $TESTDIR/lit
2021-09-10 17:19:32 +08:00
'';
};
2021-08-16 16:38:55 +08:00
artiq = artiq-upstream // {
withExperimentalFeatures = features: artiq-upstream.overrideAttrs(oa:
{ patches = map (f: ./experimental-features/${f}.diff) features; });
};
2021-09-10 17:19:32 +08:00
migen = pkgs.python3Packages.buildPythonPackage rec {
name = "migen";
src = src-migen;
2023-09-06 18:28:08 +08:00
format = "pyproject";
nativeBuildInputs = [ pkgs.python3Packages.setuptools ];
2021-09-10 17:19:32 +08:00
propagatedBuildInputs = [ pkgs.python3Packages.colorama ];
};
2021-08-16 16:38:55 +08:00
2021-09-10 17:19:32 +08:00
asyncserial = pkgs.python3Packages.buildPythonPackage rec {
pname = "asyncserial";
version = "0.1";
src = pkgs.fetchFromGitHub {
owner = "m-labs";
repo = "asyncserial";
rev = "d95bc1d6c791b0e9785935d2f62f628eb5cdf98d";
sha256 = "0yzkka9jk3612v8gx748x6ziwykq5lr7zmr9wzkcls0v2yilqx9k";
2021-08-16 16:38:55 +08:00
};
2021-09-10 17:19:32 +08:00
propagatedBuildInputs = [ pkgs.python3Packages.pyserial ];
};
2021-08-16 16:38:55 +08:00
2021-09-10 17:19:32 +08:00
misoc = pkgs.python3Packages.buildPythonPackage {
name = "misoc";
src = src-misoc;
propagatedBuildInputs = with pkgs.python3Packages; [ jinja2 numpy migen pyserial asyncserial ];
};
2021-10-08 12:13:58 +08:00
microscope = pkgs.python3Packages.buildPythonPackage rec {
pname = "microscope";
version = "unstable-2020-12-28";
src = pkgs.fetchFromGitHub {
owner = "m-labs";
repo = "microscope";
rev = "c21afe7a53258f05bde57e5ebf2e2761f3d495e4";
sha256 = "sha256-jzyiLRuEf7p8LdhmZvOQj/dyQx8eUE8p6uRlwoiT8vg=";
};
propagatedBuildInputs = with pkgs.python3Packages; [ pyserial prettytable msgpack migen ];
};
2023-05-27 18:03:18 +08:00
vivadoEnv = pkgs.buildFHSEnv {
2021-09-10 17:19:32 +08:00
name = "vivado-env";
targetPkgs = vivadoDeps;
};
2023-05-27 18:03:18 +08:00
vivado = pkgs.buildFHSEnv {
2021-09-10 17:19:32 +08:00
name = "vivado";
targetPkgs = vivadoDeps;
2022-12-18 16:51:02 +08:00
profile = "set -e; source /opt/Xilinx/Vivado/2022.2/settings64.sh";
2021-09-10 17:19:32 +08:00
runScript = "vivado";
};
makeArtiqBoardPackage = { target, variant, buildCommand ? "python -m artiq.gateware.targets.${target} -V ${variant}", experimentalFeatures ? [] }:
pkgs.stdenv.mkDerivation {
2021-09-10 17:19:32 +08:00
name = "artiq-board-${target}-${variant}";
phases = [ "buildPhase" "checkPhase" "installPhase" ];
2022-04-24 14:02:59 +08:00
cargoDeps = rustPlatform.importCargoLock {
lockFile = ./artiq/firmware/Cargo.lock;
outputHashes = {
"fringe-1.2.1" = "sha256-m4rzttWXRlwx53LWYpaKuU5AZe4GSkbjHS6oINt5d3Y=";
"tar-no-std-0.1.8" = "sha256-xm17108v4smXOqxdLvHl9CxTCJslmeogjm4Y87IXFuM=";
2022-04-24 14:02:59 +08:00
};
2021-09-01 17:45:27 +08:00
};
2021-09-10 17:19:32 +08:00
nativeBuildInputs = [
(pkgs.python3.withPackages(ps: [ migen misoc (artiq.withExperimentalFeatures experimentalFeatures) ps.packaging ]))
rust
cargo-xbuild
2023-08-07 18:45:13 +08:00
pkgs.llvmPackages_14.clang-unwrapped
2023-08-07 18:28:44 +08:00
pkgs.llvm_14
pkgs.lld_14
2021-09-10 17:19:32 +08:00
vivado
rustPlatform.cargoSetupHook
];
buildPhase =
''
ARTIQ_PATH=`python -c "import artiq; print(artiq.__path__[0])"`
ln -s $ARTIQ_PATH/firmware/Cargo.lock .
cargoSetupPostUnpackHook
cargoSetupPostPatchHook
${buildCommand}
'';
2021-10-18 11:09:10 +08:00
doCheck = true;
checkPhase =
''
2021-09-10 17:19:32 +08:00
# Search for PCREs in the Vivado output to check for errors
check_log() {
grep -Pe "$1" artiq_${target}/${variant}/gateware/vivado.log && exit 1 || true
}
check_log "\d+ constraint not met\."
check_log "Timing constraints are not met\."
'';
installPhase =
''
mkdir $out
cp artiq_${target}/${variant}/gateware/top.bit $out
2021-09-10 17:19:32 +08:00
if [ -e artiq_${target}/${variant}/software/bootloader/bootloader.bin ]
then cp artiq_${target}/${variant}/software/bootloader/bootloader.bin $out
2021-09-10 17:19:32 +08:00
fi
if [ -e artiq_${target}/${variant}/software/runtime ]
then cp artiq_${target}/${variant}/software/runtime/runtime.{elf,fbi} $out
else cp artiq_${target}/${variant}/software/satman/satman.{elf,fbi} $out
2021-09-10 17:19:32 +08:00
fi
mkdir $out/nix-support
for i in $out/*.*; do
echo file binary-dist $i >> $out/nix-support/hydra-build-products
done
2021-09-10 17:19:32 +08:00
'';
# don't mangle ELF files as they are not for NixOS
dontFixup = true;
};
2021-09-01 17:45:27 +08:00
2022-07-08 11:35:17 +08:00
openocd-bscanspi-f = pkgs: let
2021-09-10 17:19:32 +08:00
bscan_spi_bitstreams-pkg = pkgs.stdenv.mkDerivation {
name = "bscan_spi_bitstreams";
src = pkgs.fetchFromGitHub {
owner = "quartiq";
repo = "bscan_spi_bitstreams";
rev = "01d8f819f15baf9a8cc5d96945a51e4d267ff564";
sha256 = "1zqv47kzgvbn4c8cr019a6wcja7gn5h1z4kvw5bhpc72fyhagal9";
};
phases = ["installPhase"];
installPhase =
''
mkdir -p $out/share/bscan-spi-bitstreams
cp $src/*.bit $out/share/bscan-spi-bitstreams
'';
2021-09-01 17:45:27 +08:00
};
2021-09-10 17:19:32 +08:00
# https://docs.lambdaconcept.com/screamer/troubleshooting.html#error-contents-differ
openocd-fixed = pkgs.openocd.overrideAttrs(oa: {
version = "unstable-2021-09-15";
src = pkgs.fetchFromGitHub {
owner = "openocd-org";
repo = "openocd";
rev = "a0bd3c9924870c3b8f428648410181040dabc33c";
sha256 = "sha256-YgUsl4/FohfsOncM4uiz/3c6g2ZN4oZ0y5vV/2Skwqg=";
fetchSubmodules = true;
};
2022-05-31 18:24:47 +08:00
patches = [
2021-09-10 17:19:32 +08:00
(pkgs.fetchurl {
url = "https://git.m-labs.hk/M-Labs/nix-scripts/raw/commit/575ef05cd554c239e4cc8cb97ae4611db458a80d/artiq-fast/pkgs/openocd-jtagspi.diff";
sha256 = "0g3crk8gby42gm661yxdcgapdi8sp050l5pb2d0yjfic7ns9cw81";
2021-09-10 17:19:32 +08:00
})
];
nativeBuildInputs = oa.nativeBuildInputs or [] ++ [ pkgs.autoreconfHook269 ];
2021-09-10 17:19:32 +08:00
});
in pkgs.buildEnv {
name = "openocd-bscanspi";
paths = [ openocd-fixed bscan_spi_bitstreams-pkg ];
};
2022-02-09 10:53:52 +08:00
sphinxcontrib-wavedrom = pkgs.python3Packages.buildPythonPackage rec {
pname = "sphinxcontrib-wavedrom";
version = "3.0.4";
format = "pyproject";
2022-02-09 10:53:52 +08:00
src = pkgs.python3Packages.fetchPypi {
inherit pname version;
sha256 = "sha256-0zTHVBr9kXwMEo4VRTFsxdX2HI31DxdHfLUHCQmw1Ko=";
2022-02-09 10:53:52 +08:00
};
nativeBuildInputs = [ pkgs.python3Packages.setuptools-scm ];
2022-06-01 20:45:49 +08:00
propagatedBuildInputs = (with pkgs.python3Packages; [ wavedrom sphinx xcffib cairosvg ]);
2022-02-09 10:53:52 +08:00
};
2022-02-11 14:36:18 +08:00
latex-artiq-manual = pkgs.texlive.combine {
2022-02-09 10:53:52 +08:00
inherit (pkgs.texlive)
scheme-basic latexmk cmap collection-fontsrecommended fncychap
titlesec tabulary varwidth framed fancyvrb float wrapfig parskip
upquote capt-of needspace etoolbox booktabs;
2022-02-09 10:53:52 +08:00
};
artiq-frontend-dev-wrappers = pkgs.runCommandNoCC "artiq-frontend-dev-wrappers" {}
''
mkdir -p $out/bin
for program in ${self}/artiq/frontend/*.py; do
if [ -x $program ]; then
progname=`basename -s .py $program`
outname=$out/bin/$progname
echo "#!${pkgs.bash}/bin/bash" >> $outname
echo "exec python3 -m artiq.frontend.$progname \"\$@\"" >> $outname
chmod 755 $outname
fi
done
'';
2021-09-10 17:19:32 +08:00
in rec {
2022-02-11 14:36:18 +08:00
packages.x86_64-linux = {
inherit pythonparser qasync artiq;
2022-02-11 14:36:18 +08:00
inherit migen misoc asyncserial microscope vivadoEnv vivado;
2022-07-08 11:35:17 +08:00
openocd-bscanspi = openocd-bscanspi-f pkgs;
2021-09-10 17:19:32 +08:00
artiq-board-kc705-nist_clock = makeArtiqBoardPackage {
target = "kc705";
variant = "nist_clock";
};
artiq-board-efc-shuttler = makeArtiqBoardPackage {
2023-08-25 13:34:56 +08:00
target = "efc";
variant = "shuttler";
};
2022-02-11 14:36:18 +08:00
inherit sphinxcontrib-wavedrom latex-artiq-manual;
artiq-manual-html = pkgs.stdenvNoCC.mkDerivation rec {
name = "artiq-manual-html-${version}";
version = artiqVersion;
src = self;
buildInputs = [
pkgs.python3Packages.sphinx pkgs.python3Packages.sphinx_rtd_theme
pkgs.python3Packages.sphinx-argparse sphinxcontrib-wavedrom
];
buildPhase = ''
export VERSIONEER_OVERRIDE=${artiqVersion}
2022-02-12 10:24:45 +08:00
export SOURCE_DATE_EPOCH=${builtins.toString self.sourceInfo.lastModified}
2022-02-11 14:36:18 +08:00
cd doc/manual
make html
'';
installPhase = ''
cp -r _build/html $out
mkdir $out/nix-support
echo doc manual $out index.html >> $out/nix-support/hydra-build-products
'';
};
artiq-manual-pdf = pkgs.stdenvNoCC.mkDerivation rec {
name = "artiq-manual-pdf-${version}";
version = artiqVersion;
src = self;
buildInputs = [
pkgs.python3Packages.sphinx pkgs.python3Packages.sphinx_rtd_theme
pkgs.python3Packages.sphinx-argparse sphinxcontrib-wavedrom
latex-artiq-manual
];
buildPhase = ''
export VERSIONEER_OVERRIDE=${artiq.version}
export SOURCE_DATE_EPOCH=${builtins.toString self.sourceInfo.lastModified}
cd doc/manual
make latexpdf
'';
installPhase = ''
mkdir $out
cp _build/latex/ARTIQ.pdf $out
mkdir $out/nix-support
echo doc-pdf manual $out ARTIQ.pdf >> $out/nix-support/hydra-build-products
'';
};
2021-08-25 12:49:05 +08:00
};
2022-01-30 19:31:20 +08:00
inherit makeArtiqBoardPackage;
defaultPackage.x86_64-linux = pkgs.python3.withPackages(ps: [ packages.x86_64-linux.artiq ]);
2021-08-16 16:38:55 +08:00
2023-05-30 16:21:06 +08:00
# Main development shell with everything you need to develop ARTIQ on Linux.
# The current copy of the ARTIQ sources is added to PYTHONPATH so changes can be tested instantly.
# Additionally, executable wrappers that import the current ARTIQ sources for the ARTIQ frontends
# are added to PATH.
2023-05-30 16:21:06 +08:00
devShells.x86_64-linux.default = pkgs.mkShell {
2021-08-16 16:38:55 +08:00
name = "artiq-dev-shell";
buildInputs = [
(pkgs.python3.withPackages(ps: with packages.x86_64-linux; [ migen misoc ps.paramiko microscope ps.packaging ] ++ artiq.propagatedBuildInputs ))
rust
cargo-xbuild
2023-08-07 18:45:13 +08:00
pkgs.llvmPackages_14.clang-unwrapped
2023-08-07 18:28:44 +08:00
pkgs.llvm_14
pkgs.lld_14
pkgs.git
artiq-frontend-dev-wrappers
# To manually run compiler tests:
pkgs.lit
outputcheck
libartiq-support
# use the vivado-env command to enter a FHS shell that lets you run the Vivado installer
packages.x86_64-linux.vivadoEnv
packages.x86_64-linux.vivado
2021-09-02 11:18:58 +08:00
packages.x86_64-linux.openocd-bscanspi
2022-02-09 10:53:52 +08:00
pkgs.python3Packages.sphinx pkgs.python3Packages.sphinx_rtd_theme
2022-02-11 14:36:18 +08:00
pkgs.python3Packages.sphinx-argparse sphinxcontrib-wavedrom latex-artiq-manual
2021-08-16 16:38:55 +08:00
];
shellHook = ''
export LIBARTIQ_SUPPORT=`libartiq-support`
2023-05-31 22:07:05 +08:00
export QT_PLUGIN_PATH=${pkgs.qt5.qtbase}/${pkgs.qt5.qtbase.dev.qtPluginPrefix}:${pkgs.qt5.qtsvg.bin}/${pkgs.qt5.qtbase.dev.qtPluginPrefix}
export QML2_IMPORT_PATH=${pkgs.qt5.qtbase}/${pkgs.qt5.qtbase.dev.qtQmlPrefix}
export PYTHONPATH=`git rev-parse --show-toplevel`:$PYTHONPATH
'';
2021-08-16 16:38:55 +08:00
};
2021-08-18 14:48:10 +08:00
2023-05-30 16:21:06 +08:00
# Lighter development shell optimized for building firmware and flashing boards.
devShells.x86_64-linux.boards = pkgs.mkShell {
name = "artiq-boards-shell";
buildInputs = [
(pkgs.python3.withPackages(ps: with packages.x86_64-linux; [ migen misoc artiq ps.packaging ]))
2023-05-30 16:21:06 +08:00
rust
cargo-xbuild
2023-08-07 18:45:13 +08:00
pkgs.llvmPackages_14.clang-unwrapped
2023-08-07 18:28:44 +08:00
pkgs.llvm_14
pkgs.lld_14
2023-05-30 16:21:06 +08:00
packages.x86_64-linux.vivado
packages.x86_64-linux.openocd-bscanspi
];
};
2022-07-08 11:35:17 +08:00
packages.aarch64-linux = {
openocd-bscanspi = openocd-bscanspi-f pkgs-aarch64;
};
2021-08-18 14:48:10 +08:00
hydraJobs = {
inherit (packages.x86_64-linux) artiq artiq-board-kc705-nist_clock artiq-board-efc-shuttler openocd-bscanspi;
2023-01-09 18:36:55 +08:00
gateware-sim = pkgs.stdenvNoCC.mkDerivation {
name = "gateware-sim";
buildInputs = [
(pkgs.python3.withPackages(ps: with packages.x86_64-linux; [ migen misoc artiq ]))
];
phases = [ "buildPhase" ];
buildPhase =
''
python -m unittest discover -v artiq.gateware.test
touch $out
'';
};
2023-01-09 18:22:05 +08:00
kc705-hitl = pkgs.stdenvNoCC.mkDerivation {
2021-09-02 11:30:22 +08:00
name = "kc705-hitl";
__networked = true; # compatibility with old patched Nix
# breaks hydra, https://github.com/NixOS/hydra/issues/1216
#__impure = true; # Nix 2.8+
2021-09-02 11:30:22 +08:00
buildInputs = [
(pkgs.python3.withPackages(ps: with packages.x86_64-linux; [ artiq ps.paramiko ]))
2023-08-07 18:28:44 +08:00
pkgs.llvm_14
pkgs.lld_14
2021-09-02 11:30:22 +08:00
pkgs.openssh
packages.x86_64-linux.openocd-bscanspi # for the bscanspi bitstreams
2021-09-02 11:30:22 +08:00
];
phases = [ "buildPhase" ];
buildPhase =
''
export HOME=`mktemp -d`
mkdir $HOME/.ssh
2021-12-03 18:34:49 +08:00
cp /opt/hydra_id_ed25519 $HOME/.ssh/id_ed25519
cp /opt/hydra_id_ed25519.pub $HOME/.ssh/id_ed25519.pub
2022-07-07 18:03:17 +08:00
echo "rpi-1 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIACtBFDVBYoAE4fpJCTANZSE0bcVpTR3uvfNvb80C4i5" > $HOME/.ssh/known_hosts
2021-12-03 18:34:49 +08:00
chmod 600 $HOME/.ssh/id_ed25519
2021-09-02 11:30:22 +08:00
LOCKCTL=$(mktemp -d)
mkfifo $LOCKCTL/lockctl
cat $LOCKCTL/lockctl | ${pkgs.openssh}/bin/ssh \
2021-12-03 18:34:49 +08:00
-i $HOME/.ssh/id_ed25519 \
2021-09-02 11:30:22 +08:00
-o UserKnownHostsFile=$HOME/.ssh/known_hosts \
rpi-1 \
'mkdir -p /tmp/board_lock && flock /tmp/board_lock/kc705-1 -c "echo Ok; cat"' \
| (
# End remote flock via FIFO
atexit_unlock() {
echo > $LOCKCTL/lockctl
}
trap atexit_unlock EXIT
# Read "Ok" line when remote successfully locked
read LOCK_OK
artiq_flash -t kc705 -H rpi-1 -d ${packages.x86_64-linux.artiq-board-kc705-nist_clock}
sleep 30
2021-09-02 11:30:22 +08:00
export ARTIQ_ROOT=`python -c "import artiq; print(artiq.__path__[0])"`/examples/kc705_nist_clock
export ARTIQ_LOW_LATENCY=1
python -m unittest discover -v artiq.test.coredevice
)
touch $out
'';
};
2022-02-11 14:36:18 +08:00
inherit (packages.x86_64-linux) artiq-manual-html artiq-manual-pdf;
2021-08-18 14:48:10 +08:00
};
};
2021-08-12 15:22:23 +08:00
nixConfig = {
2022-02-23 15:22:28 +08:00
extra-trusted-public-keys = "nixbld.m-labs.hk-1:5aSRVA5b320xbNvu30tqxVPXpld73bhtOeH6uAjRyHc=";
extra-substituters = "https://nixbld.m-labs.hk";
2022-02-23 15:30:16 +08:00
extra-sandbox-paths = "/opt";
2021-08-12 15:22:23 +08:00
};
2021-08-12 12:44:42 +08:00
}