artiq-full: split code generation into artiq-board-generated jobset #41
|
@ -0,0 +1,97 @@
|
|||
# Install Vivado in /opt and add to /etc/nixos/configuration.nix:
|
||||
# nix.sandboxPaths = ["/opt"];
|
||||
|
||||
{ pkgs ? import <nixpkgs> {}
|
||||
, artiq-fast
|
||||
}:
|
||||
|
||||
let
|
||||
artiqSrc = import (artiq-fast + "/pkgs/artiq-src.nix") { fetchgit = pkgs.fetchgit; };
|
||||
artiqpkgs = import artiq-fast { inherit pkgs; };
|
||||
pythonEnv = pkgs.python3.withPackages (ps: with ps; [
|
||||
jinja2 jsonschema numpy artiqpkgs.migen artiqpkgs.microscope artiqpkgs.misoc artiqpkgs.jesd204b artiqpkgs.artiq
|
||||
]);
|
||||
fetchcargo = import (artiq-fast + "/fetchcargo.nix") {
|
||||
inherit (pkgs) stdenv cacert git;
|
||||
inherit (artiqpkgs) cargo cargo-vendor;
|
||||
};
|
||||
cargoDeps = fetchcargo rec {
|
||||
name = "artiq-firmware-cargo-deps";
|
||||
src = "${artiqSrc}/artiq/firmware";
|
||||
sha256 = import (artiqSrc + "/artiq/firmware/cargosha256.nix");
|
||||
};
|
||||
|
||||
cargoVendored = pkgs.stdenv.mkDerivation {
|
||||
name = "artiq-firmware-cargo-vendored";
|
||||
src = cargoDeps;
|
||||
phases = [ "unpackPhase" "installPhase" ];
|
||||
installPhase =
|
||||
''
|
||||
mkdir -p $out/registry
|
||||
cat << EOF > $out/config
|
||||
[source.crates-io]
|
||||
registry = "https://github.com/rust-lang/crates.io-index"
|
||||
replace-with = "vendored-sources"
|
||||
|
||||
[source."https://github.com/m-labs/libfringe"]
|
||||
git = "https://github.com/m-labs/libfringe"
|
||||
rev = "b8a6d8f"
|
||||
replace-with = "vendored-sources"
|
||||
|
||||
[source.vendored-sources]
|
||||
directory = "$out/registry"
|
||||
EOF
|
||||
cp -R * $out/registry
|
||||
'';
|
||||
};
|
||||
in
|
||||
{ target
|
||||
, variant
|
||||
, src ? null
|
||||
, buildCommand ? "python -m artiq.gateware.targets.${target} -V ${variant}"
|
||||
, extraInstallCommands ? ""
|
||||
, ...
|
||||
}:
|
||||
let
|
||||
name = "artiq-board-${target}-${variant}-${artiqpkgs.artiq.version}-xxx";
|
||||
installPath = "${pkgs.python3Packages.python.sitePackages}/artiq/board-support/${target}-${variant}";
|
||||
in
|
||||
# Board packages are Python modules so that they get added to the ARTIQ Python
|
||||
# environment, and artiq_flash finds them.
|
||||
pkgs.stdenv.mkDerivation {
|
||||
name = "artiq-board-${target}-${variant}-${artiqpkgs.artiq.version}";
|
||||
inherit src;
|
||||
phases = [ "buildPhase" "installPhase" ];
|
||||
nativeBuildInputs = [
|
||||
pkgs.gnumake pkgs.which pythonEnv
|
||||
artiqpkgs.cargo
|
||||
artiqpkgs.rustc
|
||||
artiqpkgs.binutils-or1k
|
||||
artiqpkgs.llvm-or1k
|
||||
];
|
||||
buildInputs = [ pythonEnv ];
|
||||
buildPhase =
|
||||
''
|
||||
export CARGO_HOME=${cargoVendored}
|
||||
export TARGET_AR=or1k-linux-ar
|
||||
${buildCommand} --no-compile-gateware --gateware-identifier-str=unprogrammed
|
||||
'';
|
||||
installPhase =
|
||||
''
|
||||
mkdir -p $out
|
||||
cp -ar artiq_${target}/${variant}/gateware $out
|
||||
|
||||
TARGET_DIR=$out/${pkgs.python3Packages.python.sitePackages}/artiq/board-support/${target}-${variant}
|
||||
mkdir -p $TARGET_DIR
|
||||
if [ -e artiq_${target}/${variant}/software/bootloader/bootloader.bin ]
|
||||
then cp artiq_${target}/${variant}/software/bootloader/bootloader.bin $TARGET_DIR
|
||||
fi
|
||||
if [ -e artiq_${target}/${variant}/software/runtime ]
|
||||
then cp artiq_${target}/${variant}/software/runtime/runtime.{elf,fbi} $TARGET_DIR
|
||||
else cp artiq_${target}/${variant}/software/satman/satman.{elf,fbi} $TARGET_DIR
|
||||
fi
|
||||
${extraInstallCommands}
|
||||
'';
|
||||
# don't mangle ELF files as they are not for NixOS
|
||||
dontFixup = true;
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
{ pkgs ? import <nixpkgs> {}
|
||||
, artiq-fast ? <artiq-fast>
|
||||
}:
|
||||
|
||||
let
|
||||
sinaraSystemsSrc = <sinaraSystemsSrc>;
|
||||
generatedNix = pkgs.runCommand "generated-nix" { buildInputs = [ pkgs.nix pkgs.git ]; }
|
||||
''
|
||||
mkdir $out
|
||||
cp ${./artiq-board.nix} $out/artiq-board.nix
|
||||
cp ${../artiq-full/artiq-targets.nix} $out/artiq-targets.nix
|
||||
cp -a ${artiq-fast} $out/fast
|
||||
|
||||
REV=`git --git-dir ${sinaraSystemsSrc}/.git rev-parse HEAD`
|
||||
echo -n $REV > $out/sinara-rev.txt
|
||||
SINARA_SRC_CLEAN=`mktemp -d`
|
||||
cp -a ${sinaraSystemsSrc}/. $SINARA_SRC_CLEAN
|
||||
chmod -R 755 $SINARA_SRC_CLEAN/.git
|
||||
chmod 755 $SINARA_SRC_CLEAN
|
||||
rm -rf $SINARA_SRC_CLEAN/.git
|
||||
HASH=`nix-hash --type sha256 --base32 $SINARA_SRC_CLEAN`
|
||||
echo -n $HASH > $out/sinara-hash.txt
|
||||
|
||||
cat > $out/default.nix << EOF
|
||||
{ pkgs ? import <nixpkgs> {}
|
||||
}:
|
||||
|
||||
let
|
||||
sinaraSystemsSrc = pkgs.fetchgit {
|
||||
url = "https://git.m-labs.hk/M-Labs/sinara-systems.git";
|
||||
rev = "$REV";
|
||||
sha256 = "$HASH";
|
||||
};
|
||||
artiq-fast = import ./fast { inherit pkgs; };
|
||||
artiq-board = import ./artiq-board.nix {
|
||||
inherit pkgs;
|
||||
artiq-fast = ./fast;
|
||||
};
|
||||
in
|
||||
builtins.mapAttrs (_: conf: pkgs.lib.hydraJob (artiq-board conf)) (
|
||||
import ./artiq-targets.nix {
|
||||
inherit pkgs sinaraSystemsSrc;
|
||||
artiqVersion = artiq-fast.artiq.version;
|
||||
}
|
||||
)
|
||||
EOF
|
||||
'';
|
||||
artiq-board-generated = import generatedNix {
|
||||
inherit pkgs;
|
||||
};
|
||||
in
|
||||
artiq-board-generated // {
|
||||
generated-nix = pkgs.lib.hydraJob generatedNix;
|
||||
}
|
|
@ -47,7 +47,8 @@ in
|
|||
, variant
|
||||
, src ? null
|
||||
, buildCommand ? "python -m artiq.gateware.targets.${target} -V ${variant}"
|
||||
, extraInstallCommands ? ""}:
|
||||
, extraInstallCommands ? ""
|
||||
, ... }:
|
||||
|
||||
# Board packages are Python modules so that they get added to the ARTIQ Python
|
||||
# environment, and artiq_flash finds them.
|
||||
|
|
295
artiq-full.nix
|
@ -1,110 +1,127 @@
|
|||
{ pkgs ? import <nixpkgs> {}}:
|
||||
{ pkgs ? import <nixpkgs> {}
|
||||
, beta ? <beta>
|
||||
}:
|
||||
|
||||
let
|
||||
sinaraSystemsSrc = <sinaraSystemsSrc>;
|
||||
artiqVersion = import <artiq-fast/pkgs/artiq-version.nix> {
|
||||
sinaraSystemsRev = builtins.readFile <artiq-board-generated/sinara-rev.txt>;
|
||||
sinaraSystemsHash = builtins.readFile <artiq-board-generated/sinara-hash.txt>;
|
||||
sinaraSystemsSrc =
|
||||
if beta
|
||||
then pkgs.fetchgit {
|
||||
url = "https://git.m-labs.hk/M-Labs/sinara-systems.git";
|
||||
rev = sinaraSystemsRev;
|
||||
sha256 = sinaraSystemsHash;
|
||||
}
|
||||
else <sinaraSystemsSrc>;
|
||||
artiq-fast =
|
||||
if beta
|
||||
then <artiq-board-generated/fast>
|
||||
else <artiq-fast>;
|
||||
artiqVersion = import (artiq-fast + "/pkgs/artiq-version.nix") {
|
||||
inherit (pkgs) stdenv git fetchgit;
|
||||
};
|
||||
variantsJson =
|
||||
let
|
||||
jsonFiles =
|
||||
builtins.attrNames (
|
||||
pkgs.lib.filterAttrs (name: type:
|
||||
type != "directory" &&
|
||||
builtins.match ".+\\.json" name != null
|
||||
) (builtins.readDir sinaraSystemsSrc)
|
||||
);
|
||||
in
|
||||
builtins.listToAttrs (
|
||||
map (jsonFile: {
|
||||
name = builtins.replaceStrings [".json"] [""] jsonFile;
|
||||
value = builtins.fromJSON (
|
||||
builtins.readFile (<sinaraSystemsSrc> + "/${jsonFile}")
|
||||
);
|
||||
}) jsonFiles
|
||||
);
|
||||
variants =
|
||||
builtins.attrNames (
|
||||
pkgs.lib.filterAttrs (_: json:
|
||||
pkgs.lib.strings.versionAtLeast artiqVersion (
|
||||
if json ? min_artiq_version
|
||||
then json.min_artiq_version
|
||||
else "0"
|
||||
)
|
||||
) variantsJson
|
||||
);
|
||||
standaloneVariants =
|
||||
builtins.attrNames (
|
||||
pkgs.lib.filterAttrs (_: json:
|
||||
json.base == "standalone"
|
||||
) variantsJson
|
||||
);
|
||||
targets = import ./artiq-full/artiq-targets.nix {
|
||||
inherit pkgs artiqVersion sinaraSystemsSrc;
|
||||
};
|
||||
kasliVariants = map ({ variant, ... }: variant) (
|
||||
builtins.filter ({ target, ... }: target == "kasli") (
|
||||
builtins.attrValues targets
|
||||
|
||||
)
|
||||
);
|
||||
standaloneVariants = map ({ variant, ... }: variant) (
|
||||
builtins.filter ({ target, standalone ? false, ... }: target == "kasli" && standalone) (
|
||||
builtins.attrValues targets
|
||||
)
|
||||
);
|
||||
serializedTargets = pkgs.lib.generators.toPretty {} (
|
||||
map (conf:
|
||||
if conf ? buildCommand
|
||||
then conf // {
|
||||
buildCommand = builtins.replaceStrings ["$"] ["\\\\\\$"] conf.buildCommand;
|
||||
}
|
||||
else conf
|
||||
) (builtins.attrValues targets)
|
||||
);
|
||||
|
||||
generatedNix = pkgs.runCommand "generated-nix" { buildInputs = [ pkgs.nix pkgs.git ]; }
|
||||
''
|
||||
mkdir $out
|
||||
|
||||
cp -a ${<artiq-fast>} $out/fast
|
||||
cp ${./artiq-full}/artiq-board.nix $out
|
||||
${if beta
|
||||
then ''
|
||||
cp -a ${<artiq-board-generated>} $out/board-generated
|
||||
ln -s board-generated/fast $out/fast
|
||||
''
|
||||
else "cp -a ${<artiq-fast>} $out/fast"}
|
||||
cp ${./artiq-full}/artiq-board-vivado.nix $out
|
||||
cp ${./artiq-full}/generate-identifier.py $out
|
||||
cp ${./artiq-full}/conda-artiq-board.nix $out
|
||||
cp ${./artiq-full}/extras.nix $out
|
||||
cp ${./artiq-full}/*.patch $out
|
||||
|
||||
REV=`git --git-dir ${sinaraSystemsSrc}/.git rev-parse HEAD`
|
||||
SINARA_SRC_CLEAN=`mktemp -d`
|
||||
cp -a ${sinaraSystemsSrc}/. $SINARA_SRC_CLEAN
|
||||
chmod -R 755 $SINARA_SRC_CLEAN/.git
|
||||
chmod 755 $SINARA_SRC_CLEAN
|
||||
rm -rf $SINARA_SRC_CLEAN/.git
|
||||
HASH=`nix-hash --type sha256 --base32 $SINARA_SRC_CLEAN`
|
||||
${if beta
|
||||
then ''
|
||||
REV=${sinaraSystemsRev}
|
||||
HASH=${sinaraSystemsHash}
|
||||
''
|
||||
else ''
|
||||
REV=`git --git-dir ${sinaraSystemsSrc}/.git rev-parse HEAD`
|
||||
SINARA_SRC_CLEAN=`mktemp -d`
|
||||
cp -a ${sinaraSystemsSrc}/. $SINARA_SRC_CLEAN
|
||||
chmod -R 755 $SINARA_SRC_CLEAN/.git
|
||||
chmod 755 $SINARA_SRC_CLEAN
|
||||
rm -rf $SINARA_SRC_CLEAN/.git
|
||||
HASH=`nix-hash --type sha256 --base32 $SINARA_SRC_CLEAN`
|
||||
''}
|
||||
cat > $out/default.nix << EOF
|
||||
{ pkgs ? import <nixpkgs> {}}:
|
||||
|
||||
let
|
||||
artiq-fast = import ./fast { inherit pkgs; };
|
||||
artiq-fast = import ${if beta then "./board-generated" else "."}/fast { inherit pkgs; };
|
||||
ddbDeps = [
|
||||
artiq-fast.artiq
|
||||
(pkgs.python3.withPackages (ps: [ ps.jsonschema ]))
|
||||
];
|
||||
|
||||
target = "kasli";
|
||||
variants = [${builtins.concatStringsSep " " (
|
||||
builtins.map (variant: "\"${variant}\"") variants
|
||||
kasliVariants = [${builtins.concatStringsSep " " (
|
||||
builtins.map (variant: "\"${variant}\"") kasliVariants
|
||||
)}];
|
||||
standaloneVariants = [${builtins.concatStringsSep " " (
|
||||
builtins.map (variant: "\"${variant}\"") standaloneVariants
|
||||
)}];
|
||||
# Splitting the build process into software+gateware does
|
||||
# not work when artiq embeds compiled firmware into generated
|
||||
# Vivado input.
|
||||
boardsWithoutBuildSplit = [
|
||||
{ target = "sayma"; variant = "rtm"; }
|
||||
];
|
||||
|
||||
vivado = import ./fast/vivado.nix { inherit pkgs; };
|
||||
artiq-board-import = path: import path { inherit pkgs vivado; };
|
||||
artiq-board = args:
|
||||
if pkgs.lib.strings.versionAtLeast artiq-fast.artiq.version "6.0"
|
||||
&& ! builtins.elem { inherit (args) target variant; } boardsWithoutBuildSplit
|
||||
then
|
||||
artiq-board-import ./artiq-board.nix args
|
||||
else
|
||||
artiq-board-import ./fast/artiq-board.nix args;
|
||||
vivado = import ${if beta then "./board-generated" else "."}/fast/vivado.nix {
|
||||
inherit pkgs;
|
||||
};
|
||||
artiq-board =
|
||||
${if beta
|
||||
then ''
|
||||
import ./artiq-board-vivado.nix {
|
||||
inherit pkgs vivado;
|
||||
version = artiq-fast.artiq.version;
|
||||
board-generated = import ./board-generated {
|
||||
inherit pkgs;
|
||||
};
|
||||
}
|
||||
''
|
||||
else ''
|
||||
import ./fast/artiq-board.nix {
|
||||
inherit pkgs vivado;
|
||||
}
|
||||
''};
|
||||
conda-artiq-board = import ./conda-artiq-board.nix { inherit pkgs; };
|
||||
src = pkgs.fetchgit {
|
||||
url = "https://git.m-labs.hk/M-Labs/sinara-systems.git";
|
||||
rev = "$REV";
|
||||
sha256 = "$HASH";
|
||||
};
|
||||
generic-kasli = pkgs.lib.lists.foldr (variant: start:
|
||||
artiq-targets = pkgs.lib.lists.foldr (conf: start:
|
||||
let
|
||||
json = builtins.toPath (src + "/\''${variant}.json");
|
||||
boardBinaries = artiq-board {
|
||||
inherit target variant;
|
||||
inherit (conf) target variant;
|
||||
json = src + "/\''${variant}.json";
|
||||
boardBinaries = artiq-board (conf // {
|
||||
src = json;
|
||||
buildCommand = "python -m artiq.gateware.targets.kasli_generic \$src";
|
||||
};
|
||||
});
|
||||
in
|
||||
start // {
|
||||
"artiq-board-\''${target}-\''${variant}" = boardBinaries;
|
||||
|
@ -112,7 +129,10 @@ let
|
|||
boardBinaries = boardBinaries;
|
||||
inherit target variant;
|
||||
};
|
||||
} // (pkgs.lib.optionalAttrs (builtins.elem variant standaloneVariants) {
|
||||
} // (pkgs.lib.optionalAttrs (
|
||||
target == "kasli" &&
|
||||
builtins.elem variant standaloneVariants
|
||||
) {
|
||||
"device-db-\''${target}-\''${variant}" = pkgs.stdenv.mkDerivation {
|
||||
name = "device-db-\''${target}-\''${variant}";
|
||||
buildInputs = ddbDeps;
|
||||
|
@ -124,52 +144,54 @@ let
|
|||
echo file device_db_template \$out/device_db.py >> \$out/nix-support/hydra-build-products
|
||||
";
|
||||
};
|
||||
})) {} variants;
|
||||
})
|
||||
) {} ${serializedTargets};
|
||||
drtio-systems = {
|
||||
} // (pkgs.lib.optionalAttrs (pkgs.lib.strings.versionAtLeast artiq-fast.artiq.version "6.0") {
|
||||
berkeley3 = {
|
||||
master = "berkeley3master";
|
||||
satellites = {
|
||||
"1" = "berkeley3satellite";
|
||||
${pkgs.lib.optionalString beta ''
|
||||
berkeley3 = {
|
||||
master = "berkeley3master";
|
||||
satellites = {
|
||||
"1" = "berkeley3satellite";
|
||||
};
|
||||
};
|
||||
};
|
||||
bonn1 = {
|
||||
master = "bonn1master";
|
||||
satellites = {
|
||||
"1" = "bonn1satellite";
|
||||
bonn1 = {
|
||||
master = "bonn1master";
|
||||
satellites = {
|
||||
"1" = "bonn1satellite";
|
||||
};
|
||||
};
|
||||
};
|
||||
hw2 = {
|
||||
master = "hw2master";
|
||||
satellites = {
|
||||
"1" = "hw2satellite";
|
||||
hw2 = {
|
||||
master = "hw2master";
|
||||
satellites = {
|
||||
"1" = "hw2satellite";
|
||||
};
|
||||
};
|
||||
};
|
||||
ptb3 = {
|
||||
master = "ptb3master";
|
||||
satellites = {
|
||||
"1" = "ptb3satellite";
|
||||
ptb3 = {
|
||||
master = "ptb3master";
|
||||
satellites = {
|
||||
"1" = "ptb3satellite";
|
||||
};
|
||||
};
|
||||
};
|
||||
purdue = {
|
||||
master = "purduemaster";
|
||||
satellites = {
|
||||
"1" = "purduesatellite";
|
||||
purdue = {
|
||||
master = "purduemaster";
|
||||
satellites = {
|
||||
"1" = "purduesatellite";
|
||||
};
|
||||
};
|
||||
};
|
||||
stfc = {
|
||||
master = "stfcmaster";
|
||||
satellites = {
|
||||
"1" = "stfcsatellite";
|
||||
stfc = {
|
||||
master = "stfcmaster";
|
||||
satellites = {
|
||||
"1" = "stfcsatellite";
|
||||
};
|
||||
};
|
||||
};
|
||||
wipm7 = {
|
||||
master = "wipm7master";
|
||||
satellites = {
|
||||
"1" = "wipm7satellite";
|
||||
wipm7 = {
|
||||
master = "wipm7master";
|
||||
satellites = {
|
||||
"1" = "wipm7satellite";
|
||||
};
|
||||
};
|
||||
};
|
||||
});
|
||||
''}
|
||||
};
|
||||
drtio-ddbs = pkgs.lib.attrsets.mapAttrs'
|
||||
(system: crates: pkgs.lib.attrsets.nameValuePair ("device-db-" + system)
|
||||
(pkgs.stdenv.mkDerivation {
|
||||
|
@ -187,42 +209,7 @@ let
|
|||
})) drtio-systems;
|
||||
extras = import ./extras.nix { inherit pkgs; inherit (artiq-fast) sipyco asyncserial artiq; };
|
||||
in
|
||||
artiq-fast // generic-kasli // drtio-ddbs // extras // rec {
|
||||
artiq-board-sayma-rtm = artiq-board {
|
||||
target = "sayma";
|
||||
variant = "rtm";
|
||||
buildCommand = "python -m artiq.gateware.targets.sayma_rtm";
|
||||
};
|
||||
artiq-board-sayma-satellite = artiq-board {
|
||||
target = "sayma";
|
||||
variant = "satellite";
|
||||
buildCommand = "python -m artiq.gateware.targets.sayma_amc";
|
||||
};
|
||||
artiq-board-metlino-master = artiq-board {
|
||||
target = "metlino";
|
||||
variant = "master";
|
||||
buildCommand = "python -m artiq.gateware.targets.metlino";
|
||||
};
|
||||
artiq-board-kc705-nist_qc2 = artiq-board {
|
||||
target = "kc705";
|
||||
variant = "nist_qc2";
|
||||
};
|
||||
|
||||
conda-artiq-board-sayma-rtm = conda-artiq-board {
|
||||
target = "sayma";
|
||||
variant = "rtm";
|
||||
boardBinaries = artiq-board-sayma-rtm;
|
||||
};
|
||||
conda-artiq-board-sayma-satellite = conda-artiq-board {
|
||||
target = "sayma";
|
||||
variant = "satellite";
|
||||
boardBinaries = artiq-board-sayma-satellite;
|
||||
};
|
||||
conda-artiq-board-metlino-master = conda-artiq-board {
|
||||
target = "metlino";
|
||||
variant = "master";
|
||||
boardBinaries = artiq-board-metlino-master;
|
||||
};
|
||||
artiq-fast // artiq-targets // drtio-ddbs // extras // rec {
|
||||
conda-artiq-board-kasli-tester = conda-artiq-board {
|
||||
target = "kasli";
|
||||
variant = "tester";
|
||||
|
@ -233,28 +220,18 @@ let
|
|||
variant = "nist_clock";
|
||||
boardBinaries = artiq-fast.artiq-board-kc705-nist_clock;
|
||||
};
|
||||
conda-artiq-board-kc705-nist_qc2 = conda-artiq-board {
|
||||
target = "kc705";
|
||||
variant = "nist_qc2";
|
||||
boardBinaries = artiq-board-kc705-nist_qc2;
|
||||
};
|
||||
} // (pkgs.lib.optionalAttrs (pkgs.lib.strings.versionAtLeast artiq-fast.artiq.version "6.0") rec {
|
||||
artiq-board-sayma-satellite-st = artiq-board {
|
||||
target = "sayma";
|
||||
variant = "satellite";
|
||||
buildCommand = "python -m artiq.gateware.targets.sayma_amc --jdcg-type syncdds";
|
||||
};
|
||||
})
|
||||
}
|
||||
EOF
|
||||
'';
|
||||
pythonDeps = import ./artiq-full/python-deps.nix { inherit pkgs; };
|
||||
sipycoManualPackages = import ./artiq-full/sipyco-manual.nix {
|
||||
inherit (pkgs) stdenv lib python3Packages texlive texinfo;
|
||||
inherit (import <artiq-fast> { inherit pkgs; }) sipyco;
|
||||
inherit (import artiq-fast { inherit pkgs; }) sipyco;
|
||||
};
|
||||
artiqManualPackages = import ./artiq-full/artiq-manual.nix {
|
||||
inherit (pkgs) stdenv lib fetchgit git python3Packages texlive texinfo;
|
||||
inherit (pythonDeps) sphinxcontrib-wavedrom;
|
||||
inherit artiq-fast;
|
||||
};
|
||||
artiq-full = import generatedNix { inherit pkgs; };
|
||||
exampleUserEnv = import ./artiq-full/example-user-env.nix { inherit pkgs artiq-full; };
|
||||
|
|
|
@ -3,46 +3,11 @@
|
|||
|
||||
{ pkgs
|
||||
, vivado ? import ./fast/vivado.nix { inherit pkgs; }
|
||||
, board-generated
|
||||
, version
|
||||
}:
|
||||
|
||||
let
|
||||
version = import ./fast/pkgs/artiq-version.nix (with pkgs; { inherit stdenv fetchgit git; });
|
||||
artiqSrc = import ./fast/pkgs/artiq-src.nix { fetchgit = pkgs.fetchgit; };
|
||||
artiqpkgs = import ./fast/default.nix { inherit pkgs; };
|
||||
fetchcargo = import ./fast/fetchcargo.nix {
|
||||
inherit (pkgs) stdenv cacert git;
|
||||
inherit (artiqpkgs) cargo cargo-vendor;
|
||||
};
|
||||
cargoDeps = fetchcargo rec {
|
||||
name = "artiq-firmware-cargo-deps";
|
||||
src = "${artiqSrc}/artiq/firmware";
|
||||
sha256 = import (artiqSrc + "/artiq/firmware/cargosha256.nix");
|
||||
};
|
||||
|
||||
cargoVendored = pkgs.stdenv.mkDerivation {
|
||||
name = "artiq-firmware-cargo-vendored";
|
||||
src = cargoDeps;
|
||||
phases = [ "unpackPhase" "installPhase" ];
|
||||
installPhase =
|
||||
''
|
||||
mkdir -p $out/registry
|
||||
cat << EOF > $out/config
|
||||
[source.crates-io]
|
||||
registry = "https://github.com/rust-lang/crates.io-index"
|
||||
replace-with = "vendored-sources"
|
||||
|
||||
[source."https://github.com/m-labs/libfringe"]
|
||||
git = "https://github.com/m-labs/libfringe"
|
||||
rev = "b8a6d8f"
|
||||
replace-with = "vendored-sources"
|
||||
|
||||
[source.vendored-sources]
|
||||
directory = "$out/registry"
|
||||
EOF
|
||||
cp -R * $out/registry
|
||||
'';
|
||||
};
|
||||
|
||||
# Funnelling the source code through a Nix string allows dropping
|
||||
# all dependencies via `unsafeDiscardStringContext`.
|
||||
discardContextFromPath = { name, src }:
|
||||
|
@ -70,71 +35,13 @@ let
|
|||
in
|
||||
{ target
|
||||
, variant
|
||||
, src ? null
|
||||
, buildCommand ? "python -m artiq.gateware.targets.${target} -V ${variant}"
|
||||
, extraInstallCommands ? ""}:
|
||||
, extraInstallCommands ? ""
|
||||
, ... }:
|
||||
let
|
||||
name = "artiq-board-${target}-${variant}-${version}";
|
||||
installPath = builtins.unsafeDiscardStringContext "${pkgs.python3Packages.python.sitePackages}/artiq/board-support/${target}-${variant}";
|
||||
pythonEnv = pkgs.python3.withPackages (ps: with ps; [
|
||||
jinja2 jsonschema numpy artiqpkgs.migen artiqpkgs.microscope artiqpkgs.misoc artiqpkgs.jesd204b artiqpkgs.artiq
|
||||
]);
|
||||
|
||||
generatedSources =
|
||||
pkgs.stdenv.mkDerivation {
|
||||
name = "${name}-src";
|
||||
inherit version src;
|
||||
phases = [ "buildPhase" "installCheckPhase" "installPhase" "checkPhase" ];
|
||||
buildInputs = [ pythonEnv ];
|
||||
buildPhase =
|
||||
''
|
||||
${buildCommand} --no-compile-software --no-compile-gateware --gateware-identifier-str=unprogrammed
|
||||
'';
|
||||
installPhase =
|
||||
''
|
||||
mkdir -p $out
|
||||
cp -ar artiq_${target}/${variant}/{gateware,software} $out
|
||||
substituteInPlace $out/software/Makefile \
|
||||
--replace /build/artiq_${target}/${variant}/software/ ""
|
||||
'';
|
||||
};
|
||||
# Board packages are Python modules so that they get added to the ARTIQ Python
|
||||
# environment, and artiq_flash finds them.
|
||||
software =
|
||||
pkgs.stdenv.mkDerivation {
|
||||
name = "${name}-software";
|
||||
src = "${generatedSources}/software";
|
||||
nativeBuildInputs = [
|
||||
pkgs.gnumake pkgs.which pythonEnv
|
||||
artiqpkgs.cargo
|
||||
artiqpkgs.rustc
|
||||
artiqpkgs.binutils-or1k
|
||||
artiqpkgs.llvm-or1k
|
||||
];
|
||||
buildPhase =
|
||||
''
|
||||
export CARGO_HOME=${cargoVendored}
|
||||
export TARGET_AR=or1k-linux-ar
|
||||
|
||||
make BUILDINC_DIRECTORY=`pwd`/include
|
||||
'';
|
||||
installPhase =
|
||||
''
|
||||
TARGET_DIR=$out/${installPath}
|
||||
mkdir -p $TARGET_DIR
|
||||
|
||||
if [ -e bootloader/bootloader.bin ]
|
||||
then cp bootloader/bootloader.bin $TARGET_DIR
|
||||
fi
|
||||
if [ -e runtime ]
|
||||
then cp runtime/runtime.{elf,fbi} $TARGET_DIR
|
||||
else cp satman/satman.{elf,fbi} $TARGET_DIR
|
||||
fi
|
||||
${extraInstallCommands}
|
||||
'';
|
||||
# don't mangle ELF files as they are not for NixOS
|
||||
dontFixup = true;
|
||||
};
|
||||
generated = board-generated."artiq-board-${target}-${variant}";
|
||||
|
||||
identifierStr = "${version};${variant}";
|
||||
identifiers = import (
|
||||
|
@ -149,7 +56,7 @@ let
|
|||
|
||||
src = discardContextFromPath {
|
||||
name = "${name}-gateware";
|
||||
src = "${generatedSources}/gateware";
|
||||
src = "${generated}/gateware";
|
||||
};
|
||||
buildInputs = [ vivado pkgs.nix ];
|
||||
buildPhase = ''
|
||||
|
@ -213,6 +120,6 @@ in
|
|||
pkgs.python3Packages.toPythonModule (
|
||||
pkgs.buildEnv rec {
|
||||
inherit name;
|
||||
paths = [ software vivadoOutput ];
|
||||
paths = [ generated vivadoOutput ];
|
||||
pathsToLink = [ "/${installPath}" ];
|
||||
})
|
|
@ -1,7 +1,7 @@
|
|||
{ stdenv, lib, fetchgit, git, python3Packages, texlive, texinfo, sphinxcontrib-wavedrom }:
|
||||
{ stdenv, lib, fetchgit, git, python3Packages, texlive, texinfo, sphinxcontrib-wavedrom, artiq-fast }:
|
||||
|
||||
let
|
||||
artiqVersion = import <artiq-fast/pkgs/artiq-version.nix> { inherit stdenv fetchgit git; };
|
||||
artiqVersion = import (artiq-fast + "/pkgs/artiq-version.nix") { inherit stdenv fetchgit git; };
|
||||
|
||||
isLatexPdfTarget = target: builtins.match "latexpdf.*" target != null;
|
||||
|
||||
|
@ -16,7 +16,7 @@ let
|
|||
name = "artiq-manual-${target}-${version}";
|
||||
version = artiqVersion;
|
||||
|
||||
src = import <artiq-fast/pkgs/artiq-src.nix> { inherit fetchgit; };
|
||||
src = import (artiq-fast + "/pkgs/artiq-src.nix") { inherit fetchgit; };
|
||||
buildInputs = [
|
||||
python3Packages.sphinx python3Packages.sphinx_rtd_theme
|
||||
python3Packages.sphinx-argparse sphinxcontrib-wavedrom
|
||||
|
@ -26,7 +26,7 @@ let
|
|||
|
||||
preBuild = ''
|
||||
export VERSIONEER_OVERRIDE=${artiqVersion}
|
||||
export SOURCE_DATE_EPOCH=${import <artiq-fast/pkgs/artiq-timestamp.nix> { inherit stdenv fetchgit git; }}
|
||||
export SOURCE_DATE_EPOCH=${import (artiq-fast + "/pkgs/artiq-timestamp.nix") { inherit stdenv fetchgit git; }}
|
||||
cd doc/manual
|
||||
'';
|
||||
makeFlags = [ target ];
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
{ pkgs
|
||||
, artiqVersion
|
||||
, sinaraSystemsSrc
|
||||
}:
|
||||
|
||||
let
|
||||
jsons =
|
||||
map (jsonFile: builtins.fromJSON (
|
||||
builtins.readFile (sinaraSystemsSrc + "/${jsonFile}")
|
||||
)) (
|
||||
builtins.attrNames (
|
||||
pkgs.lib.filterAttrs (name: type:
|
||||
type != "directory" &&
|
||||
builtins.match ".+\\.json" name != null
|
||||
) (builtins.readDir sinaraSystemsSrc)
|
||||
)
|
||||
);
|
||||
kasli = builtins.listToAttrs (
|
||||
builtins.map ({ variant, base, ... }: {
|
||||
name = "artiq-board-kasli-${variant}";
|
||||
value = {
|
||||
target = "kasli";
|
||||
inherit variant;
|
||||
src = sinaraSystemsSrc + "/${variant}.json";
|
||||
buildCommand = "python -m artiq.gateware.targets.kasli_generic $src";
|
||||
standalone = base == "standalone";
|
||||
};
|
||||
}) (
|
||||
builtins.filter (json:
|
||||
pkgs.lib.strings.versionAtLeast artiqVersion (
|
||||
if json ? min_artiq_version
|
||||
then json.min_artiq_version
|
||||
else "0"
|
||||
)
|
||||
) jsons
|
||||
)
|
||||
);
|
||||
in
|
||||
kasli // {
|
||||
artiq-board-sayma-rtm = {
|
||||
target = "sayma";
|
||||
variant = "rtm";
|
||||
buildCommand = "python -m artiq.gateware.targets.sayma_rtm";
|
||||
};
|
||||
artiq-board-sayma-satellite = {
|
||||
target = "sayma";
|
||||
variant = "satellite";
|
||||
buildCommand = "python -m artiq.gateware.targets.sayma_amc";
|
||||
};
|
||||
artiq-board-metlino-master = {
|
||||
target = "metlino";
|
||||
variant = "master";
|
||||
buildCommand = "python -m artiq.gateware.targets.metlino";
|
||||
};
|
||||
artiq-board-kc705-nist_qc2 = {
|
||||
target = "kc705";
|
||||
variant = "nist_qc2";
|
||||
};
|
||||
} // (pkgs.lib.optionalAttrs (pkgs.lib.strings.versionAtLeast artiqVersion "6.0") {
|
||||
artiq-board-sayma-satellite-st = {
|
||||
target = "sayma";
|
||||
variant = "satellite";
|
||||
buildCommand = "python -m artiq.gateware.targets.sayma_amc --jdcg-type syncdds";
|
||||
};
|
||||
})
|
|
@ -16,6 +16,24 @@
|
|||
"artiqSrc": { "type": "git", "value": "git://github.com/m-labs/artiq.git master 1", "emailresponsible": false }
|
||||
}
|
||||
},
|
||||
"board-generated-beta": {
|
||||
"enabled": 1,
|
||||
"hidden": false,
|
||||
"description": "Generated code for ARTIQ targets (beta version)",
|
||||
"nixexprinput": "nixScripts",
|
||||
"nixexprpath": "artiq-board-generated",
|
||||
"checkinterval": 86400,
|
||||
"schedulingshares": 1,
|
||||
"enableemail": false,
|
||||
"emailoverride": "",
|
||||
"keepnr": 10,
|
||||
"inputs": {
|
||||
"nixpkgs": { "type": "git", "value": "git://github.com/NixOS/nixpkgs nixos-20.09", "emailresponsible": false },
|
||||
"nixScripts": { "type": "git", "value": "https://git.m-labs.hk/M-Labs/nix-scripts.git", "emailresponsible": false },
|
||||
"sinaraSystemsSrc": { "type": "git", "value": "https://git.m-labs.hk/M-Labs/sinara-systems.git master 1", "emailresponsible": false },
|
||||
"artiq-fast": { "type": "sysbuild", "value": "artiq:fast-beta:generated-nix", "emailresponsible": false }
|
||||
}
|
||||
},
|
||||
"full-beta": {
|
||||
"enabled": 1,
|
||||
"hidden": false,
|
||||
|
@ -30,8 +48,8 @@
|
|||
"inputs": {
|
||||
"nixpkgs": { "type": "git", "value": "git://github.com/NixOS/nixpkgs nixos-20.09", "emailresponsible": false },
|
||||
"nixScripts": { "type": "git", "value": "https://git.m-labs.hk/M-Labs/nix-scripts.git", "emailresponsible": false },
|
||||
"sinaraSystemsSrc": { "type": "git", "value": "https://git.m-labs.hk/M-Labs/sinara-systems.git master 1", "emailresponsible": false },
|
||||
"artiq-fast": { "type": "sysbuild", "value": "artiq:fast-beta:generated-nix", "emailresponsible": false }
|
||||
"beta": { "type": "boolean", "value": "true" },
|
||||
sb10q
commented
Same as below - this can go out of sync with Same as below - this can go out of sync with ``board-generated``.
|
||||
"artiq-board-generated": { "type": "sysbuild", "value": "artiq:board-generated-beta:generated-nix", "emailresponsible": false }
|
||||
}
|
||||
sb10q
commented
Won't this produce some spurious builds with inconsistent I think there should be a single ARTIQ input to Won't this produce some spurious builds with inconsistent ``artiq-fast`` and ``artiq-board-generated`` versions?
I think there should be a single ARTIQ input to ``full-beta``, i.e. ``board-generated`` needs to include the copy of ``fast`` that it used, and then ``full`` reuses it, in order to prevent de-synchronization.
astro
commented
I was wondering about that. Thank you for spelling it out. That will also result in yet more divergent codepaths between non-beta and beta. I was wondering about that. Thank you for spelling it out. That will also result in yet more divergent codepaths between non-beta and beta.
sb10q
commented
If it diverges too much, just have two independent copies of the relevant Nix files. This will also help avoiding inadvertently breaking stable. If it diverges too much, just have two independent copies of the relevant Nix files. This will also help avoiding inadvertently breaking stable.
sb10q
commented
You can probably symlink and not copy. > board-generated needs to include the copy of fast that it used, and then full reuses it
You can probably symlink and not copy.
astro
commented
Symlinking seems to break Nix restricted mode in which only /nix/store entries of known inputs are available to a build. Symlinking seems to break Nix restricted mode in which only /nix/store entries of known inputs are available to a build.
|
||||
},
|
||||
"fast": {
|
||||
|
@ -66,6 +84,7 @@
|
|||
"nixpkgs": { "type": "git", "value": "git://github.com/NixOS/nixpkgs nixos-20.03", "emailresponsible": false },
|
||||
"nixScripts": { "type": "git", "value": "https://git.m-labs.hk/M-Labs/nix-scripts.git", "emailresponsible": false },
|
||||
"sinaraSystemsSrc": { "type": "git", "value": "https://git.m-labs.hk/M-Labs/sinara-systems.git master 1", "emailresponsible": false },
|
||||
"beta": { "type": "boolean", "value": "false" },
|
||||
"artiq-fast": { "type": "sysbuild", "value": "artiq:fast:generated-nix", "emailresponsible": false }
|
||||
}
|
||||
},
|
||||
|
|
Won't that break on ARTIQ-5?
...and on -6 bloat the channel expressions with all the generated sources for all variants?
For the non-beta case no sources are built but
board-generated/artiq-targets.nix
is still used because it contains the static variants list."artiq:board-generated-beta:generated-nix"
is anothergenerated-nix
just like<artiq-fast>
here. As there are no dependencies on the generated sources (yet), I'm still not sure if artiq-full evaluation will wait until all of the board-generated jobs have been tried.Hmm, it's a bit heavy to add a new jobset for that on -5. Can we be more conservative here?