blob: 3a269e1bf12db8db3f047f7a2c5b988d9ee2fe88 [file] [log] [blame]
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Rules to run Kelvin benchmarks"""
load("@kelvin_sw//build_tools/bazel:kelvin.bzl","kelvin_binary", "kelvin_test", "generate_cc_arrays")
load("@matcha//rules:matcha.bzl", "bin_to_c_file", "matcha_extflash_tar", "sec_flash_binary", "smc_flash_binary", "device_deps")
def kelvin_benchmark_simulator(
name,
model,
iterations,
hw_test_size = "medium",
hw_test_tags = [],
iss_test_size = "small",
iss_test_tags = [],
**kwargs):
bin_to_c_file(
name = "{}_model".format(name),
srcs = [model],
var_name = "g_benchmark_model_data",
)
# Test to run in simulator and MPACT.
kelvin_test(
name = "{}".format(name),
srcs = ["@kelvin_sw//benchmarks:benchmark_kelvin.cc"],
hdrs = ["@kelvin_sw//benchmarks:benchmark.h", "{}_model.h".format(name)],
copts = ["-DITERATIONS={}".format(iterations), "-DBENCHMARK_NAME={}".format(name)],
deps = [
"@kelvin_sw//crt",
"@kelvin_sw//benchmarks:benchmark_header",
"@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,
model,
iterations,
**kwargs):
_kelvin_benchmark_device(
name = name,
model = model,
device_type = "fpga_nexus",
iterations = iterations,
**kwargs,
)
def kelvin_benchmark_asic(
name,
model,
iterations,
**kwargs):
_kelvin_benchmark_device(
name = name,
model = model,
device_type = "asic",
iterations = iterations,
**kwargs,
)
def kelvin_benchmark_devices(
name,
model,
iterations,
**kwargs):
kelvin_benchmark_asic(
name = "{}_asic".format(name),
model = model,
iterations = iterations,
**kwargs,
)
kelvin_benchmark_fpga(
name = "{}_fpga".format(name),
model = model,
iterations = iterations,
**kwargs,
)
# Create a filegroup to allow building all devices
native.filegroup(
name = "{}".format(name),
srcs = [
":{}_asic".format(name),
":{}_fpga".format(name),
],
output_group = "device_files",
)
def _kelvin_benchmark_device(
name,
model,
device_type,
iterations,
**kwargs):
bin_to_c_file(
name = "{}_model".format(name),
srcs = [model],
var_name = "g_benchmark_model_data",
)
# Creation of binaries for running on FPGA
smc_flash_binary(
name = "{}_smc".format(name),
srcs = [
"@kelvin_sw//benchmarks:benchmark_smc.c",
"@kelvin_sw//benchmarks:benchmark.h",
],
copts = ["-DBENCHMARK_NAME={}".format(name)],
per_device_deps = {
device_type: device_deps("smc").get(device_type),
},
deps = [
"@matcha//sw/device/lib/dif:ml_top",
"@matcha//sw/device/tests:test_lib_smc",
"@matcha//sw/device/lib/dif:i2s",
"@matcha//sw/device/lib/dif:tlul_mailbox",
"@kelvin_sw//benchmarks:benchmark_header",
"@lowrisc_opentitan//sw/device/lib/dif:rv_plic",
],
)
bin_to_c_file(
name = "{}-smc_bin".format(name),
srcs = ["{}_smc_{}_bin".format(name, device_type)],
var_name = "smc_bin",
)
sec_flash_binary(
name = "{}_sec".format(name),
srcs = [
"@kelvin_sw//benchmarks:benchmark_sec.c",
"{}-smc_bin.h".format(name),
"@kelvin_sw//benchmarks:benchmark.h",
],
copts = ["-DBENCHMARK_NAME={}".format(name)],
per_device_deps = {
device_type: device_deps("secure_core").get(device_type),
},
deps = [
"@matcha//sw/device/lib:spi_flash",
"@matcha//sw/device/tests:test_lib",
"@matcha//sw/device/lib/dif:smc_ctrl",
"@matcha//sw/device/lib/dif:tlul_mailbox",
"@kelvin_sw//benchmarks:benchmark_header",
"@lowrisc_opentitan//sw/device/lib/dif:rv_plic",
],
)
kelvin_binary(
name = "{}_kelvin".format(name),
srcs = [
"@kelvin_sw//benchmarks:benchmark_kelvin.cc",
],
copts = ["-DITERATIONS={}".format(iterations), "-DBENCHMARK_NAME={}".format(name)],
hdrs = [
"@kelvin_sw//benchmarks:benchmark.h",
"{}_model.h".format(name),
],
deps = [
"@kelvin_sw//benchmarks:benchmark_header",
"@tflite-micro//tensorflow/lite/micro:micro_framework",
"@tflite-micro//tensorflow/lite/micro:system_setup",
],
)
matcha_extflash_tar(
name = "{}_extflash".format(name),
kelvin_binary = ":{}_kelvin.bin".format(name),
sc_binary = ":{}_sec_{}_bin".format(name, device_type),
)
# Create a filegroup with all device targets.
native.filegroup(
name = "{}".format(name),
srcs = [
":{}_sec".format(name),
":{}-smc_bin".format(name),
":{}_kelvin".format(name),
":{}_extflash".format(name),
],
output_group = "{}_files".format(device_type),
)