feat: add RTC wake functionality and related integration

- Introduced  signal in sysctrl interface and module to handle RTC wake events.
- Added RTC wake status register in memory map and updated related tests.
- Integrated RTC wake handling in the APB wrapper and core wrapper.
- Enhanced clock and reset domain configurations to include RTC signals.
- Updated software build configurations to include RTC source files and headers.
- Modified formal verification and testbench files to accommodate RTC wake functionality.
- Ensured proper synchronization and status recording for RTC wake events in the sysctrl module.
This commit is contained in:
maksyuki committed 2026-08-10 09:32:30 +08:00
1 parent 34624a913a
commit c9a3d7934c
38 files changed
+663 -361

No files matched your search

+8 -2
View File
@@ -43,6 +43,7 @@ HAVE_SVA ?= NO
BUILD_RELEASE ?= NO
JTAG_IDCODE ?= DEADBEEF
EXT_CLK_HZ ?= 72000000
AUD_CLK_HZ ?= 18432000
CLINT_TIMEBASE_HZ ?= 1000000
WAVE ?= NO
FORMAL ?= NO
@@ -83,7 +84,7 @@ JOBS ?= $(shell count=$$(nproc 2>/dev/null || printf '1'); \
if [ "$$count" -gt "$(MAX_JOBS)" ]; then printf '%s' '$(MAX_JOBS)'; \
else printf '%s' "$$count"; fi)
CONFIG_KEY_VARS := SOC PDK HAVE_PLL HAVE_SRAM_IF HAVE_SRAM_MACRO PDK_BEHAV HAVE_SVA \
BUILD_RELEASE JTAG_IDCODE EXT_CLK_HZ CLINT_TIMEBASE_HZ ISA HAVE_CSR APP LINK_TYPE \
BUILD_RELEASE JTAG_IDCODE EXT_CLK_HZ AUD_CLK_HZ CLINT_TIMEBASE_HZ ISA HAVE_CSR APP LINK_TYPE \
COREMARK_MODE RTL_TOP FIRMWARE_NAME
VARIANT_ID := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/config_key.py \
--lock $(LOCK_FILE) --profile $(PROFILE_NAME) --timestamp $(BUILD_TIMESTAMP) \
@@ -155,6 +156,10 @@ EXT_CLK_HZ_VALID := $(shell printf '%s' '$(EXT_CLK_HZ)' | grep -E '^[1-9][[:digi
ifneq ($(EXT_CLK_HZ_VALID),$(EXT_CLK_HZ))
$(error EXT_CLK_HZ='$(EXT_CLK_HZ)' must be a positive integer)
endif
AUD_CLK_HZ_VALID := $(shell printf '%s' '$(AUD_CLK_HZ)' | grep -E '^[1-9][[:digit:]]*$$')
ifneq ($(AUD_CLK_HZ_VALID),$(AUD_CLK_HZ))
$(error AUD_CLK_HZ='$(AUD_CLK_HZ)' must be a positive integer)
endif
CLINT_TIMEBASE_HZ_VALID := $(shell printf '%s' '$(CLINT_TIMEBASE_HZ)' | grep -E '^[1-9][[:digit:]]*$$')
ifneq ($(CLINT_TIMEBASE_HZ_VALID),$(CLINT_TIMEBASE_HZ))
$(error CLINT_TIMEBASE_HZ='$(CLINT_TIMEBASE_HZ)' must be a positive integer)
@@ -199,6 +204,7 @@ DEF_LIST ?= +define+PDK_$(PDK)
DEF_LIST += +define+SIMU_$(SIMU)
DEF_LIST += +define+SOC_JTAG_IDCODE=$(JTAG_IDCODE_DEC)
DEF_LIST += +define+SOC_EXT_CLK_HZ=$(EXT_CLK_HZ)
DEF_LIST += +define+SOC_AUD_CLK_HZ=$(AUD_CLK_HZ)
DEF_LIST += +define+SOC_CLINT_TIMEBASE_HZ=$(CLINT_TIMEBASE_HZ)
ifeq ($(HAVE_PLL), YES)
@@ -317,7 +323,7 @@ config:
HAVE_PLL '$(HAVE_PLL)' HAVE_SRAM_IF '$(HAVE_SRAM_IF)' \
HAVE_SRAM_MACRO '$(HAVE_SRAM_MACRO)' PDK_BEHAV '$(PDK_BEHAV)' HAVE_SVA '$(HAVE_SVA)' \
BUILD_RELEASE '$(BUILD_RELEASE)' \
JTAG_IDCODE '$(JTAG_IDCODE)' EXT_CLK_HZ '$(EXT_CLK_HZ)' \
JTAG_IDCODE '$(JTAG_IDCODE)' EXT_CLK_HZ '$(EXT_CLK_HZ)' AUD_CLK_HZ '$(AUD_CLK_HZ)' \
CLINT_TIMEBASE_HZ '$(CLINT_TIMEBASE_HZ)' \
ISA '$(ISA)' HAVE_CSR '$(HAVE_CSR)' APP '$(APP)' \
LINK_TYPE '$(LINK_TYPE)' COREMARK_MODE '$(COREMARK_MODE)'
+2 -1
View File
@@ -3,6 +3,7 @@
#include <retrosoc/hal/clint.h>
#include <retrosoc/hal/gpio.h>
#include <retrosoc/hal/rng.h>
#include <retrosoc/hal/rtc.h>
#include <retrosoc/hal/timer.h>
#include <retrosoc/hal/uart.h>
#include <retrosoc/lib/printf.h>
@@ -13,7 +14,7 @@ static bool rs_ci_smoke_archinfo_v2(void) {
uint32_t device_id[4];
return (rs_archinfo_read(&info) == RS_OK) && (rs_archinfo_validate_build(&info) == RS_OK) &&
(rs_archinfo_read_device_id(device_id) == RS_ENOTSUP);
(rs_archinfo_read_device_id(device_id) == RS_ENOTSUP) && (rs_rtc_probe() == RS_OK);
}
static bool rs_ci_smoke_rng_v2(void) {
+1 -1
View File
@@ -60,7 +60,7 @@ int main(void) {
(void)rs_shell_register("tim", "timer test", true, rs_timer_shell_test);
(void)rs_shell_register("gpio", "gpio test", true, rs_gpio_shell_test);
(void)rs_shell_register("pwm", "pwm test", true, ip_pwm_test);
(void)rs_shell_register("rtc", "rtc test", true, ip_rtc_test);
(void)rs_shell_register("rtc", "rtc test", true, rs_rtc_shell_test);
(void)rs_shell_register("wdg", "wdg test", true, ip_wdg_test);
(void)rs_shell_register("rng", "rng test", true, rs_rng_shell_test);
(void)rs_shell_register("crc", "crc test", true, ip_crc_test);
+2 -2
View File
@@ -62,7 +62,7 @@
},
"cluster_archinfo": {"url": "https://github.com/retroSoC/archinfo.git", "revision": "78505969a0afdbc887cdd9b36eda228b4afb616e", "destination": "rtl/managed/clusterip/archinfo", "license": "MulanPSL-2.0"},
"cluster_clint": {"url": "https://github.com/retroSoC/clint.git", "revision": "ce49f1a5501c0a9f18c0e3f358417648f3f2fb18", "destination": "rtl/managed/clusterip/clint", "license": "NOASSERTION"},
"cluster_common": {"url": "https://github.com/retroSoC/common.git", "revision": "16ee9a5cfdc1248f35f0993710e3cb89464c19d9", "destination": "rtl/managed/clusterip/common", "license": "NOASSERTION"},
"cluster_common": {"url": "https://github.com/retroSoC/common.git", "revision": "6c318bf06570a2d195afb1708853ee921a058e5c", "destination": "rtl/managed/clusterip/common", "license": "NOASSERTION"},
"cluster_crc": {"url": "https://github.com/retroSoC/crc.git", "revision": "4654a63d06d487b5b9fe22af228c36c736b90bad", "destination": "rtl/managed/clusterip/crc", "license": "NOASSERTION"},
"cluster_i2c": {"url": "https://github.com/retroSoC/i2c.git", "revision": "73b024547c5cd70fb8bf801cc7757db2536c604f", "destination": "rtl/managed/clusterip/i2c", "license": "NOASSERTION"},
"cluster_i2s": {"url": "https://github.com/retroSoC/i2s.git", "revision": "bd0978e8b45e4cf4c1335a1fa7311385d2a4e805", "destination": "rtl/managed/clusterip/i2s", "license": "NOASSERTION"},
@@ -70,7 +70,7 @@
"cluster_ps2": {"url": "https://github.com/retroSoC/ps2.git", "revision": "2097a0d41b07573ff0453d65ba9a1670b3df7b9c", "destination": "rtl/managed/clusterip/ps2", "license": "MulanPSL-2.0"},
"cluster_pwm": {"url": "https://github.com/retroSoC/pwm.git", "revision": "c631ede87506d34f714167313ba69b196c0bea72", "destination": "rtl/managed/clusterip/pwm", "license": "NOASSERTION"},
"cluster_rng": {"url": "https://github.com/retroSoC/rng.git", "revision": "36f3e0774d8f3c4b597d3db8a96ca3992532b61e", "destination": "rtl/managed/clusterip/rng", "license": "MulanPSL-2.0"},
"cluster_rtc": {"url": "https://github.com/retroSoC/rtc.git", "revision": "c6cc82f7530eea0b87ebe1d2cde2a67c9268c0db", "destination": "rtl/managed/clusterip/rtc", "license": "NOASSERTION"},
"cluster_rtc": {"url": "https://github.com/retroSoC/rtc.git", "revision": "32548c5cbcdf39e09d0880fb611f9dd47940ea88", "destination": "rtl/managed/clusterip/rtc", "license": "NOASSERTION"},
"cluster_spi": {"url": "https://github.com/retroSoC/spi.git", "revision": "515cb408806584525605b4747db5e890dbdf1928", "destination": "rtl/managed/clusterip/spi", "license": "NOASSERTION"},
"cluster_timer": {"url": "https://github.com/retroSoC/timer.git", "revision": "75fa45d786739e1d5ab6d1e10520be2c2f0d022a", "destination": "rtl/managed/clusterip/timer", "license": "NOASSERTION"},
"cluster_uart": {"url": "https://github.com/retroSoC/uart.git", "revision": "eca12213ba06f42e0a6dd0f27907fd4c447e2774", "destination": "rtl/managed/clusterip/uart", "license": "NOASSERTION"},
@@ -6,6 +6,7 @@ HAVE_SRAM_MACRO := YES
PDK_BEHAV := YES
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := YES
@@ -6,6 +6,7 @@ HAVE_SRAM_MACRO := YES
PDK_BEHAV := YES
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := YES
+1
View File
@@ -6,6 +6,7 @@ HAVE_SRAM_MACRO := YES
PDK_BEHAV := YES
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := NO
+1
View File
@@ -5,6 +5,7 @@ HAVE_SRAM_IF := NO
HAVE_SRAM_MACRO := NO
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := NO
+1
View File
@@ -5,6 +5,7 @@ HAVE_SRAM_IF := NO
HAVE_SRAM_MACRO := NO
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := NO
+1
View File
@@ -6,6 +6,7 @@ HAVE_SRAM_MACRO := YES
PDK_BEHAV := YES
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := NO
+1
View File
@@ -5,6 +5,7 @@ HAVE_SRAM_IF := NO
HAVE_SRAM_MACRO := NO
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := YES
+1
View File
@@ -5,6 +5,7 @@ HAVE_SRAM_IF := NO
HAVE_SRAM_MACRO := NO
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := NO
+1
View File
@@ -5,6 +5,7 @@ HAVE_SRAM_IF := NO
HAVE_SRAM_MACRO := NO
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := NO
+1
View File
@@ -5,6 +5,7 @@ HAVE_SRAM_IF := NO
HAVE_SRAM_MACRO := NO
HAVE_SVA := NO
EXT_CLK_HZ := 72000000
AUD_CLK_HZ := 18432000
CLINT_TIMEBASE_HZ := 1000000
ISA := RV32IM
HAVE_CSR := NO
+3 -7
View File
@@ -159,6 +159,7 @@
#define reg_sysctrl_perf_flash_wait_hi \
RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_PERF_FLASH_WAIT_HI_OFFSET)
#define reg_sysctrl_test_status RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_TEST_STATUS_OFFSET)
#define reg_sysctrl_rtc_wake_status RS_SOC_SYSCTRL_REG32(RS_SOC_SYSCTRL_RTC_WAKE_STATUS_OFFSET)
#define RS_SOC_TEST_STATUS_VALID UINT32_C(0x80000000)
#define RS_SOC_TEST_STATUS_CODE_SHIFT 8U
#define RS_SOC_TEST_STATUS_PASS UINT32_C(0x00000001)
@@ -176,6 +177,8 @@
#define RS_SOC_PERF_CTRL_ENABLE UINT32_C(0x00000001)
#define RS_SOC_PERF_CTRL_CLEAR UINT32_C(0x00000002)
#define RS_SOC_PERF_CTRL_SNAPSHOT UINT32_C(0x00000004)
#define RS_SOC_RTC_WAKE_LIVE UINT32_C(0x00000001)
#define RS_SOC_RTC_WAKE_SEEN UINT32_C(0x00000002)
// sdram
#define reg_sdram_clkdiv RS_SOC_REG32(RS_SOC_RIBP_SDRAM_BASE, UINT32_C(0x00))
#define reg_sdram_cfg RS_SOC_REG32(RS_SOC_RIBP_SDRAM_BASE, UINT32_C(0x04))
@@ -199,13 +202,6 @@
#define reg_pwm_cr2 RS_SOC_REG32(RS_SOC_APB_PWM_BASE, UINT32_C(0x18))
#define reg_pwm_cr3 RS_SOC_REG32(RS_SOC_APB_PWM_BASE, UINT32_C(0x1C))
#define reg_pwm_stat RS_SOC_REG32(RS_SOC_APB_PWM_BASE, UINT32_C(0x20))
// rtc
#define reg_rtc_ctrl RS_SOC_REG32(RS_SOC_APB_RTC_BASE, UINT32_C(0x00))
#define reg_rtc_pscr RS_SOC_REG32(RS_SOC_APB_RTC_BASE, UINT32_C(0x04))
#define reg_rtc_cnt RS_SOC_REG32(RS_SOC_APB_RTC_BASE, UINT32_C(0x08))
#define reg_rtc_alrm RS_SOC_REG32(RS_SOC_APB_RTC_BASE, UINT32_C(0x0C))
#define reg_rtc_ista RS_SOC_REG32(RS_SOC_APB_RTC_BASE, UINT32_C(0x10))
#define reg_rtc_ssta RS_SOC_REG32(RS_SOC_APB_RTC_BASE, UINT32_C(0x14))
// wdg
#define reg_wdg_ctrl RS_SOC_REG32(RS_SOC_APB_WDG_BASE, UINT32_C(0x00))
#define reg_wdg_pscr RS_SOC_REG32(RS_SOC_APB_WDG_BASE, UINT32_C(0x04))
+33 -1
View File
@@ -1,5 +1,37 @@
#ifndef RETROSOC_RTC_H
#define RETROSOC_RTC_H
void ip_rtc_test(int argc, char **argv);
#include <rtc.h>
#include <rtc_regs.h>
#include <retrosoc/core/status.h>
typedef rtc_config_t rs_rtc_config_t;
typedef rtc_time_t rs_rtc_time_t;
typedef rtc_alarm_t rs_rtc_alarm_t;
typedef rtc_periodic_t rs_rtc_periodic_t;
typedef rtc_calendar_t rs_rtc_calendar_t;
#ifndef RS_RTC_CLOCK_HZ
#define RS_RTC_CLOCK_HZ UINT32_C(18432000)
#endif
#define RS_RTC_EVENT_SECOND RTC_EVENT_SECOND_MASK
#define RS_RTC_EVENT_ALARM0 RTC_EVENT_ALARM0_MASK
#define RS_RTC_EVENT_ALARM1 RTC_EVENT_ALARM1_MASK
#define RS_RTC_EVENT_PERIODIC RTC_EVENT_PERIODIC_MASK
#define RS_RTC_EVENT_OVERFLOW RTC_EVENT_OVERFLOW_MASK
#define RS_RTC_EVENT_ALL RTC_EVENT_VALID_MASK
rs_status_t rs_rtc_probe(void);
rs_status_t rs_rtc_configure(const rs_rtc_config_t *config, rs_timeout_t timeout);
rs_status_t rs_rtc_set_time(const rs_rtc_time_t *time, rs_timeout_t timeout);
rs_status_t rs_rtc_get_time(rs_rtc_time_t *time, rs_timeout_t timeout);
rs_status_t rs_rtc_configure_alarm(uint32_t channel, const rs_rtc_alarm_t *alarm,
rs_timeout_t timeout);
rs_status_t rs_rtc_configure_periodic(const rs_rtc_periodic_t *periodic, rs_timeout_t timeout);
uint32_t rs_rtc_get_events(void);
rs_status_t rs_rtc_clear_events(uint32_t mask, rs_timeout_t timeout);
void rs_rtc_shell_test(int argc, char **argv);
#endif
+90 -48
View File
@@ -1,57 +1,99 @@
#include <retrosoc/core/soc.h>
#include <retrosoc/core/wait.h>
#include <retrosoc/lib/printf.h>
#include <retrosoc/hal/rtc.h>
#define RS_RTC_WAIT_TIMEOUT (RS_TIMEOUT_DEFAULT * 16U)
#include <retrosoc/core/soc.h>
#include <retrosoc/lib/printf.h>
static rs_status_t rs_rtc_status(rtc_status_t status) {
rs_status_t result;
switch (status) {
case RTC_STATUS_OK:
result = RS_OK;
break;
case RTC_STATUS_INVALID_ARGUMENT:
result = RS_EINVAL;
break;
case RTC_STATUS_TIMEOUT:
result = RS_ETIMEOUT;
break;
case RTC_STATUS_NOT_INITIALIZED:
result = RS_EFORMAT;
break;
case RTC_STATUS_IO_ERROR:
default:
result = RS_EIO;
break;
}
return result;
}
rs_status_t rs_rtc_probe(void) {
return rs_rtc_status(rtc_probe((uintptr_t)RS_SOC_APB_RTC_BASE));
}
rs_status_t rs_rtc_configure(const rs_rtc_config_t *config, rs_timeout_t timeout) {
return rs_rtc_status(rtc_configure((uintptr_t)RS_SOC_APB_RTC_BASE, config, timeout));
}
rs_status_t rs_rtc_set_time(const rs_rtc_time_t *time, rs_timeout_t timeout) {
return rs_rtc_status(rtc_set_time((uintptr_t)RS_SOC_APB_RTC_BASE, time, timeout));
}
rs_status_t rs_rtc_get_time(rs_rtc_time_t *time, rs_timeout_t timeout) {
return rs_rtc_status(rtc_get_time((uintptr_t)RS_SOC_APB_RTC_BASE, time, timeout));
}
rs_status_t rs_rtc_configure_alarm(uint32_t channel, const rs_rtc_alarm_t *alarm,
rs_timeout_t timeout) {
return rs_rtc_status(
rtc_configure_alarm((uintptr_t)RS_SOC_APB_RTC_BASE, channel, alarm, timeout));
}
rs_status_t rs_rtc_configure_periodic(const rs_rtc_periodic_t *periodic, rs_timeout_t timeout) {
return rs_rtc_status(rtc_configure_periodic((uintptr_t)RS_SOC_APB_RTC_BASE, periodic, timeout));
}
uint32_t rs_rtc_get_events(void) {
return rtc_get_events((uintptr_t)RS_SOC_APB_RTC_BASE);
}
rs_status_t rs_rtc_clear_events(uint32_t mask, rs_timeout_t timeout) {
return rs_rtc_status(rtc_clear_events((uintptr_t)RS_SOC_APB_RTC_BASE, mask, timeout));
}
void rs_rtc_shell_test(int argc, char **argv) {
const rs_rtc_config_t config = {
.second_cycles = RS_RTC_CLOCK_HZ,
.calibration_ppm = 0,
.interrupt_enable = 0U,
.wake_enable = 0U,
.enable = true,
};
const rs_rtc_time_t initial_time = {
.seconds = UINT64_C(1767225600),
.subsecond = 0U,
};
rs_rtc_time_t snapshot;
rs_status_t status;
// 12.288M/256=48K
// apb4 clk: 'CPU_FREQ' MHz
// rtc_clk: 12.288 MHz
void ip_rtc_test(int argc, char **argv) {
(void)argc;
(void)argv;
printf("rtc test\n");
reg_rtc_ctrl = (uint32_t)1; // enter config mode
reg_rtc_pscr = (uint32_t)(1000000 - 1); // div1000000 for 'CPU_FREQ' Hz
printf("CTRL: %d PSCR: %d\n", reg_rtc_ctrl, reg_rtc_pscr);
for (uint32_t i = 0U; i < 6U; ++i) {
reg_rtc_cnt = (uint32_t)(123 * i);
reg_rtc_alrm = reg_rtc_cnt + 10;
printf("[static]CNT: %d ALRM: %d\n", reg_rtc_cnt, reg_rtc_alrm);
if (reg_rtc_cnt != (uint32_t)(123 * i))
printf("error\n");
status = rs_rtc_probe();
if (status == RS_OK) {
status = rs_rtc_configure(&config, RS_TIMEOUT_DEFAULT);
}
reg_rtc_cnt = (uint32_t)0;
reg_rtc_ctrl = (uint32_t)0b0010010; // core and inc trg en
printf("CTRL: %d PSCR: %d\n", reg_rtc_ctrl, reg_rtc_pscr);
printf("cnt inc test\n");
for (uint32_t i = 0U; i < 6U; ++i) {
if (rs_wait_value(&reg_rtc_ista, 1U, RS_RTC_WAIT_TIMEOUT) != RS_OK) {
printf("rtc increment timed out\n");
return;
}
printf("reg_rtc_cnt: %d\n", reg_rtc_cnt); // inc 1 in 1/'CPU_FREQ' s
if (status == RS_OK) {
status = rs_rtc_set_time(&initial_time, RS_TIMEOUT_DEFAULT);
}
printf("cnt inc test done\n");
printf("alrm trigger test\n");
reg_rtc_ctrl = (uint32_t)1; // enter config mode
reg_rtc_cnt = (uint32_t)0;
reg_rtc_alrm = reg_rtc_cnt + 6;
// for(int i = 0; i < 6; ++i) {
// reg_rtc_ctrl = (uint32_t)0b0010100; // core and alrm trg en
// while(reg_rtc_ista != (uint32_t)2); // wait alrm irq flag
// reg_rtc_ctrl = (uint32_t)1; // enter config mode
// while(reg_rtc_ista != (uint32_t)0); // clear the all irq flag
// printf("reg_rtc_cnt: %d\n", reg_rtc_cnt); // alrm trg every 1s
// reg_rtc_alrm = reg_rtc_cnt + 6;
// }
printf("CTRL: %d PSCR: %d\n", reg_rtc_ctrl, reg_rtc_pscr);
printf("alrm trigger test done\n");
printf("rtc test done\n");
if (status == RS_OK) {
status = rs_rtc_get_time(&snapshot, RS_TIMEOUT_DEFAULT);
}
if (status != RS_OK) {
printf("[RTC] V2 test failed: %d\n", status);
return;
}
printf("[APB IP] RTC V2\n");
printf("[RTC epoch/subsecond] %u/%u\n", (uint32_t)snapshot.seconds,
(uint32_t)snapshot.subsecond);
}
+2 -1
View File
@@ -124,7 +124,8 @@ void rs_app_info(void) {
printf(" 1 x PWM(4CHNL) @%p\n", (void *)&reg_pwm_ctrl);
printf(" 1 x PS2 @%p\n",
(void *)(uintptr_t)RS_SOC_APB_PS2_BASE);
printf(" 1 x RTC @%p\n", (void *)&reg_rtc_ctrl);
printf(" 1 x RTC @%p\n",
(void *)(uintptr_t)RS_SOC_APB_RTC_BASE);
printf(" 1 x WDG @%p\n", (void *)&reg_wdg_ctrl);
printf(" 1 x CRC @%p\n", (void *)&reg_crc_ctrl);
printf(" 1 x TIMER3(ADV) @%p\n", (void *)&reg_tim3_ctrl);
+2
View File
@@ -34,6 +34,8 @@ the root README and subsystem guides.
recovery, DMA, HAL, and verification contracts.
- [ip/ps2.md](ip/ps2.md) defines the Mini SoC PS/2 V2 APB, GPIO pad,
interrupt, SDK, and managed-IP integration contract.
- The managed [RTC V2 datasheet](../rtl/managed/clusterip/rtc/doc/datasheet.md)
defines Epoch time, alarms, periodic wake, calibration, CDC, and software.
- [soc-integration-wiring.md](soc-integration-wiring.md) defines the generated
pin-map workflow and SoC integration boundary.
- [mini-soc-block-diagram.svg](mini-soc-block-diagram.svg) is the Mini SoC
+10 -2
View File
@@ -152,7 +152,11 @@ digraph mini_soc_block_diagram {
];
apb_targets [
fillcolor="#E6F4EA",
label="APB target wrapper\nUART1, PWM, RTC, watchdog\nCRC, advanced timer and user IP"
label="APB target wrapper\nUART1, PWM, watchdog, CRC\nadvanced timer and user IP"
];
rtc [
fillcolor="#E6F4EA",
label="RTC V2\n64-bit Epoch + 1/256-second time\ndual alarm, periodic wake, calibration, IRQ13"
];
archinfo [
fillcolor="#E6F4EA",
@@ -181,7 +185,7 @@ digraph mini_soc_block_diagram {
{ rank=same; user_core; dma; }
{ rank=same; fault; fabric; sram; }
{ rank=same; ribp_adapter; apb_adapter; }
{ rank=same; sysctrl; clint; ribp_targets; uart0; i2c_controllers; gpio_controller; timers; ws2812; archinfo; rng; ps2; apb_targets; }
{ rank=same; sysctrl; clint; ribp_targets; uart0; i2c_controllers; gpio_controller; timers; ws2812; archinfo; rng; ps2; rtc; apb_targets; }
{ rank=same; gpio_bridge; irq; }
ext_clock -> rcu [label="clock / reset"];
@@ -214,6 +218,7 @@ digraph mini_soc_block_diagram {
apb_adapter -> archinfo [label="APB"];
apb_adapter -> rng [label="APB"];
apb_adapter -> ps2 [label="APB"];
apb_adapter -> rtc [label="APB"];
apb_adapter -> apb_targets [label="APB"];
ribp_targets -> gpio_controller [label="alternate functions"];
@@ -232,6 +237,9 @@ digraph mini_soc_block_diagram {
rng -> irq [label="IRQ16"];
ps2 -> gpio_controller [label="GPIO0/1 ALT1\nopen drain"];
ps2 -> irq [label="IRQ12"];
rcu -> rtc [label="18.432 MHz audio clock", style=dashed];
rtc -> irq [label="IRQ13"];
rtc -> sysctrl [label="wake live / sticky", style=dashed];
apb_targets -> gpio_controller [label="user_gpio"];
ribp_targets -> ext_io [dir=both, label="device interfaces"];
uart0 -> ext_io [dir=both, label="UART pads"];
+310 -274
View File
@@ -4,19 +4,19 @@
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: mini_soc_block_diagram Pages: 1 -->
<svg width="3164pt" height="896pt"
viewBox="0.00 0.00 3164.00 896.48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg width="3332pt" height="896pt"
viewBox="0.00 0.00 3332.00 896.48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 892.48)">
<title>mini_soc_block_diagram</title>
<text text-anchor="middle" x="132" y="-870.08" font-family="Arial" font-size="18.00">retroSoC Mini SoC Architecture</text>
<g id="clust1" class="cluster">
<title>cluster_asic</title>
<path fill="transparent" stroke="#111827" d="M160,-85C160,-85 3136,-85 3136,-85 3142,-85 3148,-91 3148,-97 3148,-97 3148,-772.48 3148,-772.48 3148,-778.48 3142,-784.48 3136,-784.48 3136,-784.48 160,-784.48 160,-784.48 154,-784.48 148,-778.48 148,-772.48 148,-772.48 148,-97 148,-97 148,-91 154,-85 160,-85"/>
<path fill="transparent" stroke="#111827" d="M160,-85C160,-85 3304,-85 3304,-85 3310,-85 3316,-91 3316,-97 3316,-97 3316,-772.48 3316,-772.48 3316,-778.48 3310,-784.48 3304,-784.48 3304,-784.48 160,-784.48 160,-784.48 154,-784.48 148,-778.48 148,-772.48 148,-772.48 148,-97 148,-97 148,-91 154,-85 160,-85"/>
<text text-anchor="middle" x="196.5" y="-769.28" font-family="Arial" font-size="14.00" fill="#111827">retrosoc_asic</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_soc</title>
<path fill="transparent" stroke="#94a3b8" stroke-dasharray="5,2" d="M390,-103C390,-103 3118,-103 3118,-103 3124,-103 3130,-109 3130,-115 3130,-115 3130,-729.48 3130,-729.48 3130,-735.48 3124,-741.48 3118,-741.48 3118,-741.48 390,-741.48 390,-741.48 384,-741.48 378,-735.48 378,-729.48 378,-729.48 378,-115 378,-115 378,-109 384,-103 390,-103"/>
<path fill="transparent" stroke="#94a3b8" stroke-dasharray="5,2" d="M390,-103C390,-103 3286,-103 3286,-103 3292,-103 3298,-109 3298,-115 3298,-115 3298,-729.48 3298,-729.48 3298,-735.48 3292,-741.48 3286,-741.48 3286,-741.48 390,-741.48 390,-741.48 384,-741.48 378,-735.48 378,-729.48 378,-729.48 378,-115 378,-115 378,-109 384,-103 390,-103"/>
<text text-anchor="middle" x="407.5" y="-727.88" font-family="Arial" font-size="12.00" fill="#334155">retrosoc</text>
</g>
<!-- ext_clock -->
@@ -44,542 +44,578 @@
<!-- ext_io -->
<g id="node2" class="node">
<title>ext_io</title>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M2789,-45C2789,-45 2569,-45 2569,-45 2563,-45 2557,-39 2557,-33 2557,-33 2557,-12 2557,-12 2557,-6 2563,0 2569,0 2569,0 2789,0 2789,0 2795,0 2801,-6 2801,-12 2801,-12 2801,-33 2801,-33 2801,-39 2795,-45 2789,-45"/>
<text text-anchor="middle" x="2679" y="-31" font-family="Arial" font-size="10.00" fill="#111827">External I/O and memory</text>
<text text-anchor="middle" x="2679" y="-20" font-family="Arial" font-size="10.00" fill="#111827">GPIO, UART0, PS/2, XPI Flash, SDRAM, PSRAM</text>
<text text-anchor="middle" x="2679" y="-9" font-family="Arial" font-size="10.00" fill="#111827">SD card, I2C, I2S, DVP and WS2812</text>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M3066,-45C3066,-45 2846,-45 2846,-45 2840,-45 2834,-39 2834,-33 2834,-33 2834,-12 2834,-12 2834,-6 2840,0 2846,0 2846,0 3066,0 3066,0 3072,0 3078,-6 3078,-12 3078,-12 3078,-33 3078,-33 3078,-39 3072,-45 3066,-45"/>
<text text-anchor="middle" x="2956" y="-31" font-family="Arial" font-size="10.00" fill="#111827">External I/O and memory</text>
<text text-anchor="middle" x="2956" y="-20" font-family="Arial" font-size="10.00" fill="#111827">GPIO, UART0, PS/2, XPI Flash, SDRAM, PSRAM</text>
<text text-anchor="middle" x="2956" y="-9" font-family="Arial" font-size="10.00" fill="#111827">SD card, I2C, I2S, DVP and WS2812</text>
</g>
<!-- ext_jtag -->
<g id="node3" class="node">
<title>ext_jtag</title>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M1380.5,-860.48C1380.5,-860.48 1249.5,-860.48 1249.5,-860.48 1243.5,-860.48 1237.5,-854.48 1237.5,-848.48 1237.5,-848.48 1237.5,-836.48 1237.5,-836.48 1237.5,-830.48 1243.5,-824.48 1249.5,-824.48 1249.5,-824.48 1380.5,-824.48 1380.5,-824.48 1386.5,-824.48 1392.5,-830.48 1392.5,-836.48 1392.5,-836.48 1392.5,-848.48 1392.5,-848.48 1392.5,-854.48 1386.5,-860.48 1380.5,-860.48"/>
<text text-anchor="middle" x="1315" y="-845.48" font-family="Arial" font-size="10.00" fill="#111827">Management JTAG</text>
<text text-anchor="middle" x="1315" y="-834.48" font-family="Arial" font-size="10.00" fill="#111827">TCK, TMS, TDI, TRST_n, TDO</text>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M1612.5,-860.48C1612.5,-860.48 1481.5,-860.48 1481.5,-860.48 1475.5,-860.48 1469.5,-854.48 1469.5,-848.48 1469.5,-848.48 1469.5,-836.48 1469.5,-836.48 1469.5,-830.48 1475.5,-824.48 1481.5,-824.48 1481.5,-824.48 1612.5,-824.48 1612.5,-824.48 1618.5,-824.48 1624.5,-830.48 1624.5,-836.48 1624.5,-836.48 1624.5,-848.48 1624.5,-848.48 1624.5,-854.48 1618.5,-860.48 1612.5,-860.48"/>
<text text-anchor="middle" x="1547" y="-845.48" font-family="Arial" font-size="10.00" fill="#111827">Management JTAG</text>
<text text-anchor="middle" x="1547" y="-834.48" font-family="Arial" font-size="10.00" fill="#111827">TCK, TMS, TDI, TRST_n, TDO</text>
</g>
<!-- jtag_dtm -->
<g id="node6" class="node">
<title>jtag_dtm</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1390,-678.98C1390,-678.98 1240,-678.98 1240,-678.98 1234,-678.98 1228,-672.98 1228,-666.98 1228,-666.98 1228,-654.98 1228,-654.98 1228,-648.98 1234,-642.98 1240,-642.98 1240,-642.98 1390,-642.98 1390,-642.98 1396,-642.98 1402,-648.98 1402,-654.98 1402,-654.98 1402,-666.98 1402,-666.98 1402,-672.98 1396,-678.98 1390,-678.98"/>
<text text-anchor="middle" x="1315" y="-663.98" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 JTAG DTM</text>
<text text-anchor="middle" x="1315" y="-652.98" font-family="Arial" font-size="10.00" fill="#111827">10 MHz asynchronous TCK domain</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1622,-678.98C1622,-678.98 1472,-678.98 1472,-678.98 1466,-678.98 1460,-672.98 1460,-666.98 1460,-666.98 1460,-654.98 1460,-654.98 1460,-648.98 1466,-642.98 1472,-642.98 1472,-642.98 1622,-642.98 1622,-642.98 1628,-642.98 1634,-648.98 1634,-654.98 1634,-654.98 1634,-666.98 1634,-666.98 1634,-672.98 1628,-678.98 1622,-678.98"/>
<text text-anchor="middle" x="1547" y="-663.98" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 JTAG DTM</text>
<text text-anchor="middle" x="1547" y="-652.98" font-family="Arial" font-size="10.00" fill="#111827">10 MHz asynchronous TCK domain</text>
</g>
<!-- ext_jtag&#45;&gt;jtag_dtm -->
<g id="edge2" class="edge">
<title>ext_jtag&#45;&gt;jtag_dtm</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1315,-824.27C1315,-792.24 1315,-723.39 1315,-686.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1317.45,-686.14 1315,-679.14 1312.55,-686.14 1317.45,-686.14"/>
<text text-anchor="middle" x="1335" y="-795.08" font-family="Arial" font-size="8.00" fill="#374151">JTAG pads</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1547,-824.27C1547,-792.24 1547,-723.39 1547,-686.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1549.45,-686.14 1547,-679.14 1544.55,-686.14 1549.45,-686.14"/>
<text text-anchor="middle" x="1567" y="-795.08" font-family="Arial" font-size="8.00" fill="#374151">JTAG pads</text>
</g>
<!-- fabric -->
<g id="node11" class="node">
<title>fabric</title>
<path fill="#dcecf8" stroke="#4b5563" stroke-width="1.1" d="M2009.66,-451.31C2009.66,-451.31 1941.98,-479.16 1941.98,-479.16 1936.43,-481.45 1924.88,-483.73 1918.88,-483.73 1918.88,-483.73 1763.12,-483.73 1763.12,-483.73 1757.12,-483.73 1745.57,-481.45 1740.02,-479.16 1740.02,-479.16 1672.34,-451.31 1672.34,-451.31 1666.79,-449.03 1666.79,-444.46 1672.34,-442.18 1672.34,-442.18 1740.02,-414.32 1740.02,-414.32 1745.57,-412.04 1757.12,-409.76 1763.12,-409.76 1763.12,-409.76 1918.88,-409.76 1918.88,-409.76 1924.88,-409.76 1936.43,-412.04 1941.98,-414.32 1941.98,-414.32 2009.66,-442.18 2009.66,-442.18 2015.21,-444.46 2015.21,-449.03 2009.66,-451.31"/>
<text text-anchor="middle" x="1841" y="-455.24" font-family="Arial" font-size="10.00" fill="#111827">RIB fabric</text>
<text text-anchor="middle" x="1841" y="-444.24" font-family="Arial" font-size="10.00" fill="#111827">3&#45;master round&#45;robin arbitration</text>
<text text-anchor="middle" x="1841" y="-433.24" font-family="Arial" font-size="10.00" fill="#111827">INCR1 / INCR4, access policy, fault reporting</text>
<path fill="#dcecf8" stroke="#4b5563" stroke-width="1.1" d="M2222.66,-451.31C2222.66,-451.31 2154.98,-479.16 2154.98,-479.16 2149.43,-481.45 2137.88,-483.73 2131.88,-483.73 2131.88,-483.73 1976.12,-483.73 1976.12,-483.73 1970.12,-483.73 1958.57,-481.45 1953.02,-479.16 1953.02,-479.16 1885.34,-451.31 1885.34,-451.31 1879.79,-449.03 1879.79,-444.46 1885.34,-442.18 1885.34,-442.18 1953.02,-414.32 1953.02,-414.32 1958.57,-412.04 1970.12,-409.76 1976.12,-409.76 1976.12,-409.76 2131.88,-409.76 2131.88,-409.76 2137.88,-409.76 2149.43,-412.04 2154.98,-414.32 2154.98,-414.32 2222.66,-442.18 2222.66,-442.18 2228.21,-444.46 2228.21,-449.03 2222.66,-451.31"/>
<text text-anchor="middle" x="2054" y="-455.24" font-family="Arial" font-size="10.00" fill="#111827">RIB fabric</text>
<text text-anchor="middle" x="2054" y="-444.24" font-family="Arial" font-size="10.00" fill="#111827">3&#45;master round&#45;robin arbitration</text>
<text text-anchor="middle" x="2054" y="-433.24" font-family="Arial" font-size="10.00" fill="#111827">INCR1 / INCR4, access policy, fault reporting</text>
</g>
<!-- rcu&#45;&gt;fabric -->
<g id="edge3" class="edge">
<title>rcu&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M362.03,-540.47C368.2,-539.24 372,-538.48 372,-538.48 372,-538.48 1619,-483.48 1619,-483.48 1619,-483.48 1659.87,-476.9 1706.55,-469.39"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1706.95,-471.81 1713.47,-468.27 1706.17,-466.97 1706.95,-471.81"/>
<text text-anchor="middle" x="1105" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">system clock / reset</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M362.03,-540.47C368.2,-539.24 372,-538.48 372,-538.48 372,-538.48 1851,-483.48 1851,-483.48 1851,-483.48 1883.47,-477.77 1922.43,-470.91"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1923.31,-473.24 1929.78,-469.61 1922.46,-468.42 1923.31,-473.24"/>
<text text-anchor="middle" x="1235" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">system clock / reset</text>
</g>
<!-- clint -->
<g id="node17" class="node">
<title>clint</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M792.5,-255C792.5,-255 671.5,-255 671.5,-255 665.5,-255 659.5,-249 659.5,-243 659.5,-243 659.5,-222 659.5,-222 659.5,-216 665.5,-210 671.5,-210 671.5,-210 792.5,-210 792.5,-210 798.5,-210 804.5,-216 804.5,-222 804.5,-222 804.5,-243 804.5,-243 804.5,-249 798.5,-255 792.5,-255"/>
<text text-anchor="middle" x="732" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CLINT</text>
<text text-anchor="middle" x="732" y="-230" font-family="Arial" font-size="10.00" fill="#111827">standard 64 KiB register map</text>
<text text-anchor="middle" x="732" y="-219" font-family="Arial" font-size="10.00" fill="#111827">mtime, mtimecmp and MSIP</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M953.5,-255C953.5,-255 832.5,-255 832.5,-255 826.5,-255 820.5,-249 820.5,-243 820.5,-243 820.5,-222 820.5,-222 820.5,-216 826.5,-210 832.5,-210 832.5,-210 953.5,-210 953.5,-210 959.5,-210 965.5,-216 965.5,-222 965.5,-222 965.5,-243 965.5,-243 965.5,-249 959.5,-255 953.5,-255"/>
<text text-anchor="middle" x="893" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CLINT</text>
<text text-anchor="middle" x="893" y="-230" font-family="Arial" font-size="10.00" fill="#111827">standard 64 KiB register map</text>
<text text-anchor="middle" x="893" y="-219" font-family="Arial" font-size="10.00" fill="#111827">mtime, mtimecmp and MSIP</text>
</g>
<!-- rcu&#45;&gt;clint -->
<g id="edge8" class="edge">
<title>rcu&#45;&gt;clint</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M295.07,-538.31C378.19,-480.32 605.41,-321.81 694.99,-259.32"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="696.6,-261.18 700.94,-255.17 693.8,-257.16 696.6,-261.18"/>
<text text-anchor="middle" x="537.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">1 MHz tick</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M303.48,-538.33C423.84,-472.3 778,-278 778,-278 778,-278 803.4,-268.17 830.32,-257.75"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="831.54,-259.91 837.18,-255.1 829.77,-255.34 831.54,-259.91"/>
<text text-anchor="middle" x="609.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">1 MHz tick</text>
</g>
<!-- rtc -->
<g id="node25" class="node">
<title>rtc</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M596,-255C596,-255 406,-255 406,-255 400,-255 394,-249 394,-243 394,-243 394,-222 394,-222 394,-216 400,-210 406,-210 406,-210 596,-210 596,-210 602,-210 608,-216 608,-222 608,-222 608,-243 608,-243 608,-249 602,-255 596,-255"/>
<text text-anchor="middle" x="501" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RTC V2</text>
<text text-anchor="middle" x="501" y="-230" font-family="Arial" font-size="10.00" fill="#111827">64&#45;bit Epoch + 1/256&#45;second time</text>
<text text-anchor="middle" x="501" y="-219" font-family="Arial" font-size="10.00" fill="#111827">dual alarm, periodic wake, calibration, IRQ13</text>
</g>
<!-- rcu&#45;&gt;rtc -->
<g id="edge46" class="edge">
<title>rcu&#45;&gt;rtc</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M279.73,-538.31C321.4,-480.92 434.56,-325.03 480.85,-261.26"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="482.99,-262.48 485.12,-255.38 479.02,-259.61 482.99,-262.48"/>
<text text-anchor="middle" x="435.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">18.432 MHz audio clock</text>
</g>
<!-- mgmt_core -->
<g id="node5" class="node">
<title>mgmt_core</title>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M1975,-683.48C1975,-683.48 1821,-683.48 1821,-683.48 1815,-683.48 1809,-677.48 1809,-671.48 1809,-671.48 1809,-650.48 1809,-650.48 1809,-644.48 1815,-638.48 1821,-638.48 1821,-638.48 1975,-638.48 1975,-638.48 1981,-638.48 1987,-644.48 1987,-650.48 1987,-650.48 1987,-671.48 1987,-671.48 1987,-677.48 1981,-683.48 1975,-683.48"/>
<text text-anchor="middle" x="1898" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Management core</text>
<text text-anchor="middle" x="1898" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">Fixed Hazard3, branch predictor</text>
<text text-anchor="middle" x="1898" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">JTAG Debug Module always present</text>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M2207,-683.48C2207,-683.48 2053,-683.48 2053,-683.48 2047,-683.48 2041,-677.48 2041,-671.48 2041,-671.48 2041,-650.48 2041,-650.48 2041,-644.48 2047,-638.48 2053,-638.48 2053,-638.48 2207,-638.48 2207,-638.48 2213,-638.48 2219,-644.48 2219,-650.48 2219,-650.48 2219,-671.48 2219,-671.48 2219,-677.48 2213,-683.48 2207,-683.48"/>
<text text-anchor="middle" x="2130" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Management core</text>
<text text-anchor="middle" x="2130" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">Fixed Hazard3, branch predictor</text>
<text text-anchor="middle" x="2130" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">JTAG Debug Module always present</text>
</g>
<!-- mgmt_adapter -->
<g id="node8" class="node">
<title>mgmt_adapter</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1861.5,-578.98C1861.5,-578.98 1820.5,-578.98 1820.5,-578.98 1814.5,-578.98 1808.5,-572.98 1808.5,-566.98 1808.5,-566.98 1808.5,-554.98 1808.5,-554.98 1808.5,-548.98 1814.5,-542.98 1820.5,-542.98 1820.5,-542.98 1861.5,-542.98 1861.5,-542.98 1867.5,-542.98 1873.5,-548.98 1873.5,-554.98 1873.5,-554.98 1873.5,-566.98 1873.5,-566.98 1873.5,-572.98 1867.5,-578.98 1861.5,-578.98"/>
<text text-anchor="middle" x="1841" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">RIBP2RIB</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M2074.5,-578.98C2074.5,-578.98 2033.5,-578.98 2033.5,-578.98 2027.5,-578.98 2021.5,-572.98 2021.5,-566.98 2021.5,-566.98 2021.5,-554.98 2021.5,-554.98 2021.5,-548.98 2027.5,-542.98 2033.5,-542.98 2033.5,-542.98 2074.5,-542.98 2074.5,-542.98 2080.5,-542.98 2086.5,-548.98 2086.5,-554.98 2086.5,-554.98 2086.5,-566.98 2086.5,-566.98 2086.5,-572.98 2080.5,-578.98 2074.5,-578.98"/>
<text text-anchor="middle" x="2054" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">RIBP2RIB</text>
</g>
<!-- mgmt_core&#45;&gt;mgmt_adapter -->
<g id="edge9" class="edge">
<title>mgmt_core&#45;&gt;mgmt_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1885.35,-638.24C1876.2,-622.5 1863.85,-601.28 1854.51,-585.22"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1856.6,-583.94 1850.97,-579.12 1852.37,-586.4 1856.6,-583.94"/>
<text text-anchor="middle" x="1880.5" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2113.13,-638.24C2100.83,-622.37 2084.18,-600.9 2071.69,-584.79"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2073.51,-583.15 2067.29,-579.12 2069.64,-586.15 2073.51,-583.15"/>
<text text-anchor="middle" x="2103.5" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- debug_module -->
<g id="node7" class="node">
<title>debug_module</title>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1651.5,-683.48C1651.5,-683.48 1530.5,-683.48 1530.5,-683.48 1524.5,-683.48 1518.5,-677.48 1518.5,-671.48 1518.5,-671.48 1518.5,-650.48 1518.5,-650.48 1518.5,-644.48 1524.5,-638.48 1530.5,-638.48 1530.5,-638.48 1651.5,-638.48 1651.5,-638.48 1657.5,-638.48 1663.5,-644.48 1663.5,-650.48 1663.5,-650.48 1663.5,-671.48 1663.5,-671.48 1663.5,-677.48 1657.5,-683.48 1651.5,-683.48"/>
<text text-anchor="middle" x="1591" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 Debug Module</text>
<text text-anchor="middle" x="1591" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">abstract commands, no SBA</text>
<text text-anchor="middle" x="1591" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">management&#45;hart&#45;only reset</text>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1883.5,-683.48C1883.5,-683.48 1762.5,-683.48 1762.5,-683.48 1756.5,-683.48 1750.5,-677.48 1750.5,-671.48 1750.5,-671.48 1750.5,-650.48 1750.5,-650.48 1750.5,-644.48 1756.5,-638.48 1762.5,-638.48 1762.5,-638.48 1883.5,-638.48 1883.5,-638.48 1889.5,-638.48 1895.5,-644.48 1895.5,-650.48 1895.5,-650.48 1895.5,-671.48 1895.5,-671.48 1895.5,-677.48 1889.5,-683.48 1883.5,-683.48"/>
<text text-anchor="middle" x="1823" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 Debug Module</text>
<text text-anchor="middle" x="1823" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">abstract commands, no SBA</text>
<text text-anchor="middle" x="1823" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">management&#45;hart&#45;only reset</text>
</g>
<!-- jtag_dtm&#45;&gt;debug_module -->
<g id="edge4" class="edge">
<title>jtag_dtm&#45;&gt;debug_module</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1402.33,-660.98C1437.12,-660.98 1476.91,-660.98 1510.95,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1511.12,-663.43 1518.12,-660.98 1511.12,-658.53 1511.12,-663.43"/>
<text text-anchor="middle" x="1460.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">DMI, asynchronous CDC</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1634.33,-660.98C1669.12,-660.98 1708.91,-660.98 1742.95,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1743.12,-663.43 1750.12,-660.98 1743.12,-658.53 1743.12,-663.43"/>
<text text-anchor="middle" x="1692.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">DMI, asynchronous CDC</text>
</g>
<!-- debug_module&#45;&gt;mgmt_core -->
<g id="edge5" class="edge">
<title>debug_module&#45;&gt;mgmt_core</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1663.75,-660.98C1704.99,-660.98 1757.09,-660.98 1801.69,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1801.77,-663.43 1808.77,-660.98 1801.77,-658.53 1801.77,-663.43"/>
<text text-anchor="middle" x="1736.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">halt, resume, abstract commands</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1895.75,-660.98C1936.99,-660.98 1989.09,-660.98 2033.69,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2033.77,-663.43 2040.77,-660.98 2033.77,-658.53 2033.77,-663.43"/>
<text text-anchor="middle" x="1968.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">halt, resume, abstract commands</text>
</g>
<!-- debug_module&#45;&gt;mgmt_adapter -->
<g id="edge6" class="edge">
<title>debug_module&#45;&gt;mgmt_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1645.86,-638.48C1692.97,-620.01 1759.73,-593.84 1801.68,-577.4"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1802.82,-579.58 1808.45,-574.75 1801.04,-575.02 1802.82,-579.58"/>
<text text-anchor="middle" x="1761" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">reset after bridge idle</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1873.69,-638.48C1916.13,-620.48 1975.82,-595.15 2014.7,-578.66"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2015.75,-580.87 2021.23,-575.89 2013.83,-576.36 2015.75,-580.87"/>
<text text-anchor="middle" x="1983" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">reset after bridge idle</text>
</g>
<!-- timers -->
<g id="node22" class="node">
<title>timers</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1681.5,-255C1681.5,-255 1500.5,-255 1500.5,-255 1494.5,-255 1488.5,-249 1488.5,-243 1488.5,-243 1488.5,-222 1488.5,-222 1488.5,-216 1494.5,-210 1500.5,-210 1500.5,-210 1681.5,-210 1681.5,-210 1687.5,-210 1693.5,-216 1693.5,-222 1693.5,-222 1693.5,-243 1693.5,-243 1693.5,-249 1687.5,-255 1681.5,-255"/>
<text text-anchor="middle" x="1591" y="-241" font-family="Arial" font-size="10.00" fill="#111827">General timers 0/1</text>
<text text-anchor="middle" x="1591" y="-230" font-family="Arial" font-size="10.00" fill="#111827">32&#45;bit counter, 16&#45;bit prescaler</text>
<text text-anchor="middle" x="1591" y="-219" font-family="Arial" font-size="10.00" fill="#111827">periodic / one&#45;shot, compare, debug freeze</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1913.5,-255C1913.5,-255 1732.5,-255 1732.5,-255 1726.5,-255 1720.5,-249 1720.5,-243 1720.5,-243 1720.5,-222 1720.5,-222 1720.5,-216 1726.5,-210 1732.5,-210 1732.5,-210 1913.5,-210 1913.5,-210 1919.5,-210 1925.5,-216 1925.5,-222 1925.5,-222 1925.5,-243 1925.5,-243 1925.5,-249 1919.5,-255 1913.5,-255"/>
<text text-anchor="middle" x="1823" y="-241" font-family="Arial" font-size="10.00" fill="#111827">General timers 0/1</text>
<text text-anchor="middle" x="1823" y="-230" font-family="Arial" font-size="10.00" fill="#111827">32&#45;bit counter, 16&#45;bit prescaler</text>
<text text-anchor="middle" x="1823" y="-219" font-family="Arial" font-size="10.00" fill="#111827">periodic / one&#45;shot, compare, debug freeze</text>
</g>
<!-- debug_module&#45;&gt;timers -->
<g id="edge7" class="edge">
<title>debug_module&#45;&gt;timers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1591,-638.24C1591,-609.36 1591,-561.98 1591,-561.98 1591,-561.98 1591,-561.98 1591,-336 1591,-336 1591,-292.57 1591,-262.25"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1593.45,-262.24 1591,-255.24 1588.55,-262.24 1593.45,-262.24"/>
<text text-anchor="middle" x="1602" y="-444.84" font-family="Arial" font-size="8.00" fill="#374151">halted</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1823,-638.24C1823,-609.36 1823,-561.98 1823,-561.98 1823,-561.98 1823,-561.98 1823,-336 1823,-336 1823,-292.57 1823,-262.25"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1825.45,-262.24 1823,-255.24 1820.55,-262.24 1825.45,-262.24"/>
<text text-anchor="middle" x="1834" y="-444.84" font-family="Arial" font-size="8.00" fill="#374151">halted</text>
</g>
<!-- mgmt_adapter&#45;&gt;fabric -->
<g id="edge10" class="edge">
<title>mgmt_adapter&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1841,-542.94C1841,-529.08 1841,-508.91 1841,-490.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1843.45,-490.57 1841,-483.57 1838.55,-490.57 1843.45,-490.57"/>
<text text-anchor="middle" x="1848" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2054,-542.94C2054,-529.08 2054,-508.91 2054,-490.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2056.45,-490.57 2054,-483.57 2051.55,-490.57 2056.45,-490.57"/>
<text text-anchor="middle" x="2061" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- user_core -->
<g id="node9" class="node">
<title>user_core</title>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M2171,-583.48C2171,-583.48 2095,-583.48 2095,-583.48 2089,-583.48 2083,-577.48 2083,-571.48 2083,-571.48 2083,-550.48 2083,-550.48 2083,-544.48 2089,-538.48 2095,-538.48 2095,-538.48 2171,-538.48 2171,-538.48 2177,-538.48 2183,-544.48 2183,-550.48 2183,-550.48 2183,-571.48 2183,-571.48 2183,-577.48 2177,-583.48 2171,-583.48"/>
<text text-anchor="middle" x="2133" y="-569.48" font-family="Arial" font-size="10.00" fill="#111827">Selected user core</text>
<text text-anchor="middle" x="2133" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">C0&#45;C5, one active</text>
<text text-anchor="middle" x="2133" y="-547.48" font-family="Arial" font-size="10.00" fill="#111827">PicoRV32 at C5</text>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M2384,-583.48C2384,-583.48 2308,-583.48 2308,-583.48 2302,-583.48 2296,-577.48 2296,-571.48 2296,-571.48 2296,-550.48 2296,-550.48 2296,-544.48 2302,-538.48 2308,-538.48 2308,-538.48 2384,-538.48 2384,-538.48 2390,-538.48 2396,-544.48 2396,-550.48 2396,-550.48 2396,-571.48 2396,-571.48 2396,-577.48 2390,-583.48 2384,-583.48"/>
<text text-anchor="middle" x="2346" y="-569.48" font-family="Arial" font-size="10.00" fill="#111827">Selected user core</text>
<text text-anchor="middle" x="2346" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">C0&#45;C5, one active</text>
<text text-anchor="middle" x="2346" y="-547.48" font-family="Arial" font-size="10.00" fill="#111827">PicoRV32 at C5</text>
</g>
<!-- user_core&#45;&gt;fabric -->
<g id="edge11" class="edge">
<title>user_core&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2120.39,-538.22C2111.81,-523.41 2102,-506.48 2102,-506.48 2102,-506.48 2030.85,-490.47 1962.85,-475.17"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1963.23,-472.74 1955.86,-473.59 1962.15,-477.52 1963.23,-472.74"/>
<text text-anchor="middle" x="2114" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2333.39,-538.22C2324.81,-523.41 2315,-506.48 2315,-506.48 2315,-506.48 2243.85,-490.47 2175.85,-475.17"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2176.23,-472.74 2168.86,-473.59 2175.15,-477.52 2176.23,-472.74"/>
<text text-anchor="middle" x="2327" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- dma -->
<g id="node10" class="node">
<title>dma</title>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M2589,-578.98C2589,-578.98 2471,-578.98 2471,-578.98 2465,-578.98 2459,-572.98 2459,-566.98 2459,-566.98 2459,-554.98 2459,-554.98 2459,-548.98 2465,-542.98 2471,-542.98 2471,-542.98 2589,-542.98 2589,-542.98 2595,-542.98 2601,-548.98 2601,-554.98 2601,-554.98 2601,-566.98 2601,-566.98 2601,-572.98 2595,-578.98 2589,-578.98"/>
<text text-anchor="middle" x="2530" y="-563.98" font-family="Arial" font-size="10.00" fill="#111827">DMA</text>
<text text-anchor="middle" x="2530" y="-552.98" font-family="Arial" font-size="10.00" fill="#111827">RIB master and RIBP target</text>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M2720,-578.98C2720,-578.98 2602,-578.98 2602,-578.98 2596,-578.98 2590,-572.98 2590,-566.98 2590,-566.98 2590,-554.98 2590,-554.98 2590,-548.98 2596,-542.98 2602,-542.98 2602,-542.98 2720,-542.98 2720,-542.98 2726,-542.98 2732,-548.98 2732,-554.98 2732,-554.98 2732,-566.98 2732,-566.98 2732,-572.98 2726,-578.98 2720,-578.98"/>
<text text-anchor="middle" x="2661" y="-563.98" font-family="Arial" font-size="10.00" fill="#111827">DMA</text>
<text text-anchor="middle" x="2661" y="-552.98" font-family="Arial" font-size="10.00" fill="#111827">RIB master and RIBP target</text>
</g>
<!-- dma&#45;&gt;fabric -->
<g id="edge12" class="edge">
<title>dma&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2458.86,-548.4C2345.08,-529.86 2120.28,-493.24 1975.5,-469.65"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1975.54,-467.18 1968.24,-468.47 1974.75,-472.01 1975.54,-467.18"/>
<text text-anchor="middle" x="2254" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2589.88,-546.83C2490.26,-528.41 2307.45,-494.61 2183.35,-471.66"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2183.71,-469.24 2176.38,-470.37 2182.82,-474.05 2183.71,-469.24"/>
<text text-anchor="middle" x="2418" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- uart0 -->
<g id="node19" class="node">
<title>uart0</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M3102,-255C3102,-255 2942,-255 2942,-255 2936,-255 2930,-249 2930,-243 2930,-243 2930,-222 2930,-222 2930,-216 2936,-210 2942,-210 2942,-210 3102,-210 3102,-210 3108,-210 3114,-216 3114,-222 3114,-222 3114,-243 3114,-243 3114,-249 3108,-255 3102,-255"/>
<text text-anchor="middle" x="3022" y="-241" font-family="Arial" font-size="10.00" fill="#111827">UART0 V2</text>
<text text-anchor="middle" x="3022" y="-230" font-family="Arial" font-size="10.00" fill="#111827">64&#45;byte TX/RX FIFOs, fractional baud</text>
<text text-anchor="middle" x="3022" y="-219" font-family="Arial" font-size="10.00" fill="#111827">framing/errors, IRQ2, DMA&#45;paced</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M3270,-255C3270,-255 3110,-255 3110,-255 3104,-255 3098,-249 3098,-243 3098,-243 3098,-222 3098,-222 3098,-216 3104,-210 3110,-210 3110,-210 3270,-210 3270,-210 3276,-210 3282,-216 3282,-222 3282,-222 3282,-243 3282,-243 3282,-249 3276,-255 3270,-255"/>
<text text-anchor="middle" x="3190" y="-241" font-family="Arial" font-size="10.00" fill="#111827">UART0 V2</text>
<text text-anchor="middle" x="3190" y="-230" font-family="Arial" font-size="10.00" fill="#111827">64&#45;byte TX/RX FIFOs, fractional baud</text>
<text text-anchor="middle" x="3190" y="-219" font-family="Arial" font-size="10.00" fill="#111827">framing/errors, IRQ2, DMA&#45;paced</text>
</g>
<!-- dma&#45;&gt;uart0 -->
<g id="edge37" class="edge">
<g id="edge38" class="edge">
<title>dma&#45;&gt;uart0</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2555.76,-542.89C2636.81,-489.11 2886.94,-323.13 2983.45,-259.08"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2984.83,-261.1 2989.31,-255.19 2982.12,-257.02 2984.83,-261.1"/>
<text text-anchor="middle" x="2819.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TX/RX data</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2688.7,-542.89C2775.93,-489.05 3045.31,-322.8 3148.86,-258.89"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3150.18,-260.95 3154.85,-255.19 3147.61,-256.78 3150.18,-260.95"/>
<text text-anchor="middle" x="2970.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TX/RX data</text>
</g>
<!-- i2c_controllers -->
<g id="node20" class="node">
<title>i2c_controllers</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2131.5,-255C2131.5,-255 1946.5,-255 1946.5,-255 1940.5,-255 1934.5,-249 1934.5,-243 1934.5,-243 1934.5,-222 1934.5,-222 1934.5,-216 1940.5,-210 1946.5,-210 1946.5,-210 2131.5,-210 2131.5,-210 2137.5,-210 2143.5,-216 2143.5,-222 2143.5,-222 2143.5,-243 2143.5,-243 2143.5,-249 2137.5,-255 2131.5,-255"/>
<text text-anchor="middle" x="2039" y="-241" font-family="Arial" font-size="10.00" fill="#111827">I2C0 / I2C1 V2</text>
<text text-anchor="middle" x="2039" y="-230" font-family="Arial" font-size="10.00" fill="#111827">16&#45;entry command/RX FIFOs, Sm/Fm/Fm+</text>
<text text-anchor="middle" x="2039" y="-219" font-family="Arial" font-size="10.00" fill="#111827">7/10&#45;bit, IRQ7/19, DMA&#45;paced</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2616.5,-255C2616.5,-255 2431.5,-255 2431.5,-255 2425.5,-255 2419.5,-249 2419.5,-243 2419.5,-243 2419.5,-222 2419.5,-222 2419.5,-216 2425.5,-210 2431.5,-210 2431.5,-210 2616.5,-210 2616.5,-210 2622.5,-210 2628.5,-216 2628.5,-222 2628.5,-222 2628.5,-243 2628.5,-243 2628.5,-249 2622.5,-255 2616.5,-255"/>
<text text-anchor="middle" x="2524" y="-241" font-family="Arial" font-size="10.00" fill="#111827">I2C0 / I2C1 V2</text>
<text text-anchor="middle" x="2524" y="-230" font-family="Arial" font-size="10.00" fill="#111827">16&#45;entry command/RX FIFOs, Sm/Fm/Fm+</text>
<text text-anchor="middle" x="2524" y="-219" font-family="Arial" font-size="10.00" fill="#111827">7/10&#45;bit, IRQ7/19, DMA&#45;paced</text>
</g>
<!-- dma&#45;&gt;i2c_controllers -->
<g id="edge40" class="edge">
<g id="edge41" class="edge">
<title>dma&#45;&gt;i2c_controllers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2520.78,-542.77C2488,-481.55 2379,-278 2379,-278 2379,-278 2249.95,-261.11 2150.87,-248.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2151.04,-245.69 2143.79,-247.21 2150.41,-250.55 2151.04,-245.69"/>
<text text-anchor="middle" x="2478" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">DATA_CMD / RXDATA</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2656.12,-542.77C2643.73,-499.01 2612,-387 2612,-387 2612,-387 2582,-278 2582,-278 2582,-278 2570.75,-269.37 2558.16,-259.71"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2559.37,-257.55 2552.32,-255.23 2556.38,-261.43 2559.37,-257.55"/>
<text text-anchor="middle" x="2653" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">DATA_CMD / RXDATA</text>
</g>
<!-- ws2812 -->
<g id="node23" class="node">
<title>ws2812</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2891,-255C2891,-255 2757,-255 2757,-255 2751,-255 2745,-249 2745,-243 2745,-243 2745,-222 2745,-222 2745,-216 2751,-210 2757,-210 2757,-210 2891,-210 2891,-210 2897,-210 2903,-216 2903,-222 2903,-222 2903,-243 2903,-243 2903,-249 2897,-255 2891,-255"/>
<text text-anchor="middle" x="2824" y="-241" font-family="Arial" font-size="10.00" fill="#111827">WS2812 TX</text>
<text text-anchor="middle" x="2824" y="-230" font-family="Arial" font-size="10.00" fill="#111827">24&#45;bit MSB&#45;first serializer</text>
<text text-anchor="middle" x="2824" y="-219" font-family="Arial" font-size="10.00" fill="#111827">16&#45;word FIFO, IRQ17, DMA&#45;fed</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2802,-255C2802,-255 2668,-255 2668,-255 2662,-255 2656,-249 2656,-243 2656,-243 2656,-222 2656,-222 2656,-216 2662,-210 2668,-210 2668,-210 2802,-210 2802,-210 2808,-210 2814,-216 2814,-222 2814,-222 2814,-243 2814,-243 2814,-249 2808,-255 2802,-255"/>
<text text-anchor="middle" x="2735" y="-241" font-family="Arial" font-size="10.00" fill="#111827">WS2812 TX</text>
<text text-anchor="middle" x="2735" y="-230" font-family="Arial" font-size="10.00" fill="#111827">24&#45;bit MSB&#45;first serializer</text>
<text text-anchor="middle" x="2735" y="-219" font-family="Arial" font-size="10.00" fill="#111827">16&#45;word FIFO, IRQ17, DMA&#45;fed</text>
</g>
<!-- dma&#45;&gt;ws2812 -->
<g id="edge35" class="edge">
<g id="edge36" class="edge">
<title>dma&#45;&gt;ws2812</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2538.61,-542.77C2569.22,-481.55 2671,-278 2671,-278 2671,-278 2706.24,-267.75 2742.89,-257.09"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2743.7,-259.41 2749.74,-255.1 2742.34,-254.7 2743.7,-259.41"/>
<text text-anchor="middle" x="2646.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TXDATA writes</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2664.87,-542.89C2676.87,-489.98 2713.48,-328.45 2728.48,-262.26"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2730.88,-262.78 2730.03,-255.41 2726.1,-261.7 2730.88,-262.78"/>
<text text-anchor="middle" x="2728.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TXDATA writes</text>
</g>
<!-- fault -->
<g id="node12" class="node">
<title>fault</title>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M2344.5,-464.74C2344.5,-464.74 2235.5,-464.74 2235.5,-464.74 2229.5,-464.74 2223.5,-458.74 2223.5,-452.74 2223.5,-452.74 2223.5,-440.74 2223.5,-440.74 2223.5,-434.74 2229.5,-428.74 2235.5,-428.74 2235.5,-428.74 2344.5,-428.74 2344.5,-428.74 2350.5,-428.74 2356.5,-434.74 2356.5,-440.74 2356.5,-440.74 2356.5,-452.74 2356.5,-452.74 2356.5,-458.74 2350.5,-464.74 2344.5,-464.74"/>
<text text-anchor="middle" x="2290" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">Error slave</text>
<text text-anchor="middle" x="2290" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">access and protocol faults</text>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M2557.5,-464.74C2557.5,-464.74 2448.5,-464.74 2448.5,-464.74 2442.5,-464.74 2436.5,-458.74 2436.5,-452.74 2436.5,-452.74 2436.5,-440.74 2436.5,-440.74 2436.5,-434.74 2442.5,-428.74 2448.5,-428.74 2448.5,-428.74 2557.5,-428.74 2557.5,-428.74 2563.5,-428.74 2569.5,-434.74 2569.5,-440.74 2569.5,-440.74 2569.5,-452.74 2569.5,-452.74 2569.5,-458.74 2563.5,-464.74 2557.5,-464.74"/>
<text text-anchor="middle" x="2503" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">Error slave</text>
<text text-anchor="middle" x="2503" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">access and protocol faults</text>
</g>
<!-- fabric&#45;&gt;fault -->
<g id="edge13" class="edge">
<title>fabric&#45;&gt;fault</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1954.37,-478.99C2002.41,-492.66 2047.5,-505.48 2047.5,-505.48 2047.5,-505.48 2100.5,-505.48 2100.5,-505.48 2100.5,-505.48 2210,-483.48 2210,-483.48 2210,-483.48 2226.11,-476.08 2243.88,-467.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1954.98,-476.62 1947.58,-477.06 1953.64,-481.33 1954.98,-476.62"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2245.13,-470.05 2250.47,-464.9 2243.08,-465.59 2245.13,-470.05"/>
<text text-anchor="middle" x="2074" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">invalid / denied</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2167.37,-478.99C2215.41,-492.66 2260.5,-505.48 2260.5,-505.48 2260.5,-505.48 2313.5,-505.48 2313.5,-505.48 2313.5,-505.48 2423,-483.48 2423,-483.48 2423,-483.48 2439.11,-476.08 2456.88,-467.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2167.98,-476.62 2160.58,-477.06 2166.64,-481.33 2167.98,-476.62"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2458.13,-470.05 2463.47,-464.9 2456.08,-465.59 2458.13,-470.05"/>
<text text-anchor="middle" x="2287" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">invalid / denied</text>
</g>
<!-- sram -->
<g id="node13" class="node">
<title>sram</title>
<path fill="#fff3c9" stroke="#4b5563" stroke-width="1.1" d="M2184,-464.74C2184,-464.74 2086,-464.74 2086,-464.74 2080,-464.74 2074,-458.74 2074,-452.74 2074,-452.74 2074,-440.74 2074,-440.74 2074,-434.74 2080,-428.74 2086,-428.74 2086,-428.74 2184,-428.74 2184,-428.74 2190,-428.74 2196,-434.74 2196,-440.74 2196,-440.74 2196,-452.74 2196,-452.74 2196,-458.74 2190,-464.74 2184,-464.74"/>
<text text-anchor="middle" x="2135" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">On&#45;chip SRAM</text>
<text text-anchor="middle" x="2135" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">optional RIB2RAM path</text>
<path fill="#fff3c9" stroke="#4b5563" stroke-width="1.1" d="M2397,-464.74C2397,-464.74 2299,-464.74 2299,-464.74 2293,-464.74 2287,-458.74 2287,-452.74 2287,-452.74 2287,-440.74 2287,-440.74 2287,-434.74 2293,-428.74 2299,-428.74 2299,-428.74 2397,-428.74 2397,-428.74 2403,-428.74 2409,-434.74 2409,-440.74 2409,-440.74 2409,-452.74 2409,-452.74 2409,-458.74 2403,-464.74 2397,-464.74"/>
<text text-anchor="middle" x="2348" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">On&#45;chip SRAM</text>
<text text-anchor="middle" x="2348" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">optional RIB2RAM path</text>
</g>
<!-- fabric&#45;&gt;sram -->
<g id="edge14" class="edge">
<title>fabric&#45;&gt;sram</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2020.91,-446.74C2036.95,-446.74 2052.44,-446.74 2066.56,-446.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2066.81,-449.19 2073.81,-446.74 2066.81,-444.29 2066.81,-449.19"/>
<text text-anchor="middle" x="2047.31" y="-452.34" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2233.91,-446.74C2249.95,-446.74 2265.44,-446.74 2279.56,-446.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2279.81,-449.19 2286.81,-446.74 2279.81,-444.29 2279.81,-449.19"/>
<text text-anchor="middle" x="2260.31" y="-452.34" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- ribp_adapter -->
<g id="node14" class="node">
<title>ribp_adapter</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M2059.5,-355C2059.5,-355 2018.5,-355 2018.5,-355 2012.5,-355 2006.5,-349 2006.5,-343 2006.5,-343 2006.5,-331 2006.5,-331 2006.5,-325 2012.5,-319 2018.5,-319 2018.5,-319 2059.5,-319 2059.5,-319 2065.5,-319 2071.5,-325 2071.5,-331 2071.5,-331 2071.5,-343 2071.5,-343 2071.5,-349 2065.5,-355 2059.5,-355"/>
<text text-anchor="middle" x="2039" y="-334.5" font-family="Arial" font-size="10.00" fill="#111827">RIB2RIBP</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M2274.5,-355C2274.5,-355 2233.5,-355 2233.5,-355 2227.5,-355 2221.5,-349 2221.5,-343 2221.5,-343 2221.5,-331 2221.5,-331 2221.5,-325 2227.5,-319 2233.5,-319 2233.5,-319 2274.5,-319 2274.5,-319 2280.5,-319 2286.5,-325 2286.5,-331 2286.5,-331 2286.5,-343 2286.5,-343 2286.5,-349 2280.5,-355 2274.5,-355"/>
<text text-anchor="middle" x="2254" y="-334.5" font-family="Arial" font-size="10.00" fill="#111827">RIB2RIBP</text>
</g>
<!-- fabric&#45;&gt;ribp_adapter -->
<g id="edge15" class="edge">
<title>fabric&#45;&gt;ribp_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1906.93,-409.87C1938.38,-392.75 1974.87,-372.9 2001.51,-358.4"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2002.74,-360.52 2007.72,-355.02 2000.4,-356.22 2002.74,-360.52"/>
<text text-anchor="middle" x="1970" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2120.6,-409.87C2152.37,-392.75 2189.22,-372.9 2216.13,-358.4"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2217.4,-360.5 2222.4,-355.02 2215.08,-356.18 2217.4,-360.5"/>
<text text-anchor="middle" x="2184" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- apb_adapter -->
<g id="node15" class="node">
<title>apb_adapter</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1212,-355C1212,-355 1142,-355 1142,-355 1136,-355 1130,-349 1130,-343 1130,-343 1130,-331 1130,-331 1130,-325 1136,-319 1142,-319 1142,-319 1212,-319 1212,-319 1218,-319 1224,-325 1224,-331 1224,-331 1224,-343 1224,-343 1224,-349 1218,-355 1212,-355"/>
<text text-anchor="middle" x="1177" y="-340" font-family="Arial" font-size="10.00" fill="#111827">RIB2APB</text>
<text text-anchor="middle" x="1177" y="-329" font-family="Arial" font-size="10.00" fill="#111827">direct APB bridge</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1190,-355C1190,-355 1120,-355 1120,-355 1114,-355 1108,-349 1108,-343 1108,-343 1108,-331 1108,-331 1108,-325 1114,-319 1120,-319 1120,-319 1190,-319 1190,-319 1196,-319 1202,-325 1202,-331 1202,-331 1202,-343 1202,-343 1202,-349 1196,-355 1190,-355"/>
<text text-anchor="middle" x="1155" y="-340" font-family="Arial" font-size="10.00" fill="#111827">RIB2APB</text>
<text text-anchor="middle" x="1155" y="-329" font-family="Arial" font-size="10.00" fill="#111827">direct APB bridge</text>
</g>
<!-- fabric&#45;&gt;apb_adapter -->
<g id="edge16" class="edge">
<title>fabric&#45;&gt;apb_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1713.76,-425.1C1567.99,-401.44 1335.81,-363.77 1231.21,-346.8"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1231.51,-344.36 1224.21,-345.66 1230.73,-349.2 1231.51,-344.36"/>
<text text-anchor="middle" x="1476" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2005.31,-409.89C1983.24,-393.64 1962,-378 1962,-378 1962,-378 1390.16,-349.66 1209.21,-340.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1209.28,-338.24 1202.17,-340.34 1209.04,-343.13 1209.28,-338.24"/>
<text text-anchor="middle" x="1980" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- sysctrl -->
<g id="node16" class="node">
<title>sysctrl</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1895.5,-255C1895.5,-255 1732.5,-255 1732.5,-255 1726.5,-255 1720.5,-249 1720.5,-243 1720.5,-243 1720.5,-222 1720.5,-222 1720.5,-216 1726.5,-210 1732.5,-210 1732.5,-210 1895.5,-210 1895.5,-210 1901.5,-210 1907.5,-216 1907.5,-222 1907.5,-222 1907.5,-243 1907.5,-243 1907.5,-249 1901.5,-255 1895.5,-255"/>
<text text-anchor="middle" x="1814" y="-241" font-family="Arial" font-size="10.00" fill="#111827">SYSCTRL</text>
<text text-anchor="middle" x="1814" y="-230" font-family="Arial" font-size="10.00" fill="#111827">PLL, user&#45;core select/reset/bus enable</text>
<text text-anchor="middle" x="1814" y="-219" font-family="Arial" font-size="10.00" fill="#111827">fault and performance control</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2127.5,-255C2127.5,-255 1964.5,-255 1964.5,-255 1958.5,-255 1952.5,-249 1952.5,-243 1952.5,-243 1952.5,-222 1952.5,-222 1952.5,-216 1958.5,-210 1964.5,-210 1964.5,-210 2127.5,-210 2127.5,-210 2133.5,-210 2139.5,-216 2139.5,-222 2139.5,-222 2139.5,-243 2139.5,-243 2139.5,-249 2133.5,-255 2127.5,-255"/>
<text text-anchor="middle" x="2046" y="-241" font-family="Arial" font-size="10.00" fill="#111827">SYSCTRL</text>
<text text-anchor="middle" x="2046" y="-230" font-family="Arial" font-size="10.00" fill="#111827">PLL, user&#45;core select/reset/bus enable</text>
<text text-anchor="middle" x="2046" y="-219" font-family="Arial" font-size="10.00" fill="#111827">fault and performance control</text>
</g>
<!-- ribp_adapter&#45;&gt;sysctrl -->
<g id="edge17" class="edge">
<title>ribp_adapter&#45;&gt;sysctrl</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2006.28,-321.1C1970,-304.57 1910.9,-277.64 1867.78,-258"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1868.66,-255.71 1861.27,-255.04 1866.63,-260.17 1868.66,-255.71"/>
<text text-anchor="middle" x="1955.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2221.04,-319.76C2187.47,-303.22 2134.99,-277.35 2096.24,-258.26"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2097.02,-255.91 2089.66,-255.01 2094.85,-260.31 2097.02,-255.91"/>
<text text-anchor="middle" x="2177.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;clint -->
<g id="edge18" class="edge">
<title>ribp_adapter&#45;&gt;clint</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2006.31,-333.4C1864.65,-322.11 1311,-278 1311,-278 1311,-278 819,-255 819,-255 819,-255 816.14,-254.29 811.46,-253.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="812.02,-250.75 804.63,-251.45 810.84,-255.51 812.02,-250.75"/>
<text text-anchor="middle" x="1535.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2221.42,-331.78C2118.33,-318.44 1806,-278 1806,-278 1806,-278 980,-255 980,-255 980,-255 977.14,-254.29 972.46,-253.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="973.02,-250.75 965.63,-251.45 971.84,-255.51 973.02,-250.75"/>
<text text-anchor="middle" x="1947.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_targets -->
<g id="node18" class="node">
<title>ribp_targets</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2705.5,-255C2705.5,-255 2500.5,-255 2500.5,-255 2494.5,-255 2488.5,-249 2488.5,-243 2488.5,-243 2488.5,-222 2488.5,-222 2488.5,-216 2494.5,-210 2500.5,-210 2500.5,-210 2705.5,-210 2705.5,-210 2711.5,-210 2717.5,-216 2717.5,-222 2717.5,-222 2717.5,-243 2717.5,-243 2717.5,-249 2711.5,-255 2705.5,-255"/>
<text text-anchor="middle" x="2603" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RIBP target wrapper</text>
<text text-anchor="middle" x="2603" y="-230" font-family="Arial" font-size="10.00" fill="#111827">XPI/Flash, SDRAM, PSRAM, SPI&#45;SD and DVP</text>
<text text-anchor="middle" x="2603" y="-219" font-family="Arial" font-size="10.00" fill="#111827">I2S</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M3058.5,-255C3058.5,-255 2853.5,-255 2853.5,-255 2847.5,-255 2841.5,-249 2841.5,-243 2841.5,-243 2841.5,-222 2841.5,-222 2841.5,-216 2847.5,-210 2853.5,-210 2853.5,-210 3058.5,-210 3058.5,-210 3064.5,-210 3070.5,-216 3070.5,-222 3070.5,-222 3070.5,-243 3070.5,-243 3070.5,-249 3064.5,-255 3058.5,-255"/>
<text text-anchor="middle" x="2956" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RIBP target wrapper</text>
<text text-anchor="middle" x="2956" y="-230" font-family="Arial" font-size="10.00" fill="#111827">XPI/Flash, SDRAM, PSRAM, SPI&#45;SD and DVP</text>
<text text-anchor="middle" x="2956" y="-219" font-family="Arial" font-size="10.00" fill="#111827">I2S</text>
</g>
<!-- ribp_adapter&#45;&gt;ribp_targets -->
<g id="edge19" class="edge">
<title>ribp_adapter&#45;&gt;ribp_targets</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2071.76,-330.05C2149.89,-315.85 2350.38,-279.41 2481.49,-255.58"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2482.01,-257.98 2488.46,-254.32 2481.14,-253.16 2482.01,-257.98"/>
<text text-anchor="middle" x="2363.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2286.65,-332.02C2369.61,-321.9 2582,-296 2582,-296 2582,-296 2643,-278 2643,-278 2643,-278 2828,-255 2828,-255 2828,-255 2830.29,-254.61 2834.27,-253.95"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2834.72,-256.36 2841.22,-252.78 2833.91,-251.52 2834.72,-256.36"/>
<text text-anchor="middle" x="2652.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;uart0 -->
<g id="edge20" class="edge">
<title>ribp_adapter&#45;&gt;uart0</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2071.81,-333.44C2184.81,-324.61 2551,-296 2551,-296 2551,-296 2917,-255 2917,-255 2917,-255 2919.16,-254.56 2922.87,-253.8"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2923.51,-256.17 2929.88,-252.36 2922.53,-251.37 2923.51,-256.17"/>
<text text-anchor="middle" x="2710.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2286.51,-332.83C2383.49,-323.37 2664,-296 2664,-296 2664,-296 3084,-255 3084,-255 3084,-255 3086.57,-254.48 3090.91,-253.6"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3091.48,-255.98 3097.86,-252.19 3090.51,-251.18 3091.48,-255.98"/>
<text text-anchor="middle" x="2845.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;i2c_controllers -->
<g id="edge21" class="edge">
<title>ribp_adapter&#45;&gt;i2c_controllers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2039,-318.61C2039,-303.32 2039,-280.75 2039,-262.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2041.45,-262.26 2039,-255.26 2036.55,-262.26 2041.45,-262.26"/>
<text text-anchor="middle" x="2048.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2286.91,-329.21C2342.26,-317.8 2448,-296 2448,-296 2448,-296 2471.48,-276.69 2492.33,-259.54"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2493.99,-261.35 2497.85,-255.01 2490.88,-257.56 2493.99,-261.35"/>
<text text-anchor="middle" x="2477.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- gpio_controller -->
<g id="node21" class="node">
<title>gpio_controller</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2384,-255C2384,-255 2234,-255 2234,-255 2228,-255 2222,-249 2222,-243 2222,-243 2222,-222 2222,-222 2222,-216 2228,-210 2234,-210 2234,-210 2384,-210 2384,-210 2390,-210 2396,-216 2396,-222 2396,-222 2396,-243 2396,-243 2396,-249 2390,-255 2384,-255"/>
<text text-anchor="middle" x="2309" y="-241" font-family="Arial" font-size="10.00" fill="#111827">GPIO V2</text>
<text text-anchor="middle" x="2309" y="-230" font-family="Arial" font-size="10.00" fill="#111827">user + management RIBP windows</text>
<text text-anchor="middle" x="2309" y="-219" font-family="Arial" font-size="10.00" fill="#111827">atomic I/O, filter, locks, IRQ18</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2329,-255C2329,-255 2179,-255 2179,-255 2173,-255 2167,-249 2167,-243 2167,-243 2167,-222 2167,-222 2167,-216 2173,-210 2179,-210 2179,-210 2329,-210 2329,-210 2335,-210 2341,-216 2341,-222 2341,-222 2341,-243 2341,-243 2341,-249 2335,-255 2329,-255"/>
<text text-anchor="middle" x="2254" y="-241" font-family="Arial" font-size="10.00" fill="#111827">GPIO V2</text>
<text text-anchor="middle" x="2254" y="-230" font-family="Arial" font-size="10.00" fill="#111827">user + management RIBP windows</text>
<text text-anchor="middle" x="2254" y="-219" font-family="Arial" font-size="10.00" fill="#111827">atomic I/O, filter, locks, IRQ18</text>
</g>
<!-- ribp_adapter&#45;&gt;gpio_controller -->
<g id="edge22" class="edge">
<title>ribp_adapter&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2071.57,-323.64C2114.48,-307.35 2190.87,-278.35 2245.42,-257.64"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2246.62,-259.8 2252.3,-255.03 2244.88,-255.22 2246.62,-259.8"/>
<text text-anchor="middle" x="2210" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<text text-anchor="middle" x="2210" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">user/admin</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2254,-318.61C2254,-303.32 2254,-280.75 2254,-262.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2256.45,-262.26 2254,-255.26 2251.55,-262.26 2256.45,-262.26"/>
<text text-anchor="middle" x="2274" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<text text-anchor="middle" x="2274" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">user/admin</text>
</g>
<!-- ribp_adapter&#45;&gt;timers -->
<g id="edge23" class="edge">
<title>ribp_adapter&#45;&gt;timers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2006.46,-331.91C1925.42,-321.71 1721,-296 1721,-296 1721,-296 1678.76,-275.69 1642.44,-258.23"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1643.11,-255.83 1635.74,-255.01 1640.99,-260.25 1643.11,-255.83"/>
<text text-anchor="middle" x="1730.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2221.49,-329.84C2162.31,-318.62 2043,-296 2043,-296 2043,-296 1967.92,-274.67 1905.48,-256.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1906.11,-254.57 1898.71,-255.01 1904.78,-259.28 1906.11,-254.57"/>
<text text-anchor="middle" x="2052.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;ws2812 -->
<g id="edge24" class="edge">
<title>ribp_adapter&#45;&gt;ws2812</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2071.91,-332.15C2209.43,-316.05 2731,-255 2731,-255 2731,-255 2733.58,-254.4 2737.88,-253.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2738.45,-255.79 2744.72,-251.83 2737.35,-251.02 2738.45,-255.79"/>
<text text-anchor="middle" x="2535.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2286.73,-330.52C2352.19,-319.57 2493,-296 2493,-296 2493,-296 2579.16,-273.75 2648.66,-255.8"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2649.6,-258.09 2655.76,-253.96 2648.37,-253.34 2649.6,-258.09"/>
<text text-anchor="middle" x="2566.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- apb_targets -->
<g id="node24" class="node">
<title>apb_targets</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1449.5,-255C1449.5,-255 1306.5,-255 1306.5,-255 1300.5,-255 1294.5,-249 1294.5,-243 1294.5,-243 1294.5,-222 1294.5,-222 1294.5,-216 1300.5,-210 1306.5,-210 1306.5,-210 1449.5,-210 1449.5,-210 1455.5,-210 1461.5,-216 1461.5,-222 1461.5,-222 1461.5,-243 1461.5,-243 1461.5,-249 1455.5,-255 1449.5,-255"/>
<text text-anchor="middle" x="1378" y="-241" font-family="Arial" font-size="10.00" fill="#111827">APB target wrapper</text>
<text text-anchor="middle" x="1378" y="-230" font-family="Arial" font-size="10.00" fill="#111827">UART1, PWM, RTC, watchdog</text>
<text text-anchor="middle" x="1378" y="-219" font-family="Arial" font-size="10.00" fill="#111827">CRC, advanced timer and user IP</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M781,-255C781,-255 647,-255 647,-255 641,-255 635,-249 635,-243 635,-243 635,-222 635,-222 635,-216 641,-210 647,-210 647,-210 781,-210 781,-210 787,-210 793,-216 793,-222 793,-222 793,-243 793,-243 793,-249 787,-255 781,-255"/>
<text text-anchor="middle" x="714" y="-241" font-family="Arial" font-size="10.00" fill="#111827">APB target wrapper</text>
<text text-anchor="middle" x="714" y="-230" font-family="Arial" font-size="10.00" fill="#111827">UART1, PWM, watchdog, CRC</text>
<text text-anchor="middle" x="714" y="-219" font-family="Arial" font-size="10.00" fill="#111827">advanced timer and user IP</text>
</g>
<!-- apb_adapter&#45;&gt;apb_targets -->
<g id="edge28" class="edge">
<g id="edge29" class="edge">
<title>apb_adapter&#45;&gt;apb_targets</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1210.64,-318.84C1243.08,-302.3 1292.51,-277.1 1329.25,-258.36"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1330.37,-260.54 1335.5,-255.17 1328.15,-256.17 1330.37,-260.54"/>
<text text-anchor="middle" x="1297" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1107.67,-320.22C1105.37,-319.46 1104,-319 1104,-319 1104,-319 807,-255 807,-255 807,-255 804.42,-254.4 800.12,-253.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="800.65,-251.02 793.28,-251.83 799.55,-255.79 800.65,-251.02"/>
<text text-anchor="middle" x="998" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- apb_adapter&#45;&gt;rtc -->
<g id="edge28" class="edge">
<title>apb_adapter&#45;&gt;rtc</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1107.67,-320.22C1105.37,-319.46 1104,-319 1104,-319 1104,-319 898,-296 898,-296 898,-296 622,-255 622,-255 622,-255 619.46,-254.55 615.1,-253.77"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="615.44,-251.35 608.12,-252.53 614.58,-256.17 615.44,-251.35"/>
<text text-anchor="middle" x="906" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- archinfo -->
<g id="node25" class="node">
<g id="node26" class="node">
<title>archinfo</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1048,-255C1048,-255 844,-255 844,-255 838,-255 832,-249 832,-243 832,-243 832,-222 832,-222 832,-216 838,-210 844,-210 844,-210 1048,-210 1048,-210 1054,-210 1060,-216 1060,-222 1060,-222 1060,-243 1060,-243 1060,-249 1054,-255 1048,-255"/>
<text text-anchor="middle" x="946" y="-241" font-family="Arial" font-size="10.00" fill="#111827">ARCHINFO V2</text>
<text text-anchor="middle" x="946" y="-230" font-family="Arial" font-size="10.00" fill="#111827">read&#45;only build, topology and technology identity</text>
<text text-anchor="middle" x="946" y="-219" font-family="Arial" font-size="10.00" fill="#111827">lifecycle&#45;gated 128&#45;bit device ID</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1416,-255C1416,-255 1212,-255 1212,-255 1206,-255 1200,-249 1200,-243 1200,-243 1200,-222 1200,-222 1200,-216 1206,-210 1212,-210 1212,-210 1416,-210 1416,-210 1422,-210 1428,-216 1428,-222 1428,-222 1428,-243 1428,-243 1428,-249 1422,-255 1416,-255"/>
<text text-anchor="middle" x="1314" y="-241" font-family="Arial" font-size="10.00" fill="#111827">ARCHINFO V2</text>
<text text-anchor="middle" x="1314" y="-230" font-family="Arial" font-size="10.00" fill="#111827">read&#45;only build, topology and technology identity</text>
<text text-anchor="middle" x="1314" y="-219" font-family="Arial" font-size="10.00" fill="#111827">lifecycle&#45;gated 128&#45;bit device ID</text>
</g>
<!-- apb_adapter&#45;&gt;archinfo -->
<g id="edge25" class="edge">
<title>apb_adapter&#45;&gt;archinfo</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1138.6,-318.96C1101.01,-302.28 1043.38,-276.71 1000.95,-257.88"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1001.93,-255.64 994.54,-255.04 999.95,-260.12 1001.93,-255.64"/>
<text text-anchor="middle" x="1090" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1180.93,-318.91C1206.88,-301.8 1243,-278 1243,-278 1243,-278 1257.27,-269.06 1273.01,-259.19"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1274.7,-261.02 1279.33,-255.23 1272.1,-256.87 1274.7,-261.02"/>
<text text-anchor="middle" x="1251" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- rng -->
<g id="node26" class="node">
<g id="node27" class="node">
<title>rng</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M620,-255C620,-255 406,-255 406,-255 400,-255 394,-249 394,-243 394,-243 394,-222 394,-222 394,-216 400,-210 406,-210 406,-210 620,-210 620,-210 626,-210 632,-216 632,-222 632,-222 632,-243 632,-243 632,-249 626,-255 620,-255"/>
<text text-anchor="middle" x="513" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RNG V2 entropy controller</text>
<text text-anchor="middle" x="513" y="-230" font-family="Arial" font-size="10.00" fill="#111827">8&#45;word FIFO, fail&#45;closed monitoring, IRQ16</text>
<text text-anchor="middle" x="513" y="-219" font-family="Arial" font-size="10.00" fill="#111827">management&#45;only, deterministic source unqualified</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1681,-255C1681,-255 1467,-255 1467,-255 1461,-255 1455,-249 1455,-243 1455,-243 1455,-222 1455,-222 1455,-216 1461,-210 1467,-210 1467,-210 1681,-210 1681,-210 1687,-210 1693,-216 1693,-222 1693,-222 1693,-243 1693,-243 1693,-249 1687,-255 1681,-255"/>
<text text-anchor="middle" x="1574" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RNG V2 entropy controller</text>
<text text-anchor="middle" x="1574" y="-230" font-family="Arial" font-size="10.00" fill="#111827">8&#45;word FIFO, fail&#45;closed monitoring, IRQ16</text>
<text text-anchor="middle" x="1574" y="-219" font-family="Arial" font-size="10.00" fill="#111827">management&#45;only, deterministic source unqualified</text>
</g>
<!-- apb_adapter&#45;&gt;rng -->
<g id="edge26" class="edge">
<title>apb_adapter&#45;&gt;rng</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1129.88,-328.81C999.92,-308.99 646,-255 646,-255 646,-255 643.51,-254.6 639.2,-253.9"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="639.57,-251.48 632.27,-252.78 638.79,-256.32 639.57,-251.48"/>
<text text-anchor="middle" x="919" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1202.25,-324.44C1269.14,-308.08 1392.89,-277.81 1479.15,-256.7"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1479.86,-259.05 1486.08,-255.01 1478.7,-254.29 1479.86,-259.05"/>
<text text-anchor="middle" x="1397" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- ps2 -->
<g id="node27" class="node">
<g id="node28" class="node">
<title>ps2</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1255,-255C1255,-255 1099,-255 1099,-255 1093,-255 1087,-249 1087,-243 1087,-243 1087,-222 1087,-222 1087,-216 1093,-210 1099,-210 1099,-210 1255,-210 1255,-210 1261,-210 1267,-216 1267,-222 1267,-222 1267,-243 1267,-243 1267,-249 1261,-255 1255,-255"/>
<text text-anchor="middle" x="1177" y="-241" font-family="Arial" font-size="10.00" fill="#111827">PS/2 host V2</text>
<text text-anchor="middle" x="1177" y="-230" font-family="Arial" font-size="10.00" fill="#111827">bidirectional open&#45;drain transport</text>
<text text-anchor="middle" x="1177" y="-219" font-family="Arial" font-size="10.00" fill="#111827">16&#45;byte RX/TX FIFOs, errors, IRQ12</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1161,-255C1161,-255 1005,-255 1005,-255 999,-255 993,-249 993,-243 993,-243 993,-222 993,-222 993,-216 999,-210 1005,-210 1005,-210 1161,-210 1161,-210 1167,-210 1173,-216 1173,-222 1173,-222 1173,-243 1173,-243 1173,-249 1167,-255 1161,-255"/>
<text text-anchor="middle" x="1083" y="-241" font-family="Arial" font-size="10.00" fill="#111827">PS/2 host V2</text>
<text text-anchor="middle" x="1083" y="-230" font-family="Arial" font-size="10.00" fill="#111827">bidirectional open&#45;drain transport</text>
<text text-anchor="middle" x="1083" y="-219" font-family="Arial" font-size="10.00" fill="#111827">16&#45;byte RX/TX FIFOs, errors, IRQ12</text>
</g>
<!-- apb_adapter&#45;&gt;ps2 -->
<g id="edge27" class="edge">
<title>apb_adapter&#45;&gt;ps2</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1177,-318.61C1177,-303.32 1177,-280.75 1177,-262.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1179.45,-262.26 1177,-255.26 1174.55,-262.26 1179.45,-262.26"/>
<text text-anchor="middle" x="1185" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1142.79,-318.61C1131.76,-302.91 1115.33,-279.53 1102.49,-261.25"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1104.31,-259.58 1098.28,-255.26 1100.3,-262.4 1104.31,-259.58"/>
<text text-anchor="middle" x="1133" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- irq -->
<g id="node29" class="node">
<g id="node30" class="node">
<title>irq</title>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1891,-155C1891,-155 1685,-155 1685,-155 1679,-155 1673,-149 1673,-143 1673,-143 1673,-131 1673,-131 1673,-125 1679,-119 1685,-119 1685,-119 1891,-119 1891,-119 1897,-119 1903,-125 1903,-131 1903,-131 1903,-143 1903,-143 1903,-149 1897,-155 1891,-155"/>
<text text-anchor="middle" x="1788" y="-140" font-family="Arial" font-size="10.00" fill="#111827">Interrupt aggregation</text>
<text text-anchor="middle" x="1788" y="-129" font-family="Arial" font-size="10.00" fill="#111827">RIBP and APB target IRQs to management core</text>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1926,-155C1926,-155 1720,-155 1720,-155 1714,-155 1708,-149 1708,-143 1708,-143 1708,-131 1708,-131 1708,-125 1714,-119 1720,-119 1720,-119 1926,-119 1926,-119 1932,-119 1938,-125 1938,-131 1938,-131 1938,-143 1938,-143 1938,-149 1932,-155 1926,-155"/>
<text text-anchor="middle" x="1823" y="-140" font-family="Arial" font-size="10.00" fill="#111827">Interrupt aggregation</text>
<text text-anchor="middle" x="1823" y="-129" font-family="Arial" font-size="10.00" fill="#111827">RIBP and APB target IRQs to management core</text>
</g>
<!-- clint&#45;&gt;irq -->
<g id="edge33" class="edge">
<g id="edge34" class="edge">
<title>clint&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M804.63,-213.55C813.22,-211.43 819,-210 819,-210 819,-210 1404.6,-166.49 1665.32,-147.12"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1665.76,-149.54 1672.56,-146.58 1665.4,-144.65 1665.76,-149.54"/>
<text text-anchor="middle" x="1283.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">machine IRQ0 / IRQ1</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M965.63,-213.55C974.22,-211.43 980,-210 980,-210 980,-210 1309,-178 1309,-178 1309,-178 1548.78,-159.34 1700.8,-147.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1701.18,-149.94 1707.97,-146.95 1700.8,-145.05 1701.18,-149.94"/>
<text text-anchor="middle" x="1347.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">machine IRQ0 / IRQ1</text>
</g>
<!-- ribp_targets&#45;&gt;ext_io -->
<g id="edge46" class="edge">
<g id="edge50" class="edge">
<title>ribp_targets&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2637.16,-205.29C2649.75,-195.63 2661,-187 2661,-187 2661,-187 2670.65,-99.32 2675.82,-52.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2635.38,-203.57 2631.32,-209.77 2638.37,-207.45 2635.38,-203.57"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2678.28,-52.44 2676.61,-45.21 2673.41,-51.9 2678.28,-52.44"/>
<text text-anchor="middle" x="2702" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">device interfaces</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2956,-202.41C2956,-162.61 2956,-91.61 2956,-52.07"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2953.55,-202.63 2956,-209.63 2958.45,-202.63 2953.55,-202.63"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2958.45,-52.07 2956,-45.07 2953.55,-52.07 2958.45,-52.07"/>
<text text-anchor="middle" x="2986" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">device interfaces</text>
</g>
<!-- ribp_targets&#45;&gt;gpio_controller -->
<g id="edge29" class="edge">
<g id="edge30" class="edge">
<title>ribp_targets&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2488.39,-232.5C2460.19,-232.5 2430.32,-232.5 2403.21,-232.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2403.02,-230.05 2396.02,-232.5 2403.02,-234.95 2403.02,-230.05"/>
<text text-anchor="middle" x="2442.25" y="-238.1" font-family="Arial" font-size="8.00" fill="#374151">alternate functions</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2841.22,-252.68C2833.08,-254.11 2828,-255 2828,-255 2828,-255 2442,-282.5 2442,-282.5 2442,-282.5 2376,-282.5 2376,-282.5 2376,-282.5 2346.02,-270.21 2315.78,-257.82"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2316.34,-255.4 2308.93,-255.01 2314.48,-259.94 2316.34,-255.4"/>
<text text-anchor="middle" x="2409" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">alternate functions</text>
</g>
<!-- uart0&#45;&gt;ext_io -->
<g id="edge47" class="edge">
<g id="edge51" class="edge">
<title>uart0&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2979.87,-205.95C2913.83,-165.91 2786.69,-88.81 2720.83,-48.87"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2979.01,-208.29 2986.26,-209.83 2981.55,-204.1 2979.01,-208.29"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2721.91,-46.66 2714.66,-45.12 2719.37,-50.85 2721.91,-46.66"/>
<text text-anchor="middle" x="2916" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">UART pads</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3159.9,-204.74C3114.81,-164.66 3030.27,-89.52 2985.52,-49.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3158.54,-206.81 3165.4,-209.63 3161.8,-203.15 3158.54,-206.81"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2987.13,-47.89 2980.27,-45.07 2983.87,-51.56 2987.13,-47.89"/>
<text text-anchor="middle" x="3124" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">UART pads</text>
</g>
<!-- uart0&#45;&gt;irq -->
<g id="edge38" class="edge">
<g id="edge39" class="edge">
<title>uart0&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2929.88,-212.64C2922.02,-211.03 2917,-210 2917,-210 2917,-210 2514,-178 2514,-178 2514,-178 2117.21,-156.14 1910.32,-144.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1910.16,-142.28 1903.04,-144.34 1909.89,-147.17 1910.16,-142.28"/>
<text text-anchor="middle" x="2631.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ2</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3097.86,-212.81C3089.44,-211.1 3084,-210 3084,-210 3084,-210 2786,-178 2786,-178 2786,-178 2204.75,-153.86 1945.4,-143.08"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1945.3,-140.63 1938.2,-142.79 1945.1,-145.52 1945.3,-140.63"/>
<text text-anchor="middle" x="2874.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ2</text>
</g>
<!-- i2c_controllers&#45;&gt;gpio_controller -->
<g id="edge39" class="edge">
<g id="edge40" class="edge">
<title>i2c_controllers&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2143.78,-232.5C2167.15,-232.5 2191.8,-232.5 2214.72,-232.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2214.77,-234.95 2221.77,-232.5 2214.77,-230.05 2214.77,-234.95"/>
<text text-anchor="middle" x="2182.75" y="-247.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO3/4 ALT1</text>
<text text-anchor="middle" x="2182.75" y="-238.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2419.1,-232.5C2395.78,-232.5 2371.19,-232.5 2348.33,-232.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2348.29,-230.05 2341.29,-232.5 2348.29,-234.95 2348.29,-230.05"/>
<text text-anchor="middle" x="2380.25" y="-247.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO3/4 ALT1</text>
<text text-anchor="middle" x="2380.25" y="-238.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text>
</g>
<!-- i2c_controllers&#45;&gt;irq -->
<g id="edge41" class="edge">
<g id="edge42" class="edge">
<title>i2c_controllers&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1981.1,-209.93C1938.72,-194.15 1881.69,-172.9 1840.61,-157.6"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1841.31,-155.25 1833.9,-155.1 1839.6,-159.84 1841.31,-155.25"/>
<text text-anchor="middle" x="1937.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ7 / IRQ19</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2419.43,-217.55C2292.69,-200.65 2079.48,-172.21 1945.26,-154.31"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1945.4,-151.85 1938.13,-153.36 1944.75,-156.71 1945.4,-151.85"/>
<text text-anchor="middle" x="2197.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ7 / IRQ19</text>
</g>
<!-- gpio_bridge -->
<g id="node28" class="node">
<g id="node29" class="node">
<title>gpio_bridge</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M2612.5,-155C2612.5,-155 2477.5,-155 2477.5,-155 2471.5,-155 2465.5,-149 2465.5,-143 2465.5,-143 2465.5,-131 2465.5,-131 2465.5,-125 2471.5,-119 2477.5,-119 2477.5,-119 2612.5,-119 2612.5,-119 2618.5,-119 2624.5,-125 2624.5,-131 2624.5,-131 2624.5,-143 2624.5,-143 2624.5,-149 2618.5,-155 2612.5,-155"/>
<text text-anchor="middle" x="2545" y="-140" font-family="Arial" font-size="10.00" fill="#111827">GPIO pad bridge</text>
<text text-anchor="middle" x="2545" y="-129" font-family="Arial" font-size="10.00" fill="#111827">PDK capability&#45;adapted controls</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M2802.5,-155C2802.5,-155 2667.5,-155 2667.5,-155 2661.5,-155 2655.5,-149 2655.5,-143 2655.5,-143 2655.5,-131 2655.5,-131 2655.5,-125 2661.5,-119 2667.5,-119 2667.5,-119 2802.5,-119 2802.5,-119 2808.5,-119 2814.5,-125 2814.5,-131 2814.5,-131 2814.5,-143 2814.5,-143 2814.5,-149 2808.5,-155 2802.5,-155"/>
<text text-anchor="middle" x="2735" y="-140" font-family="Arial" font-size="10.00" fill="#111827">GPIO pad bridge</text>
<text text-anchor="middle" x="2735" y="-129" font-family="Arial" font-size="10.00" fill="#111827">PDK capability&#45;adapted controls</text>
</g>
<!-- gpio_controller&#45;&gt;gpio_bridge -->
<g id="edge30" class="edge">
<g id="edge31" class="edge">
<title>gpio_controller&#45;&gt;gpio_bridge</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2342.35,-209.74C2365.05,-194.93 2391,-178 2391,-178 2391,-178 2432.45,-167.23 2472.34,-156.87"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2473.08,-159.21 2479.24,-155.08 2471.85,-154.47 2473.08,-159.21"/>
<text text-anchor="middle" x="2411" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2341.11,-214.57C2428.22,-197.63 2561.42,-171.74 2648.37,-154.84"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2648.93,-157.23 2655.33,-153.49 2647.99,-152.42 2648.93,-157.23"/>
<text text-anchor="middle" x="2543" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g>
<!-- gpio_controller&#45;&gt;irq -->
<g id="edge31" class="edge">
<g id="edge32" class="edge">
<title>gpio_controller&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2221.8,-215.85C2130.37,-199.44 1986.83,-173.68 1890.16,-156.33"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1890.32,-153.87 1882.99,-155.05 1889.45,-158.7 1890.32,-153.87"/>
<text text-anchor="middle" x="2060" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2166.78,-212.58C2091.48,-196.24 1983.33,-172.78 1908.53,-156.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1908.75,-154.1 1901.39,-155.01 1907.72,-158.89 1908.75,-154.1"/>
<text text-anchor="middle" x="2050" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text>
</g>
<!-- timers&#45;&gt;irq -->
<g id="edge32" class="edge">
<g id="edge33" class="edge">
<title>timers&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1636.69,-209.81C1669.48,-194.25 1713.36,-173.43 1745.41,-158.21"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1746.79,-160.27 1752.07,-155.05 1744.69,-155.84 1746.79,-160.27"/>
<text text-anchor="middle" x="1723.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ3 / IRQ4</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1823,-209.81C1823,-195.66 1823,-177.17 1823,-162.49"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1825.45,-162.2 1823,-155.2 1820.55,-162.2 1825.45,-162.2"/>
<text text-anchor="middle" x="1845.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ3 / IRQ4</text>
</g>
<!-- ws2812&#45;&gt;gpio_bridge -->
<g id="edge34" class="edge">
<g id="edge35" class="edge">
<title>ws2812&#45;&gt;gpio_bridge</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2759.64,-209.93C2712.34,-194.08 2648.62,-172.72 2602.91,-157.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2603.43,-155 2596.02,-155.1 2601.88,-159.64 2603.43,-155"/>
<text text-anchor="middle" x="2706.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 ALT1</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2735,-209.81C2735,-195.66 2735,-177.17 2735,-162.49"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2737.45,-162.2 2735,-155.2 2732.55,-162.2 2737.45,-162.2"/>
<text text-anchor="middle" x="2757.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 ALT1</text>
</g>
<!-- ws2812&#45;&gt;irq -->
<g id="edge36" class="edge">
<g id="edge37" class="edge">
<title>ws2812&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2744.72,-213.17C2736.45,-211.26 2731,-210 2731,-210 2731,-210 2488,-187 2488,-187 2488,-187 2433,-178 2433,-178 2433,-178 2097.52,-157.2 1910.45,-145.59"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1910.45,-143.14 1903.31,-145.15 1910.15,-148.03 1910.45,-143.14"/>
<text text-anchor="middle" x="2500" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2655.72,-213.17C2647.45,-211.26 2642,-210 2642,-210 2642,-210 2173.51,-168.81 1945.19,-148.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1945.36,-146.3 1938.17,-148.13 1944.93,-151.18 1945.36,-146.3"/>
<text text-anchor="middle" x="2389" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text>
</g>
<!-- apb_targets&#45;&gt;gpio_controller -->
<g id="edge45" class="edge">
<g id="edge49" class="edge">
<title>apb_targets&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1461.51,-251.87C1469.67,-253.76 1475,-255 1475,-255 1475,-255 1746,-282.5 1746,-282.5 1746,-282.5 1782,-282.5 1782,-282.5 1782,-282.5 2157,-255 2157,-255 2157,-255 2183.74,-251.04 2214.79,-246.45"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2215.34,-248.84 2221.9,-245.39 2214.62,-243.99 2215.34,-248.84"/>
<text text-anchor="middle" x="1764" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M793.28,-251.68C801.55,-253.68 807,-255 807,-255 807,-255 1764,-282.5 1764,-282.5 1764,-282.5 1800,-282.5 1800,-282.5 1800,-282.5 2153,-255 2153,-255 2153,-255 2155.42,-254.46 2159.52,-253.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2160.32,-255.88 2166.62,-251.97 2159.26,-251.1 2160.32,-255.88"/>
<text text-anchor="middle" x="1782" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text>
</g>
<!-- rtc&#45;&gt;sysctrl -->
<g id="edge48" class="edge">
<title>rtc&#45;&gt;sysctrl</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M608.12,-252.42C616.62,-254 622,-255 622,-255 622,-255 1572,-282.5 1572,-282.5 1572,-282.5 1630,-282.5 1630,-282.5 1630,-282.5 1939,-255 1939,-255 1939,-255 1941.31,-254.51 1945.25,-253.68"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1945.77,-256.08 1952.12,-252.24 1944.77,-251.28 1945.77,-256.08"/>
<text text-anchor="middle" x="1601" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">wake live / sticky</text>
</g>
<!-- rtc&#45;&gt;irq -->
<g id="edge47" class="edge">
<title>rtc&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M608.12,-212.47C616.62,-210.96 622,-210 622,-210 622,-210 1395.02,-163.66 1700.71,-145.33"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1701,-147.77 1707.84,-144.9 1700.71,-142.88 1701,-147.77"/>
<text text-anchor="middle" x="1162" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ13</text>
</g>
<!-- rng&#45;&gt;irq -->
<g id="edge42" class="edge">
<g id="edge43" class="edge">
<title>rng&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M632.27,-212.22C640.72,-210.85 646,-210 646,-210 646,-210 1102,-178 1102,-178 1102,-178 1468.29,-156.64 1665.56,-145.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1665.95,-147.57 1672.79,-144.72 1665.66,-142.68 1665.95,-147.57"/>
<text text-anchor="middle" x="1114" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ16</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1631.44,-209.93C1673.48,-194.15 1730.06,-172.9 1770.81,-157.6"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1771.78,-159.85 1777.47,-155.1 1770.05,-155.26 1771.78,-159.85"/>
<text text-anchor="middle" x="1725" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ16</text>
</g>
<!-- ps2&#45;&gt;gpio_controller -->
<g id="edge43" class="edge">
<g id="edge44" class="edge">
<title>ps2&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1267.4,-252.06C1275.66,-253.85 1281,-255 1281,-255 1281,-255 1807,-287 1807,-287 1807,-287 1859,-287 1859,-287 1859,-287 2157,-255 2157,-255 2157,-255 2183.74,-251.04 2214.79,-246.45"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2215.34,-248.84 2221.9,-245.39 2214.62,-243.99 2215.34,-248.84"/>
<text text-anchor="middle" x="1833" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO0/1 ALT1</text>
<text text-anchor="middle" x="1833" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">open drain</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1173.4,-252.06C1181.66,-253.85 1187,-255 1187,-255 1187,-255 2068,-287 2068,-287 2068,-287 2120,-287 2120,-287 2120,-287 2156.8,-272.03 2191.83,-257.79"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2192.77,-260.05 2198.34,-255.14 2190.93,-255.51 2192.77,-260.05"/>
<text text-anchor="middle" x="2094" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO0/1 ALT1</text>
<text text-anchor="middle" x="2094" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">open drain</text>
</g>
<!-- ps2&#45;&gt;irq -->
<g id="edge44" class="edge">
<g id="edge45" class="edge">
<title>ps2&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1267.4,-212.81C1275.66,-211.1 1281,-210 1281,-210 1281,-210 1515.85,-176.65 1665.88,-155.34"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1666.37,-157.75 1672.95,-154.34 1665.68,-152.9 1666.37,-157.75"/>
<text text-anchor="middle" x="1516" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ12</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1173.4,-212.81C1181.66,-211.1 1187,-210 1187,-210 1187,-210 1516.03,-172.75 1700.77,-151.84"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1701.15,-154.26 1707.83,-151.04 1700.59,-149.39 1701.15,-154.26"/>
<text text-anchor="middle" x="1478" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ12</text>
</g>
<!-- gpio_bridge&#45;&gt;ext_io -->
<g id="edge48" class="edge">
<g id="edge52" class="edge">
<title>gpio_bridge&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2569,-113.95C2590.61,-94.09 2619,-68 2619,-68 2619,-68 2630.85,-59.21 2644.01,-49.45"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2567.17,-112.3 2563.67,-118.84 2570.49,-115.91 2567.17,-112.3"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2645.54,-51.37 2649.7,-45.23 2642.62,-47.43 2645.54,-51.37"/>
<text text-anchor="middle" x="2639" y="-70.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2775.14,-115.57C2812.1,-96.75 2867.05,-68.78 2906.67,-48.61"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2773.69,-113.55 2768.57,-118.91 2775.91,-117.92 2773.69,-113.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2908.26,-50.55 2913.39,-45.19 2906.04,-46.18 2908.26,-50.55"/>
<text text-anchor="middle" x="2885" y="-70.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 52 KiB

+56 -16
View File
@@ -30,6 +30,7 @@ interface sysctrl_if ();
logic [ 63:0] perf_sdram_wait_i;
logic [ 63:0] perf_psram_wait_i;
logic [ 63:0] perf_flash_wait_i;
logic rtc_wake_i;
logic test_done_o;
logic test_pass_o;
logic [ 7:0] test_code_o;
@@ -48,6 +49,7 @@ interface sysctrl_if ();
input perf_sdram_wait_i,
input perf_psram_wait_i,
input perf_flash_wait_i,
input rtc_wake_i,
output core_sel_o,
output core_reset_o,
output user_bus_enable_o,
@@ -127,6 +129,8 @@ module ribp_sysctrl (
sysctrl_offset_t'(`SOC_SYSCTRL_PERF_FLASH_WAIT_HI_OFFSET);
localparam sysctrl_offset_t SYSCTRL_TEST_STATUS_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_TEST_STATUS_OFFSET);
localparam sysctrl_offset_t SYSCTRL_RTC_WAKE_STATUS_OFFSET =
sysctrl_offset_t'(`SOC_SYSCTRL_RTC_WAKE_STATUS_OFFSET);
logic s_ribp_wr_hdshk, s_ribp_rd_hdshk;
logic s_ribp_ready_d, s_ribp_ready_q;
@@ -180,25 +184,58 @@ module ribp_sysctrl (
logic s_test_pass_d, s_test_pass_q;
logic [7:0] s_test_code_d, s_test_code_q;
logic s_test_status_write;
logic s_rtc_wake_sync;
logic s_rtc_wake_clear;
logic s_rtc_wake_seen_d, s_rtc_wake_seen_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.resp_err = 1'b0;
assign ribp.rdata = s_ribp_rdata_q;
assign s_ribp_wr_hdshk = ribp.valid && (~s_ribp_ready_q) && (|ribp.wstrb);
assign s_ribp_rd_hdshk = ribp.valid && (~s_ribp_ready_q) && (~(|ribp.wstrb));
assign ribp.ready = s_ribp_ready_q;
assign ribp.resp_err = 1'b0;
assign ribp.rdata = s_ribp_rdata_q;
assign sysctrl.ip_sel_o = s_sysctrl_ipsel_q;
assign sysctrl.core_sel_o = s_sysctrl_coresel_q;
assign sysctrl.core_reset_o = s_user_reset_q;
assign sysctrl.ip_sel_o = s_sysctrl_ipsel_q;
assign sysctrl.core_sel_o = s_sysctrl_coresel_q;
assign sysctrl.core_reset_o = s_user_reset_q;
assign sysctrl.user_bus_enable_o = s_user_running_q;
assign sysctrl.perf_enable_o = s_perf_enable_q;
assign sysctrl.perf_clear_o = s_perf_clear;
assign sysctrl.test_done_o = s_test_done_q;
assign sysctrl.test_pass_o = s_test_pass_q;
assign sysctrl.test_code_o = s_test_code_q;
assign pll_ctrl.req_sel_o = s_pll_cfg_q;
assign pll_ctrl.req_valid_o = s_pll_req_valid_q;
assign pll_ctrl.rsp_ready_o = 1'b1;
assign sysctrl.perf_enable_o = s_perf_enable_q;
assign sysctrl.perf_clear_o = s_perf_clear;
assign sysctrl.test_done_o = s_test_done_q;
assign sysctrl.test_pass_o = s_test_pass_q;
assign sysctrl.test_code_o = s_test_code_q;
assign pll_ctrl.req_sel_o = s_pll_cfg_q;
assign pll_ctrl.req_valid_o = s_pll_req_valid_q;
assign pll_ctrl.rsp_ready_o = 1'b1;
cdc_sync #(
.STAGE (2),
.DATA_WIDTH(1)
) u_rtc_wake_sync (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.dat_i (sysctrl.rtc_wake_i),
.dat_o (s_rtc_wake_sync)
);
assign s_rtc_wake_clear = s_ribp_wr_hdshk &&
(ribp.addr[7:0] == SYSCTRL_RTC_WAKE_STATUS_OFFSET) && ribp.wstrb[0] && ribp.wdata[1];
always_comb begin
s_rtc_wake_seen_d = s_rtc_wake_seen_q;
if (s_rtc_wake_clear) begin
s_rtc_wake_seen_d = 1'b0;
end
if (s_rtc_wake_sync) begin
s_rtc_wake_seen_d = 1'b1;
end
end
dffr #(
.DATA_WIDTH(1)
) u_rtc_wake_seen_dffr (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.dat_i (s_rtc_wake_seen_d),
.dat_o (s_rtc_wake_seen_q)
);
assign s_sysctrl_coresel_write_valid = ribp.wdata[`USER_CORESEL_WIDTH-1:0] < `USER_CORE_COUNT;
assign s_sysctrl_coresel_en = s_ribp_wr_hdshk && ribp.addr[7:0] == SYSCTRL_CORESEL_OFFSET &&
@@ -639,6 +676,9 @@ module ribp_sysctrl (
SYSCTRL_TEST_STATUS_OFFSET: s_ribp_rdata_d = {
s_test_done_q, 15'd0, s_test_code_q, 7'd0, s_test_pass_q
};
SYSCTRL_RTC_WAKE_STATUS_OFFSET: s_ribp_rdata_d = {
30'd0, s_rtc_wake_seen_q, s_rtc_wake_sync
};
default: s_ribp_rdata_d = s_ribp_rdata_q;
endcase
// verilog_format: on
+2 -1
View File
@@ -31,7 +31,8 @@
{"symbol": "PERF_PSRAM_WAIT_HI", "offset": "0x78"},
{"symbol": "PERF_FLASH_WAIT_LO", "offset": "0x7C"},
{"symbol": "PERF_FLASH_WAIT_HI", "offset": "0x80"},
{"symbol": "TEST_STATUS", "offset": "0x84"}
{"symbol": "TEST_STATUS", "offset": "0x84"},
{"symbol": "RTC_WAKE_STATUS", "offset": "0x88"}
],
"regions": [
{"symbol": "FLASH", "base": "0x00000000", "size": "0x01000000", "route": "ribp", "kind": "active", "public": true, "linker": "FLASH", "user_access": "ro", "burst": "incr4"},
+4
View File
@@ -20,7 +20,11 @@
/clusterip/ps2/rtl/apb4_ps2.sv
/clusterip/i2c/rtl/i2c_if.sv
/clusterip/spi/rtl/spi_if.sv
/clusterip/rtc/rtl/rtc_pkg.sv
/clusterip/rtc/rtl/rtc_if.sv
/clusterip/rtc/rtl/rtc_tickgen.sv
/clusterip/rtc/rtl/rtc_core.sv
/clusterip/rtc/rtl/rtc_reg.sv
/clusterip/rtc/rtl/apb4_rtc.sv
/clusterip/wdg/rtl/wdg_if.sv
/clusterip/wdg/rtl/apb4_wdg.sv
+1
View File
@@ -13,6 +13,7 @@
/clusterip/common/rtl/cdc/cdc_sync.sv
/clusterip/common/rtl/cdc/cdc_rst_ctrlr.sv
/clusterip/common/rtl/cdc/cdc_2phase.sv
/clusterip/common/rtl/cdc/async_reqack.sv
/clusterip/common/rtl/clkrst/clk_int_div.sv
/clusterip/common/rtl/clkrst/rst_sync.sv
/clusterip/common/rtl/clkrst/counter.sv
+1
View File
@@ -75,6 +75,7 @@ module sysctrl_formal_design (
assign sysctrl.perf_sdram_wait_i = '0;
assign sysctrl.perf_psram_wait_i = '0;
assign sysctrl.perf_flash_wait_i = '0;
assign sysctrl.rtc_wake_i = 1'b0;
assign pll_ctrl.req_ready_i = f_pll_req_ready;
assign pll_ctrl.rsp_active_sel_i = f_pll_active_sel;
assign pll_ctrl.rsp_active_valid_i = f_pll_active_valid;
@@ -119,6 +119,62 @@
"path": "rtl/ip/ribp/multimedia/dvp.sv",
"instance": "u_rx_async_fifo"
},
{
"name": "rtc_command",
"source": "system",
"destination": "audio",
"primitive": "async_reqack",
"path": "rtl/managed/clusterip/rtc/rtl/apb4_rtc.sv",
"instance": "u_command_mailbox"
},
{
"name": "rtc_response",
"source": "audio",
"destination": "system",
"primitive": "async_reqack",
"path": "rtl/managed/clusterip/rtc/rtl/apb4_rtc.sv",
"instance": "u_response_mailbox"
},
{
"name": "rtc_event",
"source": "audio",
"destination": "system",
"primitive": "cdc_sync",
"path": "rtl/managed/clusterip/rtc/rtl/apb4_rtc.sv",
"instance": "u_event_sync"
},
{
"name": "rtc_status",
"source": "audio",
"destination": "system",
"primitive": "cdc_sync",
"path": "rtl/managed/clusterip/rtc/rtl/apb4_rtc.sv",
"instance": "u_status_sync"
},
{
"name": "rtc_interrupt_enable",
"source": "audio",
"destination": "system",
"primitive": "cdc_sync",
"path": "rtl/managed/clusterip/rtc/rtl/apb4_rtc.sv",
"instance": "u_interrupt_enable_sync"
},
{
"name": "rtc_wake_enable",
"source": "audio",
"destination": "system",
"primitive": "cdc_sync",
"path": "rtl/managed/clusterip/rtc/rtl/apb4_rtc.sv",
"instance": "u_wake_enable_sync"
},
{
"name": "rtc_wake_status",
"source": "audio",
"destination": "system",
"primitive": "cdc_sync",
"path": "rtl/ip/ribp/peripheral/sysctrl.sv",
"instance": "u_rtc_wake_sync"
},
{
"name": "jtag_dmi",
"source": "jtag",
+3
View File
@@ -28,6 +28,9 @@
{"name": "gpio", "description": "RIBP GPIO combined interrupt", "group": "ribp", "group_bit": 11, "core_bit": 18, "signal": "gpio.irq_o"},
{"name": "i2c1", "description": "RIBP I2C1 interrupt", "group": "ribp", "group_bit": 12, "core_bit": 19, "signal": "i2c1.irq_o"}
],
"wake_sources": [
{"name": "rtc", "signal": "u_rtc_if.wake_o", "observer": "sysctrl.rtc_wake_i", "retained": false}
],
"ribp_targets": [
{"slot": 0, "name": "uart0", "interface": "u_uart_ribp_if", "regions": ["RIBP_UART0"]},
{"slot": 1, "name": "gpio", "interface": "u_gpio_ribp_if", "regions": ["RIBP_GPIO", "RIBP_GPIO_ADMIN"]},
+5
View File
@@ -45,6 +45,7 @@ DEF_VAL += -DCOMPILER_NAME='"$(CC)"'
DEF_VAL += -DCOMPILER_CFLAGS='"$(GCC_FLAGS) $(SW_WARN_FLAGS)"'
DEF_VAL += -DCOMPILER_ISA='"$(ISA_FLAGS)"'
DEF_VAL += -DRS_CLINT_TIMEBASE_HZ=$(CLINT_TIMEBASE_HZ)U
DEF_VAL += -DRS_RTC_CLOCK_HZ=$(AUD_CLK_HZ)U
ifeq ($(HAVE_CSR),YES)
DEF_VAL += -DCSR_ENABLE
endif
@@ -63,6 +64,7 @@ CRT_SRCS := $(ROOT_PATH)/crt/arch/riscv/startup.S \
$(ROOT_PATH)/crt/src/lib/printf.c \
$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/src/archinfo.c \
$(ROOT_PATH)/rtl/managed/clusterip/rng/sw/src/rng.c \
$(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/src/rtc.c \
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2.c \
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2_keyboard.c \
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2_mouse.c \
@@ -134,6 +136,7 @@ INC_PATH := -I$(SW_BUILD_DIR)/include \
-I$(ARCHINFO_METADATA_DIR) \
-I$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/rng/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/include \
-I$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/include \
-I$(ROOT_PATH)/crt/include \
$(addprefix -I,$(APP_INC_DIRS))
@@ -149,6 +152,8 @@ SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/rng/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/include \
-type f -name '*.h' 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/include \
-type f -name '*.h' 2>/dev/null)
+8 -3
View File
@@ -27,8 +27,9 @@ module ip_apb_wrapper (
uart_if.dut uart,
pwm_if.dut pwm,
ps2_if.dut ps2,
input logic [`USER_IPSEL_WIDTH-1:0] ip_sel_i,
user_gpio_if.user_ip user_gpio,
input logic [`USER_IPSEL_WIDTH-1:0] ip_sel_i,
user_gpio_if.user_ip user_gpio,
output logic rtc_wake_o,
output logic [`SOC_IRQ_APB_WIDTH-1:0] irq_o
// verilog_format: on
);
@@ -163,11 +164,15 @@ module ip_apb_wrapper (
.ps2 (ps2)
);
apb4_rtc u_apb4_rtc (
apb4_rtc #(
.RTC_CLOCK_HZ(`SOC_AUD_CLK_HZ)
) u_apb4_rtc (
.apb4(u_rtc_apb_if),
.rtc (u_rtc_if)
);
assign rtc_wake_o = u_rtc_if.wake_o;
apb4_wdg u_apb4_wdg (
.apb4(u_wdg_apb_if),
.wdg (u_wdg_if)
+3
View File
@@ -83,6 +83,7 @@ module retrosoc (
logic [ 63:0] s_perf_psram_wait;
logic [ 63:0] s_perf_flash_wait;
logic [`SOC_IRQ_VECTOR_WIDTH-1:0] s_user_irq;
logic s_rtc_wake;
assign u_sysctrl_if.fault_access_i = s_bus_fault_access;
assign u_sysctrl_if.fault_master_i = s_bus_fault_master;
@@ -100,6 +101,7 @@ module retrosoc (
assign u_sysctrl_if.perf_sdram_wait_i = s_perf_sdram_wait;
assign u_sysctrl_if.perf_psram_wait_i = s_perf_psram_wait;
assign u_sysctrl_if.perf_flash_wait_i = s_perf_flash_wait;
assign u_sysctrl_if.rtc_wake_i = s_rtc_wake;
gpio_pad_bridge u_gpio_pad_bridge (
.inner(u_gpio_if),
@@ -206,6 +208,7 @@ core_wrapper u_core_wrapper (
.ps2 (u_ps2_if),
.ip_sel_i (u_sysctrl_if.ip_sel_o),
.user_gpio (u_user_gpio_if),
.rtc_wake_o (s_rtc_wake),
.irq_o (s_apb_irq)
);
+4
View File
@@ -12,4 +12,8 @@
`define SOC_CLINT_TIMEBASE_HZ 1000000
`endif
`ifndef SOC_AUD_CLK_HZ
`define SOC_AUD_CLK_HZ 18432000
`endif
`endif
+1
View File
@@ -13,6 +13,7 @@ from typing import Any
RESET_PRIMITIVES = {"rst_sync"}
CDC_PRIMITIVES = {
"async_fifo",
"async_reqack",
"cdc_2phase",
"cdc_sync",
"edge_det",
+3
View File
@@ -28,6 +28,7 @@ TEST_SOURCES = (
"rtl/managed/clusterip/ps2/sw/src/ps2.c",
"rtl/managed/clusterip/ps2/sw/src/ps2_keyboard.c",
"rtl/managed/clusterip/ps2/sw/src/ps2_mouse.c",
"rtl/managed/clusterip/rtc/sw/src/rtc.c",
"app/media/src/video_player.c",
"app/media/src/wav_audio.c",
"tests/c/test_runtime.c",
@@ -86,6 +87,8 @@ def main() -> int:
"-I",
str(root / "rtl/managed/clusterip/ps2/sw/include"),
"-I",
str(root / "rtl/managed/clusterip/rtc/sw/include"),
"-I",
str(root / "crt/include"),
"-I",
str(root / "app/media/include"),
+1
View File
@@ -106,6 +106,7 @@ module pll_ctrl_tb;
sysctrl.user_bus_idle_i = 1'b1;
sysctrl.fault_access_i = 1'b0;
sysctrl.fault_master_i = '0;
sysctrl.rtc_wake_i = 1'b0;
#100;
rst_n_i = 1'b1;
repeat (12) @(posedge sys_clk_o);
+24 -1
View File
@@ -72,6 +72,7 @@ module sysctrl_fault_tb;
sysctrl.perf_sdram_wait_i = 64'd16;
sysctrl.perf_psram_wait_i = 64'd17;
sysctrl.perf_flash_wait_i = 64'd18;
sysctrl.rtc_wake_i = 1'b0;
pll_ctrl.req_ready_i = 1'b1;
pll_ctrl.rsp_active_sel_i = '0;
pll_ctrl.rsp_active_valid_i = 1'b0;
@@ -163,7 +164,29 @@ module sysctrl_fault_tb;
$fatal(1, "terminal test status was overwritten");
end
$display("sysctrl fault and user core control test passed");
read_register(32'h1000_B088, read_data);
if (read_data !== 32'h0000_0000) begin
$fatal(1, "RTC wake status did not reset");
end
sysctrl.rtc_wake_i = 1'b1;
repeat (4) @(posedge clk_i);
read_register(32'h1000_B088, read_data);
if (read_data !== 32'h0000_0003) begin
$fatal(1, "RTC wake live and sticky status was not recorded");
end
sysctrl.rtc_wake_i = 1'b0;
repeat (4) @(posedge clk_i);
read_register(32'h1000_B088, read_data);
if (read_data !== 32'h0000_0002) begin
$fatal(1, "RTC wake sticky status was not retained");
end
write_register(32'h1000_B088, 32'h0000_0002);
read_register(32'h1000_B088, read_data);
if (read_data !== 32'h0000_0000) begin
$fatal(1, "RTC wake sticky status W1C failed");
end
$display("sysctrl fault, user core control, and RTC wake test passed");
$finish;
end
endmodule
+14
View File
@@ -3,6 +3,7 @@
from __future__ import annotations
import json
import math
import subprocess
import sys
from pathlib import Path
@@ -50,6 +51,19 @@ def test_clock_reset_domain_inventory_matches_the_rcu() -> None:
crossing for crossing in document["crossings"] if crossing["name"] == "clint_timebase"
)
assert clint["primitive"] == "edge_det"
assert {
"rtc_command",
"rtc_response",
"rtc_event",
"rtc_status",
"rtc_interrupt_enable",
"rtc_wake_enable",
"rtc_wake_status",
} <= {crossing["name"] for crossing in document["crossings"]}
audio = next(domain for domain in document["domains"] if domain["name"] == "audio")
assert math.isclose(audio["sta"]["period_ns"], 1_000_000_000 / 18_432_000)
for profile in (ROOT / "configs").rglob("*.mk"):
assert "AUD_CLK_HZ" in profile.read_text(encoding="utf-8")
def test_clock_reset_domain_inventory_rejects_unknown_domain_and_instance(tmp_path: Path) -> None:
+4 -1
View File
@@ -67,6 +67,7 @@ def test_generated_artifacts_share_the_capacity_baseline(tmp_path: Path) -> None
assert "SOC_SYSCTRL_PLL_CFG_OFFSET 32'h00000008" in rtl
assert "SOC_SYSCTRL_PLL_STATUS_OFFSET 32'h0000001C" in rtl
assert "SOC_SYSCTRL_TEST_STATUS_OFFSET 32'h00000084" in rtl
assert "SOC_SYSCTRL_RTC_WAKE_STATUS_OFFSET 32'h00000088" in rtl
assert "SOC_ADDR_IS_RIBP(addr)" in rtl
assert "SOC_ADDR_IS_NMI" not in rtl
user_policy = rtl.split("`define SOC_USER_ADDR_READABLE", 1)[1].split(
@@ -76,6 +77,7 @@ def test_generated_artifacts_share_the_capacity_baseline(tmp_path: Path) -> None
assert "RS_SOC_SYSCTRL_PLL_CFG_OFFSET UINT32_C(0x00000008)" in header
assert "RS_SOC_SYSCTRL_PLL_STATUS_OFFSET UINT32_C(0x0000001C)" in header
assert "RS_SOC_SYSCTRL_TEST_STATUS_OFFSET UINT32_C(0x00000084)" in header
assert "RS_SOC_SYSCTRL_RTC_WAKE_STATUS_OFFSET UINT32_C(0x00000088)" in header
assert "PSRAM (wxa!ri) : ORIGIN = 0x40000000, LENGTH = 0x00800000" in linker
@@ -192,6 +194,7 @@ def test_sysctrl_fault_registers_record_and_clear_pending(tmp_path: Path) -> Non
f"+incdir+{ROOT / 'rtl/managed/clusterip/common/rtl'}",
str(ROOT / "rtl/managed/clusterip/common/rtl/interface/ribp_if.sv"),
str(ROOT / "rtl/managed/clusterip/common/rtl/utils/register.sv"),
str(ROOT / "rtl/managed/clusterip/common/rtl/cdc/cdc_sync.sv"),
str(ROOT / "rtl/ip/ribp/peripheral/pll_ctrl_if.sv"),
str(ROOT / "rtl/ip/ribp/peripheral/sysctrl.sv"),
str(ROOT / "tests/rtl/sysctrl_fault_tb.sv"),
@@ -218,7 +221,7 @@ def test_sysctrl_fault_registers_record_and_clear_pending(tmp_path: Path) -> Non
check=True,
)
result = subprocess.run([vvp, str(simulation)], text=True, capture_output=True, check=True)
assert "sysctrl fault and user core control test passed" in result.stdout
assert "sysctrl fault, user core control, and RTC wake test passed" in result.stdout
def test_pll_controller_reconfigures_and_falls_back_to_the_safe_clock(tmp_path: Path) -> None: