{
  stdenv
, lib
, stdexp
, bsc
, targetMachine
, stages
, n # must be a string
, dram # must be a string
, strace
}:

with lib;

# Ensure the arguments are strings, to avoid problems with large numbers
assert (isString n);
assert (isString dram);

let
  # Initial variable configuration
  varConf = with bsc; { };

  inherit (targetMachine) fs;

  # Generate the complete configuration for each unit
  genConf = with bsc; c: targetMachine.config // rec {
    expName = "genseq";
    unitName = "${expName}.n${n}.dram${dram}";
    inherit (targetMachine.config) hw;
    inherit n dram;

    # Don't repeat
    loops = 1;

    # Resources
    qos = "debug";
    ntasksPerNode = 1;
    nodes = 1;
    time = "01:00:00";
    cpusPerTask = hw.cpusPerNode;
    jobName = unitName;
  };

  # Compute the array of configurations
  configs = stdexp.buildConfigs {
    inherit varConf genConf;
  };

  exec = {nextStage, conf, ...}: with conf;
  let
    #FIXME: We need a better mechanism to get the output paths
    outDir = "${fs.shared.fast}/out/$GARLIC_USER/$GARLIC_UNIT/$GARLIC_RUN";
    outFile = "${outDir}/seq.dat";
  in
    stages.exec {
      inherit nextStage;
      pre = ''
        mkdir -p "${outDir}"
      '';
      argv = [ n dram outFile ];
      post = ''
        # Link the output here
        ln -s "${outFile}" seq.dat
      '';
    };

  program = {...}: bsc.apps.bigsort.genseq;

  pipeline = stdexp.stdPipeline ++ [ exec program ];

in

  stdexp.genExperiment { inherit configs pipeline; }