#!/usr/bin/env python3

# Copyright (c) 2023 Arm Limited.
#
# SPDX-License-Identifier: MIT
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

import argparse
import os
from jinja2 import Template
import datetime

# Paths to exclude
excluded_paths = ["build",
                  "compute_kernel_writer/build",
                  "compute_kernel_writer/src",
                  "compute_kernel_writer/validation",
                  "docs/",
                  "documentation/",
                  "examples/",
                  "opencl-1.2-stubs/",
                  "release_repository/",
                  "opengles-3.1-stubs/",
                  "scripts/",
                  "tests/",
                  "/GLES_COMPUTE/",
                  "/graph/",
                  "/sve/",
                  "/SVE/",
                  "/sve2/",
                  "/SVE2/"
                  ]

excluded_files = ["TracePoint.cpp"]

# Android bp template to render
year = datetime.datetime.now().year

bp_tm = Template(
"""//
// Copyright © 2020-""" + str(year) + """ Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

// OpenCL sources are NOT required by ArmNN or its Android NNAPI driver and are used for CI purposes only.
opencl_srcs = [
        {% for cl_src in cl_srcs -%}
            "{{ cl_src }}",
        {% endfor %}
]

bootstrap_go_package {
    name: "arm_compute_library_nn_driver",
    pkgPath: "arm_compute_library_nn_driver",
    deps: [
        "blueprint",
        "blueprint-pathtools",
        "blueprint-proptools",
        "soong",
        "soong-android",
        "soong-cc",
    ],
    srcs: [
        "scripts/arm_compute_library_nn_driver.go",
    ],
    pluginFor: [ "soong_build" ],
}

arm_compute_library_defaults {
       name: "acl-default-cppflags",
       cppflags: [
            "-std=c++14",
            "-fexceptions",
            "-DBOOST_NO_AUTO_PTR",
            "-DEMBEDDED_KERNELS",
            "-DARM_COMPUTE_ASSERTS_ENABLED",
            "-DARM_COMPUTE_CPP_SCHEDULER",
            "-DENABLE_NEON",
            "-DARM_COMPUTE_ENABLE_NEON",
            "-Wno-unused-parameter",
            "-DNO_DOT_IN_TOOLCHAIN",
            "-Wno-implicit-fallthrough",
            "-fPIC",
            "-DACL_INTERNAL_TEST_CKW_IN_DF"
    ],
    rtti: true,
}

cc_library_static {
    name: "arm_compute_library",
    defaults: ["acl-default-cppflags"],
    proprietary: true,
    local_include_dirs: ["build/android-arm64v8a/src/core",
                         "build/android-arm64v8a/src/core/CL",
                         "compute_kernel_writer/prototype/include",
                         "compute_kernel_writer/prototype",
                         "src/core/common",
                         "src/core/helpers",
                         "src/core/NEON/kernels/arm_gemm",
                         "src/core/NEON/kernels/assembly",
                         "src/core/NEON/kernels/convolution/common",
                         "src/core/NEON/kernels/convolution/winograd",
                         "src/cpu/kernels/assembly"],
    export_include_dirs: [".", "./include"],
    srcs: [
        {% for src in srcs -%}
            "{{ src }}",
        {% endfor %}
    ],
    arch: {
        arm: {
            srcs: [
                {% for arm_src in arm_srcs -%}
                    "{{ arm_src }}",
                {% endfor %}
            ],
        },
        arm64: {
            srcs: [
                {% for arm64_src in arm64_srcs -%}
                    "{{ arm64_src }}",
                {% endfor %}
            ],
        },
    },
    rtti: true,
}
""")


def generate_bp_file(cpp_files, opencl_files):
    arm_files = [f for f in cpp_files if "a32_" in f]
    arm64_files = [f for f in cpp_files if any(a64 in f for a64 in ["a64_", "sve_", 'sme_', 'sme2_'])]
    gen_files = [x for x in cpp_files if x not in arm_files + arm64_files]

    arm_files.sort()
    arm64_files.sort()
    gen_files.sort()
    opencl_files.sort()

    bp_file = bp_tm.render(srcs=gen_files,
                           arm_srcs=arm_files,
                           arm64_srcs=arm64_files,
                           cl_srcs=opencl_files)
    return bp_file


def list_all_files(repo_path):
    """ Gets the list of files to include to the Android.bp

    :param repo_path: Path of the repository
    :return: The filtered list of useful filess
    """
    if not repo_path.endswith('/'):
        repo_path = repo_path + "/"

    # Get cpp files
    cpp_files = []
    cl_files = []
    for path, subdirs, files in os.walk(repo_path):
        for file in files:
            if file.endswith(".cpp"):
                cpp_files.append(os.path.join(path, file))
            elif file.endswith(".cl"):
                cl_files.append(os.path.join(path, file))
            # Include CL headers
            if "src/core/CL/cl_kernels" in path and file.endswith(".h"):
                cl_files.append(os.path.join(path, file))
    # Filter out unused cpp files
    filtered_cpp_files = []
    for cpp_file in cpp_files:
        if any(ep in cpp_file for ep in excluded_paths) or any(ef in cpp_file for ef in excluded_files):
            continue
        filtered_cpp_files.append(cpp_file.replace(repo_path, ""))
    # Filter out unused cl files
    filtered_cl_files = []
    for cl_file in cl_files:
        if any(ep in cl_file for ep in excluded_paths):
            continue
        filtered_cl_files.append(cl_file.replace(repo_path, ""))

    return filtered_cpp_files, filtered_cl_files


if __name__ == "__main__":
    # Parse arguments
    parser = argparse.ArgumentParser('Generate Android.bp file for ComputeLibrary')
    parser.add_argument('--folder', default=".", metavar="folder", dest='folder', type=str, required=False, help='Compute Library source path')
    parser.add_argument('--output_file', metavar="output_file", default='Android.bp', type=str, required=False, help='Specify Android bp output file')
    args = parser.parse_args()

    cpp_files, opencl_files = list_all_files(args.folder)
    bp_file = generate_bp_file(cpp_files, opencl_files)

    with open(args.output_file, 'w') as f:
        f.write(bp_file)
