Support running a different Kelvin benchmark binary

Allow passing in of 'kelvin_benchmark_info' which is a dictionary
that contains the needed info for the kelvin_binary (e.g srcs).
This allows the benchmark to run a different Kelvin binary while
still keeping the SEC and SMC ones the same.

Tested:
best_of_times, silence with ISS+FPGA

Change-Id: Iabba3fd2e19524a66c3f530f095828e5201d0e9c
diff --git a/benchmarks/benchmark_kelvin.cc b/benchmarks/benchmark_kelvin.cc
index c01ffde..1871619 100644
--- a/benchmarks/benchmark_kelvin.cc
+++ b/benchmarks/benchmark_kelvin.cc
@@ -34,7 +34,7 @@
 
 // In order to include the model data generate from Bazel, include the header
 // using the name passed as a macro.
-#define MODEL_HEADER_DIRECTORY benchmarks/
+#define MODEL_HEADER_DIRECTORY BENCHMARK_PATH/
 #define MODEL_HEADER_TYPE _model.h
 #define MODEL_HEADER STR(MODEL_HEADER_DIRECTORY BENCHMARK_NAME MODEL_HEADER_TYPE)
 #include MODEL_HEADER
diff --git a/benchmarks/benchmark_sec.c b/benchmarks/benchmark_sec.c
index b1b5040..251bd08 100644
--- a/benchmarks/benchmark_sec.c
+++ b/benchmarks/benchmark_sec.c
@@ -34,10 +34,10 @@
 // In order to include the model data generate from Bazel, include the header
 // using the name passed as a macro. For some reason this binary (vs Kelvin)
 // adds space when concatinating so use the model format -smc_bin.h.
-#define MODEL_HEADER_DIRECTORY benchmarks
-#define MODEL_HEADER_TYPE smc_bin.h
-#define MODEL_HEADER STR(MODEL_HEADER_DIRECTORY/BENCHMARK_NAME-MODEL_HEADER_TYPE)
-#include MODEL_HEADER
+#define SMC_BINARY_DIRECTORY BENCHMARK_PATH
+#define SMC_BINARY_TYPE smc_bin.h
+#define SMC_BINARY STR(SMC_BINARY_DIRECTORY/BENCHMARK_NAME-SMC_BINARY_TYPE)
+#include SMC_BINARY
 
 static dif_pinmux_t pinmux;
 static dif_smc_ctrl_t smc_ctrl;
diff --git a/benchmarks/benchmarks.bzl b/benchmarks/benchmarks.bzl
index f02e544..3414e7d 100644
--- a/benchmarks/benchmarks.bzl
+++ b/benchmarks/benchmarks.bzl
@@ -23,53 +23,67 @@
         iterations,
         test_data = None,
         profile = False,
+        kelvin_binary_info = None,
+        benchmark_path = "benchmarks",
         hw_test_size = "medium",
         hw_test_tags = [],
         iss_test_size = "small",
         iss_test_tags = [],
         **kwargs):
 
-        kelvin_headers = ["@kelvin_sw//benchmarks:benchmark.h"]
-        model_header_name = "{}_model".format(name)
-        bin_to_c_file(
-            name = model_header_name,
-            srcs = [model],
-            var_name = "g_benchmark_model_data",
-        )
-        kelvin_headers.append(model_header_name)
-
-        if test_data:
-            test_data_header_name = "{}_test_data".format(name)
-            bin_to_c_file(
-                name = test_data_header_name,
-                srcs = [test_data],
-                var_name = "g_benchmark_test_data",
+        if kelvin_binary_info:
+            kelvin_test(
+                name = kelvin_binary_info['name'],
+                srcs = kelvin_binary_info['srcs'],
+                hdrs = kelvin_binary_info['hdrs'],
+                copts = kelvin_binary_info['copts'],
+                deps = kelvin_binary_info['deps'],
+                hw_test_size = "medium",
+                iss_test_size = "medium",
             )
-            kelvin_headers.append(test_data_header_name)
+        else:
+            kelvin_headers = ["@kelvin_sw//benchmarks:benchmark.h"]
+            model_header_name = "{}_model".format(name)
+            bin_to_c_file(
+                name = model_header_name,
+                srcs = [model],
+                var_name = "g_benchmark_model_data",
+            )
+            kelvin_headers.append(model_header_name)
 
-        # Test to run in simulator and MPACT.
-        kelvin_test(
-            name = "{}".format(name),
-            srcs = ["@kelvin_sw//benchmarks:benchmark_kelvin.cc"],
-            hdrs = kelvin_headers,
-            copts = [
-                "-DITERATIONS={}".format(iterations),
-                "-DBENCHMARK_NAME={}".format(name),
-                "-DTEST_DATA={}".format(1 if test_data else 0),
-                "-DPROFILE={}".format(1 if profile else 0),
-            ],
-            deps = [
-                "@kelvin_sw//crt",
-                "@kelvin_sw//benchmarks:benchmark_header",
-                "@kelvin_sw//benchmarks:cycle_count",
-                "@tflite-micro//tensorflow/lite/micro:micro_framework",
-                "@tflite-micro//tensorflow/lite/micro:system_setup",
-            ],
-            hw_test_size = hw_test_size,
-            hw_test_tags = hw_test_tags,
-            iss_test_size = iss_test_size,
-            iss_test_tags = iss_test_tags,
-        )
+            if test_data:
+                test_data_header_name = "{}_test_data".format(name)
+                bin_to_c_file(
+                    name = test_data_header_name,
+                    srcs = [test_data],
+                    var_name = "g_benchmark_test_data",
+                )
+                kelvin_headers.append(test_data_header_name)
+
+            # Test to run in simulator and MPACT.
+            kelvin_test(
+                name = "{}".format(name),
+                srcs = ["@kelvin_sw//benchmarks:benchmark_kelvin.cc"],
+                hdrs = kelvin_headers,
+                copts = [
+                    "-DITERATIONS={}".format(iterations),
+                    "-DBENCHMARK_NAME={}".format(name),
+                    "-DTEST_DATA={}".format(1 if test_data else 0),
+                    "-DPROFILE={}".format(1 if profile else 0),
+                    "-DBENCHMARK_PATH={}".format(benchmark_path),
+                ],
+                deps = [
+                    "@kelvin_sw//crt",
+                    "@kelvin_sw//benchmarks:benchmark_header",
+                    "@kelvin_sw//benchmarks:cycle_count",
+                    "@tflite-micro//tensorflow/lite/micro:micro_framework",
+                    "@tflite-micro//tensorflow/lite/micro:system_setup",
+                ],
+                hw_test_size = hw_test_size,
+                hw_test_tags = hw_test_tags,
+                iss_test_size = iss_test_size,
+                iss_test_tags = iss_test_tags,
+            )
 
 def kelvin_benchmark_fpga(
         name,
@@ -77,6 +91,8 @@
         iterations,
         test_data = None,
         profile = False,
+        kelvin_binary_info = None,
+        benchmark_path = "benchmarks",
         **kwargs):
         _kelvin_benchmark_device(
             name = name,
@@ -85,6 +101,8 @@
             iterations = iterations,
             test_data = test_data,
             profile = profile,
+            kelvin_binary_info = kelvin_binary_info,
+            benchmark_path = benchmark_path,
             **kwargs,
         )
 
@@ -94,6 +112,8 @@
         iterations,
         test_data = None,
         profile = False,
+        kelvin_binary_info = None,
+        benchmark_path = "benchmarks",
         **kwargs):
 
         _kelvin_benchmark_device(
@@ -103,6 +123,8 @@
             iterations = iterations,
             test_data = test_data,
             profile = profile,
+            kelvin_binary_info = kelvin_binary_info,
+            benchmark_path = benchmark_path,
             **kwargs,
         )
 
@@ -112,6 +134,8 @@
         iterations,
         test_data = None,
         profile = False,
+        kelvin_binary_info = None,
+        benchmark_path = "benchmarks",
         **kwargs):
 
         kelvin_benchmark_asic(
@@ -120,6 +144,8 @@
             iterations = iterations,
             test_data = test_data,
             profile = profile,
+            kelvin_binary_info = kelvin_binary_info,
+            benchmark_path = benchmark_path,
             **kwargs,
         )
 
@@ -129,6 +155,8 @@
             iterations = iterations,
             test_data = test_data,
             profile = profile,
+            kelvin_binary_info = kelvin_binary_info,
+            benchmark_path = benchmark_path,
             **kwargs,
         )
 
