#! /usr/bin/env python

# ICON
#
# ---------------------------------------------------------------
# Copyright (C) 2004-2026, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss
# Contact information: icon-model.org
# See AUTHORS.TXT for a list of authors
# See LICENSES/ for license information
# SPDX-License-Identifier: BSD-3-Clause
# ---------------------------------------------------------------

"""\
Create cyclic SLURM CPU mask for binding
"""
from __future__ import print_function

import argparse

command_line = argparse.ArgumentParser(description=__doc__.split("\n", 1)[0])
command_line.add_argument(
    "--threads",
    "-t",
    type=int,
    default=4,
    help="number of threads per task [%(default)s]",
)
command_line.add_argument(
    "--group-size",
    "-g",
    type=int,
    default=16,
    help="number of cpus per group [%(default)s]",
)
command_line.add_argument(
    "--cpus",
    "-c",
    type=int,
    default=128,
    help="number of cpus per node [%(default)s]",
)
command_line.add_argument(
    "--separator",
    "-s",
    default=",",
    help="string separating task masks [%(default)s]",
)

args = command_line.parse_args()

args.separator = args.separator.replace(r"\n", "\n")
args.separator = args.separator.replace(r"\t", "\t")

result = []
for offset in range(args.group_size // args.threads):
    current = 0
    for thread in range(args.threads):
        current = (current << 1) + 1
    for group in range(args.cpus // args.group_size):
        result.append(
            hex(
                current << offset * args.threads + group * args.group_size
            ).rstrip("L")
        )

print(args.separator.join(result))
