//
// Copyright © 2020-2023 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

package arm_compute_library_nn_driver

import (
    "android/soong/android"
    "android/soong/cc"
    "strings"
)

func isVersionAtLeast(version_name string, target_version int) bool {
    name_map := map[string]int {
    "L": 5, "5": 5,
    "M": 6, "6": 6,
    "N": 7, "7": 7,
    "O": 8, "8": 8,
    "P": 9, "9": 9,
    "Q": 10, "10": 10,
    "R": 11, "11": 11,
    "S": 12, "12": 12,
    "T": 13, "13": 13,
    "U": 14, "14": 14,
    }
    if _, ok := name_map[version_name]; ok {
        return name_map[version_name] >= target_version
    } else {
        return false
    }
}

func globalFlags(ctx android.BaseContext) []string {
    var cppflags []string

   if ctx.AConfig().PlatformVersionName() == "Q" || ctx.AConfig().PlatformVersionName() == "10" ||
      ctx.AConfig().PlatformVersionName() == "R" || ctx.AConfig().PlatformVersionName() == "11" ||
      ctx.AConfig().PlatformVersionName() == "S" || ctx.AConfig().PlatformVersionName() == "12" {
        cppflags = append(cppflags, "-fno-addrsig")
    }

    if ctx.AConfig().PlatformVersionName() == "R" || ctx.AConfig().PlatformVersionName() == "11" {
      for _, a := range ctx.DeviceConfig().Arches() {
        theArch := a.ArchType.String()
        if theArch == "armv8-2a" {
          cppflags = append(cppflags, "-march=armv8.2-a+fp16")
          cppflags = append(cppflags, "-DARM_COMPUTE_ENABLE_FP16")
          cppflags = append(cppflags, "-DENABLE_FP16_KERNELS")
        }
      }
    }

    // Since Android T, the underlying NDK stops supporting system assembler like GAS, in favor of integrated assembler
    // However for Android < Android T we still want to suppress integrated assembler for backward compatibility
    if ! isVersionAtLeast(ctx.AConfig().PlatformVersionName(), 13) {
        cppflags = append(cppflags, "-no-integrated-as")
    }

    data_types := strings.Split(ctx.AConfig().GetenvWithDefault("COMPUTE_LIB_DATA_TYPE", "ALL"), ",")

    for _, x := range data_types {
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "INTEGER" {
            cppflags = append(cppflags, "-DENABLE_INTEGER_KERNELS")
        }
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QASYMM8" {
            cppflags = append(cppflags, "-DENABLE_QASYMM8_KERNELS")
        }
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QASYMM8_SIGNED" {
            cppflags = append(cppflags, "-DENABLE_QASYMM8_SIGNED_KERNELS")
        }
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QASYMM16" {
            cppflags = append(cppflags, "-DENABLE_QASYMM16_KERNELS")
        }
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "QSYMM16" {
            cppflags = append(cppflags, "-DENABLE_QSYMM16_KERNELS")
        }
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "FP32" {
            cppflags = append(cppflags, "-DENABLE_FP32_KERNELS")
        }
    }

    data_layouts := strings.Split(ctx.AConfig().GetenvWithDefault("COMPUTE_LIB_DATA_LAYOUT", "ALL"), ",")

    for _, x := range data_layouts {
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "NHWC" {
            cppflags = append(cppflags, "-DENABLE_NHWC_KERNELS")
        }
        if strings.ToUpper(x) == "ALL" || strings.ToUpper(x) == "NCHW" {
            cppflags = append(cppflags, "-DENABLE_NCHW_KERNELS")
        }
    }

    cppflags = append(cppflags, "-DARM_COMPUTE_CPU_ENABLED")
    cppflags = append(cppflags, "-DARM_COMPUTE_OPENCL_ENABLED")

    return cppflags
}

func clframeworkNNDriverDefaults(ctx android.LoadHookContext) {
        type props struct {
                Cppflags []string
        }

        p := &props{}
        p.Cppflags = globalFlags(ctx)

        ctx.AppendProperties(p)
}

func init() {

  android.RegisterModuleType("arm_compute_library_defaults", clframeworkNNDriverDefaultsFactory)
}

func clframeworkNNDriverDefaultsFactory() android.Module {

   module := cc.DefaultsFactory()
   android.AddLoadHook(module, clframeworkNNDriverDefaults)
   return module
}
