let register tname ((opts, af) as options) deps process is_filled =

  (* Check that tname is not already used. *)
  if is_registered tname then
    failwith ("Task registration problem: "^tname
              ^" is already registered")

  (* Check that dependencies are met. *)
  else if (List.exists (List.exists (notf is_registered)) deps) then
    failwith ("Task registration problem: the dependencies cannot be met for "
              ^ tname ^".")

  (* This registration is consistent. *)
  else 
      Hashtbl.add registered_tasks tname
        {
          name       = tname;
          options    = options;
          depends_on = deps;
          process    = 
            {
              input_type  = deps;
              output_type = tname;
              code        = as_process_code tname deps process
            };
          is_filled  = is_filled
        }