@@ -149,6 +177,8 @@
         iterations,
         test_data = None,
         profile = False,
+        kelvin_binary_info = None,
+        benchmark_path = "benchmarks",
         **kwargs):
 
         # Creation of binaries for running on FPGA
@@ -187,7 +217,10 @@
                 "{}-smc_bin.h".format(name),
                 "@kelvin_sw//benchmarks:benchmark.h",
             ],
-            copts = ["-DBENCHMARK_NAME={}".format(name)],
+            copts = [
+                "-DBENCHMARK_NAME={}".format(name),
+                "-DBENCHMARK_PATH={}".format(benchmark_path),
+            ],
             per_device_deps = {
                 device_type: device_deps("secure_core").get(device_type),
             },
@@ -202,43 +235,54 @@
             ],
         )
 
-        kelvin_headers = ["@kelvin_sw//benchmarks:benchmark.h"]
-        model_header_name = "{}_model".format(name)
-        bin_to_c_file(
-            name = "{}_model".format(name),
-            srcs = [model],
-            var_name = "g_benchmark_model_data",
-        )
-        kelvin_headers.append(model_header_name)
-
-        if test_data:
-            test_data_header_name = "{}_test_data".format(name)
-            bin_to_c_file(
-                name = test_data_header_name,
-                srcs = [test_data],
-                var_name = "g_benchmark_test_data",
+        # If provided Kelvin binary info, use that instead of the standard
+        if kelvin_binary_info:
+            kelvin_binary(
+                name = "{}_kelvin".format(name),
+                srcs = kelvin_binary_info['srcs'],
+                copts = kelvin_binary_info['copts'],
+                hdrs = kelvin_binary_info['hdrs'],
+                deps = kelvin_binary_info['deps'],
             )
-            kelvin_headers.append(test_data_header_name)
+        else:
+            kelvin_headers = ["@kelvin_sw//benchmarks:benchmark.h"]
+            model_header_name = "{}_model".format(name)
+            bin_to_c_file(
+                name = "{}_model".format(name),
+                srcs = [model],
+                var_name = "g_benchmark_model_data",
+            )
+            kelvin_headers.append(model_header_name)
 
-        kelvin_binary(
-            name = "{}_kelvin".format(name),
-            srcs = [
-                "@kelvin_sw//benchmarks:benchmark_kelvin.cc",
-            ],
-            copts = [
-                "-DITERATIONS={}".format(iterations),
-                "-DBENCHMARK_NAME={}".format(name),
-                "-DTEST_DATA={}".format(1 if test_data else 0),
-                "-DPROFILE={}".format(1 if profile else 0),
-            ],
-            hdrs = kelvin_headers,
-            deps = [
-                "@kelvin_sw//benchmarks:benchmark_header",
-                "@kelvin_sw//benchmarks:cycle_count",
-                "@tflite-micro//tensorflow/lite/micro:micro_framework",
-                "@tflite-micro//tensorflow/lite/micro:system_setup",
-            ],
-        )
+            if test_data:
+                test_data_header_name = "{}_test_data".format(name)
+                bin_to_c_file(
+                    name = test_data_header_name,
+                    srcs = [test_data],
+                    var_name = "g_benchmark_test_data",
+                )
+                kelvin_headers.append(test_data_header_name)
+
+            kelvin_binary(
+                name = "{}_kelvin".format(name),
+                srcs = [
+                    "@kelvin_sw//benchmarks:benchmark_kelvin.cc",
+                ],
+                copts = [
+                    "-DITERATIONS={}".format(iterations),
+                    "-DBENCHMARK_NAME={}".format(name),
+                    "-DTEST_DATA={}".format(1 if test_data else 0),
+                    "-DPROFILE={}".format(1 if profile else 0),
+                    "-DBENCHMARK_PATH={}".format(benchmark_path),
+                ],
+                hdrs = kelvin_headers,
+                deps = [
+                    "@kelvin_sw//benchmarks:benchmark_header",
+                    "@kelvin_sw//benchmarks:cycle_count",
+                    "@tflite-micro//tensorflow/lite/micro:micro_framework",
+                    "@tflite-micro//tensorflow/lite/micro:system_setup",
+                ],
+            )
 
         matcha_extflash_tar(
             name = "{}_extflash".format(name),