feat: refactor UART and Timer Interfaces; Remove Unused Components

- Deleted the UART interface and related components from the RTL design, including the UART TX/RX signals and instances.
- Removed the timer interface and its associated files from the project, including the timer definitions and references in the integration files.
- Updated the APB target configurations to reflect the removal of the UART and timer components, ensuring the IRQ and memory map configurations are consistent.
- Adjusted the formal verification properties and testbenches to exclude references to the removed components.
- Cleaned up the integration documentation to accurately describe the current state of the system without the UART and timer interfaces.
This commit is contained in:
maksyuki committed 2026-08-11 09:02:35 +08:00
1 parent 068c05bf66
commit e4e5546dbc
33 files changed
+406 -591

No files matched your search

-1
View File
@@ -76,7 +76,6 @@ jobs:
rtl/managed/clusterip/rng
rtl/managed/clusterip/rtc
rtl/managed/clusterip/spi
rtl/managed/clusterip/timer
rtl/managed/clusterip/uart
rtl/managed/clusterip/wdg
rtl/managed/third_party
-1
View File
@@ -35,7 +35,6 @@ jobs:
rtl/managed/clusterip/rng
rtl/managed/clusterip/rtc
rtl/managed/clusterip/spi
rtl/managed/clusterip/timer
rtl/managed/clusterip/uart
rtl/managed/clusterip/wdg
rtl/managed/third_party
-2
View File
@@ -5,7 +5,6 @@
#include <retrosoc/core/soc.h>
#include <retrosoc/hal/crc.h>
#include <retrosoc/hal/gpio.h>
#include <retrosoc/hal/hpuart.h>
#include <retrosoc/hal/i2c.h>
#include <retrosoc/hal/i2s.h>
#include <retrosoc/hal/lcd.h>
@@ -68,7 +67,6 @@ int main(void) {
(void)rs_shell_register("lcd", "lcd test", true, ip_lcd_test);
(void)rs_shell_register("i2s", "i2s test", false, ip_i2s_test);
(void)rs_shell_register("nor", "nor flash test", false, ip_norflash_test);
(void)rs_shell_register("uart1", "uart1 test", false, ip_hpuart_test);
(void)rs_shell_register("pcf", "pcf8563b test", true, pcf8563b_test);
#ifdef CSR_ENABLE
(void)rs_shell_register("irq", "tmr/sw irq test", true, irq_test);
-1
View File
@@ -72,7 +72,6 @@
"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": "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"},
"cluster_wdg": {"url": "https://github.com/retroSoC/wdg.git", "revision": "134be4b884efa8683b1617ceb41f17399b4bb83f", "destination": "rtl/managed/clusterip/wdg", "license": "MulanPSL-2.0"}
},
-12
View File
@@ -186,18 +186,6 @@
#define reg_dvp_recven RS_SOC_REG32(RS_SOC_RIBP_DVP_BASE, UINT32_C(0x00))
#define reg_dvp_rxdata RS_SOC_REG32(RS_SOC_RIBP_DVP_BASE, UINT32_C(0x04))
#define reg_dvp_status RS_SOC_REG32(RS_SOC_RIBP_DVP_BASE, UINT32_C(0x08))
// uart
#define reg_uart1_lcr RS_SOC_REG32(RS_SOC_APB_UART1_BASE, UINT32_C(0x00))
#define reg_uart1_div RS_SOC_REG32(RS_SOC_APB_UART1_BASE, UINT32_C(0x04))
#define reg_uart1_trx RS_SOC_REG32(RS_SOC_APB_UART1_BASE, UINT32_C(0x08))
#define reg_uart1_fcr RS_SOC_REG32(RS_SOC_APB_UART1_BASE, UINT32_C(0x0C))
#define reg_uart1_lsr RS_SOC_REG32(RS_SOC_APB_UART1_BASE, UINT32_C(0x10))
// tim3
#define reg_tim3_ctrl RS_SOC_REG32(RS_SOC_APB_TMR_BASE, UINT32_C(0x00))
#define reg_tim3_pscr RS_SOC_REG32(RS_SOC_APB_TMR_BASE, UINT32_C(0x04))
#define reg_tim3_cnt RS_SOC_REG32(RS_SOC_APB_TMR_BASE, UINT32_C(0x08))
#define reg_tim3_cmp RS_SOC_REG32(RS_SOC_APB_TMR_BASE, UINT32_C(0x0C))
#define reg_tim3_stat RS_SOC_REG32(RS_SOC_APB_TMR_BASE, UINT32_C(0x10))
#define reg_user_ip_reg0 RS_SOC_REG32(RS_SOC_APB_USER_IP_BASE, UINT32_C(0x00))
#define reg_user_ip_reg1 RS_SOC_REG32(RS_SOC_APB_USER_IP_BASE, UINT32_C(0x04))
#define reg_user_ip_reg2 RS_SOC_REG32(RS_SOC_APB_USER_IP_BASE, UINT32_C(0x08))
@@ -1,5 +0,0 @@
#ifndef RETROSOC_ADVTIM_H
#define RETROSOC_ADVTIM_H
void ip_advtim_test(void);
#endif
-5
View File
@@ -1,5 +0,0 @@
#ifndef RETROSOC_HPUART_H
#define RETROSOC_HPUART_H
void ip_hpuart_test(int argc, char **argv);
#endif
-66
View File
@@ -1,66 +0,0 @@
#include <retrosoc/core/soc.h>
#include <retrosoc/core/wait.h>
#include <retrosoc/lib/printf.h>
#include <retrosoc/hal/advanced_timer.h>
#define RS_ADVTIMER_LONG_TIMEOUT (RS_TIMEOUT_DEFAULT * 100U)
static rs_status_t rs_advtimer_init(uint32_t div, uint32_t cmp) {
if ((div == 0U) || (cmp == 0U)) {
return RS_EINVAL;
}
reg_tim3_ctrl = (uint32_t)0x0;
if (rs_wait_value(&reg_tim3_stat, 0U, RS_TIMEOUT_DEFAULT) != RS_OK) {
return RS_ETIMEOUT;
}
reg_tim3_pscr = div - 1;
reg_tim3_cmp = cmp - 1;
printf("CTRL: %d PSCR: %d CMP: %d\n", reg_tim3_ctrl, reg_tim3_pscr, reg_tim3_cmp);
return RS_OK;
}
static rs_status_t rs_advtimer_delay(uint32_t val, rs_timeout_t timeout) {
reg_tim3_ctrl = (uint32_t)0xD;
for (uint32_t i = 0U; i < val; ++i) {
if (rs_wait_value(&reg_tim3_stat, 1U, timeout) != RS_OK) {
reg_tim3_ctrl = (uint32_t)0x0;
return RS_ETIMEOUT;
}
}
reg_tim3_ctrl = (uint32_t)0x0;
return RS_OK;
}
void ip_advtim_test(void) {
printf("[APB IP] adv timer test\n");
// 'CPU_FREQ' MHz for 1ms
printf("no div test start\n");
if (rs_advtimer_init(1U, CPU_FREQ * 1000U) != RS_OK) {
printf("advanced timer initialization timed out\n");
return;
}
// advtimer_init(1, 100); // for rtl simu
for (uint32_t i = 1U; i <= 10U; ++i) {
if (rs_advtimer_delay(1000U, RS_TIMEOUT_DEFAULT) != RS_OK) {
printf("advanced timer delay timed out\n");
return;
}
printf("delay 1s\n");
}
printf("no div test done\n");
printf("div test start\n");
// 'CPU_FREQ' MHz for 1s
if (rs_advtimer_init(CPU_FREQ, 1000000U) != RS_OK) {
printf("advanced timer initialization timed out\n");
return;
}
// advtimer_init(100, 10); // for soc
for (uint32_t i = 1U; i <= 10U; ++i) {
if (rs_advtimer_delay(1U, RS_ADVTIMER_LONG_TIMEOUT) != RS_OK) {
printf("advanced timer delay timed out\n");
return;
}
printf("delay 1s\n");
}
printf("CTRL: %d PSCR: %d CMP: %d\n", reg_tim3_ctrl, reg_tim3_pscr, reg_tim3_cmp);
}
-46
View File
@@ -1,46 +0,0 @@
#include <retrosoc/core/soc.h>
#include <retrosoc/core/wait.h>
#include <retrosoc/lib/printf.h>
#include <retrosoc/hal/hpuart.h>
void ip_hpuart_test(int argc, char **argv) {
(void)argc;
(void)argv;
printf("[IP] uart test\n");
printf("[UART DIV] %x\n", reg_uart1_div);
printf("[UART LCR] %x\n", reg_uart1_lcr);
reg_uart1_div = (uint32_t)434; // 50x10^6 / 115200
reg_uart1_fcr = (uint32_t)0b1111; // clear tx and rx fifo
reg_uart1_fcr = (uint32_t)0b1100;
reg_uart1_lcr = (uint32_t)0b00011111; // 8N1, en all irq
printf("[UART DIV] %x\n", reg_uart1_div);
printf("[UART LCR] %x\n", reg_uart1_lcr);
printf("uart tx test\n");
uint32_t val = (uint32_t)0x41;
for (uint32_t i = 0U; i < 30U; ++i) {
if (rs_wait_mask(&reg_uart1_lsr, 0x100U, 0U, RS_TIMEOUT_DEFAULT) != RS_OK) {
printf("uart tx fifo timed out\n");
return;
}
reg_uart1_trx = (uint32_t)(val + i);
}
printf("uart tx test done\n");
printf("uart rx test\n");
// uint32_t rx_val = 0;
// for (int i = 0; i < 36; ++i)
// {
// while (((reg_uart1_lsr & 0x080) >> 7) == 1)
// ;
// rx_val = reg_uart1_trx;
// printf("[UART TRX] %x\n", rx_val);
// }
// printf("uart rx test done\n");
printf("uart done\n");
}
-2
View File
@@ -120,7 +120,6 @@ void rs_app_info(void) {
(void *)(uintptr_t)RS_SOC_APB_ARCHINFO_BASE);
printf(" 1 x RNG @%p\n",
(void *)(uintptr_t)RS_SOC_APB_RNG_BASE);
printf(" 1 x UART1(ADV) @%p\n", (void *)&reg_uart1_lcr);
printf(" 1 x PWM V2(4CH) @%p\n",
(void *)(uintptr_t)RS_SOC_APB_PWM_BASE);
printf(" 1 x PS2 @%p\n",
@@ -131,7 +130,6 @@ void rs_app_info(void) {
(void *)(uintptr_t)RS_SOC_APB_WDG_BASE);
printf(" 1 x CRC @%p\n",
(void *)(uintptr_t)RS_SOC_APB_CRC_BASE);
printf(" 1 x TIMER3(ADV) @%p\n", (void *)&reg_tim3_ctrl);
printf(" 1 x USER_IP(4KiB) @%p\n", (void *)&reg_user_ip_reg0);
printf("\n");
printf("#############################################################\n");
+1 -2
View File
@@ -19,8 +19,7 @@ generic-DMA request pacing.
UART0 and the generic DMA share the SoC clock domain. The existing `uart_if`
continues to own the physical RX, TX, and IRQ signals; DMA readiness is a
separate internal connection. APB UART1 is independent and is not affected by
this ABI.
separate internal connection.
## Register ABI
+1 -1
View File
@@ -152,7 +152,7 @@ digraph mini_soc_block_diagram {
];
apb_targets [
fillcolor="#E6F4EA",
label="APB target wrapper\nUART1, advanced timer\nand user IP"
label="APB target wrapper\nUser IP target"
];
pwm [
fillcolor="#E6F4EA",
+284 -285
View File
@@ -4,19 +4,19 @@
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: mini_soc_block_diagram Pages: 1 -->
<svg width="4015pt" height="905pt"
viewBox="0.00 0.00 4015.00 905.48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg width="3995pt" height="905pt"
viewBox="0.00 0.00 3995.00 905.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 901.48)">
<title>mini_soc_block_diagram</title>
<text text-anchor="middle" x="132" y="-879.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 3987,-85 3987,-85 3993,-85 3999,-91 3999,-97 3999,-97 3999,-781.48 3999,-781.48 3999,-787.48 3993,-793.48 3987,-793.48 3987,-793.48 160,-793.48 160,-793.48 154,-793.48 148,-787.48 148,-781.48 148,-781.48 148,-97 148,-97 148,-91 154,-85 160,-85"/>
<path fill="transparent" stroke="#111827" d="M160,-85C160,-85 3967,-85 3967,-85 3973,-85 3979,-91 3979,-97 3979,-97 3979,-781.48 3979,-781.48 3979,-787.48 3973,-793.48 3967,-793.48 3967,-793.48 160,-793.48 160,-793.48 154,-793.48 148,-787.48 148,-781.48 148,-781.48 148,-97 148,-97 148,-91 154,-85 160,-85"/>
<text text-anchor="middle" x="196.5" y="-778.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 3969,-103 3969,-103 3975,-103 3981,-109 3981,-115 3981,-115 3981,-738.48 3981,-738.48 3981,-744.48 3975,-750.48 3969,-750.48 3969,-750.48 390,-750.48 390,-750.48 384,-750.48 378,-744.48 378,-738.48 378,-738.48 378,-115 378,-115 378,-109 384,-103 390,-103"/>
<path fill="transparent" stroke="#94a3b8" stroke-dasharray="5,2" d="M390,-103C390,-103 3949,-103 3949,-103 3955,-103 3961,-109 3961,-115 3961,-115 3961,-738.48 3961,-738.48 3961,-744.48 3955,-750.48 3949,-750.48 3949,-750.48 390,-750.48 390,-750.48 384,-750.48 378,-744.48 378,-738.48 378,-738.48 378,-115 378,-115 378,-109 384,-103 390,-103"/>
<text text-anchor="middle" x="407.5" y="-736.88" font-family="Arial" font-size="12.00" fill="#334155">retrosoc</text>
</g>
<!-- ext_clock -->
@@ -44,61 +44,61 @@
<!-- ext_io -->
<g id="node2" class="node">
<title>ext_io</title>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M3079,-45C3079,-45 2859,-45 2859,-45 2853,-45 2847,-39 2847,-33 2847,-33 2847,-12 2847,-12 2847,-6 2853,0 2859,0 2859,0 3079,0 3079,0 3085,0 3091,-6 3091,-12 3091,-12 3091,-33 3091,-33 3091,-39 3085,-45 3079,-45"/>
<text text-anchor="middle" x="2969" y="-31" font-family="Arial" font-size="10.00" fill="#111827">External I/O and memory</text>
<text text-anchor="middle" x="2969" 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="2969" y="-9" font-family="Arial" font-size="10.00" fill="#111827">SD card, I2C, I2S, DVP, WS2812 and PWM V2</text>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M3059,-45C3059,-45 2839,-45 2839,-45 2833,-45 2827,-39 2827,-33 2827,-33 2827,-12 2827,-12 2827,-6 2833,0 2839,0 2839,0 3059,0 3059,0 3065,0 3071,-6 3071,-12 3071,-12 3071,-33 3071,-33 3071,-39 3065,-45 3059,-45"/>
<text text-anchor="middle" x="2949" y="-31" font-family="Arial" font-size="10.00" fill="#111827">External I/O and memory</text>
<text text-anchor="middle" x="2949" 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="2949" y="-9" font-family="Arial" font-size="10.00" fill="#111827">SD card, I2C, I2S, DVP, WS2812 and PWM V2</text>
</g>
<!-- ext_jtag -->
<g id="node3" class="node">
<title>ext_jtag</title>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M3018.5,-869.48C3018.5,-869.48 2887.5,-869.48 2887.5,-869.48 2881.5,-869.48 2875.5,-863.48 2875.5,-857.48 2875.5,-857.48 2875.5,-845.48 2875.5,-845.48 2875.5,-839.48 2881.5,-833.48 2887.5,-833.48 2887.5,-833.48 3018.5,-833.48 3018.5,-833.48 3024.5,-833.48 3030.5,-839.48 3030.5,-845.48 3030.5,-845.48 3030.5,-857.48 3030.5,-857.48 3030.5,-863.48 3024.5,-869.48 3018.5,-869.48"/>
<text text-anchor="middle" x="2953" y="-854.48" font-family="Arial" font-size="10.00" fill="#111827">Management JTAG</text>
<text text-anchor="middle" x="2953" y="-843.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="M2998.5,-869.48C2998.5,-869.48 2867.5,-869.48 2867.5,-869.48 2861.5,-869.48 2855.5,-863.48 2855.5,-857.48 2855.5,-857.48 2855.5,-845.48 2855.5,-845.48 2855.5,-839.48 2861.5,-833.48 2867.5,-833.48 2867.5,-833.48 2998.5,-833.48 2998.5,-833.48 3004.5,-833.48 3010.5,-839.48 3010.5,-845.48 3010.5,-845.48 3010.5,-857.48 3010.5,-857.48 3010.5,-863.48 3004.5,-869.48 2998.5,-869.48"/>
<text text-anchor="middle" x="2933" y="-854.48" font-family="Arial" font-size="10.00" fill="#111827">Management JTAG</text>
<text text-anchor="middle" x="2933" y="-843.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="M3028,-687.98C3028,-687.98 2878,-687.98 2878,-687.98 2872,-687.98 2866,-681.98 2866,-675.98 2866,-675.98 2866,-663.98 2866,-663.98 2866,-657.98 2872,-651.98 2878,-651.98 2878,-651.98 3028,-651.98 3028,-651.98 3034,-651.98 3040,-657.98 3040,-663.98 3040,-663.98 3040,-675.98 3040,-675.98 3040,-681.98 3034,-687.98 3028,-687.98"/>
<text text-anchor="middle" x="2953" y="-672.98" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 JTAG DTM</text>
<text text-anchor="middle" x="2953" y="-661.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="M3008,-687.98C3008,-687.98 2858,-687.98 2858,-687.98 2852,-687.98 2846,-681.98 2846,-675.98 2846,-675.98 2846,-663.98 2846,-663.98 2846,-657.98 2852,-651.98 2858,-651.98 2858,-651.98 3008,-651.98 3008,-651.98 3014,-651.98 3020,-657.98 3020,-663.98 3020,-663.98 3020,-675.98 3020,-675.98 3020,-681.98 3014,-687.98 3008,-687.98"/>
<text text-anchor="middle" x="2933" y="-672.98" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 JTAG DTM</text>
<text text-anchor="middle" x="2933" y="-661.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="M2953,-833.27C2953,-801.24 2953,-732.39 2953,-695.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2955.45,-695.14 2953,-688.14 2950.55,-695.14 2955.45,-695.14"/>
<text text-anchor="middle" x="2973" y="-804.08" font-family="Arial" font-size="8.00" fill="#374151">JTAG pads</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2933,-833.27C2933,-801.24 2933,-732.39 2933,-695.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2935.45,-695.14 2933,-688.14 2930.55,-695.14 2935.45,-695.14"/>
<text text-anchor="middle" x="2953" y="-804.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="M2927.66,-460.31C2927.66,-460.31 2859.98,-488.16 2859.98,-488.16 2854.43,-490.45 2842.88,-492.73 2836.88,-492.73 2836.88,-492.73 2681.12,-492.73 2681.12,-492.73 2675.12,-492.73 2663.57,-490.45 2658.02,-488.16 2658.02,-488.16 2590.34,-460.31 2590.34,-460.31 2584.79,-458.03 2584.79,-453.46 2590.34,-451.18 2590.34,-451.18 2658.02,-423.32 2658.02,-423.32 2663.57,-421.04 2675.12,-418.76 2681.12,-418.76 2681.12,-418.76 2836.88,-418.76 2836.88,-418.76 2842.88,-418.76 2854.43,-421.04 2859.98,-423.32 2859.98,-423.32 2927.66,-451.18 2927.66,-451.18 2933.21,-453.46 2933.21,-458.03 2927.66,-460.31"/>
<text text-anchor="middle" x="2759" y="-464.24" font-family="Arial" font-size="10.00" fill="#111827">RIB fabric</text>
<text text-anchor="middle" x="2759" y="-453.24" font-family="Arial" font-size="10.00" fill="#111827">3&#45;master round&#45;robin arbitration</text>
<text text-anchor="middle" x="2759" y="-442.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="M2907.66,-460.31C2907.66,-460.31 2839.98,-488.16 2839.98,-488.16 2834.43,-490.45 2822.88,-492.73 2816.88,-492.73 2816.88,-492.73 2661.12,-492.73 2661.12,-492.73 2655.12,-492.73 2643.57,-490.45 2638.02,-488.16 2638.02,-488.16 2570.34,-460.31 2570.34,-460.31 2564.79,-458.03 2564.79,-453.46 2570.34,-451.18 2570.34,-451.18 2638.02,-423.32 2638.02,-423.32 2643.57,-421.04 2655.12,-418.76 2661.12,-418.76 2661.12,-418.76 2816.88,-418.76 2816.88,-418.76 2822.88,-418.76 2834.43,-421.04 2839.98,-423.32 2839.98,-423.32 2907.66,-451.18 2907.66,-451.18 2913.21,-453.46 2913.21,-458.03 2907.66,-460.31"/>
<text text-anchor="middle" x="2739" y="-464.24" font-family="Arial" font-size="10.00" fill="#111827">RIB fabric</text>
<text text-anchor="middle" x="2739" y="-453.24" font-family="Arial" font-size="10.00" fill="#111827">3&#45;master round&#45;robin arbitration</text>
<text text-anchor="middle" x="2739" y="-442.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,-549.47C368.2,-548.24 372,-547.48 372,-547.48 372,-547.48 2575,-492.48 2575,-492.48 2575,-492.48 2599.75,-487.68 2631.1,-481.59"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2631.92,-483.92 2638.32,-480.18 2630.98,-479.11 2631.92,-483.92"/>
<text text-anchor="middle" x="1640" y="-518.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,-549.47C368.2,-548.24 372,-547.48 372,-547.48 372,-547.48 2555,-492.48 2555,-492.48 2555,-492.48 2579.75,-487.68 2611.1,-481.59"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2611.92,-483.92 2618.32,-480.18 2610.98,-479.11 2611.92,-483.92"/>
<text text-anchor="middle" x="1629" y="-518.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="M1124.5,-255C1124.5,-255 1003.5,-255 1003.5,-255 997.5,-255 991.5,-249 991.5,-243 991.5,-243 991.5,-222 991.5,-222 991.5,-216 997.5,-210 1003.5,-210 1003.5,-210 1124.5,-210 1124.5,-210 1130.5,-210 1136.5,-216 1136.5,-222 1136.5,-222 1136.5,-243 1136.5,-243 1136.5,-249 1130.5,-255 1124.5,-255"/>
<text text-anchor="middle" x="1064" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CLINT</text>
<text text-anchor="middle" x="1064" y="-230" font-family="Arial" font-size="10.00" fill="#111827">standard 64 KiB register map</text>
<text text-anchor="middle" x="1064" 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="M1104.5,-255C1104.5,-255 983.5,-255 983.5,-255 977.5,-255 971.5,-249 971.5,-243 971.5,-243 971.5,-222 971.5,-222 971.5,-216 977.5,-210 983.5,-210 983.5,-210 1104.5,-210 1104.5,-210 1110.5,-210 1116.5,-216 1116.5,-222 1116.5,-222 1116.5,-243 1116.5,-243 1116.5,-249 1110.5,-255 1104.5,-255"/>
<text text-anchor="middle" x="1044" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CLINT</text>
<text text-anchor="middle" x="1044" y="-230" font-family="Arial" font-size="10.00" fill="#111827">standard 64 KiB register map</text>
<text text-anchor="middle" x="1044" 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="M312.93,-547.47C364.4,-524.84 438,-492.48 438,-492.48 438,-492.48 616,-396 616,-396 616,-396 747,-278 747,-278 747,-278 978,-255 978,-255 978,-255 980.43,-254.39 984.46,-253.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="985.24,-255.72 991.44,-251.64 984.05,-250.96 985.24,-255.72"/>
<text text-anchor="middle" x="643.5" y="-389.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="M312.93,-547.47C364.4,-524.84 438,-492.48 438,-492.48 438,-492.48 837,-278 837,-278 837,-278 958,-255 958,-255 958,-255 960.43,-254.39 964.46,-253.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="965.24,-255.72 971.44,-251.64 964.05,-250.96 965.24,-255.72"/>
<text text-anchor="middle" x="650.5" y="-389.6" font-family="Arial" font-size="8.00" fill="#374151">1 MHz tick</text>
</g>
<!-- wdg -->
<g id="node26" class="node">
@@ -133,514 +133,513 @@
<!-- mgmt_core -->
<g id="node5" class="node">
<title>mgmt_core</title>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M3233,-692.48C3233,-692.48 3079,-692.48 3079,-692.48 3073,-692.48 3067,-686.48 3067,-680.48 3067,-680.48 3067,-659.48 3067,-659.48 3067,-653.48 3073,-647.48 3079,-647.48 3079,-647.48 3233,-647.48 3233,-647.48 3239,-647.48 3245,-653.48 3245,-659.48 3245,-659.48 3245,-680.48 3245,-680.48 3245,-686.48 3239,-692.48 3233,-692.48"/>
<text text-anchor="middle" x="3156" y="-678.48" font-family="Arial" font-size="10.00" fill="#111827">Management core</text>
<text text-anchor="middle" x="3156" y="-667.48" font-family="Arial" font-size="10.00" fill="#111827">Fixed Hazard3, branch predictor</text>
<text text-anchor="middle" x="3156" y="-656.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="M3213,-692.48C3213,-692.48 3059,-692.48 3059,-692.48 3053,-692.48 3047,-686.48 3047,-680.48 3047,-680.48 3047,-659.48 3047,-659.48 3047,-653.48 3053,-647.48 3059,-647.48 3059,-647.48 3213,-647.48 3213,-647.48 3219,-647.48 3225,-653.48 3225,-659.48 3225,-659.48 3225,-680.48 3225,-680.48 3225,-686.48 3219,-692.48 3213,-692.48"/>
<text text-anchor="middle" x="3136" y="-678.48" font-family="Arial" font-size="10.00" fill="#111827">Management core</text>
<text text-anchor="middle" x="3136" y="-667.48" font-family="Arial" font-size="10.00" fill="#111827">Fixed Hazard3, branch predictor</text>
<text text-anchor="middle" x="3136" y="-656.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="M3176.5,-587.98C3176.5,-587.98 3135.5,-587.98 3135.5,-587.98 3129.5,-587.98 3123.5,-581.98 3123.5,-575.98 3123.5,-575.98 3123.5,-563.98 3123.5,-563.98 3123.5,-557.98 3129.5,-551.98 3135.5,-551.98 3135.5,-551.98 3176.5,-551.98 3176.5,-551.98 3182.5,-551.98 3188.5,-557.98 3188.5,-563.98 3188.5,-563.98 3188.5,-575.98 3188.5,-575.98 3188.5,-581.98 3182.5,-587.98 3176.5,-587.98"/>
<text text-anchor="middle" x="3156" y="-567.48" font-family="Arial" font-size="10.00" fill="#111827">RIBP2RIB</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M3156.5,-587.98C3156.5,-587.98 3115.5,-587.98 3115.5,-587.98 3109.5,-587.98 3103.5,-581.98 3103.5,-575.98 3103.5,-575.98 3103.5,-563.98 3103.5,-563.98 3103.5,-557.98 3109.5,-551.98 3115.5,-551.98 3115.5,-551.98 3156.5,-551.98 3156.5,-551.98 3162.5,-551.98 3168.5,-557.98 3168.5,-563.98 3168.5,-563.98 3168.5,-575.98 3168.5,-575.98 3168.5,-581.98 3162.5,-587.98 3156.5,-587.98"/>
<text text-anchor="middle" x="3136" y="-567.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="M3156,-647.24C3156,-631.92 3156,-611.4 3156,-595.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3158.45,-595.12 3156,-588.12 3153.55,-595.12 3158.45,-595.12"/>
<text text-anchor="middle" x="3165.5" y="-618.08" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3136,-647.24C3136,-631.92 3136,-611.4 3136,-595.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3138.45,-595.12 3136,-588.12 3133.55,-595.12 3138.45,-595.12"/>
<text text-anchor="middle" x="3145.5" y="-618.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="M3523.5,-692.48C3523.5,-692.48 3402.5,-692.48 3402.5,-692.48 3396.5,-692.48 3390.5,-686.48 3390.5,-680.48 3390.5,-680.48 3390.5,-659.48 3390.5,-659.48 3390.5,-653.48 3396.5,-647.48 3402.5,-647.48 3402.5,-647.48 3523.5,-647.48 3523.5,-647.48 3529.5,-647.48 3535.5,-653.48 3535.5,-659.48 3535.5,-659.48 3535.5,-680.48 3535.5,-680.48 3535.5,-686.48 3529.5,-692.48 3523.5,-692.48"/>
<text text-anchor="middle" x="3463" y="-678.48" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 Debug Module</text>
<text text-anchor="middle" x="3463" y="-667.48" font-family="Arial" font-size="10.00" fill="#111827">abstract commands, no SBA</text>
<text text-anchor="middle" x="3463" y="-656.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="M3503.5,-692.48C3503.5,-692.48 3382.5,-692.48 3382.5,-692.48 3376.5,-692.48 3370.5,-686.48 3370.5,-680.48 3370.5,-680.48 3370.5,-659.48 3370.5,-659.48 3370.5,-653.48 3376.5,-647.48 3382.5,-647.48 3382.5,-647.48 3503.5,-647.48 3503.5,-647.48 3509.5,-647.48 3515.5,-653.48 3515.5,-659.48 3515.5,-659.48 3515.5,-680.48 3515.5,-680.48 3515.5,-686.48 3509.5,-692.48 3503.5,-692.48"/>
<text text-anchor="middle" x="3443" y="-678.48" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 Debug Module</text>
<text text-anchor="middle" x="3443" y="-667.48" font-family="Arial" font-size="10.00" fill="#111827">abstract commands, no SBA</text>
<text text-anchor="middle" x="3443" y="-656.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="M2971.06,-688.13C3000.11,-717.33 3054,-771.48 3054,-771.48 3054,-771.48 3259,-771.48 3259,-771.48 3259,-771.48 3350.81,-725.8 3411.25,-695.73"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3412.55,-697.82 3417.73,-692.51 3410.37,-693.44 3412.55,-697.82"/>
<text text-anchor="middle" x="3215" y="-804.08" font-family="Arial" font-size="8.00" fill="#374151">DMI, asynchronous CDC</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2951.06,-688.13C2980.11,-717.33 3034,-771.48 3034,-771.48 3034,-771.48 3239,-771.48 3239,-771.48 3239,-771.48 3330.81,-725.8 3391.25,-695.73"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3392.55,-697.82 3397.73,-692.51 3390.37,-693.44 3392.55,-697.82"/>
<text text-anchor="middle" x="3195" y="-804.08" 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="M3390.11,-669.98C3348.89,-669.98 3296.84,-669.98 3252.29,-669.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3252.21,-667.53 3245.21,-669.98 3252.21,-672.43 3252.21,-667.53"/>
<text text-anchor="middle" x="3317.75" y="-675.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="M3370.11,-669.98C3328.89,-669.98 3276.84,-669.98 3232.29,-669.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3232.21,-667.53 3225.21,-669.98 3232.21,-672.43 3232.21,-667.53"/>
<text text-anchor="middle" x="3297.75" y="-675.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="M3390.23,-647.57C3313.31,-624.94 3203,-592.48 3203,-592.48 3203,-592.48 3199.87,-591.05 3195.22,-588.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3196.03,-586.6 3188.64,-585.92 3193.99,-591.06 3196.03,-586.6"/>
<text text-anchor="middle" x="3347" y="-618.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="M3370.23,-647.57C3293.31,-624.94 3183,-592.48 3183,-592.48 3183,-592.48 3179.87,-591.05 3175.22,-588.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3176.03,-586.6 3168.64,-585.92 3173.99,-591.06 3176.03,-586.6"/>
<text text-anchor="middle" x="3327" y="-618.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="M3953.5,-255C3953.5,-255 3772.5,-255 3772.5,-255 3766.5,-255 3760.5,-249 3760.5,-243 3760.5,-243 3760.5,-222 3760.5,-222 3760.5,-216 3766.5,-210 3772.5,-210 3772.5,-210 3953.5,-210 3953.5,-210 3959.5,-210 3965.5,-216 3965.5,-222 3965.5,-222 3965.5,-243 3965.5,-243 3965.5,-249 3959.5,-255 3953.5,-255"/>
<text text-anchor="middle" x="3863" y="-241" font-family="Arial" font-size="10.00" fill="#111827">General timers 0/1</text>
<text text-anchor="middle" x="3863" 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="3863" 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="M3933.5,-255C3933.5,-255 3752.5,-255 3752.5,-255 3746.5,-255 3740.5,-249 3740.5,-243 3740.5,-243 3740.5,-222 3740.5,-222 3740.5,-216 3746.5,-210 3752.5,-210 3752.5,-210 3933.5,-210 3933.5,-210 3939.5,-210 3945.5,-216 3945.5,-222 3945.5,-222 3945.5,-243 3945.5,-243 3945.5,-249 3939.5,-255 3933.5,-255"/>
<text text-anchor="middle" x="3843" y="-241" font-family="Arial" font-size="10.00" fill="#111827">General timers 0/1</text>
<text text-anchor="middle" x="3843" 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="3843" 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="M3481.64,-647.24C3506.39,-618.36 3547,-570.98 3547,-570.98 3547,-570.98 3547,-570.98 3547,-345 3547,-345 3701.95,-290.33 3794.84,-257.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3795.91,-259.77 3801.7,-255.13 3794.28,-255.15 3795.91,-259.77"/>
<text text-anchor="middle" x="3558" y="-453.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="M3461.64,-647.24C3486.39,-618.36 3527,-570.98 3527,-570.98 3527,-570.98 3527,-570.98 3527,-345 3527,-345 3681.95,-290.33 3774.84,-257.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3775.91,-259.77 3781.7,-255.13 3774.28,-255.15 3775.91,-259.77"/>
<text text-anchor="middle" x="3538" y="-453.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="M3123.45,-551.91C3093.6,-536.25 3054,-515.48 3054,-515.48 3054,-515.48 2965.74,-497.91 2885.78,-481.99"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2885.91,-479.51 2878.56,-480.55 2884.95,-484.32 2885.91,-479.51"/>
<text text-anchor="middle" x="3078" y="-518.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3103.45,-551.91C3073.6,-536.25 3034,-515.48 3034,-515.48 3034,-515.48 2945.74,-497.91 2865.78,-481.99"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2865.91,-479.51 2858.56,-480.55 2864.95,-484.32 2865.91,-479.51"/>
<text text-anchor="middle" x="3058" y="-518.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="M3304,-592.48C3304,-592.48 3228,-592.48 3228,-592.48 3222,-592.48 3216,-586.48 3216,-580.48 3216,-580.48 3216,-559.48 3216,-559.48 3216,-553.48 3222,-547.48 3228,-547.48 3228,-547.48 3304,-547.48 3304,-547.48 3310,-547.48 3316,-553.48 3316,-559.48 3316,-559.48 3316,-580.48 3316,-580.48 3316,-586.48 3310,-592.48 3304,-592.48"/>
<text text-anchor="middle" x="3266" y="-578.48" font-family="Arial" font-size="10.00" fill="#111827">Selected user core</text>
<text text-anchor="middle" x="3266" y="-567.48" font-family="Arial" font-size="10.00" fill="#111827">C0&#45;C5, one active</text>
<text text-anchor="middle" x="3266" y="-556.48" font-family="Arial" font-size="10.00" fill="#111827">PicoRV32 at C5</text>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M3284,-592.48C3284,-592.48 3208,-592.48 3208,-592.48 3202,-592.48 3196,-586.48 3196,-580.48 3196,-580.48 3196,-559.48 3196,-559.48 3196,-553.48 3202,-547.48 3208,-547.48 3208,-547.48 3284,-547.48 3284,-547.48 3290,-547.48 3296,-553.48 3296,-559.48 3296,-559.48 3296,-580.48 3296,-580.48 3296,-586.48 3290,-592.48 3284,-592.48"/>
<text text-anchor="middle" x="3246" y="-578.48" font-family="Arial" font-size="10.00" fill="#111827">Selected user core</text>
<text text-anchor="middle" x="3246" y="-567.48" font-family="Arial" font-size="10.00" fill="#111827">C0&#45;C5, one active</text>
<text text-anchor="middle" x="3246" y="-556.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="M3215.89,-552.15C3207.79,-549.43 3202,-547.48 3202,-547.48 3202,-547.48 3091,-515.48 3091,-515.48 3091,-515.48 2982.88,-496.35 2890.04,-479.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2890.42,-477.51 2883.1,-478.7 2889.56,-482.33 2890.42,-477.51"/>
<text text-anchor="middle" x="3127" y="-518.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3195.89,-552.15C3187.79,-549.43 3182,-547.48 3182,-547.48 3182,-547.48 3071,-515.48 3071,-515.48 3071,-515.48 2962.88,-496.35 2870.04,-479.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2870.42,-477.51 2863.1,-478.7 2869.56,-482.33 2870.42,-477.51"/>
<text text-anchor="middle" x="3107" y="-518.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="M3084,-587.98C3084,-587.98 2966,-587.98 2966,-587.98 2960,-587.98 2954,-581.98 2954,-575.98 2954,-575.98 2954,-563.98 2954,-563.98 2954,-557.98 2960,-551.98 2966,-551.98 2966,-551.98 3084,-551.98 3084,-551.98 3090,-551.98 3096,-557.98 3096,-563.98 3096,-563.98 3096,-575.98 3096,-575.98 3096,-581.98 3090,-587.98 3084,-587.98"/>
<text text-anchor="middle" x="3025" y="-572.98" font-family="Arial" font-size="10.00" fill="#111827">DMA</text>
<text text-anchor="middle" x="3025" y="-561.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="M3064,-587.98C3064,-587.98 2946,-587.98 2946,-587.98 2940,-587.98 2934,-581.98 2934,-575.98 2934,-575.98 2934,-563.98 2934,-563.98 2934,-557.98 2940,-551.98 2946,-551.98 2946,-551.98 3064,-551.98 3064,-551.98 3070,-551.98 3076,-557.98 3076,-563.98 3076,-563.98 3076,-575.98 3076,-575.98 3076,-581.98 3070,-587.98 3064,-587.98"/>
<text text-anchor="middle" x="3005" y="-572.98" font-family="Arial" font-size="10.00" fill="#111827">DMA</text>
<text text-anchor="middle" x="3005" y="-561.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="M3028.45,-551.91C3030.99,-539.36 3034,-524.48 3034,-524.48 3034,-524.48 3034,-515.48 3034,-515.48 3034,-515.48 2955.99,-498.82 2883.06,-483.24"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2883.38,-480.81 2876.02,-481.74 2882.36,-485.6 2883.38,-480.81"/>
<text text-anchor="middle" x="3041" y="-518.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3008.45,-551.91C3010.99,-539.36 3014,-524.48 3014,-524.48 3014,-524.48 3014,-515.48 3014,-515.48 3014,-515.48 2935.99,-498.82 2863.06,-483.24"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2863.38,-480.81 2856.02,-481.74 2862.36,-485.6 2863.38,-480.81"/>
<text text-anchor="middle" x="3021" y="-518.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="M2985,-255C2985,-255 2825,-255 2825,-255 2819,-255 2813,-249 2813,-243 2813,-243 2813,-222 2813,-222 2813,-216 2819,-210 2825,-210 2825,-210 2985,-210 2985,-210 2991,-210 2997,-216 2997,-222 2997,-222 2997,-243 2997,-243 2997,-249 2991,-255 2985,-255"/>
<text text-anchor="middle" x="2905" y="-241" font-family="Arial" font-size="10.00" fill="#111827">UART0 V2</text>
<text text-anchor="middle" x="2905" 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="2905" 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="M2965,-255C2965,-255 2805,-255 2805,-255 2799,-255 2793,-249 2793,-243 2793,-243 2793,-222 2793,-222 2793,-216 2799,-210 2805,-210 2805,-210 2965,-210 2965,-210 2971,-210 2977,-216 2977,-222 2977,-222 2977,-243 2977,-243 2977,-249 2971,-255 2965,-255"/>
<text text-anchor="middle" x="2885" y="-241" font-family="Arial" font-size="10.00" fill="#111827">UART0 V2</text>
<text text-anchor="middle" x="2885" 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="2885" 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="edge41" class="edge">
<title>dma&#45;&gt;uart0</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M3025.77,-551.91C3026.33,-539.36 3027,-524.48 3027,-524.48 3027,-524.48 3027,-515.48 3027,-515.48 3027,-515.48 2566,-492.48 2566,-492.48 2566,-492.48 2566,-419 2566,-419 2566,-419 2605,-396 2605,-396 2605,-396 2641,-278 2641,-278 2641,-278 2799,-255 2799,-255 2799,-255 2801.57,-254.48 2805.91,-253.6"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2806.48,-255.98 2812.86,-252.19 2805.51,-251.18 2806.48,-255.98"/>
<text text-anchor="middle" x="2628.5" y="-389.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="M3005.77,-551.91C3006.33,-539.36 3007,-524.48 3007,-524.48 3007,-524.48 3007,-515.48 3007,-515.48 3007,-515.48 2546,-492.48 2546,-492.48 2546,-492.48 2546,-419 2546,-419 2546,-419 2585,-396 2585,-396 2585,-396 2621,-278 2621,-278 2621,-278 2779,-255 2779,-255 2779,-255 2781.57,-254.48 2785.91,-253.6"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2786.48,-255.98 2792.86,-252.19 2785.51,-251.18 2786.48,-255.98"/>
<text text-anchor="middle" x="2608.5" y="-389.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="M2773.5,-255C2773.5,-255 2588.5,-255 2588.5,-255 2582.5,-255 2576.5,-249 2576.5,-243 2576.5,-243 2576.5,-222 2576.5,-222 2576.5,-216 2582.5,-210 2588.5,-210 2588.5,-210 2773.5,-210 2773.5,-210 2779.5,-210 2785.5,-216 2785.5,-222 2785.5,-222 2785.5,-243 2785.5,-243 2785.5,-249 2779.5,-255 2773.5,-255"/>
<text text-anchor="middle" x="2681" y="-241" font-family="Arial" font-size="10.00" fill="#111827">I2C0 / I2C1 V2</text>
<text text-anchor="middle" x="2681" 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="2681" 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="M2753.5,-255C2753.5,-255 2568.5,-255 2568.5,-255 2562.5,-255 2556.5,-249 2556.5,-243 2556.5,-243 2556.5,-222 2556.5,-222 2556.5,-216 2562.5,-210 2568.5,-210 2568.5,-210 2753.5,-210 2753.5,-210 2759.5,-210 2765.5,-216 2765.5,-222 2765.5,-222 2765.5,-243 2765.5,-243 2765.5,-249 2759.5,-255 2753.5,-255"/>
<text text-anchor="middle" x="2661" y="-241" font-family="Arial" font-size="10.00" fill="#111827">I2C0 / I2C1 V2</text>
<text text-anchor="middle" x="2661" 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="2661" 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="edge44" class="edge">
<title>dma&#45;&gt;i2c_controllers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M3023.39,-551.76C3021.93,-536.12 3020,-515.48 3020,-515.48 3020,-515.48 2560,-492.48 2560,-492.48 2560,-492.48 2517,-396 2517,-396 2517,-396 2517,-387 2517,-387 2517,-387 2527,-278 2527,-278 2527,-278 2562.47,-267.75 2599.36,-257.09"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2600.21,-259.4 2606.26,-255.1 2598.85,-254.69 2600.21,-259.4"/>
<text text-anchor="middle" x="2558" y="-389.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="M3003.39,-551.76C3001.93,-536.12 3000,-515.48 3000,-515.48 3000,-515.48 2540,-492.48 2540,-492.48 2540,-492.48 2497,-396 2497,-396 2497,-396 2497,-387 2497,-387 2497,-387 2507,-278 2507,-278 2507,-278 2542.47,-267.75 2579.36,-257.09"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2580.21,-259.4 2586.26,-255.1 2578.85,-254.69 2580.21,-259.4"/>
<text text-anchor="middle" x="2538" y="-389.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="M2537,-255C2537,-255 2403,-255 2403,-255 2397,-255 2391,-249 2391,-243 2391,-243 2391,-222 2391,-222 2391,-216 2397,-210 2403,-210 2403,-210 2537,-210 2537,-210 2543,-210 2549,-216 2549,-222 2549,-222 2549,-243 2549,-243 2549,-249 2543,-255 2537,-255"/>
<text text-anchor="middle" x="2470" y="-241" font-family="Arial" font-size="10.00" fill="#111827">WS2812 TX</text>
<text text-anchor="middle" x="2470" y="-230" font-family="Arial" font-size="10.00" fill="#111827">24&#45;bit MSB&#45;first serializer</text>
<text text-anchor="middle" x="2470" 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="M2517,-255C2517,-255 2383,-255 2383,-255 2377,-255 2371,-249 2371,-243 2371,-243 2371,-222 2371,-222 2371,-216 2377,-210 2383,-210 2383,-210 2517,-210 2517,-210 2523,-210 2529,-216 2529,-222 2529,-222 2529,-243 2529,-243 2529,-249 2523,-255 2517,-255"/>
<text text-anchor="middle" x="2450" y="-241" font-family="Arial" font-size="10.00" fill="#111827">WS2812 TX</text>
<text text-anchor="middle" x="2450" y="-230" font-family="Arial" font-size="10.00" fill="#111827">24&#45;bit MSB&#45;first serializer</text>
<text text-anchor="middle" x="2450" 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="edge39" class="edge">
<title>dma&#45;&gt;ws2812</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2965.54,-551.94C2956.44,-549.33 2950,-547.48 2950,-547.48 2950,-547.48 2521,-492.48 2521,-492.48 2521,-492.48 2384,-396 2384,-396 2384,-396 2384,-387 2384,-387 2384,-387 2429.56,-305.68 2454.36,-261.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2456.58,-262.47 2457.86,-255.17 2452.3,-260.08 2456.58,-262.47"/>
<text text-anchor="middle" x="2411.5" y="-389.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="M2945.54,-551.94C2936.44,-549.33 2930,-547.48 2930,-547.48 2930,-547.48 2501,-492.48 2501,-492.48 2501,-492.48 2364,-396 2364,-396 2364,-396 2364,-387 2364,-387 2364,-387 2409.56,-305.68 2434.36,-261.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2436.58,-262.47 2437.86,-255.17 2432.3,-260.08 2436.58,-262.47"/>
<text text-anchor="middle" x="2391.5" y="-389.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="M3262.5,-473.74C3262.5,-473.74 3153.5,-473.74 3153.5,-473.74 3147.5,-473.74 3141.5,-467.74 3141.5,-461.74 3141.5,-461.74 3141.5,-449.74 3141.5,-449.74 3141.5,-443.74 3147.5,-437.74 3153.5,-437.74 3153.5,-437.74 3262.5,-437.74 3262.5,-437.74 3268.5,-437.74 3274.5,-443.74 3274.5,-449.74 3274.5,-449.74 3274.5,-461.74 3274.5,-461.74 3274.5,-467.74 3268.5,-473.74 3262.5,-473.74"/>
<text text-anchor="middle" x="3208" y="-458.74" font-family="Arial" font-size="10.00" fill="#111827">Error slave</text>
<text text-anchor="middle" x="3208" y="-447.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="M3242.5,-473.74C3242.5,-473.74 3133.5,-473.74 3133.5,-473.74 3127.5,-473.74 3121.5,-467.74 3121.5,-461.74 3121.5,-461.74 3121.5,-449.74 3121.5,-449.74 3121.5,-443.74 3127.5,-437.74 3133.5,-437.74 3133.5,-437.74 3242.5,-437.74 3242.5,-437.74 3248.5,-437.74 3254.5,-443.74 3254.5,-449.74 3254.5,-449.74 3254.5,-461.74 3254.5,-461.74 3254.5,-467.74 3248.5,-473.74 3242.5,-473.74"/>
<text text-anchor="middle" x="3188" y="-458.74" font-family="Arial" font-size="10.00" fill="#111827">Error slave</text>
<text text-anchor="middle" x="3188" y="-447.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="M2872.37,-487.99C2920.41,-501.66 2965.5,-514.48 2965.5,-514.48 2965.5,-514.48 3018.5,-514.48 3018.5,-514.48 3018.5,-514.48 3128,-492.48 3128,-492.48 3128,-492.48 3144.11,-485.08 3161.88,-476.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2872.98,-485.62 2865.58,-486.06 2871.64,-490.33 2872.98,-485.62"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3163.13,-479.05 3168.47,-473.9 3161.08,-474.59 3163.13,-479.05"/>
<text text-anchor="middle" x="2992" y="-518.08" font-family="Arial" font-size="8.00" fill="#374151">invalid / denied</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2852.37,-487.99C2900.41,-501.66 2945.5,-514.48 2945.5,-514.48 2945.5,-514.48 2998.5,-514.48 2998.5,-514.48 2998.5,-514.48 3108,-492.48 3108,-492.48 3108,-492.48 3124.11,-485.08 3141.88,-476.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2852.98,-485.62 2845.58,-486.06 2851.64,-490.33 2852.98,-485.62"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3143.13,-479.05 3148.47,-473.9 3141.08,-474.59 3143.13,-479.05"/>
<text text-anchor="middle" x="2972" y="-518.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="M3102,-473.74C3102,-473.74 3004,-473.74 3004,-473.74 2998,-473.74 2992,-467.74 2992,-461.74 2992,-461.74 2992,-449.74 2992,-449.74 2992,-443.74 2998,-437.74 3004,-437.74 3004,-437.74 3102,-437.74 3102,-437.74 3108,-437.74 3114,-443.74 3114,-449.74 3114,-449.74 3114,-461.74 3114,-461.74 3114,-467.74 3108,-473.74 3102,-473.74"/>
<text text-anchor="middle" x="3053" y="-458.74" font-family="Arial" font-size="10.00" fill="#111827">On&#45;chip SRAM</text>
<text text-anchor="middle" x="3053" y="-447.74" font-family="Arial" font-size="10.00" fill="#111827">optional RIB2RAM path</text>
<path fill="#fff3c9" stroke="#4b5563" stroke-width="1.1" d="M3082,-473.74C3082,-473.74 2984,-473.74 2984,-473.74 2978,-473.74 2972,-467.74 2972,-461.74 2972,-461.74 2972,-449.74 2972,-449.74 2972,-443.74 2978,-437.74 2984,-437.74 2984,-437.74 3082,-437.74 3082,-437.74 3088,-437.74 3094,-443.74 3094,-449.74 3094,-449.74 3094,-461.74 3094,-461.74 3094,-467.74 3088,-473.74 3082,-473.74"/>
<text text-anchor="middle" x="3033" y="-458.74" font-family="Arial" font-size="10.00" fill="#111827">On&#45;chip SRAM</text>
<text text-anchor="middle" x="3033" y="-447.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="M2938.91,-455.74C2954.95,-455.74 2970.44,-455.74 2984.56,-455.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2984.81,-458.19 2991.81,-455.74 2984.81,-453.29 2984.81,-458.19"/>
<text text-anchor="middle" x="2965.31" y="-461.34" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2918.91,-455.74C2934.95,-455.74 2950.44,-455.74 2964.56,-455.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2964.81,-458.19 2971.81,-455.74 2964.81,-453.29 2964.81,-458.19"/>
<text text-anchor="middle" x="2945.31" y="-461.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="M3049.5,-364C3049.5,-364 3008.5,-364 3008.5,-364 3002.5,-364 2996.5,-358 2996.5,-352 2996.5,-352 2996.5,-340 2996.5,-340 2996.5,-334 3002.5,-328 3008.5,-328 3008.5,-328 3049.5,-328 3049.5,-328 3055.5,-328 3061.5,-334 3061.5,-340 3061.5,-340 3061.5,-352 3061.5,-352 3061.5,-358 3055.5,-364 3049.5,-364"/>
<text text-anchor="middle" x="3029" y="-343.5" font-family="Arial" font-size="10.00" fill="#111827">RIB2RIBP</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M3029.5,-364C3029.5,-364 2988.5,-364 2988.5,-364 2982.5,-364 2976.5,-358 2976.5,-352 2976.5,-352 2976.5,-340 2976.5,-340 2976.5,-334 2982.5,-328 2988.5,-328 2988.5,-328 3029.5,-328 3029.5,-328 3035.5,-328 3041.5,-334 3041.5,-340 3041.5,-340 3041.5,-352 3041.5,-352 3041.5,-358 3035.5,-364 3029.5,-364"/>
<text text-anchor="middle" x="3009" y="-343.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="M2848.91,-418.87C2896.71,-399.79 2953.03,-377.31 2989.8,-362.64"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2990.84,-364.87 2996.43,-360 2989.02,-360.32 2990.84,-364.87"/>
<text text-anchor="middle" x="2933" y="-389.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2828.91,-418.87C2876.71,-399.79 2933.03,-377.31 2969.8,-362.64"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2970.84,-364.87 2976.43,-360 2969.02,-360.32 2970.84,-364.87"/>
<text text-anchor="middle" x="2913" y="-389.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="M1524,-364C1524,-364 1454,-364 1454,-364 1448,-364 1442,-358 1442,-352 1442,-352 1442,-340 1442,-340 1442,-334 1448,-328 1454,-328 1454,-328 1524,-328 1524,-328 1530,-328 1536,-334 1536,-340 1536,-340 1536,-352 1536,-352 1536,-358 1530,-364 1524,-364"/>
<text text-anchor="middle" x="1489" y="-349" font-family="Arial" font-size="10.00" fill="#111827">RIB2APB</text>
<text text-anchor="middle" x="1489" y="-338" font-family="Arial" font-size="10.00" fill="#111827">direct APB bridge</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1504,-364C1504,-364 1434,-364 1434,-364 1428,-364 1422,-358 1422,-352 1422,-352 1422,-340 1422,-340 1422,-334 1428,-328 1434,-328 1434,-328 1504,-328 1504,-328 1510,-328 1516,-334 1516,-340 1516,-340 1516,-352 1516,-352 1516,-358 1510,-364 1504,-364"/>
<text text-anchor="middle" x="1469" y="-349" font-family="Arial" font-size="10.00" fill="#111827">RIB2APB</text>
<text text-anchor="middle" x="1469" y="-338" 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="M2640.61,-430.26C2562.69,-414.14 2475,-396 2475,-396 2475,-396 2445,-387 2445,-387 2445,-387 1745.89,-357.75 1543.36,-349.27"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1543.18,-346.81 1536.08,-348.97 1542.97,-351.71 1543.18,-346.81"/>
<text text-anchor="middle" x="2482" y="-389.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2620.61,-430.26C2542.69,-414.14 2455,-396 2455,-396 2455,-396 2425,-387 2425,-387 2425,-387 1725.89,-357.75 1523.36,-349.27"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1523.18,-346.81 1516.08,-348.97 1522.97,-351.71 1523.18,-346.81"/>
<text text-anchor="middle" x="2462" y="-389.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="M3721.5,-255C3721.5,-255 3558.5,-255 3558.5,-255 3552.5,-255 3546.5,-249 3546.5,-243 3546.5,-243 3546.5,-222 3546.5,-222 3546.5,-216 3552.5,-210 3558.5,-210 3558.5,-210 3721.5,-210 3721.5,-210 3727.5,-210 3733.5,-216 3733.5,-222 3733.5,-222 3733.5,-243 3733.5,-243 3733.5,-249 3727.5,-255 3721.5,-255"/>
<text text-anchor="middle" x="3640" y="-241" font-family="Arial" font-size="10.00" fill="#111827">SYSCTRL</text>
<text text-anchor="middle" x="3640" 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="3640" 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="M3701.5,-255C3701.5,-255 3538.5,-255 3538.5,-255 3532.5,-255 3526.5,-249 3526.5,-243 3526.5,-243 3526.5,-222 3526.5,-222 3526.5,-216 3532.5,-210 3538.5,-210 3538.5,-210 3701.5,-210 3701.5,-210 3707.5,-210 3713.5,-216 3713.5,-222 3713.5,-222 3713.5,-243 3713.5,-243 3713.5,-249 3707.5,-255 3701.5,-255"/>
<text text-anchor="middle" x="3620" y="-241" font-family="Arial" font-size="10.00" fill="#111827">SYSCTRL</text>
<text text-anchor="middle" x="3620" 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="3620" 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="M3061.67,-339.69C3128.58,-328.81 3275,-305 3275,-305 3275,-305 3533,-255 3533,-255 3533,-255 3535.31,-254.54 3539.25,-253.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3539.74,-256.14 3546.12,-252.36 3538.77,-251.34 3539.74,-256.14"/>
<text text-anchor="middle" x="3420.5" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3041.67,-339.69C3108.58,-328.81 3255,-305 3255,-305 3255,-305 3513,-255 3513,-255 3513,-255 3515.31,-254.54 3519.25,-253.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3519.74,-256.14 3526.12,-252.36 3518.77,-251.34 3519.74,-256.14"/>
<text text-anchor="middle" x="3400.5" y="-289.6" 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="M2996.29,-341.42C2906.7,-331.6 2664,-305 2664,-305 2664,-305 2635,-278 2635,-278 2635,-278 1151,-255 1151,-255 1151,-255 1148.14,-254.29 1143.46,-253.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1144.02,-250.75 1136.63,-251.45 1142.84,-255.51 1144.02,-250.75"/>
<text text-anchor="middle" x="2673.5" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2976.29,-341.42C2886.7,-331.6 2644,-305 2644,-305 2644,-305 2615,-278 2615,-278 2615,-278 1131,-255 1131,-255 1131,-255 1128.14,-254.29 1123.46,-253.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1124.02,-250.75 1116.63,-251.45 1122.84,-255.51 1124.02,-250.75"/>
<text text-anchor="middle" x="2653.5" y="-289.6" 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="M3507.5,-255C3507.5,-255 3302.5,-255 3302.5,-255 3296.5,-255 3290.5,-249 3290.5,-243 3290.5,-243 3290.5,-222 3290.5,-222 3290.5,-216 3296.5,-210 3302.5,-210 3302.5,-210 3507.5,-210 3507.5,-210 3513.5,-210 3519.5,-216 3519.5,-222 3519.5,-222 3519.5,-243 3519.5,-243 3519.5,-249 3513.5,-255 3507.5,-255"/>
<text text-anchor="middle" x="3405" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RIBP target wrapper</text>
<text text-anchor="middle" x="3405" 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="3405" y="-219" font-family="Arial" font-size="10.00" fill="#111827">I2S</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M3487.5,-255C3487.5,-255 3282.5,-255 3282.5,-255 3276.5,-255 3270.5,-249 3270.5,-243 3270.5,-243 3270.5,-222 3270.5,-222 3270.5,-216 3276.5,-210 3282.5,-210 3282.5,-210 3487.5,-210 3487.5,-210 3493.5,-210 3499.5,-216 3499.5,-222 3499.5,-222 3499.5,-243 3499.5,-243 3499.5,-249 3493.5,-255 3487.5,-255"/>
<text text-anchor="middle" x="3385" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RIBP target wrapper</text>
<text text-anchor="middle" x="3385" 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="3385" 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="M3061.71,-335.3C3120.1,-317.98 3243.82,-281.3 3325.67,-257.02"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3326.46,-259.35 3332.48,-255.01 3325.07,-254.65 3326.46,-259.35"/>
<text text-anchor="middle" x="3259.5" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3041.71,-335.3C3100.1,-317.98 3223.82,-281.3 3305.67,-257.02"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3306.46,-259.35 3312.48,-255.01 3305.07,-254.65 3306.46,-259.35"/>
<text text-anchor="middle" x="3239.5" y="-289.6" 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="M3021.02,-327.75C3011.83,-307.89 2998,-278 2998,-278 2998,-278 2977.98,-268.42 2956.52,-258.15"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2957.51,-255.91 2950.14,-255.1 2955.39,-260.33 2957.51,-255.91"/>
<text text-anchor="middle" x="3018.5" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3001.02,-327.75C2991.83,-307.89 2978,-278 2978,-278 2978,-278 2957.98,-268.42 2936.52,-258.15"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2937.51,-255.91 2930.14,-255.1 2935.39,-260.33 2937.51,-255.91"/>
<text text-anchor="middle" x="2998.5" y="-289.6" 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="M2996.3,-333C2964.19,-321.22 2920,-305 2920,-305 2920,-305 2890,-278 2890,-278 2890,-278 2840.07,-267.37 2789.01,-256.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2789.49,-254.09 2782.13,-255.03 2788.47,-258.89 2789.49,-254.09"/>
<text text-anchor="middle" x="2929.5" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2976.3,-333C2944.19,-321.22 2900,-305 2900,-305 2900,-305 2870,-278 2870,-278 2870,-278 2820.07,-267.37 2769.01,-256.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2769.49,-254.09 2762.13,-255.03 2768.47,-258.89 2769.49,-254.09"/>
<text text-anchor="middle" x="2909.5" y="-289.6" 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="M3186,-255C3186,-255 3036,-255 3036,-255 3030,-255 3024,-249 3024,-243 3024,-243 3024,-222 3024,-222 3024,-216 3030,-210 3036,-210 3036,-210 3186,-210 3186,-210 3192,-210 3198,-216 3198,-222 3198,-222 3198,-243 3198,-243 3198,-249 3192,-255 3186,-255"/>
<text text-anchor="middle" x="3111" y="-241" font-family="Arial" font-size="10.00" fill="#111827">GPIO V2</text>
<text text-anchor="middle" x="3111" y="-230" font-family="Arial" font-size="10.00" fill="#111827">user + management RIBP windows</text>
<text text-anchor="middle" x="3111" 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="M3166,-255C3166,-255 3016,-255 3016,-255 3010,-255 3004,-249 3004,-243 3004,-243 3004,-222 3004,-222 3004,-216 3010,-210 3016,-210 3016,-210 3166,-210 3166,-210 3172,-210 3178,-216 3178,-222 3178,-222 3178,-243 3178,-243 3178,-249 3172,-255 3166,-255"/>
<text text-anchor="middle" x="3091" y="-241" font-family="Arial" font-size="10.00" fill="#111827">GPIO V2</text>
<text text-anchor="middle" x="3091" y="-230" font-family="Arial" font-size="10.00" fill="#111827">user + management RIBP windows</text>
<text text-anchor="middle" x="3091" 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="M3041.81,-327.58C3054.91,-309.77 3075.43,-281.86 3090.73,-261.06"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3092.72,-262.49 3094.9,-255.4 3088.78,-259.58 3092.72,-262.49"/>
<text text-anchor="middle" x="3097" y="-294.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<text text-anchor="middle" x="3097" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">user/admin</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3021.81,-327.58C3034.91,-309.77 3055.43,-281.86 3070.73,-261.06"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3072.72,-262.49 3074.9,-255.4 3068.78,-259.58 3072.72,-262.49"/>
<text text-anchor="middle" x="3077" y="-294.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<text text-anchor="middle" x="3077" y="-285.1" 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="M3061.62,-341.79C3158.2,-332.3 3436,-305 3436,-305 3436,-305 3521,-278 3521,-278 3521,-278 3747,-255 3747,-255 3747,-255 3749.33,-254.57 3753.33,-253.83"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3753.87,-256.22 3760.31,-252.53 3752.98,-251.4 3753.87,-256.22"/>
<text text-anchor="middle" x="3530.5" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3041.62,-341.79C3138.2,-332.3 3416,-305 3416,-305 3416,-305 3501,-278 3501,-278 3501,-278 3727,-255 3727,-255 3727,-255 3729.33,-254.57 3733.33,-253.83"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3733.87,-256.22 3740.31,-252.53 3732.98,-251.4 3733.87,-256.22"/>
<text text-anchor="middle" x="3510.5" y="-289.6" 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="M2996.41,-340.79C2916.82,-330.53 2719,-305 2719,-305 2719,-305 2689,-278 2689,-278 2689,-278 2563,-255 2563,-255 2563,-255 2560.42,-254.4 2556.12,-253.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2556.65,-251.02 2549.28,-251.83 2555.55,-255.79 2556.65,-251.02"/>
<text text-anchor="middle" x="2728.5" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2976.41,-340.79C2896.82,-330.53 2699,-305 2699,-305 2699,-305 2669,-278 2669,-278 2669,-278 2543,-255 2543,-255 2543,-255 2540.42,-254.4 2536.12,-253.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2536.65,-251.02 2529.28,-251.83 2535.55,-255.79 2536.65,-251.02"/>
<text text-anchor="middle" x="2708.5" y="-289.6" 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="M952,-255C952,-255 852,-255 852,-255 846,-255 840,-249 840,-243 840,-243 840,-222 840,-222 840,-216 846,-210 852,-210 852,-210 952,-210 952,-210 958,-210 964,-216 964,-222 964,-222 964,-243 964,-243 964,-249 958,-255 952,-255"/>
<text text-anchor="middle" x="902" y="-241" font-family="Arial" font-size="10.00" fill="#111827">APB target wrapper</text>
<text text-anchor="middle" x="902" y="-230" font-family="Arial" font-size="10.00" fill="#111827">UART1, advanced timer</text>
<text text-anchor="middle" x="902" y="-219" font-family="Arial" font-size="10.00" fill="#111827">and user IP</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M932,-250.5C932,-250.5 852,-250.5 852,-250.5 846,-250.5 840,-244.5 840,-238.5 840,-238.5 840,-226.5 840,-226.5 840,-220.5 846,-214.5 852,-214.5 852,-214.5 932,-214.5 932,-214.5 938,-214.5 944,-220.5 944,-226.5 944,-226.5 944,-238.5 944,-238.5 944,-244.5 938,-250.5 932,-250.5"/>
<text text-anchor="middle" x="892" y="-235.5" font-family="Arial" font-size="10.00" fill="#111827">APB target wrapper</text>
<text text-anchor="middle" x="892" y="-224.5" font-family="Arial" font-size="10.00" fill="#111827">User IP target</text>
</g>
<!-- apb_adapter&#45;&gt;apb_targets -->
<g id="edge32" class="edge">
<title>apb_adapter&#45;&gt;apb_targets</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1441.67,-329.22C1439.37,-328.46 1438,-328 1438,-328 1438,-328 978,-255 978,-255 978,-255 975.31,-254.24 970.95,-253.01"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="971.46,-250.6 964.06,-251.06 970.13,-255.32 971.46,-250.6"/>
<text text-anchor="middle" x="1297" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1421.67,-329.22C1419.37,-328.46 1418,-328 1418,-328 1418,-328 958,-255 958,-255 958,-255 955.25,-254.1 950.87,-252.68"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="951.42,-250.28 944,-250.44 949.9,-254.94 951.42,-250.28"/>
<text text-anchor="middle" x="1277" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- pwm -->
<g id="node25" class="node">
<title>pwm</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1832,-255C1832,-255 1618,-255 1618,-255 1612,-255 1606,-249 1606,-243 1606,-243 1606,-222 1606,-222 1606,-216 1612,-210 1618,-210 1618,-210 1832,-210 1832,-210 1838,-210 1844,-216 1844,-222 1844,-222 1844,-243 1844,-243 1844,-249 1838,-255 1832,-255"/>
<text text-anchor="middle" x="1725" y="-241" font-family="Arial" font-size="10.00" fill="#111827">PWM V2</text>
<text text-anchor="middle" x="1725" y="-230" font-family="Arial" font-size="10.00" fill="#111827">2 timers, 4 action channels, 2 operators</text>
<text text-anchor="middle" x="1725" y="-219" font-family="Arial" font-size="10.00" fill="#111827">fades, dead time, carrier, fault and capture, IRQ11</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1812,-255C1812,-255 1598,-255 1598,-255 1592,-255 1586,-249 1586,-243 1586,-243 1586,-222 1586,-222 1586,-216 1592,-210 1598,-210 1598,-210 1812,-210 1812,-210 1818,-210 1824,-216 1824,-222 1824,-222 1824,-243 1824,-243 1824,-249 1818,-255 1812,-255"/>
<text text-anchor="middle" x="1705" y="-241" font-family="Arial" font-size="10.00" fill="#111827">PWM V2</text>
<text text-anchor="middle" x="1705" y="-230" font-family="Arial" font-size="10.00" fill="#111827">2 timers, 4 action channels, 2 operators</text>
<text text-anchor="middle" x="1705" y="-219" font-family="Arial" font-size="10.00" fill="#111827">fades, dead time, carrier, fault and capture, IRQ11</text>
</g>
<!-- apb_adapter&#45;&gt;pwm -->
<g id="edge31" class="edge">
<title>apb_adapter&#45;&gt;pwm</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1525.1,-327.94C1564.48,-309.34 1627.88,-279.38 1672.71,-258.21"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1673.9,-260.35 1679.18,-255.15 1671.81,-255.92 1673.9,-260.35"/>
<text text-anchor="middle" x="1636" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1505.1,-327.94C1544.48,-309.34 1607.88,-279.38 1652.71,-258.21"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1653.9,-260.35 1659.18,-255.15 1651.81,-255.92 1653.9,-260.35"/>
<text text-anchor="middle" x="1616" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- apb_adapter&#45;&gt;wdg -->
<g id="edge29" class="edge">
<title>apb_adapter&#45;&gt;wdg</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1441.67,-329.22C1439.37,-328.46 1438,-328 1438,-328 1438,-328 941,-305 941,-305 941,-305 753,-278 753,-278 753,-278 586,-255 586,-255 586,-255 583.41,-254.46 579.06,-253.55"/>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1421.67,-329.22C1419.37,-328.46 1418,-328 1418,-328 1418,-328 928,-305 928,-305 928,-305 843,-278 843,-278 843,-278 586,-255 586,-255 586,-255 583.41,-254.46 579.06,-253.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="579.46,-251.13 572.11,-252.1 578.46,-255.93 579.46,-251.13"/>
<text text-anchor="middle" x="949" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<text text-anchor="middle" x="936" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- crc -->
<g id="node27" class="node">
<title>crc</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1360,-255C1360,-255 1176,-255 1176,-255 1170,-255 1164,-249 1164,-243 1164,-243 1164,-222 1164,-222 1164,-216 1170,-210 1176,-210 1176,-210 1360,-210 1360,-210 1366,-210 1372,-216 1372,-222 1372,-222 1372,-243 1372,-243 1372,-249 1366,-255 1360,-255"/>
<text text-anchor="middle" x="1268" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CRC V2</text>
<text text-anchor="middle" x="1268" y="-230" font-family="Arial" font-size="10.00" fill="#111827">programmable 7/8/16/32&#45;bit streaming CRC</text>
<text text-anchor="middle" x="1268" y="-219" font-family="Arial" font-size="10.00" fill="#111827">byte, halfword and word APB feed</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1340,-255C1340,-255 1156,-255 1156,-255 1150,-255 1144,-249 1144,-243 1144,-243 1144,-222 1144,-222 1144,-216 1150,-210 1156,-210 1156,-210 1340,-210 1340,-210 1346,-210 1352,-216 1352,-222 1352,-222 1352,-243 1352,-243 1352,-249 1346,-255 1340,-255"/>
<text text-anchor="middle" x="1248" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CRC V2</text>
<text text-anchor="middle" x="1248" y="-230" font-family="Arial" font-size="10.00" fill="#111827">programmable 7/8/16/32&#45;bit streaming CRC</text>
<text text-anchor="middle" x="1248" y="-219" font-family="Arial" font-size="10.00" fill="#111827">byte, halfword and word APB feed</text>
</g>
<!-- apb_adapter&#45;&gt;crc -->
<g id="edge30" class="edge">
<title>apb_adapter&#45;&gt;crc</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1454.95,-327.82C1418.1,-309.23 1358.99,-279.41 1317.12,-258.28"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1318.16,-256.06 1310.81,-255.1 1315.95,-260.44 1318.16,-256.06"/>
<text text-anchor="middle" x="1412" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1434.95,-327.82C1398.1,-309.23 1338.99,-279.41 1297.12,-258.28"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1298.16,-256.06 1290.81,-255.1 1295.95,-260.44 1298.16,-256.06"/>
<text text-anchor="middle" x="1392" y="-289.6" 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="M1441.67,-329.22C1439.37,-328.46 1438,-328 1438,-328 1438,-328 1104,-305 1104,-305 1104,-305 937.75,-275.13 820.15,-254.01"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="820.5,-251.58 813.18,-252.75 819.64,-256.4 820.5,-251.58"/>
<text text-anchor="middle" x="1112" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1421.67,-329.22C1419.37,-328.46 1418,-328 1418,-328 1418,-328 1084,-305 1084,-305 1084,-305 931.28,-276.11 819.99,-255.06"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="820.39,-252.64 813.06,-253.75 819.48,-257.46 820.39,-252.64"/>
<text text-anchor="middle" x="1092" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- archinfo -->
<g id="node29" class="node">
<title>archinfo</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M2352,-255C2352,-255 2148,-255 2148,-255 2142,-255 2136,-249 2136,-243 2136,-243 2136,-222 2136,-222 2136,-216 2142,-210 2148,-210 2148,-210 2352,-210 2352,-210 2358,-210 2364,-216 2364,-222 2364,-222 2364,-243 2364,-243 2364,-249 2358,-255 2352,-255"/>
<text text-anchor="middle" x="2250" y="-241" font-family="Arial" font-size="10.00" fill="#111827">ARCHINFO V2</text>
<text text-anchor="middle" x="2250" 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="2250" 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="M2332,-255C2332,-255 2128,-255 2128,-255 2122,-255 2116,-249 2116,-243 2116,-243 2116,-222 2116,-222 2116,-216 2122,-210 2128,-210 2128,-210 2332,-210 2332,-210 2338,-210 2344,-216 2344,-222 2344,-222 2344,-243 2344,-243 2344,-249 2338,-255 2332,-255"/>
<text text-anchor="middle" x="2230" y="-241" font-family="Arial" font-size="10.00" fill="#111827">ARCHINFO V2</text>
<text text-anchor="middle" x="2230" 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="2230" 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="M1536.12,-339.05C1624.42,-327.91 1806,-305 1806,-305 1806,-305 2123,-255 2123,-255 2123,-255 2125.09,-254.65 2128.72,-254.03"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2129.15,-256.44 2135.64,-252.86 2128.33,-251.61 2129.15,-256.44"/>
<text text-anchor="middle" x="1982" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1516.12,-339.05C1604.42,-327.91 1786,-305 1786,-305 1786,-305 2103,-255 2103,-255 2103,-255 2105.09,-254.65 2108.72,-254.03"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2109.15,-256.44 2115.64,-252.86 2108.33,-251.61 2109.15,-256.44"/>
<text text-anchor="middle" x="1962" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- rng -->
<g id="node30" class="node">
<title>rng</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M2097,-255C2097,-255 1883,-255 1883,-255 1877,-255 1871,-249 1871,-243 1871,-243 1871,-222 1871,-222 1871,-216 1877,-210 1883,-210 1883,-210 2097,-210 2097,-210 2103,-210 2109,-216 2109,-222 2109,-222 2109,-243 2109,-243 2109,-249 2103,-255 2097,-255"/>
<text text-anchor="middle" x="1990" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RNG V2 entropy controller</text>
<text text-anchor="middle" x="1990" 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="1990" 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="M2077,-255C2077,-255 1863,-255 1863,-255 1857,-255 1851,-249 1851,-243 1851,-243 1851,-222 1851,-222 1851,-216 1857,-210 1863,-210 1863,-210 2077,-210 2077,-210 2083,-210 2089,-216 2089,-222 2089,-222 2089,-243 2089,-243 2089,-249 2083,-255 2077,-255"/>
<text text-anchor="middle" x="1970" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RNG V2 entropy controller</text>
<text text-anchor="middle" x="1970" 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="1970" 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="M1536.13,-334.51C1615.74,-316.79 1778.65,-280.54 1886.08,-256.63"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1886.77,-258.98 1893.07,-255.07 1885.71,-254.2 1886.77,-258.98"/>
<text text-anchor="middle" x="1792" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1516.13,-334.51C1595.74,-316.79 1758.65,-280.54 1866.08,-256.63"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1866.77,-258.98 1873.07,-255.07 1865.71,-254.2 1866.77,-258.98"/>
<text text-anchor="middle" x="1772" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- ps2 -->
<g id="node31" class="node">
<title>ps2</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1567,-255C1567,-255 1411,-255 1411,-255 1405,-255 1399,-249 1399,-243 1399,-243 1399,-222 1399,-222 1399,-216 1405,-210 1411,-210 1411,-210 1567,-210 1567,-210 1573,-210 1579,-216 1579,-222 1579,-222 1579,-243 1579,-243 1579,-249 1573,-255 1567,-255"/>
<text text-anchor="middle" x="1489" y="-241" font-family="Arial" font-size="10.00" fill="#111827">PS/2 host V2</text>
<text text-anchor="middle" x="1489" y="-230" font-family="Arial" font-size="10.00" fill="#111827">bidirectional open&#45;drain transport</text>
<text text-anchor="middle" x="1489" 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="M1547,-255C1547,-255 1391,-255 1391,-255 1385,-255 1379,-249 1379,-243 1379,-243 1379,-222 1379,-222 1379,-216 1385,-210 1391,-210 1391,-210 1547,-210 1547,-210 1553,-210 1559,-216 1559,-222 1559,-222 1559,-243 1559,-243 1559,-249 1553,-255 1547,-255"/>
<text text-anchor="middle" x="1469" y="-241" font-family="Arial" font-size="10.00" fill="#111827">PS/2 host V2</text>
<text text-anchor="middle" x="1469" y="-230" font-family="Arial" font-size="10.00" fill="#111827">bidirectional open&#45;drain transport</text>
<text text-anchor="middle" x="1469" 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="M1489,-327.58C1489,-310.16 1489,-283.05 1489,-262.4"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1491.45,-262.4 1489,-255.4 1486.55,-262.4 1491.45,-262.4"/>
<text text-anchor="middle" x="1497" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1469,-327.58C1469,-310.16 1469,-283.05 1469,-262.4"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1471.45,-262.4 1469,-255.4 1466.55,-262.4 1471.45,-262.4"/>
<text text-anchor="middle" x="1477" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- irq -->
<g id="node33" class="node">
<title>irq</title>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M2093,-155C2093,-155 1887,-155 1887,-155 1881,-155 1875,-149 1875,-143 1875,-143 1875,-131 1875,-131 1875,-125 1881,-119 1887,-119 1887,-119 2093,-119 2093,-119 2099,-119 2105,-125 2105,-131 2105,-131 2105,-143 2105,-143 2105,-149 2099,-155 2093,-155"/>
<text text-anchor="middle" x="1990" y="-140" font-family="Arial" font-size="10.00" fill="#111827">Interrupt aggregation</text>
<text text-anchor="middle" x="1990" 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="M2073,-155C2073,-155 1867,-155 1867,-155 1861,-155 1855,-149 1855,-143 1855,-143 1855,-131 1855,-131 1855,-125 1861,-119 1867,-119 1867,-119 2073,-119 2073,-119 2079,-119 2085,-125 2085,-131 2085,-131 2085,-143 2085,-143 2085,-149 2079,-155 2073,-155"/>
<text text-anchor="middle" x="1970" y="-140" font-family="Arial" font-size="10.00" fill="#111827">Interrupt aggregation</text>
<text text-anchor="middle" x="1970" 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="edge37" class="edge">
<title>clint&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1136.63,-213.55C1145.22,-211.43 1151,-210 1151,-210 1151,-210 1634.62,-168.5 1867.5,-148.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1867.9,-150.94 1874.66,-147.9 1867.48,-146.06 1867.9,-150.94"/>
<text text-anchor="middle" x="1558.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="M1116.63,-213.55C1125.22,-211.43 1131,-210 1131,-210 1131,-210 1614.62,-168.5 1847.5,-148.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1847.9,-150.94 1854.66,-147.9 1847.48,-146.06 1847.9,-150.94"/>
<text text-anchor="middle" x="1538.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="edge58" class="edge">
<title>ribp_targets&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3353.02,-206.7C3269.04,-166.64 3104.5,-88.14 3020.71,-48.17"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3352.2,-209.03 3359.57,-209.83 3354.31,-204.6 3352.2,-209.03"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3021.7,-45.93 3014.32,-45.12 3019.59,-50.35 3021.7,-45.93"/>
<text text-anchor="middle" x="3274" 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="M3333.02,-206.7C3249.04,-166.64 3084.5,-88.14 3000.71,-48.17"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3332.2,-209.03 3339.57,-209.83 3334.31,-204.6 3332.2,-209.03"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3001.7,-45.93 2994.32,-45.12 2999.59,-50.35 3001.7,-45.93"/>
<text text-anchor="middle" x="3254" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">device interfaces</text>
</g>
<!-- ribp_targets&#45;&gt;gpio_controller -->
<g id="edge33" class="edge">
<title>ribp_targets&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3290.39,-232.5C3262.19,-232.5 3232.32,-232.5 3205.21,-232.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3205.02,-230.05 3198.02,-232.5 3205.02,-234.95 3205.02,-230.05"/>
<text text-anchor="middle" x="3244.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="M3270.39,-232.5C3242.19,-232.5 3212.32,-232.5 3185.21,-232.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3185.02,-230.05 3178.02,-232.5 3185.02,-234.95 3185.02,-230.05"/>
<text text-anchor="middle" x="3224.25" y="-238.1" font-family="Arial" font-size="8.00" fill="#374151">alternate functions</text>
</g>
<!-- uart0&#45;&gt;ext_io -->
<g id="edge59" class="edge">
<title>uart0&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2932.63,-204.77C2942.4,-195.32 2951,-187 2951,-187 2951,-187 2960.65,-99.32 2965.82,-52.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2930.79,-203.14 2927.46,-209.77 2934.2,-206.67 2930.79,-203.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2968.28,-52.44 2966.61,-45.21 2963.41,-51.9 2968.28,-52.44"/>
<text text-anchor="middle" x="2983" 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="M2912.63,-204.77C2922.4,-195.32 2931,-187 2931,-187 2931,-187 2940.65,-99.32 2945.82,-52.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2910.79,-203.14 2907.46,-209.77 2914.2,-206.67 2910.79,-203.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2948.28,-52.44 2946.61,-45.21 2943.41,-51.9 2948.28,-52.44"/>
<text text-anchor="middle" x="2963" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">UART pads</text>
</g>
<!-- uart0&#45;&gt;irq -->
<g id="edge42" class="edge">
<title>uart0&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2812.99,-211.73C2742.06,-196.49 2656,-178 2656,-178 2656,-178 2304.6,-156.9 2112.3,-145.35"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2112.38,-142.9 2105.25,-144.92 2112.09,-147.79 2112.38,-142.9"/>
<text text-anchor="middle" x="2706.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="M2792.99,-211.73C2722.06,-196.49 2636,-178 2636,-178 2636,-178 2284.6,-156.9 2092.3,-145.35"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2092.38,-142.9 2085.25,-144.92 2092.09,-147.79 2092.38,-142.9"/>
<text text-anchor="middle" x="2686.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ2</text>
</g>
<!-- i2c_controllers&#45;&gt;gpio_controller -->
<g id="edge43" class="edge">
<title>i2c_controllers&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2781.94,-255.06C2856.47,-271.71 2945,-291.5 2945,-291.5 2945,-291.5 2997,-291.5 2997,-291.5 2997,-291.5 3030.21,-274.31 3060.78,-258.49"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3062.16,-260.54 3067.25,-255.14 3059.91,-256.18 3062.16,-260.54"/>
<text text-anchor="middle" x="2971" y="-294.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO3/4 ALT1</text>
<text text-anchor="middle" x="2971" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2761.94,-255.06C2836.47,-271.71 2925,-291.5 2925,-291.5 2925,-291.5 2977,-291.5 2977,-291.5 2977,-291.5 3010.21,-274.31 3040.78,-258.49"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3042.16,-260.54 3047.25,-255.14 3039.91,-256.18 3042.16,-260.54"/>
<text text-anchor="middle" x="2951" y="-294.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO3/4 ALT1</text>
<text text-anchor="middle" x="2951" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text>
</g>
<!-- i2c_controllers&#45;&gt;irq -->
<g id="edge45" class="edge">
<title>i2c_controllers&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2642.23,-209.89C2615.59,-195.05 2585,-178 2585,-178 2585,-178 2286.38,-157.92 2112.24,-146.22"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2112.22,-143.76 2105.07,-145.74 2111.89,-148.65 2112.22,-143.76"/>
<text text-anchor="middle" x="2625.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="M2622.23,-209.89C2595.59,-195.05 2565,-178 2565,-178 2565,-178 2266.38,-157.92 2092.24,-146.22"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2092.22,-143.76 2085.07,-145.74 2091.89,-148.65 2092.22,-143.76"/>
<text text-anchor="middle" x="2605.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ7 / IRQ19</text>
</g>
<!-- gpio_bridge -->
<g id="node32" class="node">
<title>gpio_bridge</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M2900.5,-155C2900.5,-155 2765.5,-155 2765.5,-155 2759.5,-155 2753.5,-149 2753.5,-143 2753.5,-143 2753.5,-131 2753.5,-131 2753.5,-125 2759.5,-119 2765.5,-119 2765.5,-119 2900.5,-119 2900.5,-119 2906.5,-119 2912.5,-125 2912.5,-131 2912.5,-131 2912.5,-143 2912.5,-143 2912.5,-149 2906.5,-155 2900.5,-155"/>
<text text-anchor="middle" x="2833" y="-140" font-family="Arial" font-size="10.00" fill="#111827">GPIO pad bridge</text>
<text text-anchor="middle" x="2833" 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="M2880.5,-155C2880.5,-155 2745.5,-155 2745.5,-155 2739.5,-155 2733.5,-149 2733.5,-143 2733.5,-143 2733.5,-131 2733.5,-131 2733.5,-125 2739.5,-119 2745.5,-119 2745.5,-119 2880.5,-119 2880.5,-119 2886.5,-119 2892.5,-125 2892.5,-131 2892.5,-131 2892.5,-143 2892.5,-143 2892.5,-149 2886.5,-155 2880.5,-155"/>
<text text-anchor="middle" x="2813" y="-140" font-family="Arial" font-size="10.00" fill="#111827">GPIO pad bridge</text>
<text text-anchor="middle" x="2813" 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="edge34" class="edge">
<title>gpio_controller&#45;&gt;gpio_bridge</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3023.67,-212.72C3015.96,-211.07 3011,-210 3011,-210 3011,-210 2832,-187 2832,-187 2832,-187 2832,-178 2832,-178 2832,-178 2832.18,-170.7 2832.39,-162.33"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2834.84,-162.25 2832.57,-155.2 2829.95,-162.13 2834.84,-162.25"/>
<text text-anchor="middle" x="2852" 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="M3003.67,-212.72C2995.96,-211.07 2991,-210 2991,-210 2991,-210 2812,-187 2812,-187 2812,-187 2812,-178 2812,-178 2812,-178 2812.18,-170.7 2812.39,-162.33"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2814.84,-162.25 2812.57,-155.2 2809.95,-162.13 2814.84,-162.25"/>
<text text-anchor="middle" x="2832" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g>
<!-- gpio_controller&#45;&gt;irq -->
<g id="edge35" class="edge">
<title>gpio_controller&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3023.67,-212.72C3015.96,-211.07 3011,-210 3011,-210 3011,-210 2802,-187 2802,-187 2802,-187 2722,-178 2722,-178 2722,-178 2320.49,-156.06 2112.2,-144.68"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2112.3,-142.23 2105.18,-144.29 2112.04,-147.12 2112.3,-142.23"/>
<text text-anchor="middle" x="2814" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3003.67,-212.72C2995.96,-211.07 2991,-210 2991,-210 2991,-210 2782,-187 2782,-187 2782,-187 2702,-178 2702,-178 2702,-178 2300.49,-156.06 2092.2,-144.68"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2092.3,-142.23 2085.18,-144.29 2092.04,-147.12 2092.3,-142.23"/>
<text text-anchor="middle" x="2794" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text>
</g>
<!-- timers&#45;&gt;irq -->
<g id="edge36" class="edge">
<title>timers&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M3760.31,-212.47C3752.16,-210.96 3747,-210 3747,-210 3747,-210 2511.39,-159.37 2112.53,-143.02"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2112.38,-140.56 2105.28,-142.72 2112.18,-145.46 2112.38,-140.56"/>
<text text-anchor="middle" x="3200.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="M3740.31,-212.47C3732.16,-210.96 3727,-210 3727,-210 3727,-210 2491.39,-159.37 2092.53,-143.02"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2092.38,-140.56 2085.28,-142.72 2092.18,-145.46 2092.38,-140.56"/>
<text text-anchor="middle" x="3180.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ3 / IRQ4</text>
</g>
<!-- ws2812&#45;&gt;gpio_bridge -->
<g id="edge38" class="edge">
<title>ws2812&#45;&gt;gpio_bridge</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2497.66,-209.74C2516.48,-194.93 2538,-178 2538,-178 2538,-178 2659.15,-161.57 2746.18,-149.77"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2746.56,-152.19 2753.17,-148.82 2745.9,-147.34 2746.56,-152.19"/>
<text text-anchor="middle" x="2560.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="M2477.66,-209.74C2496.48,-194.93 2518,-178 2518,-178 2518,-178 2639.15,-161.57 2726.18,-149.77"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2726.56,-152.19 2733.17,-148.82 2725.9,-147.34 2726.56,-152.19"/>
<text text-anchor="middle" x="2540.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 ALT1</text>
</g>
<!-- ws2812&#45;&gt;irq -->
<g id="edge40" class="edge">
<title>ws2812&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2390.79,-212.99C2383.05,-211.18 2378,-210 2378,-210 2378,-210 2204.05,-177.72 2089.09,-156.39"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2089.28,-153.93 2081.95,-155.06 2088.39,-158.75 2089.28,-153.93"/>
<text text-anchor="middle" x="2264" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2370.79,-212.99C2363.05,-211.18 2358,-210 2358,-210 2358,-210 2184.05,-177.72 2069.09,-156.39"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2069.28,-153.93 2061.95,-155.06 2068.39,-158.75 2069.28,-153.93"/>
<text text-anchor="middle" x="2244" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text>
</g>
<!-- apb_targets&#45;&gt;gpio_controller -->
<g id="edge57" class="edge">
<title>apb_targets&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M964.06,-250.87C972.32,-253.32 978,-255 978,-255 978,-255 2529,-287 2529,-287 2529,-287 2565,-287 2565,-287 2565,-287 3011,-255 3011,-255 3011,-255 3013.14,-254.52 3016.78,-253.7"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3017.37,-256.08 3023.67,-252.15 3016.3,-251.3 3017.37,-256.08"/>
<text text-anchor="middle" x="2547" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M944,-250.23C952.18,-253.02 958,-255 958,-255 958,-255 2509,-287 2509,-287 2509,-287 2545,-287 2545,-287 2545,-287 2991,-255 2991,-255 2991,-255 2993.14,-254.52 2996.78,-253.7"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2997.37,-256.08 3003.67,-252.15 2996.3,-251.3 2997.37,-256.08"/>
<text text-anchor="middle" x="2527" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text>
</g>
<!-- pwm&#45;&gt;gpio_controller -->
<g id="edge49" class="edge">
<title>pwm&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1851.2,-253.85C1855.51,-254.58 1858,-255 1858,-255 1858,-255 2801,-296 2801,-296 2801,-296 2889,-296 2889,-296 2889,-296 2962.82,-274.89 3025.32,-257.01"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1851.58,-251.43 1844.27,-252.68 1850.76,-256.26 1851.58,-251.43"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3026.05,-259.35 3032.11,-255.07 3024.7,-254.64 3026.05,-259.35"/>
<text text-anchor="middle" x="2845" y="-298.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO3&#45;6 output</text>
<text text-anchor="middle" x="2845" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 sync, GPIO9 fault</text>
<text text-anchor="middle" x="2845" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO30/31 capture</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1831.2,-253.85C1835.51,-254.58 1838,-255 1838,-255 1838,-255 2781,-296 2781,-296 2781,-296 2869,-296 2869,-296 2869,-296 2942.82,-274.89 3005.32,-257.01"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1831.58,-251.43 1824.27,-252.68 1830.76,-256.26 1831.58,-251.43"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3006.05,-259.35 3012.11,-255.07 3004.7,-254.64 3006.05,-259.35"/>
<text text-anchor="middle" x="2825" y="-298.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO3&#45;6 output</text>
<text text-anchor="middle" x="2825" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 sync, GPIO9 fault</text>
<text text-anchor="middle" x="2825" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO30/31 capture</text>
</g>
<!-- pwm&#45;&gt;irq -->
<g id="edge50" class="edge">
<title>pwm&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1786.13,-209.93C1830.96,-194.11 1891.33,-172.81 1934.73,-157.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1935.76,-159.74 1941.54,-155.1 1934.13,-155.12 1935.76,-159.74"/>
<text text-anchor="middle" x="1885" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ11</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1766.13,-209.93C1810.96,-194.11 1871.33,-172.81 1914.73,-157.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1915.76,-159.74 1921.54,-155.1 1914.13,-155.12 1915.76,-159.74"/>
<text text-anchor="middle" x="1865" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ11</text>
</g>
<!-- wdg&#45;&gt;rcu -->
<g id="edge56" class="edge">
@@ -652,53 +651,53 @@
<!-- wdg&#45;&gt;irq -->
<g id="edge55" class="edge">
<title>wdg&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M572.11,-212.9C580.53,-211.14 586,-210 586,-210 586,-210 1123,-178 1123,-178 1123,-178 1628.5,-154.68 1867.53,-143.65"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1867.99,-146.08 1874.87,-143.31 1867.76,-141.19 1867.99,-146.08"/>
<text text-anchor="middle" x="1160" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">early warning IRQ14</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M572.11,-212.9C580.53,-211.14 586,-210 586,-210 586,-210 1116,-178 1116,-178 1116,-178 1611.4,-154.8 1847.57,-143.73"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1847.95,-146.17 1854.83,-143.39 1847.72,-141.27 1847.95,-146.17"/>
<text text-anchor="middle" x="1153" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">early warning IRQ14</text>
</g>
<!-- rtc&#45;&gt;sysctrl -->
<g id="edge53" class="edge">
<title>rtc&#45;&gt;sysctrl</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M813.12,-252.42C821.62,-254 827,-255 827,-255 827,-255 2571,-287 2571,-287 2571,-287 2629,-287 2629,-287 2629,-287 3533,-255 3533,-255 3533,-255 3535.31,-254.51 3539.25,-253.68"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3539.77,-256.08 3546.12,-252.24 3538.77,-251.28 3539.77,-256.08"/>
<text text-anchor="middle" x="2600" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">wake live / sticky</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M813.12,-252.42C821.62,-254 827,-255 827,-255 827,-255 2551,-287 2551,-287 2551,-287 2609,-287 2609,-287 2609,-287 3513,-255 3513,-255 3513,-255 3515.31,-254.51 3519.25,-253.68"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3519.77,-256.08 3526.12,-252.24 3518.77,-251.28 3519.77,-256.08"/>
<text text-anchor="middle" x="2580" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">wake live / sticky</text>
</g>
<!-- rtc&#45;&gt;irq -->
<g id="edge52" class="edge">
<title>rtc&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M813.12,-212.47C821.62,-210.96 827,-210 827,-210 827,-210 1568.52,-164.09 1867.36,-145.59"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1867.94,-148.01 1874.77,-145.13 1867.63,-143.12 1867.94,-148.01"/>
<text text-anchor="middle" x="1350" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ13</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M813.12,-212.47C821.62,-210.96 827,-210 827,-210 827,-210 1552.67,-164.29 1847.59,-145.71"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1848.08,-148.14 1854.91,-145.25 1847.77,-143.24 1848.08,-148.14"/>
<text text-anchor="middle" x="1342" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ13</text>
</g>
<!-- rng&#45;&gt;irq -->
<g id="edge46" class="edge">
<title>rng&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1990,-209.81C1990,-195.66 1990,-177.17 1990,-162.49"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1992.45,-162.2 1990,-155.2 1987.55,-162.2 1992.45,-162.2"/>
<text text-anchor="middle" x="2002" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ16</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1970,-209.81C1970,-195.66 1970,-177.17 1970,-162.49"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1972.45,-162.2 1970,-155.2 1967.55,-162.2 1972.45,-162.2"/>
<text text-anchor="middle" x="1982" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ16</text>
</g>
<!-- ps2&#45;&gt;gpio_controller -->
<g id="edge47" class="edge">
<title>ps2&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1579.4,-252.06C1587.66,-253.85 1593,-255 1593,-255 1593,-255 2744,-291.5 2744,-291.5 2744,-291.5 2796,-291.5 2796,-291.5 2796,-291.5 3011,-255 3011,-255 3011,-255 3013.14,-254.52 3016.78,-253.7"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="3017.37,-256.08 3023.67,-252.15 3016.3,-251.3 3017.37,-256.08"/>
<text text-anchor="middle" x="2770" y="-294.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO0/1 ALT1</text>
<text text-anchor="middle" x="2770" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">open drain</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1559.4,-252.06C1567.66,-253.85 1573,-255 1573,-255 1573,-255 2724,-291.5 2724,-291.5 2724,-291.5 2776,-291.5 2776,-291.5 2776,-291.5 2991,-255 2991,-255 2991,-255 2993.14,-254.52 2996.78,-253.7"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2997.37,-256.08 3003.67,-252.15 2996.3,-251.3 2997.37,-256.08"/>
<text text-anchor="middle" x="2750" y="-294.1" font-family="Arial" font-size="8.00" fill="#374151">GPIO0/1 ALT1</text>
<text text-anchor="middle" x="2750" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">open drain</text>
</g>
<!-- ps2&#45;&gt;irq -->
<g id="edge48" class="edge">
<title>ps2&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1579.4,-212.81C1587.66,-211.1 1593,-210 1593,-210 1593,-210 1771.6,-177.61 1889.21,-156.28"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1889.72,-158.68 1896.17,-155.02 1888.84,-153.86 1889.72,-158.68"/>
<text text-anchor="middle" x="1779" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ12</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1559.4,-212.81C1567.66,-211.1 1573,-210 1573,-210 1573,-210 1751.6,-177.61 1869.21,-156.28"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1869.72,-158.68 1876.17,-155.02 1868.84,-153.86 1869.72,-158.68"/>
<text text-anchor="middle" x="1759" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ12</text>
</g>
<!-- gpio_bridge&#45;&gt;ext_io -->
<g id="edge60" class="edge">
<title>gpio_bridge&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2857.65,-113.95C2879.84,-94.09 2909,-68 2909,-68 2909,-68 2920.85,-59.21 2934.01,-49.45"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2855.76,-112.35 2852.18,-118.84 2859.03,-116 2855.76,-112.35"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2935.54,-51.37 2939.7,-45.23 2932.62,-47.43 2935.54,-51.37"/>
<text text-anchor="middle" x="2929" 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="M2837.65,-113.95C2859.84,-94.09 2889,-68 2889,-68 2889,-68 2900.85,-59.21 2914.01,-49.45"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2835.76,-112.35 2832.18,-118.84 2839.03,-116 2835.76,-112.35"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2915.54,-51.37 2919.7,-45.23 2912.62,-47.43 2915.54,-51.37"/>
<text text-anchor="middle" x="2909" y="-70.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 59 KiB

+7 -8
View File
@@ -43,14 +43,13 @@ and output enable come from the PWM interface, so a fault-configured high-Z
state reaches the GPIO pad bridge instead of being overridden by a constant
enable. PWM uses management-core IRQ11.
GPIO2 ALT0 feeds the external synchronization input while retaining its
existing advanced-timer capture binding. GPIO9 ALT0 feeds the asynchronous
fault input. GPIO30 and GPIO31 ALT1 feed capture channels 0 and 1. Software must
select the corresponding alternate function and input mode before relying on
these paths. GPIO9 fault shutdown includes an immediate asynchronous safe-state
path plus synchronized filtering/status inside the IP; technology sign-off must
verify external pulse width and pad-disable latency. The complete programming,
safety, and verification contract is in the managed
GPIO2 ALT0 feeds the external synchronization input. GPIO9 ALT0 feeds the
asynchronous fault input. GPIO30 and GPIO31 ALT1 feed capture channels 0 and 1.
Software must select the corresponding alternate function and input mode before
relying on these paths. GPIO9 fault shutdown includes an immediate asynchronous
safe-state path plus synchronized filtering/status inside the IP; technology
sign-off must verify external pulse width and pad-disable latency. The complete
programming, safety, and verification contract is in the managed
[PWM V2 datasheet](../rtl/managed/clusterip/pwm/doc/datasheet.md).
## WS2812 output
+6 -8
View File
@@ -59,14 +59,12 @@
{"symbol": "RIBP_GPIO_ADMIN", "base": "0x10014000", "size": "0x00001000", "route": "ribp", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "APB_ARCHINFO", "base": "0x20000000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "ro"},
{"symbol": "APB_RNG", "base": "0x20001000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "APB_UART1", "base": "0x20002000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_PWM", "base": "0x20003000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_PS2", "base": "0x20004000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_RTC", "base": "0x20005000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_WDG", "base": "0x20006000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "APB_CRC", "base": "0x20007000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_TMR", "base": "0x20008000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_USER_IP", "base": "0x2000F000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_PWM", "base": "0x20002000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_PS2", "base": "0x20003000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_RTC", "base": "0x20004000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_WDG", "base": "0x20005000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "none"},
{"symbol": "APB_CRC", "base": "0x20006000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "APB_USER_IP", "base": "0x20007000", "size": "0x00001000", "route": "apb", "kind": "active", "public": true, "user_access": "rw"},
{"symbol": "SRAM", "base": "0x30000000", "size": "0x00020000", "route": "ram", "kind": "active", "public": true, "linker": "SRAM", "user_access": "rw", "burst": "incr4"},
{"symbol": "SDRAM", "base": "0x38000000", "size": "0x02000000", "route": "ribp", "kind": "active", "public": true, "linker": "SDRAM", "user_access": "rw", "burst": "incr4"},
{"symbol": "PSRAM", "base": "0x40000000", "size": "0x00800000", "route": "ribp", "kind": "active", "public": true, "linker": "PSRAM", "user_access": "rw", "burst": "incr4"},
-1
View File
@@ -1 +0,0 @@
instance { retrosoc_tb.u_retrosoc_asic.\u_retrosoc.u_axil_ip_wrapper.u_apb4_uart.u_uart_rx.reg_rx_sync_0__reg } { noTiming };
-23
View File
@@ -72,9 +72,6 @@ module retrosoc_tb;
wire s_dvp_vsync;
wire [ 7:0] s_dvp_data;
wire s_uart1_tx;
wire s_uart1_rx;
`ifdef HAVE_PLL
always #(1000 / XTAL_CPU_FREQ / 2) r_xtal_clk = (r_xtal_clk === 1'b0);
`endif
@@ -146,14 +143,6 @@ module retrosoc_tb;
);
rs232 #(
.BAUD_RATE(115200)
) u_rs232_1 (
.rs232_rx_i(s_uart1_tx),
.rs232_tx_o(s_uart1_rx)
);
ps2_device_model u_ps2_device_model (
.ps2_clk_io(s_gpio_0_io),
.ps2_dat_io(s_gpio_1_io)
@@ -211,18 +200,6 @@ module retrosoc_tb;
end
end
initial begin : UART_RX_BLOCK
integer i;
#1000;
while (1) begin
#1000;
for (i = 0; i < 26; ++i) begin
u_rs232_1.send(i + 8'd66);
#500;
end
end
end
initial begin
if ($test$plusargs("wave_YES")) begin
$display("== generate simulation wave ==");
-6
View File
@@ -5,10 +5,6 @@
/clusterip/rng/rtl/rng_deterministic_source.sv
/clusterip/rng/rtl/apb4_rng.sv
/clusterip/uart/rtl/uart_if.sv
/clusterip/uart/rtl/uart_tx.sv
/clusterip/uart/rtl/uart_rx.sv
/clusterip/uart/rtl/uart_irq.sv
/clusterip/uart/rtl/apb4_uart.sv
/clusterip/pwm/rtl/pwm_pkg.sv
/clusterip/pwm/rtl/pwm_tickgen.sv
/clusterip/pwm/rtl/pwm_timer.sv
@@ -43,5 +39,3 @@
/clusterip/crc/rtl/crc_core.sv
/clusterip/crc/rtl/crc_reg.sv
/clusterip/crc/rtl/apb4_crc.sv
/clusterip/timer/rtl/tmr_if.sv
/clusterip/timer/rtl/apb4_tmr.sv
-1
View File
@@ -15,7 +15,6 @@
+incdir+/clusterip/rtc/rtl
+incdir+/clusterip/wdg/rtl
+incdir+/clusterip/crc/rtl
+incdir+/clusterip/timer/rtl
+incdir+/ip/ribp/interconnect
+incdir+/ip/ribp/util
+incdir+/ip/ribp/memory
+2 -8
View File
@@ -44,8 +44,8 @@ module rib2apb_formal_design (
output logic [ 1:0] rib_rsp_beat,
output logic rib_rsp_last,
output logic rib_rsp_ready,
output logic [ 9:0] psel_comb,
output logic [ 9:0] psel_q,
output logic [ 7:0] psel_comb,
output logic [ 7:0] psel_q,
output logic xfer_ready,
output logic xfer_error,
output logic rsp_input_valid,
@@ -57,13 +57,11 @@ module rib2apb_formal_design (
rib_if rib ();
apb4_pure_if archinfo ();
apb4_pure_if rng ();
apb4_pure_if uart ();
apb4_pure_if pwm ();
apb4_pure_if ps2 ();
apb4_pure_if rtc ();
apb4_pure_if wdg ();
apb4_pure_if crc ();
apb4_pure_if tmr ();
apb4_pure_if user_ip ();
(* anyseq *)logic f_rib_cmd_valid;
@@ -106,13 +104,11 @@ module rib2apb_formal_design (
formal_apb_slave u_archinfo_slave (.apb(archinfo));
formal_apb_slave u_rng_slave (.apb(rng));
formal_apb_slave u_uart_slave (.apb(uart));
formal_apb_slave u_pwm_slave (.apb(pwm));
formal_apb_slave u_ps2_slave (.apb(ps2));
formal_apb_slave u_rtc_slave (.apb(rtc));
formal_apb_slave u_wdg_slave (.apb(wdg));
formal_apb_slave u_crc_slave (.apb(crc));
formal_apb_slave u_tmr_slave (.apb(tmr));
formal_apb_slave u_user_ip_slave (.apb(user_ip));
rib2apb u_dut (
@@ -121,13 +117,11 @@ module rib2apb_formal_design (
.rib (rib),
.archinfo(archinfo),
.rng (rng),
.uart (uart),
.pwm (pwm),
.ps2 (ps2),
.rtc (rtc),
.wdg (wdg),
.crc (crc),
.tmr (tmr),
.user_ip (user_ip)
);
+2 -2
View File
@@ -35,8 +35,8 @@ module rib2apb_formal;
wire [ 1:0] rib_rsp_beat;
wire rib_rsp_last;
wire rib_rsp_ready;
wire [ 9:0] psel_comb;
wire [ 9:0] psel_q;
wire [ 7:0] psel_comb;
wire [ 7:0] psel_q;
wire xfer_ready;
wire xfer_error;
wire rsp_input_valid;
+9 -9
View File
@@ -19,21 +19,21 @@ peripheral output path. Values are restricted to scalar signal references and
one-bit constants so malformed expressions are rejected before RTL generation.
The `apb_targets` list defines the stable APB response slot, timed/pure APB
interface names, and corresponding active APB address-map region. The user-IP
target is part of the fixed platform integration and its presence is checked
against the canonical memory map.
interface names, and corresponding active APB address-map region. APB slots are
contiguous from zero. The user-IP target is part of the fixed platform
integration and its presence is checked against the canonical memory map.
`irq_vector_width`, `irq_groups`, and `interrupts` define the complete core
interrupt topology. `rib` and `apb` group entries declare the wrapper output
width and the associated `retrosoc.sv` signal. Every group bit must be present
exactly once, each core-vector bit must have one source, and sources are limited
to scalar signal references or one-bit constants. The generator emits the two
wrapper bindings, the core-vector wiring, and simulation-only assertions. Core
IRQ bits 0 through 16 retain their current compatibility mapping; additions
must use currently unallocated bits and preserve the existing entries. Bits
without an interrupt entry are driven low. Firmware does not expose a generic
external interrupt API until the SoC includes a claim/complete interrupt
controller.
wrapper bindings, the core-vector wiring, and simulation-only assertions.
Existing allocated core IRQ bits retain their compatibility mapping; additions
must use currently unallocated bits and preserve the existing entries. Removing
a source leaves its core IRQ bit unallocated and driven low. Firmware does not
expose a generic external interrupt API until the SoC includes a claim/complete
interrupt controller.
`user_extensions.json` defines the SoC-level user-core and user-IP slots.
The locked mini-ver-mpw `mpw.toml` remains the source of truth for enabled
@@ -37,13 +37,11 @@ COMPATIBILITY_IRQ_BINDINGS = (
("i2c0", "ribp", 7, 7, "i2c0.irq_o"),
("i2s", "ribp", 8, 8, "i2s.irq_o"),
("xpi", "ribp", 9, 9, "xpi.irq_o"),
("uart1", "apb", 0, 10, "uart.irq_o"),
("pwm", "apb", 1, 11, "pwm.irq_o"),
("ps2", "apb", 2, 12, "ps2.irq_o"),
("rtc", "apb", 3, 13, "u_rtc_if.irq_o"),
("watchdog_early_warning", "apb", 4, 14, "u_wdg_if.irq_o"),
("advanced_timer", "apb", 5, 15, "u_tmr_if.irq_o"),
("rng", "apb", 6, 16, "s_rng_irq"),
("pwm", "apb", 0, 11, "pwm.irq_o"),
("ps2", "apb", 1, 12, "ps2.irq_o"),
("rtc", "apb", 2, 13, "u_rtc_if.irq_o"),
("watchdog_early_warning", "apb", 3, 14, "u_wdg_if.irq_o"),
("rng", "apb", 4, 16, "s_rng_irq"),
("ws2812", "ribp", 10, 17, "ws2812.irq_o"),
("gpio", "ribp", 11, 18, "gpio.irq_o"),
("i2c1", "ribp", 12, 19, "i2c1.irq_o"),
+15 -19
View File
@@ -4,7 +4,7 @@
"irq_vector_width": 32,
"irq_groups": [
{"name": "ribp", "width": 13, "top_signal": "s_ribp_irq"},
{"name": "apb", "width": 7, "top_signal": "s_apb_irq"}
{"name": "apb", "width": 5, "top_signal": "s_apb_irq"}
],
"interrupts": [
{"name": "clint_software", "description": "CLINT machine software interrupt", "group": "ribp", "group_bit": 0, "core_bit": 0, "signal": "u_clint_if.software_irq_o[0]", "user_visible": false},
@@ -17,13 +17,11 @@
{"name": "i2c0", "description": "RIBP I2C0 interrupt", "group": "ribp", "group_bit": 7, "core_bit": 7, "signal": "i2c0.irq_o"},
{"name": "i2s", "description": "RIBP I2S interrupt", "group": "ribp", "group_bit": 8, "core_bit": 8, "signal": "i2s.irq_o"},
{"name": "xpi", "description": "XPI controller interrupt", "group": "ribp", "group_bit": 9, "core_bit": 9, "signal": "xpi.irq_o"},
{"name": "uart1", "description": "APB UART1 interrupt", "group": "apb", "group_bit": 0, "core_bit": 10, "signal": "uart.irq_o"},
{"name": "pwm", "description": "APB PWM interrupt", "group": "apb", "group_bit": 1, "core_bit": 11, "signal": "pwm.irq_o"},
{"name": "ps2", "description": "APB PS2 interrupt", "group": "apb", "group_bit": 2, "core_bit": 12, "signal": "ps2.irq_o"},
{"name": "rtc", "description": "APB RTC interrupt", "group": "apb", "group_bit": 3, "core_bit": 13, "signal": "u_rtc_if.irq_o"},
{"name": "watchdog_early_warning", "description": "APB watchdog early-warning interrupt", "group": "apb", "group_bit": 4, "core_bit": 14, "signal": "u_wdg_if.irq_o"},
{"name": "advanced_timer", "description": "APB advanced timer interrupt", "group": "apb", "group_bit": 5, "core_bit": 15, "signal": "u_tmr_if.irq_o"},
{"name": "rng", "description": "APB RNG data/error interrupt", "group": "apb", "group_bit": 6, "core_bit": 16, "signal": "s_rng_irq", "user_visible": false},
{"name": "pwm", "description": "APB PWM interrupt", "group": "apb", "group_bit": 0, "core_bit": 11, "signal": "pwm.irq_o"},
{"name": "ps2", "description": "APB PS2 interrupt", "group": "apb", "group_bit": 1, "core_bit": 12, "signal": "ps2.irq_o"},
{"name": "rtc", "description": "APB RTC interrupt", "group": "apb", "group_bit": 2, "core_bit": 13, "signal": "u_rtc_if.irq_o"},
{"name": "watchdog_early_warning", "description": "APB watchdog early-warning interrupt", "group": "apb", "group_bit": 3, "core_bit": 14, "signal": "u_wdg_if.irq_o"},
{"name": "rng", "description": "APB RNG data/error interrupt", "group": "apb", "group_bit": 4, "core_bit": 16, "signal": "s_rng_irq", "user_visible": false},
{"name": "ws2812", "description": "WS2812 transmitter interrupt", "group": "ribp", "group_bit": 10, "core_bit": 17, "signal": "ws2812.irq_o"},
{"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"}
@@ -61,19 +59,17 @@
"apb_targets": [
{"slot": 0, "name": "archinfo", "timed_interface": "u_archinfo_apb_if", "pure_interface": "u_archinfo_apb_pure_if", "region": "APB_ARCHINFO"},
{"slot": 1, "name": "rng", "timed_interface": "u_rng_apb_if", "pure_interface": "u_rng_apb_pure_if", "region": "APB_RNG"},
{"slot": 2, "name": "uart", "timed_interface": "u_uart1_apb_if", "pure_interface": "u_uart1_apb_pure_if", "region": "APB_UART1"},
{"slot": 3, "name": "pwm", "timed_interface": "u_pwm_apb_if", "pure_interface": "u_pwm_apb_pure_if", "region": "APB_PWM"},
{"slot": 4, "name": "ps2", "timed_interface": "u_ps2_apb_if", "pure_interface": "u_ps2_apb_pure_if", "region": "APB_PS2"},
{"slot": 5, "name": "rtc", "timed_interface": "u_rtc_apb_if", "pure_interface": "u_rtc_apb_pure_if", "region": "APB_RTC"},
{"slot": 6, "name": "wdg", "timed_interface": "u_wdg_apb_if", "pure_interface": "u_wdg_apb_pure_if", "region": "APB_WDG"},
{"slot": 7, "name": "crc", "timed_interface": "u_crc_apb_if", "pure_interface": "u_crc_apb_pure_if", "region": "APB_CRC"},
{"slot": 8, "name": "tmr", "timed_interface": "u_tmr_apb_if", "pure_interface": "u_tmr_apb_pure_if", "region": "APB_TMR"},
{"slot": 9, "name": "user_ip", "timed_interface": "u_user_ip_apb_if", "pure_interface": "u_user_ip_apb_pure_if", "region": "APB_USER_IP"}
{"slot": 2, "name": "pwm", "timed_interface": "u_pwm_apb_if", "pure_interface": "u_pwm_apb_pure_if", "region": "APB_PWM"},
{"slot": 3, "name": "ps2", "timed_interface": "u_ps2_apb_if", "pure_interface": "u_ps2_apb_pure_if", "region": "APB_PS2"},
{"slot": 4, "name": "rtc", "timed_interface": "u_rtc_apb_if", "pure_interface": "u_rtc_apb_pure_if", "region": "APB_RTC"},
{"slot": 5, "name": "wdg", "timed_interface": "u_wdg_apb_if", "pure_interface": "u_wdg_apb_pure_if", "region": "APB_WDG"},
{"slot": 6, "name": "crc", "timed_interface": "u_crc_apb_if", "pure_interface": "u_crc_apb_pure_if", "region": "APB_CRC"},
{"slot": 7, "name": "user_ip", "timed_interface": "u_user_ip_apb_if", "pure_interface": "u_user_ip_apb_pure_if", "region": "APB_USER_IP"}
],
"gpio_alt_functions": [
{"pin": 0, "alt0": {"inputs": ["u_uart1_if.rx_i"], "do": "1'b0", "oe": "1'b0"}, "alt1": {"inputs": ["u_ps2_if.ps2_clk_i"], "do": "u_ps2_if.ps2_clk_o", "oe": "u_ps2_if.ps2_clk_oe_o"}},
{"pin": 1, "alt0": {"inputs": [], "do": "u_uart1_if.tx_o", "oe": "1'b1"}, "alt1": {"inputs": ["u_ps2_if.ps2_dat_i"], "do": "u_ps2_if.ps2_dat_o", "oe": "u_ps2_if.ps2_dat_oe_o"}},
{"pin": 2, "alt0": {"inputs": ["s_tmr_capch", "u_pwm_if.sync_i"], "do": "1'b0", "oe": "1'b0"}, "alt1": {"inputs": [], "do": "u_ws2812_if.dat_o", "oe": "1'b1"}},
{"pin": 0, "alt0": {"inputs": [], "do": "1'b0", "oe": "1'b0"}, "alt1": {"inputs": ["u_ps2_if.ps2_clk_i"], "do": "u_ps2_if.ps2_clk_o", "oe": "u_ps2_if.ps2_clk_oe_o"}},
{"pin": 1, "alt0": {"inputs": [], "do": "1'b0", "oe": "1'b0"}, "alt1": {"inputs": ["u_ps2_if.ps2_dat_i"], "do": "u_ps2_if.ps2_dat_o", "oe": "u_ps2_if.ps2_dat_oe_o"}},
{"pin": 2, "alt0": {"inputs": ["u_pwm_if.sync_i"], "do": "1'b0", "oe": "1'b0"}, "alt1": {"inputs": [], "do": "u_ws2812_if.dat_o", "oe": "1'b1"}},
{"pin": 3, "alt0": {"inputs": [], "do": "u_pwm_if.pwm_o[0]", "oe": "u_pwm_if.oe_o[0]"}, "alt1": {"inputs": ["u_i2c1_if.scl_i"], "do": "u_i2c1_if.scl_o", "oe": "u_i2c1_if.scl_oe_o"}},
{"pin": 4, "alt0": {"inputs": [], "do": "u_pwm_if.pwm_o[1]", "oe": "u_pwm_if.oe_o[1]"}, "alt1": {"inputs": ["u_i2c1_if.sda_i"], "do": "u_i2c1_if.sda_o", "oe": "u_i2c1_if.sda_oe_o"}},
{"pin": 5, "alt0": {"inputs": [], "do": "u_pwm_if.pwm_o[2]", "oe": "u_pwm_if.oe_o[2]"}, "alt1": {"inputs": [], "do": "clkdiv4_i", "oe": "1'b1"}},
-2
View File
@@ -88,8 +88,6 @@ CRT_SRCS := $(ROOT_PATH)/crt/arch/riscv/startup.S \
$(ROOT_PATH)/crt/src/hal/watchdog.c \
$(ROOT_PATH)/crt/src/hal/crc.c \
$(ROOT_PATH)/crt/src/hal/rng.c \
$(ROOT_PATH)/crt/src/hal/advanced_timer.c \
$(ROOT_PATH)/crt/src/hal/hpuart.c \
$(ROOT_PATH)/crt/src/hal/ps2.c \
$(ROOT_PATH)/crt/src/hal/i2c_math.c \
$(ROOT_PATH)/crt/src/hal/i2c.c \
-1
View File
@@ -40,7 +40,6 @@ POST_OPTS := -sdf min:retrosoc_tb.u_retrosoc_asic:$(SDF_PATH) \
+sdfverbose \
+neg_tchk \
-negdelay \
+optconfigfile+$(RTL_PATH)/disable_timing_checklist \
-diag=sdf:verbose \
+warn=OPD:10,IWNF:10,SDFCOM_UHICD:10,SDFCOM_ANICD:10,SDFCOM_NICD:10,DRTZ:10,SDFCOM_UHICD:10,SDFCOM_NTCDTL:10
-19
View File
@@ -9,7 +9,6 @@
// See the Mulan PSL v2 for more details.
`include "mmap_define.svh"
`include "uart_define.svh"
`include "pwm_define.svh"
`include "ps2_define.svh"
`include "user_extensions.svh"
@@ -23,9 +22,7 @@ module ip_apb_wrapper (
input logic clk_aud_i,
input logic rst_aud_n_i,
input logic debug_halted_i,
input logic tmr_capch_i,
rib_if.slave rib,
uart_if.dut uart,
pwm_if.dut pwm,
ps2_if.dut ps2,
input logic [`USER_IPSEL_WIDTH-1:0] ip_sel_i,
@@ -99,10 +96,6 @@ module ip_apb_wrapper (
.wdg_rst_n_i (rst_aud_n_i),
.debug_halted_i(debug_halted_i)
);
tmr_if u_tmr_if (.exclk_i(clk_aud_i));
assign u_tmr_if.capch_i = tmr_capch_i;
`include "soc_apb_bridges.svh"
// verilog_format: off
@@ -149,13 +142,6 @@ module ip_apb_wrapper (
.apb4 (u_rng_apb_if)
);
apb4_uart #(
.FIFO_DEPTH(32)
) u_apb4_uart (
.apb4(u_uart1_apb_if),
.uart(uart)
);
apb4_pwm #(
.PCLK_HZ(`SOC_EXT_CLK_HZ)
) u_apb4_pwm (
@@ -194,11 +180,6 @@ module ip_apb_wrapper (
apb4_crc u_apb4_crc (.apb4(u_crc_apb_if));
apb4_tmr u_apb4_tmr (
.apb4(u_tmr_apb_if),
.tmr (u_tmr_if)
);
// Generated IRQ ownership and core-vector bit assignments are topology checked.
`include "soc_apb_irq_bindings.svh"
-4
View File
@@ -56,12 +56,10 @@ module retrosoc (
sdio_if u_sdio_if ();
opipsram_if u_opipsram_if ();
i2c_if u_i2c1_if ();
uart_if u_uart1_if ();
pwm_if u_pwm_if ();
ps2_if u_ps2_if ();
// verilog_format: on
logic s_tmr_capch;
logic s_mgmt_debug_halted;
logic [`SOC_IRQ_VECTOR_WIDTH-1:0] s_irq;
logic [ `SOC_IRQ_RIBP_WIDTH-1:0] s_ribp_irq;
@@ -203,9 +201,7 @@ core_wrapper u_core_wrapper (
.clk_aud_i (clk_aud_i),
.rst_aud_n_i (rst_aud_n_i),
.debug_halted_i (s_mgmt_debug_halted),
.tmr_capch_i (s_tmr_capch),
`include "soc_ip_apb_wrapper_fabric.svh"
.uart (u_uart1_if),
.pwm (u_pwm_if),
.ps2 (u_ps2_if),
.ip_sel_i (u_sysctrl_if.ip_sel_o),
+3 -3
View File
@@ -18,9 +18,9 @@
//
// GPIO ALT0 DIR ALT1 DIR
// ------ --------------------------- ------ ---------------------- ------
// GPIO00 UART1_RX IN PS2_CLK BIDI
// GPIO01 UART1_TX OUT PS2_DATA BIDI
// GPIO02 TMR_CAPTURE + PWM_SYNC IN WS2812_DATA OUT
// GPIO00 TIE_OFF - PS2_CLK BIDI
// GPIO01 TIE_OFF - PS2_DATA BIDI
// GPIO02 PWM_SYNC IN WS2812_DATA OUT
// GPIO03 PWM0 OUT I2C1_SCL BIDI
// GPIO04 PWM1 OUT I2C1_SDA BIDI
// GPIO05 PWM2 OUT CLKDIV4 OUT
-10
View File
@@ -12,13 +12,11 @@ module rib2apb_tb;
rib_if rib ();
apb4_pure_if archinfo ();
apb4_pure_if rng ();
apb4_pure_if uart ();
apb4_pure_if pwm ();
apb4_pure_if ps2 ();
apb4_pure_if rtc ();
apb4_pure_if wdg ();
apb4_pure_if crc ();
apb4_pure_if tmr ();
apb4_pure_if user_ip ();
always #5 clk_i = ~clk_i;
@@ -29,9 +27,6 @@ module rib2apb_tb;
assign rng.pready = rng_ready;
assign rng.prdata = rng_rdata;
assign rng.pslverr = rng_slverr;
assign uart.pready = 1'b0;
assign uart.prdata = '0;
assign uart.pslverr = 1'b0;
assign pwm.pready = 1'b0;
assign pwm.prdata = '0;
assign pwm.pslverr = 1'b0;
@@ -47,9 +42,6 @@ module rib2apb_tb;
assign crc.pready = 1'b0;
assign crc.prdata = '0;
assign crc.pslverr = 1'b0;
assign tmr.pready = 1'b0;
assign tmr.prdata = '0;
assign tmr.pslverr = 1'b0;
assign user_ip.pready = 1'b0;
assign user_ip.prdata = '0;
assign user_ip.pslverr = 1'b0;
@@ -60,13 +52,11 @@ module rib2apb_tb;
.rib (rib),
.archinfo(archinfo),
.rng (rng),
.uart (uart),
.pwm (pwm),
.ps2 (ps2),
.rtc (rtc),
.wdg (wdg),
.crc (crc),
.tmr (tmr),
.user_ip (user_ip)
);
+18 -4
View File
@@ -30,17 +30,31 @@ module soc_irq_topology_tb;
expect_irq(32'd1 << bit_index);
end
s_ribp_irq = '0;
s_ribp_irq[10] = 1'b1;
expect_irq(32'd1 << 17);
for (int bit_index = 10; bit_index < `SOC_IRQ_RIBP_WIDTH; bit_index++) begin
s_ribp_irq = '0;
s_ribp_irq[bit_index] = 1'b1;
expect_irq(32'd1 << (bit_index + 7));
end
for (int bit_index = 0; bit_index < `SOC_IRQ_APB_WIDTH; bit_index++) begin
s_ribp_irq = '0;
s_apb_irq = '0;
s_apb_irq[bit_index] = 1'b1;
expect_irq(32'd1 << (10 + bit_index));
case (bit_index)
0: expect_irq(32'd1 << 11);
1: expect_irq(32'd1 << 12);
2: expect_irq(32'd1 << 13);
3: expect_irq(32'd1 << 14);
4: expect_irq(32'd1 << 16);
default: $fatal(1, "unexpected APB IRQ bit %0d", bit_index);
endcase
end
s_apb_irq = '0;
expect_irq('0);
if (s_irq[10] !== 1'b0 || s_irq[15] !== 1'b0) begin
$fatal(1, "removed core IRQ bits are not low: IRQ10=%b IRQ15=%b", s_irq[10], s_irq[15]);
end
if (s_irq[31:18] !== '0) begin
$fatal(1, "unallocated core IRQ bits are not low: %h", s_irq[31:18]);
end
+17 -2
View File
@@ -87,8 +87,23 @@ def test_user_ip_is_always_emitted_for_the_fixed_platform(tmp_path: Path) -> Non
rtl = (tmp_path / "rtl/mmap_define.svh").read_text(encoding="utf-8")
header = (tmp_path / "include/retrosoc/generated/memory_map.h").read_text(encoding="utf-8")
assert "SOC_ADDR_APB_USER_IP_BASE" in rtl
assert "RS_SOC_APB_USER_IP_BASE" in header
expected_apb_bases = {
"ARCHINFO": "20000000",
"RNG": "20001000",
"PWM": "20002000",
"PS2": "20003000",
"RTC": "20004000",
"WDG": "20005000",
"CRC": "20006000",
"USER_IP": "20007000",
}
for symbol, base in expected_apb_bases.items():
assert f"`define SOC_ADDR_APB_{symbol}_BASE 32'h{base}" in rtl
assert f"#define RS_SOC_APB_{symbol}_BASE UINT32_C(0x{base})" in header
assert "APB_UART1" not in rtl
assert "APB_UART1" not in header
assert "APB_TMR" not in rtl
assert "APB_TMR" not in header
def test_bootstrap_assembly_uses_the_generated_gpio_admin_base() -> None:
+36 -25
View File
@@ -82,7 +82,11 @@ def test_topology_generates_complete_rib_apb_and_gpio_bindings(tmp_path: Path) -
assert "assign s_xpi_region_sel[1] = (ribp.addr <= `SOC_ADDR_FLASH_END);" in routes
assert "assign u_sdio_ribp_if.valid = 1'b0;" in routes
assert gpio.count("// GPIO") == 64
assert "assign u_uart1_if.rx_i = u_gpio_if.di_i[0];" in gpio
assert "u_uart1_if" not in gpio
assert "assign u_gpio_if.alt0_do_i[0] = 1'b0;" in gpio
assert "assign u_gpio_if.alt0_oe_i[0] = 1'b0;" in gpio
assert "assign u_gpio_if.alt0_do_i[1] = 1'b0;" in gpio
assert "assign u_gpio_if.alt0_oe_i[1] = 1'b0;" in gpio
assert "assign u_gpio_if.alt1_do_i[0] = u_ps2_if.ps2_clk_o;" in gpio
assert "assign u_gpio_if.alt1_oe_i[0] = u_ps2_if.ps2_clk_oe_o;" in gpio
assert "assign u_gpio_if.alt1_do_i[1] = u_ps2_if.ps2_dat_o;" in gpio
@@ -95,11 +99,12 @@ def test_topology_generates_complete_rib_apb_and_gpio_bindings(tmp_path: Path) -
assert "assign u_pwm_if.capture_i[0] = u_gpio_if.di_i[30];" in gpio
assert "assign u_pwm_if.capture_i[1] = u_gpio_if.di_i[31];" in gpio
assert "assign u_gpio_if.alt1_do_i[22] = u_psram_if.nss_o[0];" in gpio
assert apb_interfaces.count("apb4_if u_") == 10
assert "s_tmr_capch" not in gpio
assert apb_interfaces.count("apb4_if u_") == 8
assert "apb4_pure_if u_archinfo_apb_pure_if ();" in apb_interfaces
assert "assign tmr.paddr = s_addr_q;" in apb_routes
assert "({32{s_psel_q[8]}} & tmr.prdata)" in apb_response
assert "localparam int NSLV = 10;" in apb_declarations
assert "assign user_ip.paddr = s_addr_q;" in apb_routes
assert "({32{s_psel_q[7]}} & user_ip.prdata)" in apb_response
assert "localparam int NSLV = 8;" in apb_declarations
assert fabric.count("ribp_if u_") == 1
assert fabric.count("rib_if u_") == 4
assert ".mgmt_ribp(u_mgmt_ribp_if)" in bus_fabric
@@ -107,16 +112,20 @@ def test_topology_generates_complete_rib_apb_and_gpio_bindings(tmp_path: Path) -
assert ".apb_rib(u_apb_rib_if)" in bus_fabric
assert ".rib(u_rib_if)" in bus_fabric
assert "`define SOC_IRQ_VECTOR_WIDTH 32" in irq_config
assert "`define SOC_USER_IRQ_MASK 32'h000EFFFC" in irq_config
assert "`define SOC_USER_IRQ_MASK 32'h000E7BFC" in irq_config
assert "`define SOC_IRQ_RIBP_WIDTH 13" in irq_config
assert "`define SOC_IRQ_APB_WIDTH 7" in irq_config
assert "`define SOC_IRQ_APB_WIDTH 5" in irq_config
assert "assign irq_o[0] = u_clint_if.software_irq_o[0];" in rib_irq
assert "assign irq_o[10] = ws2812.irq_o;" in rib_irq
assert "assign irq_o[11] = gpio.irq_o;" in rib_irq
assert "assign irq_o[12] = i2c1.irq_o;" in rib_irq
assert "assign irq_o[5] = u_tmr_if.irq_o;" in apb_irq
assert "assign irq_o[6] = s_rng_irq;" in apb_irq
assert "s_irq[16] = s_apb_irq[6];" in irq_wiring
assert "assign irq_o[0] = pwm.irq_o;" in apb_irq
assert "assign irq_o[4] = s_rng_irq;" in apb_irq
assert "s_irq[10]" not in irq_wiring
assert "s_irq[15]" not in irq_wiring
assert "s_irq[16] = s_apb_irq[4];" in irq_wiring
assert "irq_i[10] == 1'b0" in irq_sva
assert "irq_i[15] == 1'b0" in irq_sva
assert "irq_i[31] == 1'b0" in irq_sva
assert "bind retrosoc soc_irq_topology_sva" in irq_sva
assert filelist.startswith("+incdir+")
@@ -135,7 +144,7 @@ def test_topology_preserves_default_irq_compatibility_mapping() -> None:
)
for interrupt in document["interrupts"]
]
assert mappings[:20] == [
assert mappings == [
("clint_software", "ribp", 0, 0, "u_clint_if.software_irq_o[0]"),
("clint_timer", "ribp", 1, 1, "u_clint_if.timer_irq_o[0]"),
("uart0", "ribp", 2, 2, "uart.irq_o"),
@@ -146,18 +155,15 @@ def test_topology_preserves_default_irq_compatibility_mapping() -> None:
("i2c0", "ribp", 7, 7, "i2c0.irq_o"),
("i2s", "ribp", 8, 8, "i2s.irq_o"),
("xpi", "ribp", 9, 9, "xpi.irq_o"),
("uart1", "apb", 0, 10, "uart.irq_o"),
("pwm", "apb", 1, 11, "pwm.irq_o"),
("ps2", "apb", 2, 12, "ps2.irq_o"),
("rtc", "apb", 3, 13, "u_rtc_if.irq_o"),
("watchdog_early_warning", "apb", 4, 14, "u_wdg_if.irq_o"),
("advanced_timer", "apb", 5, 15, "u_tmr_if.irq_o"),
("rng", "apb", 6, 16, "s_rng_irq"),
("pwm", "apb", 0, 11, "pwm.irq_o"),
("ps2", "apb", 1, 12, "ps2.irq_o"),
("rtc", "apb", 2, 13, "u_rtc_if.irq_o"),
("watchdog_early_warning", "apb", 3, 14, "u_wdg_if.irq_o"),
("rng", "apb", 4, 16, "s_rng_irq"),
("ws2812", "ribp", 10, 17, "ws2812.irq_o"),
("gpio", "ribp", 11, 18, "gpio.irq_o"),
("i2c1", "ribp", 12, 19, "i2c1.irq_o"),
]
assert all(mapping[3] >= 20 for mapping in mappings[20:])
def test_topology_always_adds_the_user_apb_target(tmp_path: Path) -> None:
@@ -172,12 +178,12 @@ def test_topology_always_adds_the_user_apb_target(tmp_path: Path) -> None:
)
assert "apb4_if u_user_ip_apb_if (clk_i, rst_n_i);" in interfaces
assert "localparam int NSLV = 10;" in declarations
assert "s_psel_q[9]" in response
assert "localparam int NSLV = 8;" in declarations
assert "s_psel_q[7]" in response
assert "apb4_pure_if user_ip ();" in formal_design
assert ".user_ip (user_ip)" in formal_design
assert "logic [ 9:0] psel_comb" in formal_design
assert "wire [ 9:0] psel_comb" in formal_properties
assert "logic [ 7:0] psel_comb" in formal_design
assert "wire [ 7:0] psel_comb" in formal_properties
def test_topology_rejects_unknown_or_non_rib_regions(tmp_path: Path) -> None:
@@ -222,7 +228,7 @@ def test_topology_rejects_invalid_apb_target_ownership(tmp_path: Path) -> None:
assert "not an active APB region" in result.stderr
document = json.loads(TOPOLOGY.read_text(encoding="utf-8"))
document["apb_targets"][8]["slot"] = 0
document["apb_targets"][7]["slot"] = 0
result = validate(write_invalid_topology(tmp_path, document))
assert result.returncode != 0
assert "APB target slot 0 is duplicated" in result.stderr
@@ -268,7 +274,12 @@ def test_topology_rejects_invalid_irq_groups_and_bindings(tmp_path: Path) -> Non
assert "core interrupt bit 0 is duplicated" in result.stderr
document = json.loads(TOPOLOGY.read_text(encoding="utf-8"))
document["interrupts"].pop(16)
rng_index = next(
index
for index, interrupt in enumerate(document["interrupts"])
if interrupt["name"] == "rng"
)
document["interrupts"].pop(rng_index)
result = validate(write_invalid_topology(tmp_path, document))
assert result.returncode != 0
assert "interrupt group apb does not cover every group bit" in result.stderr