Merge "Add 3 tests to edacloud"
diff --git a/rules/matcha.bzl b/rules/matcha.bzl
index c83860c..9d87d2c 100644
--- a/rules/matcha.bzl
+++ b/rules/matcha.bzl
@@ -48,6 +48,11 @@
     "smc": "//sw/device/lib/arch:smc_fpga_nexus",
 }
 
+ASIC_CORE_TARGETS = {
+    "secure_core": "//sw/device/lib/arch:sc_asic",
+    "smc": "//sw/device/lib/arch:smc_asic",
+}
+
 # This helper function generates a dictionary of per-device dependencies which is used to
 # generate slightly different binaries for each hardware target, including two
 # simulation platforms (DV and Verilator), and one FPGA platform (Nexus),
@@ -57,6 +62,7 @@
         "sim_verilator": [VERILATOR_CORE_TARGETS.get(core)],
         "sim_dv": [DV_CORE_TARGETS.get(core)],
         "fpga_nexus": [NEXUS_CORE_TARGETS.get(core)],
+        "asic": [ASIC_CORE_TARGETS.get(core)],
     }
     return per_device_deps
 
diff --git a/sw/device/lib/arch/BUILD b/sw/device/lib/arch/BUILD
index 373534e..b0bc154 100644
--- a/sw/device/lib/arch/BUILD
+++ b/sw/device/lib/arch/BUILD
@@ -43,3 +43,19 @@
         ":device",
     ],
 )
+
+cc_library(
+    name = "sc_asic",
+    srcs = ["device_sc_asic.c"],
+    deps = [
+        ":device",
+    ],
+)
+
+cc_library(
+    name = "smc_asic",
+    srcs = ["device_smc_asic.c"],
+    deps = [
+        ":device",
+    ],
+)
diff --git a/sw/device/lib/arch/device.h b/sw/device/lib/arch/device.h
index 085f5db..8ba3187 100644
--- a/sw/device/lib/arch/device.h
+++ b/sw/device/lib/arch/device.h
@@ -44,6 +44,10 @@
    * Represents the Nexus FPGA device, for Shodan.
    */
   kDeviceFpgaNexus = 2,
+  /**
+   * Represents the ASIC variant of the design.
+   */
+  kDeviceAsic = 3,
 } device_type_t;
 
 /**
diff --git a/sw/device/lib/arch/device_sc_asic.c b/sw/device/lib/arch/device_sc_asic.c
new file mode 100644
index 0000000..86bfaf7
--- /dev/null
+++ b/sw/device/lib/arch/device_sc_asic.c
@@ -0,0 +1,47 @@
+// Copyright 2023 Google LLC.
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#include <stdbool.h>
+
+#include "sw/device/lib/arch/device.h"
+
+/**
+ * @file
+ * @brief Device-specific symbol definitions for the ASIC device. Copied from
+ * Nexus.
+ */
+
+const device_type_t kDeviceType = kDeviceAsic;
+
+const uint64_t kClockFreqCpuMhz = 10;
+
+const uint64_t kClockFreqCpuHz = kClockFreqCpuMhz * 1000 * 1000;
+
+uint64_t to_cpu_cycles(uint64_t usec) { return usec * kClockFreqCpuMhz; }
+
+const uint64_t kClockFreqPeripheralHz = 25 * 100 * 1000;  // 2.5MHz
+
+const uint64_t kClockFreqUsbHz = 48 * 1000 * 1000;  // 48MHz
+
+const uint64_t kClockFreqAonHz = 250 * 1000;  // 250kHz
+
+const uint64_t kUartBaudrate = 115200;
+
+const uint32_t kUartNCOValue =
+    CALCULATE_UART_NCO(kUartBaudrate, kClockFreqPeripheralHz);
+
+const uint32_t kUartTxFifoCpuCycles =
+    CALCULATE_UART_TX_FIFO_CPU_CYCLES(kUartBaudrate, kClockFreqCpuHz);
+
+const uint32_t kAstCheckPollCpuCycles =
+    CALCULATE_AST_CHECK_POLL_CPU_CYCLES(kClockFreqCpuHz);
+
+const uintptr_t kDeviceTestStatusAddress = 0;
+
+const uintptr_t kDeviceLogBypassUartAddress = 0;
+
+const bool kJitterEnabled = false;
+
+void device_fpga_version_print(void) {}
diff --git a/sw/device/lib/arch/device_smc_asic.c b/sw/device/lib/arch/device_smc_asic.c
new file mode 100644
index 0000000..4642a44
--- /dev/null
+++ b/sw/device/lib/arch/device_smc_asic.c
@@ -0,0 +1,46 @@
+// Copyright 2023 Google LLC.
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#include <assert.h>
+#include <stdbool.h>
+
+#include "sw/device/lib/arch/device.h"
+
+/**
+ * @file
+ * @brief Device-specific symbol definitions for the ASIC SMC device.
+ */
+
+const device_type_t kDeviceType = kDeviceAsic;
+
+// 10 MHz
+const uint64_t kClockFreqCpuMhz = 10;
+
+const uint64_t kClockFreqCpuHz = kClockFreqCpuMhz * 1000 * 1000;
+
+uint64_t to_cpu_cycles(uint64_t usec) { return usec * kClockFreqCpuMhz; }
+
+const uint64_t kClockFreqPeripheralHz = 25 * 100 * 1000;  // 2.5MHz
+
+const uint64_t kClockFreqUsbHz = 48 * 1000 * 1000;  // 48MHz
+
+const uint64_t kClockFreqAonHz = 250 * 1000;  // 250kHz
+
+const uint64_t kUartBaudrate = 115200;
+
+const uint32_t kUartNCOValue =
+    CALCULATE_UART_NCO(kUartBaudrate, kClockFreqPeripheralHz);
+
+const uint32_t kUartTxFifoCpuCycles =
+    CALCULATE_UART_TX_FIFO_CPU_CYCLES(kUartBaudrate, kClockFreqCpuHz);
+
+const uint32_t kAstCheckPollCpuCycles =
+    CALCULATE_AST_CHECK_POLL_CPU_CYCLES(kClockFreqCpuHz);
+
+const uintptr_t kDeviceTestStatusAddress = 0x0;
+
+const uintptr_t kDeviceLogBypassUartAddress = 0;
+
+const bool kJitterEnabled = false;