[sw,tests] Test the wake from sleep using the ADC ctrl for debug cable wakeup

For test: chip_sw_adc_ctrl_sleep_debug_cable_wakeup.

Configures the ADC_CTRL and filters then enters deep sleep. Checks that generated stimulus within the
filters' configured ranges provides a wakeup signal and the system reboots. After reboot checks the
wakeup reason and the triggered values in the ADC_CTRL.

Signed-off-by: Dave Williams <dave.williams@ensilica.com>
diff --git a/hw/top_earlgrey/data/chip_testplan.hjson b/hw/top_earlgrey/data/chip_testplan.hjson
index 22240df..546a777 100644
--- a/hw/top_earlgrey/data/chip_testplan.hjson
+++ b/hw/top_earlgrey/data/chip_testplan.hjson
@@ -1548,7 +1548,7 @@
             - Repeat for both ADC channels.
             '''
       milestone: V2
-      tests: []
+      tests: ["chip_sw_adc_ctrl_sleep_debug_cable_wakeup"]
     }
 
     ///////////////////////////////////////////////////////
diff --git a/hw/top_earlgrey/dv/chip_sim_cfg.hjson b/hw/top_earlgrey/dv/chip_sim_cfg.hjson
index ef009b1..26ee36d 100644
--- a/hw/top_earlgrey/dv/chip_sim_cfg.hjson
+++ b/hw/top_earlgrey/dv/chip_sim_cfg.hjson
@@ -495,6 +495,13 @@
       run_opts: ["+sw_test_timeout_ns=18000000"]
     }
     {
+      name: chip_sw_adc_ctrl_sleep_debug_cable_wakeup
+      uvm_test_seq: chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq
+      sw_images: ["sw/device/tests/adc_ctrl_sleep_debug_cable_wakeup_test:1"]
+      en_run_modes: ["sw_test_mode_test_rom"]
+      run_opts: ["+sw_test_timeout_ns=18000000"]
+    }
+    {
       name: chip_sw_otbn_randomness
       uvm_test_seq: chip_sw_base_vseq
       sw_images: ["sw/device/tests/otbn_randomness_test:1"]
diff --git a/hw/top_earlgrey/dv/env/chip_env.core b/hw/top_earlgrey/dv/env/chip_env.core
index f1ee576..1709d5a 100644
--- a/hw/top_earlgrey/dv/env/chip_env.core
+++ b/hw/top_earlgrey/dv/env/chip_env.core
@@ -59,6 +59,7 @@
       - seq_lib/chip_sw_ast_clk_outputs_vseq.sv: {is_include_file: true}
       - seq_lib/chip_sw_sensor_ctrl_status_intr_vseq.sv: {is_include_file: true}
       - seq_lib/chip_sw_pwrmgr_deep_sleep_all_wake_ups_vseq.sv: {is_include_file: true}
+      - seq_lib/chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq.sv: {is_include_file: true}
       - seq_lib/chip_callback_vseq.sv: {is_include_file: true}
       - autogen/chip_env_pkg__params.sv: {is_include_file: true}
       - ast_supply_if.sv
diff --git a/hw/top_earlgrey/dv/env/seq_lib/chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq.sv b/hw/top_earlgrey/dv/env/seq_lib/chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq.sv
new file mode 100644
index 0000000..29cc2a1
--- /dev/null
+++ b/hw/top_earlgrey/dv/env/seq_lib/chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq.sv
@@ -0,0 +1,198 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+class chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq extends chip_sw_base_vseq;
+  `uvm_object_utils(chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq)
+
+  `uvm_object_new
+
+  localparam string ADC_CHANNEL0_HDL_PATH = "tb.dut.u_ast.u_adc.u_adc_ana.adc_d_ch0_o";
+  localparam string ADC_CHANNEL1_HDL_PATH = "tb.dut.u_ast.u_adc.u_adc_ana.adc_d_ch1_o";
+  localparam string ADC_DATA_VALID = "tb.dut.u_ast.u_adc.adc_d_val_o";
+  localparam string ADC_POWERDOWN = "tb.dut.u_ast.u_adc.adc_pd_i";
+  localparam string ADC_CTRL_WAKEUP_REQ = "tb.dut.top_earlgrey.u_pwrmgr_aon.wakeups_i[1]";
+
+  localparam uint NUM_LOW_POWER_SAMPLES = 8;
+  localparam uint NUM_NORMAL_POWER_SAMPLES = 8;
+  localparam uint WAKE_UP_TIME_AON_CYCLES = 16;
+  localparam uint CHANNEL0_MIN = 128;
+  localparam uint CHANNEL0_MAX = CHANNEL0_MIN + 127;
+  localparam uint CHANNEL1_MIN = 512;
+  localparam uint CHANNEL1_MAX = CHANNEL1_MIN + 127;
+
+  localparam bit IN_RANGE = 1;
+  localparam bit NOT_IN_RANGE = 0;
+
+  event adc_valid_falling_edge_event;
+  bit   powerdown_count_enabled;
+  int   powerdown_count;
+
+  virtual task check_hdl_paths();
+    int retval;
+    retval = uvm_hdl_check_path(ADC_CHANNEL0_HDL_PATH);
+    `DV_CHECK_EQ_FATAL(retval, 1, $sformatf(
+                       "Hierarchical path %0s appears to be invalid.", ADC_CHANNEL0_HDL_PATH))
+    retval = uvm_hdl_check_path(ADC_CHANNEL1_HDL_PATH);
+    `DV_CHECK_EQ_FATAL(retval, 1, $sformatf(
+                       "Hierarchical path %0s appears to be invalid.", ADC_CHANNEL1_HDL_PATH))
+    retval = uvm_hdl_check_path(ADC_DATA_VALID);
+    `DV_CHECK_EQ_FATAL(retval, 1, $sformatf(
+                       "Hierarchical path %0s appears to be invalid.", ADC_DATA_VALID))
+    retval = uvm_hdl_check_path(ADC_POWERDOWN);
+    `DV_CHECK_EQ_FATAL(retval, 1, $sformatf(
+                       "Hierarchical path %0s appears to be invalid.", ADC_POWERDOWN))
+    retval = uvm_hdl_check_path(ADC_CTRL_WAKEUP_REQ);
+    `DV_CHECK_EQ_FATAL(retval, 1, $sformatf(
+                       "Hierarchical path %0s appears to be invalid.", ADC_CTRL_WAKEUP_REQ))
+  endtask
+
+  virtual task symbol_byte_write(string str, bit [7:0] data);
+    bit [7:0] array_data[1] = {data};
+    sw_symbol_backdoor_overwrite(str, array_data);
+  endtask
+
+  virtual task cpu_init();
+    // sw_symbol_backdoor_overwrite takes an array as the input.
+    super.cpu_init();
+    symbol_byte_write("kNumLowPowerSamples", NUM_LOW_POWER_SAMPLES);
+    symbol_byte_write("kNumNormalPowerSamples", NUM_NORMAL_POWER_SAMPLES);
+    symbol_byte_write("kWakeUpTimeAonCycles", WAKE_UP_TIME_AON_CYCLES);
+    symbol_byte_write("kChannel0MaxLowByte", CHANNEL0_MAX[7:0]);
+    symbol_byte_write("kChannel0MaxHighByte", CHANNEL0_MAX[15:8]);
+    symbol_byte_write("kChannel0MinLowByte", CHANNEL0_MIN[7:0]);
+    symbol_byte_write("kChannel0MinHighByte", CHANNEL0_MIN[15:8]);
+    symbol_byte_write("kChannel1MaxLowByte", CHANNEL1_MAX[7:0]);
+    symbol_byte_write("kChannel1MaxHighByte", CHANNEL1_MAX[15:8]);
+    symbol_byte_write("kChannel1MinLowByte", CHANNEL1_MIN[7:0]);
+    symbol_byte_write("kChannel1MinHighByte", CHANNEL1_MIN[15:8]);
+  endtask
+
+  virtual task wait_for_adc_valid_falling_edge();
+    int retval;
+    bit adc_data_valid;
+    bit adc_data_valid_last_value;
+    forever begin
+      adc_data_valid_last_value = adc_data_valid;
+      retval = uvm_hdl_read(ADC_DATA_VALID, adc_data_valid);
+      `DV_CHECK_EQ(retval, 1, $sformatf("uvm_hdl_read failed for %0s", ADC_DATA_VALID))
+      if (adc_data_valid_last_value == 1 && adc_data_valid == 0) begin
+        ->adc_valid_falling_edge_event;
+      end
+      cfg.clk_rst_vif.wait_clks(1);
+    end
+  endtask
+
+  virtual task detect_powerdown_rising_edge();
+    int retval;
+    bit powerdown_value;
+    bit powerdown_last_value;
+    forever begin
+      powerdown_last_value = powerdown_value;
+      retval = uvm_hdl_read(ADC_POWERDOWN, powerdown_value);
+      `DV_CHECK_EQ(retval, 1, $sformatf("uvm_hdl_read failed for %0s", ADC_POWERDOWN))
+      if (powerdown_value == 1 && powerdown_last_value == 0) begin
+        if (powerdown_count_enabled == 1) begin
+          powerdown_count++;
+        end
+      end
+      cfg.clk_rst_vif.wait_clks(1);
+    end
+  endtask
+
+  virtual task force_adc_channels(input bit channel0_in_range, input bit channel1_in_range);
+    bit [9:0] channel0_data;
+    bit [9:0] channel1_data;
+    if (channel0_in_range == 1) begin
+      `DV_CHECK(std::randomize(channel0_data) with {
+                channel0_data inside {[CHANNEL0_MIN : CHANNEL0_MAX]};});
+    end else begin
+      `DV_CHECK(std::randomize(channel0_data) with {
+                !{channel0_data inside {[CHANNEL0_MIN : CHANNEL0_MAX]}};});
+    end
+    `DV_CHECK(uvm_hdl_force(ADC_CHANNEL0_HDL_PATH, channel0_data));
+    if (channel1_in_range == 1) begin
+      `DV_CHECK(std::randomize(channel1_data) with {
+                channel1_data inside {[CHANNEL1_MIN : CHANNEL1_MAX]};});
+    end else begin
+      `DV_CHECK(std::randomize(channel1_data) with {
+                !{channel1_data inside {[CHANNEL1_MIN : CHANNEL1_MAX]}};});
+    end
+    `DV_CHECK(uvm_hdl_force(ADC_CHANNEL1_HDL_PATH, channel1_data));
+  endtask
+
+  virtual task generate_adc_data();
+    bit wakeup;
+    int bad_sample;
+
+    // Data with a channel 0 glitch.
+    bad_sample = $urandom_range(0, NUM_LOW_POWER_SAMPLES - 1);
+    for (int i = 0; i < NUM_LOW_POWER_SAMPLES; i++) begin
+      if (i == bad_sample) begin
+        force_adc_channels(NOT_IN_RANGE, IN_RANGE);
+      end else begin
+        force_adc_channels(IN_RANGE, IN_RANGE);
+      end
+      repeat (2) @(adc_valid_falling_edge_event);
+    end
+
+    // Both channels glitched.
+    force_adc_channels(NOT_IN_RANGE, NOT_IN_RANGE);
+    repeat (2) @(adc_valid_falling_edge_event);
+
+    // Data with a channel 1 glitch.
+    bad_sample = $urandom_range(0, NUM_LOW_POWER_SAMPLES - 1);
+    for (int i = 0; i < NUM_LOW_POWER_SAMPLES; i++) begin
+      if (i == bad_sample) begin
+        force_adc_channels(IN_RANGE, NOT_IN_RANGE);
+      end else begin
+        force_adc_channels(IN_RANGE, IN_RANGE);
+      end
+      repeat (2) @(adc_valid_falling_edge_event);
+    end
+
+    // Both channels glitched.
+    force_adc_channels(NOT_IN_RANGE, NOT_IN_RANGE);
+    repeat (NUM_NORMAL_POWER_SAMPLES * 2) @(adc_valid_falling_edge_event);
+
+    // Check that there is no unexpected wakeup and that there
+    // has been a number of powerdown signals following the glitched data.
+    `DV_CHECK(uvm_hdl_read(ADC_CTRL_WAKEUP_REQ, wakeup));
+    `DV_CHECK_EQ_FATAL(wakeup, 0, "Unexpected wakeup.")
+    `DV_CHECK(powerdown_count >= NUM_LOW_POWER_SAMPLES * 3);
+
+    // Data with both channels in range which will trigger a wakeup.
+    for (int i = 0; i < NUM_LOW_POWER_SAMPLES; i++) begin
+      force_adc_channels(IN_RANGE, IN_RANGE);
+      repeat (2) @(adc_valid_falling_edge_event);
+    end
+    for (int i = 0; i < NUM_NORMAL_POWER_SAMPLES; i++) begin
+      force_adc_channels(IN_RANGE, IN_RANGE);
+      repeat (2) @(adc_valid_falling_edge_event);
+    end
+  endtask
+
+  virtual task body();
+    check_hdl_paths();
+    super.body();
+
+    // Wait for test to enter WFI before generating ADC data which will
+    // cause a wakeup event.
+    wait(cfg.sw_test_status_vif.sw_test_status == SwTestStatusInTest);
+    wait(cfg.sw_test_status_vif.sw_test_status == SwTestStatusInWfi);
+
+    // Fork tasks for detecting edges.
+    powerdown_count = 0;
+    powerdown_count_enabled = 1;
+    fork
+      wait_for_adc_valid_falling_edge();
+      detect_powerdown_rising_edge();
+    join_none
+
+    // Generate a sequence of ADC data.
+    generate_adc_data();
+
+    disable fork;
+  endtask
+
+endclass
diff --git a/hw/top_earlgrey/dv/env/seq_lib/chip_vseq_list.sv b/hw/top_earlgrey/dv/env/seq_lib/chip_vseq_list.sv
index 15b3a92..6de71fa 100644
--- a/hw/top_earlgrey/dv/env/seq_lib/chip_vseq_list.sv
+++ b/hw/top_earlgrey/dv/env/seq_lib/chip_vseq_list.sv
@@ -28,3 +28,4 @@
 `include "chip_sw_ast_clk_outputs_vseq.sv"
 `include "chip_sw_sensor_ctrl_status_intr_vseq.sv"
 `include "chip_sw_pwrmgr_deep_sleep_all_wake_ups_vseq.sv"
+`include "chip_sw_adc_ctrl_sleep_debug_cable_wakeup_vseq.sv"
diff --git a/sw/device/tests/sim_dv/BUILD b/sw/device/tests/sim_dv/BUILD
index 6a1ed1e..407312e 100644
--- a/sw/device/tests/sim_dv/BUILD
+++ b/sw/device/tests/sim_dv/BUILD
@@ -293,3 +293,21 @@
         "//sw/device/lib/testing/test_framework:ottf_main",
     ],
 )
+
+opentitan_functest(
+    name = "adc_ctrl_sleep_debug_cable_wakeup_test",
+    srcs = ["adc_ctrl_sleep_debug_cable_wakeup_test.c"],
+    targets = ["dv"],
+    deps = [
+        "//hw/top_earlgrey/sw/autogen:top_earlgrey",
+        "//sw/device/lib/base:mmio",
+        "//sw/device/lib/dif:adc_ctrl",
+        "//sw/device/lib/dif:pwrmgr",
+        "//sw/device/lib/dif:rstmgr",
+        "//sw/device/lib/runtime:log",
+        "//sw/device/lib/testing:pwrmgr_testutils",
+        "//sw/device/lib/testing:rstmgr_testutils",
+        "//sw/device/lib/testing/test_framework:check",
+        "//sw/device/lib/testing/test_framework:ottf_main",
+    ],
+)
diff --git a/sw/device/tests/sim_dv/adc_ctrl_sleep_debug_cable_wakeup_test.c b/sw/device/tests/sim_dv/adc_ctrl_sleep_debug_cable_wakeup_test.c
new file mode 100644
index 0000000..dd040e9
--- /dev/null
+++ b/sw/device/tests/sim_dv/adc_ctrl_sleep_debug_cable_wakeup_test.c
@@ -0,0 +1,142 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#include "sw/device/lib/base/mmio.h"
+#include "sw/device/lib/dif/dif_adc_ctrl.h"
+#include "sw/device/lib/dif/dif_pwrmgr.h"
+#include "sw/device/lib/dif/dif_rstmgr.h"
+#include "sw/device/lib/runtime/log.h"
+#include "sw/device/lib/testing/pwrmgr_testutils.h"
+#include "sw/device/lib/testing/rstmgr_testutils.h"
+#include "sw/device/lib/testing/test_framework/check.h"
+#include "sw/device/lib/testing/test_framework/ottf_main.h"
+
+#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
+
+const test_config_t kTestConfig;
+
+enum {
+  kPowerUpTimeAonCycles = 2,
+};
+
+// These constants will be setup from the testbench
+// using sw_symbol_backdoor_overwrite.
+
+static volatile const uint8_t kNumLowPowerSamples;
+static volatile const uint8_t kNumNormalPowerSamples;
+static volatile const uint8_t kWakeUpTimeAonCycles;
+
+static volatile const uint8_t kChannel0MaxLowByte;
+static volatile const uint8_t kChannel0MaxHighByte;
+static volatile const uint8_t kChannel0MinLowByte;
+static volatile const uint8_t kChannel0MinHighByte;
+
+static volatile const uint8_t kChannel1MaxLowByte;
+static volatile const uint8_t kChannel1MaxHighByte;
+static volatile const uint8_t kChannel1MinLowByte;
+static volatile const uint8_t kChannel1MinHighByte;
+
+static void configure_adc_ctrl(const dif_adc_ctrl_t *adc_ctrl) {
+  CHECK_DIF_OK(dif_adc_ctrl_set_enabled(adc_ctrl, kDifToggleDisabled));
+  CHECK_DIF_OK(dif_adc_ctrl_reset(adc_ctrl));
+  CHECK_DIF_OK(dif_adc_ctrl_configure(
+      adc_ctrl, (dif_adc_ctrl_config_t){
+                    .mode = kDifAdcCtrlLowPowerScanMode,
+                    .num_low_power_samples = kNumLowPowerSamples,
+                    .num_normal_power_samples = kNumNormalPowerSamples,
+                    .power_up_time_aon_cycles = kPowerUpTimeAonCycles,
+                    .wake_up_time_aon_cycles = kWakeUpTimeAonCycles}));
+}
+
+bool test_main(void) {
+  dif_adc_ctrl_t adc_ctrl;
+  dif_pwrmgr_t pwrmgr;
+  dif_rstmgr_t rstmgr;
+
+  CHECK_DIF_OK(dif_adc_ctrl_init(
+      mmio_region_from_addr(TOP_EARLGREY_ADC_CTRL_AON_BASE_ADDR), &adc_ctrl));
+  CHECK_DIF_OK(dif_pwrmgr_init(
+      mmio_region_from_addr(TOP_EARLGREY_PWRMGR_AON_BASE_ADDR), &pwrmgr));
+  CHECK_DIF_OK(dif_rstmgr_init(
+      mmio_region_from_addr(TOP_EARLGREY_RSTMGR_AON_BASE_ADDR), &rstmgr));
+
+  uint16_t channel0_filter0_max =
+      (kChannel0MaxHighByte << 8) | kChannel0MaxLowByte;
+  uint16_t channel0_filter0_min =
+      (kChannel0MinHighByte << 8) | kChannel0MinLowByte;
+  uint16_t channel1_filter0_max =
+      (kChannel1MaxHighByte << 8) | kChannel1MaxLowByte;
+  uint16_t channel1_filter0_min =
+      (kChannel1MinHighByte << 8) | kChannel1MinLowByte;
+
+  // Assuming the chip hasn't slept yet, wakeup reason should be empty.
+  if (pwrmgr_testutils_is_wakeup_reason(&pwrmgr, 0)) {
+    LOG_INFO("POR reset.");
+
+    CHECK(rstmgr_testutils_is_reset_info(&rstmgr, kDifRstmgrResetInfoPor));
+
+    // Setup ADC configuration.
+    configure_adc_ctrl(&adc_ctrl);
+
+    // Setup ADC filters. There is one filter for each channel.
+    CHECK_DIF_OK(dif_adc_ctrl_configure_filter(
+        &adc_ctrl, kDifAdcCtrlChannel0,
+        (dif_adc_ctrl_filter_config_t){.filter = kDifAdcCtrlFilter0,
+                                       .generate_irq_on_match = false,
+                                       .generate_wakeup_on_match = true,
+                                       .in_range = true,
+                                       .max_voltage = channel0_filter0_max,
+                                       .min_voltage = channel0_filter0_min},
+        kDifToggleDisabled));
+    CHECK_DIF_OK(dif_adc_ctrl_configure_filter(
+        &adc_ctrl, kDifAdcCtrlChannel1,
+        (dif_adc_ctrl_filter_config_t){.filter = kDifAdcCtrlFilter0,
+                                       .generate_irq_on_match = false,
+                                       .generate_wakeup_on_match = true,
+                                       .in_range = true,
+                                       .max_voltage = channel1_filter0_max,
+                                       .min_voltage = channel1_filter0_min},
+        kDifToggleDisabled));
+
+    // enable filters.
+    CHECK_DIF_OK(dif_adc_ctrl_filter_set_enabled(
+        &adc_ctrl, kDifAdcCtrlChannel0, kDifAdcCtrlFilter0, kDifToggleEnabled));
+    CHECK_DIF_OK(dif_adc_ctrl_filter_set_enabled(
+        &adc_ctrl, kDifAdcCtrlChannel1, kDifAdcCtrlFilter0, kDifToggleEnabled));
+
+    CHECK_DIF_OK(dif_adc_ctrl_set_enabled(&adc_ctrl, kDifToggleEnabled));
+
+    // Setup low power.
+    rstmgr_testutils_pre_reset(&rstmgr);
+    pwrmgr_testutils_enable_low_power(&pwrmgr, kDifPwrmgrWakeupRequestSourceTwo,
+                                      0);
+    // Enter low power mode.
+    LOG_INFO("Issued WFI to enter sleep.");
+    test_status_set(kTestStatusInWfi);
+    wait_for_interrupt();
+  } else if (pwrmgr_testutils_is_wakeup_reason(
+                 &pwrmgr, kDifPwrmgrWakeupRequestSourceTwo)) {
+    LOG_INFO("Wakeup reset.");
+    CHECK(rstmgr_testutils_is_reset_info(&rstmgr,
+                                         kDifRstmgrResetInfoLowPowerExit));
+    uint16_t adc_value;
+    CHECK_DIF_OK(dif_adc_ctrl_get_triggered_value(
+        &adc_ctrl, kDifAdcCtrlChannel0, &adc_value));
+    CHECK(channel0_filter0_min <= adc_value &&
+          adc_value <= channel0_filter0_max);
+
+    CHECK_DIF_OK(dif_adc_ctrl_get_triggered_value(
+        &adc_ctrl, kDifAdcCtrlChannel1, &adc_value));
+    CHECK(channel1_filter0_min <= adc_value &&
+          adc_value <= channel1_filter0_max);
+
+  } else {
+    dif_pwrmgr_wakeup_reason_t wakeup_reason;
+    CHECK_DIF_OK(dif_pwrmgr_wakeup_reason_get(&pwrmgr, &wakeup_reason));
+    LOG_ERROR("Unexpected wakeup detected: type = %d, request_source = %d",
+              wakeup_reason.types, wakeup_reason.request_sources);
+    return false;
+  }
+  return true;
+}
diff --git a/sw/device/tests/sim_dv/meson.build b/sw/device/tests/sim_dv/meson.build
index 231146d..a1cc74f 100644
--- a/sw/device/tests/sim_dv/meson.build
+++ b/sw/device/tests/sim_dv/meson.build
@@ -385,3 +385,25 @@
     'library': sram_ctrl_main_scrambled_access_test_lib,
   }
 }
+
+adc_ctrl_sleep_debug_cable_wakeup_test_lib = declare_dependency(
+  link_with: static_library(
+    'adc_ctrl_sleep_debug_cable_wakeup_test_lib',
+    sources: ['adc_ctrl_sleep_debug_cable_wakeup_test.c'],
+    dependencies: [
+      sw_lib_dif_adc_ctrl,
+      sw_lib_dif_pwrmgr,
+      sw_lib_dif_rstmgr,
+      sw_lib_mmio,
+      sw_lib_runtime_log,
+      sw_lib_testing_pwrmgr_testutils,
+      sw_lib_testing_rstmgr_testutils,
+      top_earlgrey,
+    ],
+  ),
+)
+sw_tests += {
+  'adc_ctrl_sleep_debug_cable_wakeup_test': {
+    'library': adc_ctrl_sleep_debug_cable_wakeup_test_lib,
+  }
+}