feat: add archinfo metadata generation and integration

- Introduced scripts and makefile targets for generating architecture information metadata.
- Updated the filelist generation to include archinfo metadata files.
- Modified software.mk to include archinfo source files and headers.
- Enhanced the ip_apb_wrapper and user_ip_wrapper to integrate archinfo components.
- Updated tests to ensure stability and correct path expansions for generated files.
- Removed unnecessary files from the clusterip filelist.
This commit is contained in:
maksyuki committed 2026-08-09 15:14:41 +08:00
1 parent 8266791cfc
commit 4f8d7bc699
20 files changed
+520 -288

No files matched your search

+5 -1
View File
@@ -40,6 +40,7 @@ HAVE_SRAM_IF ?= NO
HAVE_SRAM_MACRO ?= NO
PDK_BEHAV ?= NO
HAVE_SVA ?= NO
BUILD_RELEASE ?= NO
JTAG_IDCODE ?= DEADBEEF
EXT_CLK_HZ ?= 72000000
CLINT_TIMEBASE_HZ ?= 1000000
@@ -82,7 +83,7 @@ JOBS ?= $(shell count=$$(nproc 2>/dev/null || printf '1'); \
if [ "$$count" -gt "$(MAX_JOBS)" ]; then printf '%s' '$(MAX_JOBS)'; \
else printf '%s' "$$count"; fi)
CONFIG_KEY_VARS := SOC PDK HAVE_PLL HAVE_SRAM_IF HAVE_SRAM_MACRO PDK_BEHAV HAVE_SVA \
JTAG_IDCODE EXT_CLK_HZ CLINT_TIMEBASE_HZ ISA HAVE_CSR APP LINK_TYPE \
BUILD_RELEASE JTAG_IDCODE EXT_CLK_HZ CLINT_TIMEBASE_HZ ISA HAVE_CSR APP LINK_TYPE \
COREMARK_MODE RTL_TOP FIRMWARE_NAME
VARIANT_ID := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/config_key.py \
--lock $(LOCK_FILE) --profile $(PROFILE_NAME) --timestamp $(BUILD_TIMESTAMP) \
@@ -92,6 +93,7 @@ $(error Failed to calculate build variant ID)
endif
LOCK_DIGEST := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/dependency_lock.py \
--lock $(LOCK_FILE) --digest | tail -n 1))
CONFIG_DIGEST := $(lastword $(subst -, ,$(VARIANT_ID)))
export BUILD_TIMESTAMP
VARIANT_ROOT := $(abspath $(BUILD_ROOT))/$(VARIANT_ID)
SW_BUILD_DIR := $(VARIANT_ROOT)/sw
@@ -131,6 +133,7 @@ $(call validate_value,HAVE_SRAM_IF,$(VALID_BOOL))
$(call validate_value,HAVE_SRAM_MACRO,$(VALID_BOOL))
$(call validate_value,PDK_BEHAV,$(VALID_BOOL))
$(call validate_value,HAVE_SVA,$(VALID_BOOL))
$(call validate_value,BUILD_RELEASE,$(VALID_BOOL))
$(call validate_value,WAVE,$(VALID_BOOL))
$(call validate_value,FORMAL,$(VALID_BOOL))
$(call validate_value,VCS_USE_LSF,$(VALID_BOOL))
@@ -313,6 +316,7 @@ config:
VCS_USE_LSF '$(VCS_USE_LSF)' PDK '$(PDK)' \
HAVE_PLL '$(HAVE_PLL)' HAVE_SRAM_IF '$(HAVE_SRAM_IF)' \
HAVE_SRAM_MACRO '$(HAVE_SRAM_MACRO)' PDK_BEHAV '$(PDK_BEHAV)' HAVE_SVA '$(HAVE_SVA)' \
BUILD_RELEASE '$(BUILD_RELEASE)' \
JTAG_IDCODE '$(JTAG_IDCODE)' EXT_CLK_HZ '$(EXT_CLK_HZ)' \
CLINT_TIMEBASE_HZ '$(CLINT_TIMEBASE_HZ)' \
ISA '$(ISA)' HAVE_CSR '$(HAVE_CSR)' APP '$(APP)' \
+4 -1
View File
@@ -35,6 +35,8 @@ under the [Mulan Permissive Software License, Version 2](LICENSE).
`coremark`, `debug`, and `shell` applications.
- Open-source behavioral simulation with Icarus Verilog and Verilator, synthesis with
Yosys, netlist simulation with Icarus Verilog, and timing analysis with OpenSTA.
- Read-only ARCHINFO ABI V2 discovery for build/configuration provenance, SoC
topology, technology capabilities, and lifecycle-gated device identity.
- Checksum-verified dependency and toolchain locks, structured flow results, warning
baselines, metrics collection, SBOM generation, and checksummed release packages.
@@ -73,7 +75,8 @@ user core.
CI Verilator firmware simulations explicitly select the `ci_smoke`
application, which checks UART, archinfo APB readback, and test-status
completion without the verbose startup report. The profiles retain `bringup`
completion without the verbose startup report. ARCHINFO checks include its V2
ABI and the build/configuration identifiers generated for that variant. The profiles retain `bringup`
as their default for manual diagnostics. To run the full report in Verilator,
use:
+1 -1
View File
@@ -29,7 +29,7 @@ The build selects an application with `APP=<name>`. The supported profiles are:
| --- | --- |
| `benchmark` | Fixed-workload memory and DMA baseline with machine-readable wait counters and readback checksums. |
| `bringup` | Manual startup diagnostic that prints complete application and archinfo details. |
| `ci_smoke` | Fast deterministic CI smoke test for UART, archinfo APB readback, and test-status completion. |
| `ci_smoke` | Fast deterministic CI smoke test for UART, ARCHINFO V2 ABI/build identity, and test-status completion. |
| `coremark` | SRAM-resident Hazard3 CoreMark measurement; use the committed quick or standard profile. |
| `debug` | Minimal SRAM image used only by the Hazard3 OpenOCD/GDB acceptance flow. |
| `shell` | Interactive application that adds shell services, board drivers, media, FatFs, CoreMark, and UserIP integration. |
+7 -7
View File
@@ -1,3 +1,4 @@
#include <retrosoc/core/archinfo.h>
#include <retrosoc/core/soc.h>
#include <retrosoc/hal/clint.h>
#include <retrosoc/hal/gpio.h>
@@ -6,13 +7,12 @@
#include <retrosoc/lib/printf.h>
#include <retrosoc/service/test.h>
static bool rs_ci_smoke_archinfo_matches_reset_values(void) {
const uint32_t archinfo_sys = reg_archinfo_sys;
const uint32_t archinfo_idl = reg_archinfo_idl;
const uint32_t archinfo_idh = reg_archinfo_idh;
static bool rs_ci_smoke_archinfo_v2(void) {
rs_archinfo_t info;
uint32_t device_id[4];
return (archinfo_sys == UINT32_C(0x000F1010)) && (archinfo_idl == UINT32_C(0xFFFF2022)) &&
(archinfo_idh == UINT32_C(0x00FFFFFF));
return (rs_archinfo_read(&info) == RS_OK) && (rs_archinfo_validate_build(&info) == RS_OK) &&
(rs_archinfo_read_device_id(device_id) == RS_ENOTSUP);
}
static bool rs_ci_smoke_clint_standard_map(void) {
@@ -173,7 +173,7 @@ int main(void) {
rs_test_finish(RS_TEST_FAILED, 7U);
}
if (!rs_ci_smoke_archinfo_matches_reset_values()) {
if (!rs_ci_smoke_archinfo_v2()) {
rs_test_finish(RS_TEST_FAILED, 1U);
}
printf("ci_smoke: archinfo passed\n");
+1 -1
View File
@@ -60,7 +60,7 @@
"submodules": ["libraries/sky130_fd_sc_hd/latest"],
"license": "Apache-2.0"
},
"cluster_archinfo": {"url": "https://github.com/retroSoC/archinfo.git", "revision": "d65dd13c83a1176668bf5178004814a1551bf6ba", "destination": "rtl/managed/clusterip/archinfo", "license": "NOASSERTION"},
"cluster_archinfo": {"url": "https://github.com/retroSoC/archinfo.git", "revision": "78505969a0afdbc887cdd9b36eda228b4afb616e", "destination": "rtl/managed/clusterip/archinfo", "license": "MulanPSL-2.0"},
"cluster_clint": {"url": "https://github.com/retroSoC/clint.git", "revision": "ce49f1a5501c0a9f18c0e3f358417648f3f2fb18", "destination": "rtl/managed/clusterip/clint", "license": "NOASSERTION"},
"cluster_common": {"url": "https://github.com/retroSoC/common.git", "revision": "16ee9a5cfdc1248f35f0993710e3cb89464c19d9", "destination": "rtl/managed/clusterip/common", "license": "NOASSERTION"},
"cluster_crc": {"url": "https://github.com/retroSoC/crc.git", "revision": "4654a63d06d487b5b9fe22af228c36c736b90bad", "destination": "rtl/managed/clusterip/crc", "license": "NOASSERTION"},
+11
View File
@@ -1,5 +1,16 @@
#ifndef RETROSOC_ARCHINFO_H
#define RETROSOC_ARCHINFO_H
#include <stdint.h>
#include <archinfo.h>
#include <retrosoc/core/status.h>
typedef archinfo_snapshot_t rs_archinfo_t;
rs_status_t rs_archinfo_read(rs_archinfo_t *info);
rs_status_t rs_archinfo_validate_build(const rs_archinfo_t *info);
rs_status_t rs_archinfo_read_device_id(uint32_t device_id[4]);
void ip_archinfo_test(int argc, char **argv);
#endif
-4
View File
@@ -183,10 +183,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))
// archinfo
#define reg_archinfo_sys RS_SOC_REG32(RS_SOC_APB_ARCHINFO_BASE, UINT32_C(0x00))
#define reg_archinfo_idl RS_SOC_REG32(RS_SOC_APB_ARCHINFO_BASE, UINT32_C(0x04))
#define reg_archinfo_idh RS_SOC_REG32(RS_SOC_APB_ARCHINFO_BASE, UINT32_C(0x08))
// rng
#define reg_rng_ctrl RS_SOC_REG32(RS_SOC_APB_RNG_BASE, UINT32_C(0x00))
#define reg_rng_seed RS_SOC_REG32(RS_SOC_APB_RNG_BASE, UINT32_C(0x04))
+66 -5
View File
@@ -1,12 +1,73 @@
#include <archinfo_integration_metadata.h>
#include <archinfo_regs.h>
#include <retrosoc/core/archinfo.h>
#include <retrosoc/core/soc.h>
#include <retrosoc/lib/printf.h>
#include <retrosoc/core/archinfo.h>
static rs_status_t rs_archinfo_status(archinfo_status_t status) {
rs_status_t result;
switch (status) {
case ARCHINFO_STATUS_OK:
result = RS_OK;
break;
case ARCHINFO_STATUS_INVALID_ARGUMENT:
result = RS_EINVAL;
break;
case ARCHINFO_STATUS_UNAVAILABLE:
result = RS_ENOTSUP;
break;
case ARCHINFO_STATUS_INCOMPATIBLE:
default:
result = RS_EFORMAT;
break;
}
return result;
}
rs_status_t rs_archinfo_read(rs_archinfo_t *info) {
return rs_archinfo_status(archinfo_read((uintptr_t)RS_SOC_APB_ARCHINFO_BASE, info));
}
rs_status_t rs_archinfo_validate_build(const rs_archinfo_t *info) {
const archinfo_build_expectation_t expectation = {
.check_build_id =
(ARCHINFO_INTEGRATION_BUILD_STATUS & ARCHINFO_BUILD_SOURCE_KNOWN_MASK) != 0U,
.check_config_id = true,
.build_id = ARCHINFO_INTEGRATION_BUILD_ID,
.config_id = ARCHINFO_INTEGRATION_CONFIG_ID,
};
return rs_archinfo_status(archinfo_validate(info, &expectation));
}
rs_status_t rs_archinfo_read_device_id(uint32_t device_id[4]) {
return rs_archinfo_status(
archinfo_read_device_id((uintptr_t)RS_SOC_APB_ARCHINFO_BASE, device_id));
}
void ip_archinfo_test(int argc, char **argv) {
rs_archinfo_t info;
rs_status_t status;
(void)argc;
(void)argv;
printf("[APB IP] archinfo test\n");
printf("[ARCHINFO SYS] %x\n", reg_archinfo_sys);
printf("[ARCHINFO IDL] %x\n", reg_archinfo_idl);
printf("[ARCHINFO IDH] %x\n", reg_archinfo_idh);
status = rs_archinfo_read(&info);
if (status != RS_OK) {
printf("[ARCHINFO] read failed: %d\n", status);
return;
}
printf("[APB IP] archinfo ABI V2\n");
printf("[ARCHINFO COMPONENT] %x\n", info.component_id);
printf("[ARCHINFO SOC/REV] %x/%x\n", info.soc_id, info.soc_revision);
printf("[ARCHINFO BUILD] %x%x status=%x\n", (uint32_t)(info.build_id >> 32U),
(uint32_t)info.build_id, info.build_status);
printf("[ARCHINFO CONFIG] %x\n", info.config_id);
printf("[ARCHINFO CLOCK/SRAM] %u/%u\n", info.reference_clock_hz, info.sram_bytes);
printf("[ARCHINFO TOPOLOGY/FEATURES] %x/%x\n", info.topology, info.features0);
printf("[ARCHINFO TECHNOLOGY] %x\n", info.technology);
printf("[ARCHINFO VERSION/CAP] %x/%x\n", info.ip_version, info.capability);
}
+2 -1
View File
@@ -116,7 +116,8 @@ void rs_app_info(void) {
printf(" 1 x DVP @%p\n", (void *)&reg_dvp_recven);
printf(" 1 x I2C1 @%p\n",
(void *)(uintptr_t)RS_SOC_RIBP_I2C1_BASE);
printf(" 1 x ARCHINFO @%p\n", (void *)&reg_archinfo_sys);
printf(" 1 x ARCHINFO @%p\n",
(void *)(uintptr_t)RS_SOC_APB_ARCHINFO_BASE);
printf(" 1 x RNG @%p\n", (void *)&reg_rng_ctrl);
printf(" 1 x UART1(ADV) @%p\n", (void *)&reg_uart1_lcr);
printf(" 1 x PWM(4CHNL) @%p\n", (void *)&reg_pwm_ctrl);
+10
View File
@@ -19,6 +19,15 @@ archinfo APB readback, and test-status completion within the CI time budget;
`bringup` retains the full automatic application-information report for
manual runs.
ARCHINFO ABI V2 exposes immutable build, configuration, topology, feature, and
technology identity. Its register specification, driver, standalone tests, and
formal properties are delivered by the
[archinfo IP repository](https://github.com/retroSoC/archinfo). The integration
generates matching RTL and C metadata headers from the source revision,
dependency lock, and canonical configuration digest.
Normal builds clear the release flag; an audited release flow sets
`BUILD_RELEASE=YES`, which is part of the canonical configuration digest.
OpenSTA runs a reproducible core-STA baseline for every CI PDK: IHP130 uses
`slow_1p08V_125C`, GF180 uses `ss_125C_4v50`, ICS55 uses the H7CR
`ss_1p08_125C` view, and SKY130 uses `ss_100C_1v40`.
@@ -96,6 +105,7 @@ one timestamp to all of its child Make commands.
```text
build/<variant>/
generated/mpw/<simulator>/
generated/archinfo/
generated/pin_map/
sw/
sim/<simulator>/
+7 -2
View File
@@ -152,7 +152,11 @@ digraph mini_soc_block_diagram {
];
apb_targets [
fillcolor="#E6F4EA",
label="APB target wrapper\nArchinfo, RNG, UART1, PWM, PS/2, RTC\nwatchdog, CRC, advanced timer and user IP"
label="APB target wrapper\nRNG, UART1, PWM, PS/2, RTC\nwatchdog, CRC, advanced timer and user IP"
];
archinfo [
fillcolor="#E6F4EA",
label="ARCHINFO V2\nread-only build, topology and technology identity\nlifecycle-gated 128-bit device ID"
];
gpio_bridge [
fillcolor="#E5E7EB",
@@ -169,7 +173,7 @@ digraph mini_soc_block_diagram {
{ rank=same; user_core; dma; }
{ rank=same; fault; fabric; sram; }
{ rank=same; ribp_adapter; apb_adapter; }
{ rank=same; sysctrl; clint; ribp_targets; uart0; i2c_controllers; gpio_controller; timers; ws2812; apb_targets; }
{ rank=same; sysctrl; clint; ribp_targets; uart0; i2c_controllers; gpio_controller; timers; ws2812; archinfo; apb_targets; }
{ rank=same; gpio_bridge; irq; }
ext_clock -> rcu [label="clock / reset"];
@@ -199,6 +203,7 @@ digraph mini_soc_block_diagram {
ribp_adapter -> gpio_controller [label="RIBP\nuser/admin"];
ribp_adapter -> timers [label="RIBP"];
ribp_adapter -> ws2812 [label="RIBP"];
apb_adapter -> archinfo [label="APB"];
apb_adapter -> apb_targets [label="APB"];
ribp_targets -> gpio_controller [label="alternate functions"];
+252 -237
View File
@@ -4,19 +4,19 @@
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: mini_soc_block_diagram Pages: 1 -->
<svg width="2433pt" height="896pt"
viewBox="0.00 0.00 2433.00 896.48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<svg width="2689pt" height="896pt"
viewBox="0.00 0.00 2689.00 896.48" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 892.48)">
<title>mini_soc_block_diagram</title>
<text text-anchor="middle" x="132" y="-870.08" font-family="Arial" font-size="18.00">retroSoC Mini SoC Architecture</text>
<g id="clust1" class="cluster">
<title>cluster_asic</title>
<path fill="transparent" stroke="#111827" d="M160,-85C160,-85 2405,-85 2405,-85 2411,-85 2417,-91 2417,-97 2417,-97 2417,-772.48 2417,-772.48 2417,-778.48 2411,-784.48 2405,-784.48 2405,-784.48 160,-784.48 160,-784.48 154,-784.48 148,-778.48 148,-772.48 148,-772.48 148,-97 148,-97 148,-91 154,-85 160,-85"/>
<path fill="transparent" stroke="#111827" d="M160,-85C160,-85 2661,-85 2661,-85 2667,-85 2673,-91 2673,-97 2673,-97 2673,-772.48 2673,-772.48 2673,-778.48 2667,-784.48 2661,-784.48 2661,-784.48 160,-784.48 160,-784.48 154,-784.48 148,-778.48 148,-772.48 148,-772.48 148,-97 148,-97 148,-91 154,-85 160,-85"/>
<text text-anchor="middle" x="196.5" y="-769.28" font-family="Arial" font-size="14.00" fill="#111827">retrosoc_asic</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_soc</title>
<path fill="transparent" stroke="#94a3b8" stroke-dasharray="5,2" d="M390,-103C390,-103 2387,-103 2387,-103 2393,-103 2399,-109 2399,-115 2399,-115 2399,-729.48 2399,-729.48 2399,-735.48 2393,-741.48 2387,-741.48 2387,-741.48 390,-741.48 390,-741.48 384,-741.48 378,-735.48 378,-729.48 378,-729.48 378,-115 378,-115 378,-109 384,-103 390,-103"/>
<path fill="transparent" stroke="#94a3b8" stroke-dasharray="5,2" d="M390,-103C390,-103 2643,-103 2643,-103 2649,-103 2655,-109 2655,-115 2655,-115 2655,-729.48 2655,-729.48 2655,-735.48 2649,-741.48 2643,-741.48 2643,-741.48 390,-741.48 390,-741.48 384,-741.48 378,-735.48 378,-729.48 378,-729.48 378,-115 378,-115 378,-109 384,-103 390,-103"/>
<text text-anchor="middle" x="407.5" y="-727.88" font-family="Arial" font-size="12.00" fill="#334155">retrosoc</text>
</g>
<!-- ext_clock -->
@@ -44,475 +44,490 @@
<!-- ext_io -->
<g id="node2" class="node">
<title>ext_io</title>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M2045,-45C2045,-45 1853,-45 1853,-45 1847,-45 1841,-39 1841,-33 1841,-33 1841,-12 1841,-12 1841,-6 1847,0 1853,0 1853,0 2045,0 2045,0 2051,0 2057,-6 2057,-12 2057,-12 2057,-33 2057,-33 2057,-39 2051,-45 2045,-45"/>
<text text-anchor="middle" x="1949" y="-31" font-family="Arial" font-size="10.00" fill="#111827">External I/O and memory</text>
<text text-anchor="middle" x="1949" y="-20" font-family="Arial" font-size="10.00" fill="#111827">GPIO, UART0, XPI Flash, SDRAM, PSRAM</text>
<text text-anchor="middle" x="1949" y="-9" font-family="Arial" font-size="10.00" fill="#111827">SD card, I2C, I2S, DVP and WS2812</text>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M2300,-45C2300,-45 2108,-45 2108,-45 2102,-45 2096,-39 2096,-33 2096,-33 2096,-12 2096,-12 2096,-6 2102,0 2108,0 2108,0 2300,0 2300,0 2306,0 2312,-6 2312,-12 2312,-12 2312,-33 2312,-33 2312,-39 2306,-45 2300,-45"/>
<text text-anchor="middle" x="2204" y="-31" font-family="Arial" font-size="10.00" fill="#111827">External I/O and memory</text>
<text text-anchor="middle" x="2204" y="-20" font-family="Arial" font-size="10.00" fill="#111827">GPIO, UART0, XPI Flash, SDRAM, PSRAM</text>
<text text-anchor="middle" x="2204" y="-9" font-family="Arial" font-size="10.00" fill="#111827">SD card, I2C, I2S, DVP and WS2812</text>
</g>
<!-- ext_jtag -->
<g id="node3" class="node">
<title>ext_jtag</title>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M700.5,-860.48C700.5,-860.48 569.5,-860.48 569.5,-860.48 563.5,-860.48 557.5,-854.48 557.5,-848.48 557.5,-848.48 557.5,-836.48 557.5,-836.48 557.5,-830.48 563.5,-824.48 569.5,-824.48 569.5,-824.48 700.5,-824.48 700.5,-824.48 706.5,-824.48 712.5,-830.48 712.5,-836.48 712.5,-836.48 712.5,-848.48 712.5,-848.48 712.5,-854.48 706.5,-860.48 700.5,-860.48"/>
<text text-anchor="middle" x="635" y="-845.48" font-family="Arial" font-size="10.00" fill="#111827">Management JTAG</text>
<text text-anchor="middle" x="635" y="-834.48" font-family="Arial" font-size="10.00" fill="#111827">TCK, TMS, TDI, TRST_n, TDO</text>
<path fill="#f3f4f6" stroke="#4b5563" stroke-width="1.1" d="M805.5,-860.48C805.5,-860.48 674.5,-860.48 674.5,-860.48 668.5,-860.48 662.5,-854.48 662.5,-848.48 662.5,-848.48 662.5,-836.48 662.5,-836.48 662.5,-830.48 668.5,-824.48 674.5,-824.48 674.5,-824.48 805.5,-824.48 805.5,-824.48 811.5,-824.48 817.5,-830.48 817.5,-836.48 817.5,-836.48 817.5,-848.48 817.5,-848.48 817.5,-854.48 811.5,-860.48 805.5,-860.48"/>
<text text-anchor="middle" x="740" y="-845.48" font-family="Arial" font-size="10.00" fill="#111827">Management JTAG</text>
<text text-anchor="middle" x="740" y="-834.48" font-family="Arial" font-size="10.00" fill="#111827">TCK, TMS, TDI, TRST_n, TDO</text>
</g>
<!-- jtag_dtm -->
<g id="node6" class="node">
<title>jtag_dtm</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M710,-678.98C710,-678.98 560,-678.98 560,-678.98 554,-678.98 548,-672.98 548,-666.98 548,-666.98 548,-654.98 548,-654.98 548,-648.98 554,-642.98 560,-642.98 560,-642.98 710,-642.98 710,-642.98 716,-642.98 722,-648.98 722,-654.98 722,-654.98 722,-666.98 722,-666.98 722,-672.98 716,-678.98 710,-678.98"/>
<text text-anchor="middle" x="635" y="-663.98" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 JTAG DTM</text>
<text text-anchor="middle" x="635" y="-652.98" font-family="Arial" font-size="10.00" fill="#111827">10 MHz asynchronous TCK domain</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M815,-678.98C815,-678.98 665,-678.98 665,-678.98 659,-678.98 653,-672.98 653,-666.98 653,-666.98 653,-654.98 653,-654.98 653,-648.98 659,-642.98 665,-642.98 665,-642.98 815,-642.98 815,-642.98 821,-642.98 827,-648.98 827,-654.98 827,-654.98 827,-666.98 827,-666.98 827,-672.98 821,-678.98 815,-678.98"/>
<text text-anchor="middle" x="740" y="-663.98" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 JTAG DTM</text>
<text text-anchor="middle" x="740" y="-652.98" font-family="Arial" font-size="10.00" fill="#111827">10 MHz asynchronous TCK domain</text>
</g>
<!-- ext_jtag&#45;&gt;jtag_dtm -->
<g id="edge2" class="edge">
<title>ext_jtag&#45;&gt;jtag_dtm</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M635,-824.27C635,-792.24 635,-723.39 635,-686.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="637.45,-686.14 635,-679.14 632.55,-686.14 637.45,-686.14"/>
<text text-anchor="middle" x="655" y="-795.08" font-family="Arial" font-size="8.00" fill="#374151">JTAG pads</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M740,-824.27C740,-792.24 740,-723.39 740,-686.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="742.45,-686.14 740,-679.14 737.55,-686.14 742.45,-686.14"/>
<text text-anchor="middle" x="760" y="-795.08" font-family="Arial" font-size="8.00" fill="#374151">JTAG pads</text>
</g>
<!-- fabric -->
<g id="node11" class="node">
<title>fabric</title>
<path fill="#dcecf8" stroke="#4b5563" stroke-width="1.1" d="M1327.66,-451.31C1327.66,-451.31 1259.98,-479.16 1259.98,-479.16 1254.43,-481.45 1242.88,-483.73 1236.88,-483.73 1236.88,-483.73 1081.12,-483.73 1081.12,-483.73 1075.12,-483.73 1063.57,-481.45 1058.02,-479.16 1058.02,-479.16 990.34,-451.31 990.34,-451.31 984.79,-449.03 984.79,-444.46 990.34,-442.18 990.34,-442.18 1058.02,-414.32 1058.02,-414.32 1063.57,-412.04 1075.12,-409.76 1081.12,-409.76 1081.12,-409.76 1236.88,-409.76 1236.88,-409.76 1242.88,-409.76 1254.43,-412.04 1259.98,-414.32 1259.98,-414.32 1327.66,-442.18 1327.66,-442.18 1333.21,-444.46 1333.21,-449.03 1327.66,-451.31"/>
<text text-anchor="middle" x="1159" y="-455.24" font-family="Arial" font-size="10.00" fill="#111827">RIB fabric</text>
<text text-anchor="middle" x="1159" y="-444.24" font-family="Arial" font-size="10.00" fill="#111827">3&#45;master round&#45;robin arbitration</text>
<text text-anchor="middle" x="1159" y="-433.24" font-family="Arial" font-size="10.00" fill="#111827">INCR1 / INCR4, access policy, fault reporting</text>
<path fill="#dcecf8" stroke="#4b5563" stroke-width="1.1" d="M1184.66,-451.31C1184.66,-451.31 1116.98,-479.16 1116.98,-479.16 1111.43,-481.45 1099.88,-483.73 1093.88,-483.73 1093.88,-483.73 938.12,-483.73 938.12,-483.73 932.12,-483.73 920.57,-481.45 915.02,-479.16 915.02,-479.16 847.34,-451.31 847.34,-451.31 841.79,-449.03 841.79,-444.46 847.34,-442.18 847.34,-442.18 915.02,-414.32 915.02,-414.32 920.57,-412.04 932.12,-409.76 938.12,-409.76 938.12,-409.76 1093.88,-409.76 1093.88,-409.76 1099.88,-409.76 1111.43,-412.04 1116.98,-414.32 1116.98,-414.32 1184.66,-442.18 1184.66,-442.18 1190.21,-444.46 1190.21,-449.03 1184.66,-451.31"/>
<text text-anchor="middle" x="1016" y="-455.24" font-family="Arial" font-size="10.00" fill="#111827">RIB fabric</text>
<text text-anchor="middle" x="1016" y="-444.24" font-family="Arial" font-size="10.00" fill="#111827">3&#45;master round&#45;robin arbitration</text>
<text text-anchor="middle" x="1016" y="-433.24" font-family="Arial" font-size="10.00" fill="#111827">INCR1 / INCR4, access policy, fault reporting</text>
</g>
<!-- rcu&#45;&gt;fabric -->
<g id="edge3" class="edge">
<title>rcu&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M362.03,-540.47C368.2,-539.24 372,-538.48 372,-538.48 372,-538.48 939,-483.48 939,-483.48 939,-483.48 978.82,-477.02 1024.57,-469.58"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1025.15,-471.97 1031.66,-468.43 1024.36,-467.13 1025.15,-471.97"/>
<text text-anchor="middle" x="724" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">system clock / reset</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M362.03,-540.47C368.2,-539.24 372,-538.48 372,-538.48 372,-538.48 832,-483.48 832,-483.48 832,-483.48 856.75,-478.68 888.1,-472.59"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="888.92,-474.92 895.32,-471.18 887.98,-470.11 888.92,-474.92"/>
<text text-anchor="middle" x="664" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">system clock / reset</text>
</g>
<!-- clint -->
<g id="node17" class="node">
<title>clint</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M769.5,-255C769.5,-255 648.5,-255 648.5,-255 642.5,-255 636.5,-249 636.5,-243 636.5,-243 636.5,-222 636.5,-222 636.5,-216 642.5,-210 648.5,-210 648.5,-210 769.5,-210 769.5,-210 775.5,-210 781.5,-216 781.5,-222 781.5,-222 781.5,-243 781.5,-243 781.5,-249 775.5,-255 769.5,-255"/>
<text text-anchor="middle" x="709" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CLINT</text>
<text text-anchor="middle" x="709" y="-230" font-family="Arial" font-size="10.00" fill="#111827">standard 64 KiB register map</text>
<text text-anchor="middle" x="709" 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="M527.5,-255C527.5,-255 406.5,-255 406.5,-255 400.5,-255 394.5,-249 394.5,-243 394.5,-243 394.5,-222 394.5,-222 394.5,-216 400.5,-210 406.5,-210 406.5,-210 527.5,-210 527.5,-210 533.5,-210 539.5,-216 539.5,-222 539.5,-222 539.5,-243 539.5,-243 539.5,-249 533.5,-255 527.5,-255"/>
<text text-anchor="middle" x="467" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CLINT</text>
<text text-anchor="middle" x="467" y="-230" font-family="Arial" font-size="10.00" fill="#111827">standard 64 KiB register map</text>
<text text-anchor="middle" x="467" 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="M293.54,-538.31C372.58,-480.32 588.63,-321.81 673.81,-259.32"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="675.27,-261.28 679.47,-255.17 672.37,-257.33 675.27,-261.28"/>
<text text-anchor="middle" x="525.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">1 MHz tick</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M277.48,-538.31C313.09,-481.03 409.7,-325.66 449.5,-261.65"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="451.78,-262.62 453.4,-255.38 447.62,-260.03 451.78,-262.62"/>
<text text-anchor="middle" x="392.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">1 MHz tick</text>
</g>
<!-- mgmt_core -->
<g id="node5" class="node">
<title>mgmt_core</title>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M1295,-683.48C1295,-683.48 1141,-683.48 1141,-683.48 1135,-683.48 1129,-677.48 1129,-671.48 1129,-671.48 1129,-650.48 1129,-650.48 1129,-644.48 1135,-638.48 1141,-638.48 1141,-638.48 1295,-638.48 1295,-638.48 1301,-638.48 1307,-644.48 1307,-650.48 1307,-650.48 1307,-671.48 1307,-671.48 1307,-677.48 1301,-683.48 1295,-683.48"/>
<text text-anchor="middle" x="1218" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Management core</text>
<text text-anchor="middle" x="1218" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">Fixed Hazard3, branch predictor</text>
<text text-anchor="middle" x="1218" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">JTAG Debug Module always present</text>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M1400,-683.48C1400,-683.48 1246,-683.48 1246,-683.48 1240,-683.48 1234,-677.48 1234,-671.48 1234,-671.48 1234,-650.48 1234,-650.48 1234,-644.48 1240,-638.48 1246,-638.48 1246,-638.48 1400,-638.48 1400,-638.48 1406,-638.48 1412,-644.48 1412,-650.48 1412,-650.48 1412,-671.48 1412,-671.48 1412,-677.48 1406,-683.48 1400,-683.48"/>
<text text-anchor="middle" x="1323" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Management core</text>
<text text-anchor="middle" x="1323" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">Fixed Hazard3, branch predictor</text>
<text text-anchor="middle" x="1323" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">JTAG Debug Module always present</text>
</g>
<!-- mgmt_adapter -->
<g id="node8" class="node">
<title>mgmt_adapter</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1179.5,-578.98C1179.5,-578.98 1138.5,-578.98 1138.5,-578.98 1132.5,-578.98 1126.5,-572.98 1126.5,-566.98 1126.5,-566.98 1126.5,-554.98 1126.5,-554.98 1126.5,-548.98 1132.5,-542.98 1138.5,-542.98 1138.5,-542.98 1179.5,-542.98 1179.5,-542.98 1185.5,-542.98 1191.5,-548.98 1191.5,-554.98 1191.5,-554.98 1191.5,-566.98 1191.5,-566.98 1191.5,-572.98 1185.5,-578.98 1179.5,-578.98"/>
<text text-anchor="middle" x="1159" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">RIBP2RIB</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1036.5,-578.98C1036.5,-578.98 995.5,-578.98 995.5,-578.98 989.5,-578.98 983.5,-572.98 983.5,-566.98 983.5,-566.98 983.5,-554.98 983.5,-554.98 983.5,-548.98 989.5,-542.98 995.5,-542.98 995.5,-542.98 1036.5,-542.98 1036.5,-542.98 1042.5,-542.98 1048.5,-548.98 1048.5,-554.98 1048.5,-554.98 1048.5,-566.98 1048.5,-566.98 1048.5,-572.98 1042.5,-578.98 1036.5,-578.98"/>
<text text-anchor="middle" x="1016" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">RIBP2RIB</text>
</g>
<!-- mgmt_core&#45;&gt;mgmt_adapter -->
<g id="edge9" class="edge">
<title>mgmt_core&#45;&gt;mgmt_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1204.91,-638.24C1195.44,-622.5 1182.66,-601.28 1172.99,-585.22"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1175.02,-583.85 1169.31,-579.12 1170.83,-586.38 1175.02,-583.85"/>
<text text-anchor="middle" x="1199.5" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1249.88,-638.47C1172.98,-615.84 1063,-583.48 1063,-583.48 1063,-583.48 1059.87,-582.05 1055.22,-579.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1056.03,-577.6 1048.64,-576.92 1053.99,-582.06 1056.03,-577.6"/>
<text text-anchor="middle" x="1178.5" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- debug_module -->
<g id="node7" class="node">
<title>debug_module</title>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M971.5,-683.48C971.5,-683.48 850.5,-683.48 850.5,-683.48 844.5,-683.48 838.5,-677.48 838.5,-671.48 838.5,-671.48 838.5,-650.48 838.5,-650.48 838.5,-644.48 844.5,-638.48 850.5,-638.48 850.5,-638.48 971.5,-638.48 971.5,-638.48 977.5,-638.48 983.5,-644.48 983.5,-650.48 983.5,-650.48 983.5,-671.48 983.5,-671.48 983.5,-677.48 977.5,-683.48 971.5,-683.48"/>
<text text-anchor="middle" x="911" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 Debug Module</text>
<text text-anchor="middle" x="911" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">abstract commands, no SBA</text>
<text text-anchor="middle" x="911" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">management&#45;hart&#45;only reset</text>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1076.5,-683.48C1076.5,-683.48 955.5,-683.48 955.5,-683.48 949.5,-683.48 943.5,-677.48 943.5,-671.48 943.5,-671.48 943.5,-650.48 943.5,-650.48 943.5,-644.48 949.5,-638.48 955.5,-638.48 955.5,-638.48 1076.5,-638.48 1076.5,-638.48 1082.5,-638.48 1088.5,-644.48 1088.5,-650.48 1088.5,-650.48 1088.5,-671.48 1088.5,-671.48 1088.5,-677.48 1082.5,-683.48 1076.5,-683.48"/>
<text text-anchor="middle" x="1016" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 Debug Module</text>
<text text-anchor="middle" x="1016" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">abstract commands, no SBA</text>
<text text-anchor="middle" x="1016" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">management&#45;hart&#45;only reset</text>
</g>
<!-- jtag_dtm&#45;&gt;debug_module -->
<g id="edge4" class="edge">
<title>jtag_dtm&#45;&gt;debug_module</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M722.33,-660.98C757.12,-660.98 796.91,-660.98 830.95,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="831.12,-663.43 838.12,-660.98 831.12,-658.53 831.12,-663.43"/>
<text text-anchor="middle" x="780.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">DMI, asynchronous CDC</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M827.33,-660.98C862.12,-660.98 901.91,-660.98 935.95,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="936.12,-663.43 943.12,-660.98 936.12,-658.53 936.12,-663.43"/>
<text text-anchor="middle" x="885.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">DMI, asynchronous CDC</text>
</g>
<!-- debug_module&#45;&gt;mgmt_core -->
<g id="edge5" class="edge">
<title>debug_module&#45;&gt;mgmt_core</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M983.75,-660.98C1024.99,-660.98 1077.09,-660.98 1121.69,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1121.77,-663.43 1128.77,-660.98 1121.77,-658.53 1121.77,-663.43"/>
<text text-anchor="middle" x="1056.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">halt, resume, abstract commands</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1088.75,-660.98C1129.99,-660.98 1182.09,-660.98 1226.69,-660.98"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1226.77,-663.43 1233.77,-660.98 1226.77,-658.53 1226.77,-663.43"/>
<text text-anchor="middle" x="1161.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">halt, resume, abstract commands</text>
</g>
<!-- debug_module&#45;&gt;mgmt_adapter -->
<g id="edge6" class="edge">
<title>debug_module&#45;&gt;mgmt_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M965.42,-638.48C1012.02,-620.06 1078,-593.99 1119.63,-577.54"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1120.74,-579.74 1126.35,-574.89 1118.94,-575.18 1120.74,-579.74"/>
<text text-anchor="middle" x="1080" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">reset after bridge idle</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1016,-638.24C1016,-622.92 1016,-602.4 1016,-586.51"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1018.45,-586.12 1016,-579.12 1013.55,-586.12 1018.45,-586.12"/>
<text text-anchor="middle" x="1054" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">reset after bridge idle</text>
</g>
<!-- timers -->
<g id="node22" class="node">
<title>timers</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1001.5,-255C1001.5,-255 820.5,-255 820.5,-255 814.5,-255 808.5,-249 808.5,-243 808.5,-243 808.5,-222 808.5,-222 808.5,-216 814.5,-210 820.5,-210 820.5,-210 1001.5,-210 1001.5,-210 1007.5,-210 1013.5,-216 1013.5,-222 1013.5,-222 1013.5,-243 1013.5,-243 1013.5,-249 1007.5,-255 1001.5,-255"/>
<text text-anchor="middle" x="911" y="-241" font-family="Arial" font-size="10.00" fill="#111827">General timers 0/1</text>
<text text-anchor="middle" x="911" 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="911" 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="M1707.5,-255C1707.5,-255 1526.5,-255 1526.5,-255 1520.5,-255 1514.5,-249 1514.5,-243 1514.5,-243 1514.5,-222 1514.5,-222 1514.5,-216 1520.5,-210 1526.5,-210 1526.5,-210 1707.5,-210 1707.5,-210 1713.5,-210 1719.5,-216 1719.5,-222 1719.5,-222 1719.5,-243 1719.5,-243 1719.5,-249 1713.5,-255 1707.5,-255"/>
<text text-anchor="middle" x="1617" y="-241" font-family="Arial" font-size="10.00" fill="#111827">General timers 0/1</text>
<text text-anchor="middle" x="1617" 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="1617" 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="M911,-638.24C911,-609.36 911,-561.98 911,-561.98 911,-561.98 911,-561.98 911,-336 911,-336 911,-292.57 911,-262.25"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="913.45,-262.24 911,-255.24 908.55,-262.24 913.45,-262.24"/>
<text text-anchor="middle" x="922" y="-444.84" font-family="Arial" font-size="8.00" fill="#374151">halted</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1088.7,-649.63C1235.4,-628.73 1553,-583.48 1553,-583.48 1553,-583.48 1726,-387 1726,-387 1726,-387 1726,-378 1726,-378 1726,-378 1694,-278 1694,-278 1694,-278 1678.25,-268.9 1661,-258.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1661.88,-256.61 1654.6,-255.23 1659.43,-260.85 1661.88,-256.61"/>
<text text-anchor="middle" x="1715" y="-444.84" font-family="Arial" font-size="8.00" fill="#374151">halted</text>
</g>
<!-- mgmt_adapter&#45;&gt;fabric -->
<g id="edge10" class="edge">
<title>mgmt_adapter&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1159,-542.94C1159,-529.08 1159,-508.91 1159,-490.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1161.45,-490.57 1159,-483.57 1156.55,-490.57 1161.45,-490.57"/>
<text text-anchor="middle" x="1166" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1016,-542.94C1016,-529.08 1016,-508.91 1016,-490.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1018.45,-490.57 1016,-483.57 1013.55,-490.57 1018.45,-490.57"/>
<text text-anchor="middle" x="1023" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- user_core -->
<g id="node9" class="node">
<title>user_core</title>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M1489,-583.48C1489,-583.48 1413,-583.48 1413,-583.48 1407,-583.48 1401,-577.48 1401,-571.48 1401,-571.48 1401,-550.48 1401,-550.48 1401,-544.48 1407,-538.48 1413,-538.48 1413,-538.48 1489,-538.48 1489,-538.48 1495,-538.48 1501,-544.48 1501,-550.48 1501,-550.48 1501,-571.48 1501,-571.48 1501,-577.48 1495,-583.48 1489,-583.48"/>
<text text-anchor="middle" x="1451" y="-569.48" font-family="Arial" font-size="10.00" fill="#111827">Selected user core</text>
<text text-anchor="middle" x="1451" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">C0&#45;C5, one active</text>
<text text-anchor="middle" x="1451" y="-547.48" font-family="Arial" font-size="10.00" fill="#111827">PicoRV32 at C5</text>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M1164,-583.48C1164,-583.48 1088,-583.48 1088,-583.48 1082,-583.48 1076,-577.48 1076,-571.48 1076,-571.48 1076,-550.48 1076,-550.48 1076,-544.48 1082,-538.48 1088,-538.48 1088,-538.48 1164,-538.48 1164,-538.48 1170,-538.48 1176,-544.48 1176,-550.48 1176,-550.48 1176,-571.48 1176,-571.48 1176,-577.48 1170,-583.48 1164,-583.48"/>
<text text-anchor="middle" x="1126" y="-569.48" font-family="Arial" font-size="10.00" fill="#111827">Selected user core</text>
<text text-anchor="middle" x="1126" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">C0&#45;C5, one active</text>
<text text-anchor="middle" x="1126" y="-547.48" font-family="Arial" font-size="10.00" fill="#111827">PicoRV32 at C5</text>
</g>
<!-- user_core&#45;&gt;fabric -->
<g id="edge11" class="edge">
<title>user_core&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1438.39,-538.22C1429.81,-523.41 1420,-506.48 1420,-506.48 1420,-506.48 1348.85,-490.47 1280.85,-475.17"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1281.23,-472.74 1273.86,-473.59 1280.15,-477.52 1281.23,-472.74"/>
<text text-anchor="middle" x="1432" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1104.79,-538.34C1091.1,-524.37 1072.85,-505.75 1056.45,-489.02"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1058.08,-487.18 1051.43,-483.89 1054.58,-490.61 1058.08,-487.18"/>
<text text-anchor="middle" x="1087" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- dma -->
<g id="node10" class="node">
<title>dma</title>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M2046,-578.98C2046,-578.98 1928,-578.98 1928,-578.98 1922,-578.98 1916,-572.98 1916,-566.98 1916,-566.98 1916,-554.98 1916,-554.98 1916,-548.98 1922,-542.98 1928,-542.98 1928,-542.98 2046,-542.98 2046,-542.98 2052,-542.98 2058,-548.98 2058,-554.98 2058,-554.98 2058,-566.98 2058,-566.98 2058,-572.98 2052,-578.98 2046,-578.98"/>
<text text-anchor="middle" x="1987" y="-563.98" font-family="Arial" font-size="10.00" fill="#111827">DMA</text>
<text text-anchor="middle" x="1987" y="-552.98" font-family="Arial" font-size="10.00" fill="#111827">RIB master and RIBP target</text>
<path fill="#ddf2e3" stroke="#4b5563" stroke-width="1.1" d="M1527,-578.98C1527,-578.98 1409,-578.98 1409,-578.98 1403,-578.98 1397,-572.98 1397,-566.98 1397,-566.98 1397,-554.98 1397,-554.98 1397,-548.98 1403,-542.98 1409,-542.98 1409,-542.98 1527,-542.98 1527,-542.98 1533,-542.98 1539,-548.98 1539,-554.98 1539,-554.98 1539,-566.98 1539,-566.98 1539,-572.98 1533,-578.98 1527,-578.98"/>
<text text-anchor="middle" x="1468" y="-563.98" font-family="Arial" font-size="10.00" fill="#111827">DMA</text>
<text text-anchor="middle" x="1468" y="-552.98" font-family="Arial" font-size="10.00" fill="#111827">RIB master and RIBP target</text>
</g>
<!-- dma&#45;&gt;fabric -->
<g id="edge12" class="edge">
<title>dma&#45;&gt;fabric</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1915.77,-551.02C1755.21,-530.82 1379,-483.48 1379,-483.48 1379,-483.48 1339.18,-477.02 1293.43,-469.58"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1293.64,-467.13 1286.34,-468.43 1292.85,-471.97 1293.64,-467.13"/>
<text text-anchor="middle" x="1635" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1396.98,-548.06C1318.49,-534.88 1203,-515.48 1203,-515.48 1203,-515.48 1161.2,-500.34 1117.12,-484.37"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1117.74,-481.99 1110.32,-481.91 1116.07,-486.6 1117.74,-481.99"/>
<text text-anchor="middle" x="1210" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- uart0 -->
<g id="node19" class="node">
<title>uart0</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2371,-255C2371,-255 2211,-255 2211,-255 2205,-255 2199,-249 2199,-243 2199,-243 2199,-222 2199,-222 2199,-216 2205,-210 2211,-210 2211,-210 2371,-210 2371,-210 2377,-210 2383,-216 2383,-222 2383,-222 2383,-243 2383,-243 2383,-249 2377,-255 2371,-255"/>
<text text-anchor="middle" x="2291" y="-241" font-family="Arial" font-size="10.00" fill="#111827">UART0 V2</text>
<text text-anchor="middle" x="2291" 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="2291" 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="M2627,-255C2627,-255 2467,-255 2467,-255 2461,-255 2455,-249 2455,-243 2455,-243 2455,-222 2455,-222 2455,-216 2461,-210 2467,-210 2467,-210 2627,-210 2627,-210 2633,-210 2639,-216 2639,-222 2639,-222 2639,-243 2639,-243 2639,-249 2633,-255 2627,-255"/>
<text text-anchor="middle" x="2547" y="-241" font-family="Arial" font-size="10.00" fill="#111827">UART0 V2</text>
<text text-anchor="middle" x="2547" 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="2547" 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="edge34" class="edge">
<g id="edge35" class="edge">
<title>dma&#45;&gt;uart0</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M2002.92,-542.89C2052.59,-489.55 2205.03,-325.83 2265.7,-260.67"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2267.62,-262.2 2270.6,-255.41 2264.04,-258.86 2267.62,-262.2"/>
<text text-anchor="middle" x="2174.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TX/RX data</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1503.68,-542.82C1550.56,-520.26 1627,-483.48 1627,-483.48 1627,-483.48 1721,-410 1721,-410 1721,-410 2228.04,-301.66 2447.6,-254.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2448.32,-257.09 2454.65,-253.23 2447.29,-252.3 2448.32,-257.09"/>
<text text-anchor="middle" x="1889.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TX/RX data</text>
</g>
<!-- i2c_controllers -->
<g id="node20" class="node">
<title>i2c_controllers</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1974.5,-255C1974.5,-255 1789.5,-255 1789.5,-255 1783.5,-255 1777.5,-249 1777.5,-243 1777.5,-243 1777.5,-222 1777.5,-222 1777.5,-216 1783.5,-210 1789.5,-210 1789.5,-210 1974.5,-210 1974.5,-210 1980.5,-210 1986.5,-216 1986.5,-222 1986.5,-222 1986.5,-243 1986.5,-243 1986.5,-249 1980.5,-255 1974.5,-255"/>
<text text-anchor="middle" x="1882" y="-241" font-family="Arial" font-size="10.00" fill="#111827">I2C0 / I2C1 V2</text>
<text text-anchor="middle" x="1882" 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="1882" 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="M1261.5,-255C1261.5,-255 1076.5,-255 1076.5,-255 1070.5,-255 1064.5,-249 1064.5,-243 1064.5,-243 1064.5,-222 1064.5,-222 1064.5,-216 1070.5,-210 1076.5,-210 1076.5,-210 1261.5,-210 1261.5,-210 1267.5,-210 1273.5,-216 1273.5,-222 1273.5,-222 1273.5,-243 1273.5,-243 1273.5,-249 1267.5,-255 1261.5,-255"/>
<text text-anchor="middle" x="1169" y="-241" font-family="Arial" font-size="10.00" fill="#111827">I2C0 / I2C1 V2</text>
<text text-anchor="middle" x="1169" 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="1169" 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="edge37" class="edge">
<g id="edge38" class="edge">
<title>dma&#45;&gt;i2c_controllers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1981.5,-542.89C1964.48,-489.98 1912.54,-328.45 1891.25,-262.26"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1893.52,-261.32 1889.05,-255.41 1888.86,-262.82 1893.52,-261.32"/>
<text text-anchor="middle" x="1971" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">DATA_CMD / RXDATA</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1426.26,-542.82C1371.42,-520.26 1282,-483.48 1282,-483.48 1282,-483.48 1236,-378 1236,-378 1236,-378 1201.51,-303.62 1182.02,-261.58"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1184.2,-260.45 1179.03,-255.13 1179.75,-262.51 1184.2,-260.45"/>
<text text-anchor="middle" x="1280" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">DATA_CMD / RXDATA</text>
</g>
<!-- ws2812 -->
<g id="node23" class="node">
<title>ws2812</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2160,-255C2160,-255 2026,-255 2026,-255 2020,-255 2014,-249 2014,-243 2014,-243 2014,-222 2014,-222 2014,-216 2020,-210 2026,-210 2026,-210 2160,-210 2160,-210 2166,-210 2172,-216 2172,-222 2172,-222 2172,-243 2172,-243 2172,-249 2166,-255 2160,-255"/>
<text text-anchor="middle" x="2093" y="-241" font-family="Arial" font-size="10.00" fill="#111827">WS2812 TX</text>
<text text-anchor="middle" x="2093" y="-230" font-family="Arial" font-size="10.00" fill="#111827">24&#45;bit MSB&#45;first serializer</text>
<text text-anchor="middle" x="2093" 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="M2416,-255C2416,-255 2282,-255 2282,-255 2276,-255 2270,-249 2270,-243 2270,-243 2270,-222 2270,-222 2270,-216 2276,-210 2282,-210 2282,-210 2416,-210 2416,-210 2422,-210 2428,-216 2428,-222 2428,-222 2428,-243 2428,-243 2428,-249 2422,-255 2416,-255"/>
<text text-anchor="middle" x="2349" y="-241" font-family="Arial" font-size="10.00" fill="#111827">WS2812 TX</text>
<text text-anchor="middle" x="2349" y="-230" font-family="Arial" font-size="10.00" fill="#111827">24&#45;bit MSB&#45;first serializer</text>
<text text-anchor="middle" x="2349" 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="edge32" class="edge">
<g id="edge33" class="edge">
<title>dma&#45;&gt;ws2812</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1992.55,-542.89C2009.73,-489.98 2062.17,-328.45 2083.66,-262.26"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2086.05,-262.83 2085.89,-255.41 2081.39,-261.31 2086.05,-262.83"/>
<text text-anchor="middle" x="2071.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TXDATA writes</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" stroke-dasharray="5,2" d="M1495.6,-542.82C1531.87,-520.26 1591,-483.48 1591,-483.48 1591,-483.48 1676,-378 1676,-378 1676,-378 1752,-296 1752,-296 1752,-296 1762,-278 1762,-278 1762,-278 2256,-255 2256,-255 2256,-255 2258.58,-254.4 2262.88,-253.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2263.45,-255.79 2269.72,-251.83 2262.35,-251.02 2263.45,-255.79"/>
<text text-anchor="middle" x="1703.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TXDATA writes</text>
</g>
<!-- fault -->
<g id="node12" class="node">
<title>fault</title>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1662.5,-464.74C1662.5,-464.74 1553.5,-464.74 1553.5,-464.74 1547.5,-464.74 1541.5,-458.74 1541.5,-452.74 1541.5,-452.74 1541.5,-440.74 1541.5,-440.74 1541.5,-434.74 1547.5,-428.74 1553.5,-428.74 1553.5,-428.74 1662.5,-428.74 1662.5,-428.74 1668.5,-428.74 1674.5,-434.74 1674.5,-440.74 1674.5,-440.74 1674.5,-452.74 1674.5,-452.74 1674.5,-458.74 1668.5,-464.74 1662.5,-464.74"/>
<text text-anchor="middle" x="1608" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">Error slave</text>
<text text-anchor="middle" x="1608" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">access and protocol faults</text>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1565.5,-464.74C1565.5,-464.74 1456.5,-464.74 1456.5,-464.74 1450.5,-464.74 1444.5,-458.74 1444.5,-452.74 1444.5,-452.74 1444.5,-440.74 1444.5,-440.74 1444.5,-434.74 1450.5,-428.74 1456.5,-428.74 1456.5,-428.74 1565.5,-428.74 1565.5,-428.74 1571.5,-428.74 1577.5,-434.74 1577.5,-440.74 1577.5,-440.74 1577.5,-452.74 1577.5,-452.74 1577.5,-458.74 1571.5,-464.74 1565.5,-464.74"/>
<text text-anchor="middle" x="1511" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">Error slave</text>
<text text-anchor="middle" x="1511" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">access and protocol faults</text>
</g>
<!-- fabric&#45;&gt;fault -->
<g id="edge13" class="edge">
<title>fabric&#45;&gt;fault</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1272.37,-478.99C1320.41,-492.66 1365.5,-505.48 1365.5,-505.48 1365.5,-505.48 1418.5,-505.48 1418.5,-505.48 1418.5,-505.48 1528,-483.48 1528,-483.48 1528,-483.48 1544.11,-476.08 1561.88,-467.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1272.98,-476.62 1265.58,-477.06 1271.64,-481.33 1272.98,-476.62"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1563.13,-470.05 1568.47,-464.9 1561.08,-465.59 1563.13,-470.05"/>
<text text-anchor="middle" x="1392" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">invalid / denied</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1129.37,-478.99C1177.41,-492.66 1222.5,-505.48 1222.5,-505.48 1222.5,-505.48 1275.5,-505.48 1275.5,-505.48 1275.5,-505.48 1431,-483.48 1431,-483.48 1431,-483.48 1447.11,-476.08 1464.88,-467.93"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1129.98,-476.62 1122.58,-477.06 1128.64,-481.33 1129.98,-476.62"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1466.13,-470.05 1471.47,-464.9 1464.08,-465.59 1466.13,-470.05"/>
<text text-anchor="middle" x="1249" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">invalid / denied</text>
</g>
<!-- sram -->
<g id="node13" class="node">
<title>sram</title>
<path fill="#fff3c9" stroke="#4b5563" stroke-width="1.1" d="M1502,-464.74C1502,-464.74 1404,-464.74 1404,-464.74 1398,-464.74 1392,-458.74 1392,-452.74 1392,-452.74 1392,-440.74 1392,-440.74 1392,-434.74 1398,-428.74 1404,-428.74 1404,-428.74 1502,-428.74 1502,-428.74 1508,-428.74 1514,-434.74 1514,-440.74 1514,-440.74 1514,-452.74 1514,-452.74 1514,-458.74 1508,-464.74 1502,-464.74"/>
<text text-anchor="middle" x="1453" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">On&#45;chip SRAM</text>
<text text-anchor="middle" x="1453" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">optional RIB2RAM path</text>
<path fill="#fff3c9" stroke="#4b5563" stroke-width="1.1" d="M1405,-464.74C1405,-464.74 1307,-464.74 1307,-464.74 1301,-464.74 1295,-458.74 1295,-452.74 1295,-452.74 1295,-440.74 1295,-440.74 1295,-434.74 1301,-428.74 1307,-428.74 1307,-428.74 1405,-428.74 1405,-428.74 1411,-428.74 1417,-434.74 1417,-440.74 1417,-440.74 1417,-452.74 1417,-452.74 1417,-458.74 1411,-464.74 1405,-464.74"/>
<text text-anchor="middle" x="1356" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">On&#45;chip SRAM</text>
<text text-anchor="middle" x="1356" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">optional RIB2RAM path</text>
</g>
<!-- fabric&#45;&gt;sram -->
<g id="edge14" class="edge">
<title>fabric&#45;&gt;sram</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1338.91,-446.74C1354.95,-446.74 1370.44,-446.74 1384.56,-446.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1384.81,-449.19 1391.81,-446.74 1384.81,-444.29 1384.81,-449.19"/>
<text text-anchor="middle" x="1365.31" y="-452.34" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1195.96,-446.74C1228.71,-446.74 1260.97,-446.74 1287.85,-446.74"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1287.92,-449.19 1294.92,-446.74 1287.92,-444.29 1287.92,-449.19"/>
<text text-anchor="middle" x="1245.31" y="-452.34" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- ribp_adapter -->
<g id="node14" class="node">
<title>ribp_adapter</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1442.5,-355C1442.5,-355 1401.5,-355 1401.5,-355 1395.5,-355 1389.5,-349 1389.5,-343 1389.5,-343 1389.5,-331 1389.5,-331 1389.5,-325 1395.5,-319 1401.5,-319 1401.5,-319 1442.5,-319 1442.5,-319 1448.5,-319 1454.5,-325 1454.5,-331 1454.5,-331 1454.5,-343 1454.5,-343 1454.5,-349 1448.5,-355 1442.5,-355"/>
<text text-anchor="middle" x="1422" y="-334.5" font-family="Arial" font-size="10.00" fill="#111827">RIB2RIBP</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1520.5,-355C1520.5,-355 1479.5,-355 1479.5,-355 1473.5,-355 1467.5,-349 1467.5,-343 1467.5,-343 1467.5,-331 1467.5,-331 1467.5,-325 1473.5,-319 1479.5,-319 1479.5,-319 1520.5,-319 1520.5,-319 1526.5,-319 1532.5,-325 1532.5,-331 1532.5,-331 1532.5,-343 1532.5,-343 1532.5,-349 1526.5,-355 1520.5,-355"/>
<text text-anchor="middle" x="1500" y="-334.5" font-family="Arial" font-size="10.00" fill="#111827">RIB2RIBP</text>
</g>
<!-- fabric&#45;&gt;ribp_adapter -->
<g id="edge15" class="edge">
<title>fabric&#45;&gt;ribp_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1246.58,-409.87C1292.52,-391.04 1346.56,-368.91 1382.39,-354.23"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1383.76,-356.31 1389.31,-351.39 1381.9,-351.78 1383.76,-356.31"/>
<text text-anchor="middle" x="1328" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1114.41,-413.06C1166.58,-395.74 1220,-378 1220,-378 1220,-378 1382.8,-354.74 1460.12,-343.7"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1460.75,-346.08 1467.33,-342.67 1460.06,-341.23 1460.75,-346.08"/>
<text text-anchor="middle" x="1227" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- apb_adapter -->
<g id="node15" class="node">
<title>apb_adapter</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1107,-355C1107,-355 1037,-355 1037,-355 1031,-355 1025,-349 1025,-343 1025,-343 1025,-331 1025,-331 1025,-325 1031,-319 1037,-319 1037,-319 1107,-319 1107,-319 1113,-319 1119,-325 1119,-331 1119,-331 1119,-343 1119,-343 1119,-349 1113,-355 1107,-355"/>
<text text-anchor="middle" x="1072" y="-340" font-family="Arial" font-size="10.00" fill="#111827">RIB2APB</text>
<text text-anchor="middle" x="1072" y="-329" font-family="Arial" font-size="10.00" fill="#111827">direct APB bridge</text>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M965,-355C965,-355 895,-355 895,-355 889,-355 883,-349 883,-343 883,-343 883,-331 883,-331 883,-325 889,-319 895,-319 895,-319 965,-319 965,-319 971,-319 977,-325 977,-331 977,-331 977,-343 977,-343 977,-349 971,-355 965,-355"/>
<text text-anchor="middle" x="930" y="-340" font-family="Arial" font-size="10.00" fill="#111827">RIB2APB</text>
<text text-anchor="middle" x="930" y="-329" font-family="Arial" font-size="10.00" fill="#111827">direct APB bridge</text>
</g>
<!-- fabric&#45;&gt;apb_adapter -->
<g id="edge16" class="edge">
<title>fabric&#45;&gt;apb_adapter</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1130.03,-409.87C1116.97,-393.69 1101.93,-375.07 1090.44,-360.83"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1092.05,-358.93 1085.74,-355.02 1088.24,-362.01 1092.05,-358.93"/>
<text text-anchor="middle" x="1117" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M987.36,-409.87C974.45,-393.69 959.59,-375.07 948.23,-360.83"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="949.87,-358.96 943.59,-355.02 946.04,-362.02 949.87,-358.96"/>
<text text-anchor="middle" x="974" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g>
<!-- sysctrl -->
<g id="node16" class="node">
<title>sysctrl</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1738.5,-255C1738.5,-255 1575.5,-255 1575.5,-255 1569.5,-255 1563.5,-249 1563.5,-243 1563.5,-243 1563.5,-222 1563.5,-222 1563.5,-216 1569.5,-210 1575.5,-210 1575.5,-210 1738.5,-210 1738.5,-210 1744.5,-210 1750.5,-216 1750.5,-222 1750.5,-222 1750.5,-243 1750.5,-243 1750.5,-249 1744.5,-255 1738.5,-255"/>
<text text-anchor="middle" x="1657" y="-241" font-family="Arial" font-size="10.00" fill="#111827">SYSCTRL</text>
<text text-anchor="middle" x="1657" 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="1657" 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="M1475.5,-255C1475.5,-255 1312.5,-255 1312.5,-255 1306.5,-255 1300.5,-249 1300.5,-243 1300.5,-243 1300.5,-222 1300.5,-222 1300.5,-216 1306.5,-210 1312.5,-210 1312.5,-210 1475.5,-210 1475.5,-210 1481.5,-210 1487.5,-216 1487.5,-222 1487.5,-222 1487.5,-243 1487.5,-243 1487.5,-249 1481.5,-255 1475.5,-255"/>
<text text-anchor="middle" x="1394" y="-241" font-family="Arial" font-size="10.00" fill="#111827">SYSCTRL</text>
<text text-anchor="middle" x="1394" 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="1394" 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="M1454.67,-324.54C1488.35,-312.72 1536,-296 1536,-296 1536,-296 1575.31,-275.69 1609.12,-258.23"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1610.26,-260.4 1615.36,-255.01 1608.01,-256.04 1610.26,-260.4"/>
<text text-anchor="middle" x="1577.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1477.65,-318.8C1463.55,-307.96 1448,-296 1448,-296 1448,-296 1432.02,-277.51 1417.45,-260.64"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1419.01,-258.7 1412.58,-255.01 1415.31,-261.91 1419.01,-258.7"/>
<text text-anchor="middle" x="1457.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;clint -->
<g id="edge18" class="edge">
<title>ribp_adapter&#45;&gt;clint</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1389.25,-333.22C1282.44,-324.15 951,-296 951,-296 951,-296 859.3,-272.32 788.79,-254.11"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="789,-251.63 781.61,-252.25 787.77,-256.37 789,-251.63"/>
<text text-anchor="middle" x="960.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1467.47,-334.23C1325.22,-326.49 765,-296 765,-296 765,-296 554,-255 554,-255 554,-255 551.14,-254.29 546.46,-253.14"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="547.02,-250.75 539.63,-251.45 545.84,-255.51 547.02,-250.75"/>
<text text-anchor="middle" x="774.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_targets -->
<g id="node18" class="node">
<title>ribp_targets</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1524.5,-255C1524.5,-255 1319.5,-255 1319.5,-255 1313.5,-255 1307.5,-249 1307.5,-243 1307.5,-243 1307.5,-222 1307.5,-222 1307.5,-216 1313.5,-210 1319.5,-210 1319.5,-210 1524.5,-210 1524.5,-210 1530.5,-210 1536.5,-216 1536.5,-222 1536.5,-222 1536.5,-243 1536.5,-243 1536.5,-249 1530.5,-255 1524.5,-255"/>
<text text-anchor="middle" x="1422" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RIBP target wrapper</text>
<text text-anchor="middle" x="1422" 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="1422" y="-219" font-family="Arial" font-size="10.00" fill="#111827">I2S</text>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M2230.5,-255C2230.5,-255 2025.5,-255 2025.5,-255 2019.5,-255 2013.5,-249 2013.5,-243 2013.5,-243 2013.5,-222 2013.5,-222 2013.5,-216 2019.5,-210 2025.5,-210 2025.5,-210 2230.5,-210 2230.5,-210 2236.5,-210 2242.5,-216 2242.5,-222 2242.5,-222 2242.5,-243 2242.5,-243 2242.5,-249 2236.5,-255 2230.5,-255"/>
<text text-anchor="middle" x="2128" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RIBP target wrapper</text>
<text text-anchor="middle" x="2128" 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="2128" 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="M1422,-318.61C1422,-303.32 1422,-280.75 1422,-262.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1424.45,-262.26 1422,-255.26 1419.55,-262.26 1424.45,-262.26"/>
<text text-anchor="middle" x="1431.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1532.69,-321.78C1559.14,-310.29 1592,-296 1592,-296 1592,-296 1622,-278 1622,-278 1622,-278 1935,-255 1935,-255 1935,-255 1967.59,-251.37 2005.99,-247.09"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2006.54,-249.5 2013.22,-246.29 2005.99,-244.63 2006.54,-249.5"/>
<text text-anchor="middle" x="1631.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;uart0 -->
<g id="edge20" class="edge">
<title>ribp_adapter&#45;&gt;uart0</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1454.82,-332.96C1555.64,-323.63 1854,-296 1854,-296 1854,-296 2186,-255 2186,-255 2186,-255 2188.16,-254.56 2191.87,-253.8"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2192.51,-256.17 2198.88,-252.36 2191.53,-251.37 2192.51,-256.17"/>
<text text-anchor="middle" x="1999.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1532.74,-329.48C1589.7,-318.15 1701,-296 1701,-296 1701,-296 1738,-278 1738,-278 1738,-278 2442,-255 2442,-255 2442,-255 2444.16,-254.56 2447.87,-253.8"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2448.51,-256.17 2454.88,-252.36 2447.53,-251.37 2448.51,-256.17"/>
<text text-anchor="middle" x="1747.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;i2c_controllers -->
<g id="edge21" class="edge">
<title>ribp_adapter&#45;&gt;i2c_controllers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1454.71,-328.71C1521.23,-313.89 1674.71,-279.69 1778.43,-256.58"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1779.2,-258.92 1785.5,-255 1778.13,-254.13 1779.2,-258.92"/>
<text text-anchor="middle" x="1688.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1467.26,-329.48C1410.3,-318.15 1299,-296 1299,-296 1299,-296 1269,-278 1269,-278 1269,-278 1247.29,-268.34 1224.1,-258.02"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1224.93,-255.71 1217.54,-255.1 1222.93,-260.18 1224.93,-255.71"/>
<text text-anchor="middle" x="1308.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- gpio_controller -->
<g id="node21" class="node">
<title>gpio_controller</title>
<path fill="#f9e1e7" stroke="#4b5563" stroke-width="1.1" d="M1203,-255C1203,-255 1053,-255 1053,-255 1047,-255 1041,-249 1041,-243 1041,-243 1041,-222 1041,-222 1041,-216 1047,-210 1053,-210 1053,-210 1203,-210 1203,-210 1209,-210 1215,-216 1215,-222 1215,-222 1215,-243 1215,-243 1215,-249 1209,-255 1203,-255"/>
<text text-anchor="middle" x="1128" y="-241" font-family="Arial" font-size="10.00" fill="#111827">GPIO V2</text>
<text text-anchor="middle" x="1128" y="-230" font-family="Arial" font-size="10.00" fill="#111827">user + management RIBP windows</text>
<text text-anchor="middle" x="1128" 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="M1909,-255C1909,-255 1759,-255 1759,-255 1753,-255 1747,-249 1747,-243 1747,-243 1747,-222 1747,-222 1747,-216 1753,-210 1759,-210 1759,-210 1909,-210 1909,-210 1915,-210 1921,-216 1921,-222 1921,-222 1921,-243 1921,-243 1921,-249 1915,-255 1909,-255"/>
<text text-anchor="middle" x="1834" y="-241" font-family="Arial" font-size="10.00" fill="#111827">GPIO V2</text>
<text text-anchor="middle" x="1834" y="-230" font-family="Arial" font-size="10.00" fill="#111827">user + management RIBP windows</text>
<text text-anchor="middle" x="1834" 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="M1389.41,-324.64C1343.13,-308.5 1257.25,-278.56 1196.57,-257.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1197.09,-254.99 1189.68,-255 1195.48,-259.62 1197.09,-254.99"/>
<text text-anchor="middle" x="1321" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<text text-anchor="middle" x="1321" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">user/admin</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1514.73,-318.91C1529.48,-301.8 1550,-278 1550,-278 1550,-278 1733,-255 1733,-255 1733,-255 1735.42,-254.48 1739.52,-253.61"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1740.28,-255.95 1746.62,-252.1 1739.26,-251.16 1740.28,-255.95"/>
<text text-anchor="middle" x="1570" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<text text-anchor="middle" x="1570" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">user/admin</text>
</g>
<!-- ribp_adapter&#45;&gt;timers -->
<g id="edge23" class="edge">
<title>ribp_adapter&#45;&gt;timers</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1389.26,-329.43C1316.31,-314.8 1137.66,-278.96 1020.55,-255.47"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1020.97,-253.06 1013.63,-254.09 1020.01,-257.86 1020.97,-253.06"/>
<text text-anchor="middle" x="1221.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1499.57,-318.8C1499.3,-307.96 1499,-296 1499,-296 1499,-296 1499,-278 1499,-278 1499,-278 1525.28,-268.09 1553.04,-257.62"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1554.04,-259.86 1559.73,-255.1 1552.31,-255.28 1554.04,-259.86"/>
<text text-anchor="middle" x="1508.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- ribp_adapter&#45;&gt;ws2812 -->
<g id="edge24" class="edge">
<title>ribp_adapter&#45;&gt;ws2812</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1454.73,-331.41C1577,-314.28 2000,-255 2000,-255 2000,-255 2002.58,-254.4 2006.88,-253.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2007.45,-255.79 2013.72,-251.83 2006.35,-251.02 2007.45,-255.79"/>
<text text-anchor="middle" x="1838.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1532.81,-326.82C1575.03,-315.01 1643,-296 1643,-296 1643,-296 1680,-278 1680,-278 1680,-278 2256,-255 2256,-255 2256,-255 2258.58,-254.4 2262.88,-253.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2263.45,-255.79 2269.72,-251.83 2262.35,-251.02 2263.45,-255.79"/>
<text text-anchor="middle" x="1689.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g>
<!-- apb_targets -->
<g id="node24" class="node">
<title>apb_targets</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M597.5,-255C597.5,-255 406.5,-255 406.5,-255 400.5,-255 394.5,-249 394.5,-243 394.5,-243 394.5,-222 394.5,-222 394.5,-216 400.5,-210 406.5,-210 406.5,-210 597.5,-210 597.5,-210 603.5,-210 609.5,-216 609.5,-222 609.5,-222 609.5,-243 609.5,-243 609.5,-249 603.5,-255 597.5,-255"/>
<text text-anchor="middle" x="502" y="-241" font-family="Arial" font-size="10.00" fill="#111827">APB target wrapper</text>
<text text-anchor="middle" x="502" y="-230" font-family="Arial" font-size="10.00" fill="#111827">Archinfo, RNG, UART1, PWM, PS/2, RTC</text>
<text text-anchor="middle" x="502" y="-219" font-family="Arial" font-size="10.00" fill="#111827">watchdog, CRC, advanced timer and user IP</text>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M1025.5,-255C1025.5,-255 834.5,-255 834.5,-255 828.5,-255 822.5,-249 822.5,-243 822.5,-243 822.5,-222 822.5,-222 822.5,-216 828.5,-210 834.5,-210 834.5,-210 1025.5,-210 1025.5,-210 1031.5,-210 1037.5,-216 1037.5,-222 1037.5,-222 1037.5,-243 1037.5,-243 1037.5,-249 1031.5,-255 1025.5,-255"/>
<text text-anchor="middle" x="930" y="-241" font-family="Arial" font-size="10.00" fill="#111827">APB target wrapper</text>
<text text-anchor="middle" x="930" y="-230" font-family="Arial" font-size="10.00" fill="#111827">RNG, UART1, PWM, PS/2, RTC</text>
<text text-anchor="middle" x="930" y="-219" font-family="Arial" font-size="10.00" fill="#111827">watchdog, CRC, advanced timer and user IP</text>
</g>
<!-- apb_adapter&#45;&gt;apb_targets -->
<g id="edge25" class="edge">
<g id="edge26" class="edge">
<title>apb_adapter&#45;&gt;apb_targets</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1024.87,-327.52C936.06,-311.55 741.64,-276.59 616.52,-254.09"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="616.82,-251.66 609.5,-252.83 615.96,-256.48 616.82,-251.66"/>
<text text-anchor="middle" x="846" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M930,-318.61C930,-303.32 930,-280.75 930,-262.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="932.45,-262.26 930,-255.26 927.55,-262.26 932.45,-262.26"/>
<text text-anchor="middle" x="938" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- archinfo -->
<g id="node25" class="node">
<title>archinfo</title>
<path fill="#e6f4ea" stroke="#4b5563" stroke-width="1.1" d="M783,-255C783,-255 579,-255 579,-255 573,-255 567,-249 567,-243 567,-243 567,-222 567,-222 567,-216 573,-210 579,-210 579,-210 783,-210 783,-210 789,-210 795,-216 795,-222 795,-222 795,-243 795,-243 795,-249 789,-255 783,-255"/>
<text text-anchor="middle" x="681" y="-241" font-family="Arial" font-size="10.00" fill="#111827">ARCHINFO V2</text>
<text text-anchor="middle" x="681" 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="681" 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="M888.6,-318.96C848.01,-302.25 785.71,-276.61 739.95,-257.77"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="740.73,-255.44 733.32,-255.04 738.86,-259.97 740.73,-255.44"/>
<text text-anchor="middle" x="835" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text>
</g>
<!-- irq -->
<g id="node26" class="node">
<g id="node27" class="node">
<title>irq</title>
<path fill="#fce7f3" stroke="#4b5563" stroke-width="1.1" d="M1502,-155C1502,-155 1296,-155 1296,-155 1290,-155 1284,-149 1284,-143 1284,-143 1284,-131 1284,-131 1284,-125 1290,-119 1296,-119 1296,-119 1502,-119 1502,-119 1508,-119 1514,-125 1514,-131 1514,-131 1514,-143 1514,-143 1514,-149 1508,-155 1502,-155"/>
<text text-anchor="middle" x="1399" y="-140" font-family="Arial" font-size="10.00" fill="#111827">Interrupt aggregation</text>
<text text-anchor="middle" x="1399" 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="M1765,-155C1765,-155 1559,-155 1559,-155 1553,-155 1547,-149 1547,-143 1547,-143 1547,-131 1547,-131 1547,-125 1553,-119 1559,-119 1559,-119 1765,-119 1765,-119 1771,-119 1777,-125 1777,-131 1777,-131 1777,-143 1777,-143 1777,-149 1771,-155 1765,-155"/>
<text text-anchor="middle" x="1662" y="-140" font-family="Arial" font-size="10.00" fill="#111827">Interrupt aggregation</text>
<text text-anchor="middle" x="1662" 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="edge30" class="edge">
<g id="edge31" class="edge">
<title>clint&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M781.56,-213.36C789.62,-211.34 795,-210 795,-210 795,-210 1100.51,-173.58 1276.97,-152.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1277.31,-154.97 1283.97,-151.71 1276.73,-150.11 1277.31,-154.97"/>
<text text-anchor="middle" x="1098.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="M539.63,-213.55C548.22,-211.43 554,-210 554,-210 554,-210 1251.48,-164.68 1539.67,-145.95"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1539.99,-148.38 1546.82,-145.48 1539.68,-143.49 1539.99,-148.38"/>
<text text-anchor="middle" x="1079.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="edge40" class="edge">
<g id="edge41" class="edge">
<title>ribp_targets&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1543.73,-211.05C1547.71,-210.39 1550,-210 1550,-210 1550,-210 1931,-187 1931,-187 1931,-187 1940.65,-99.32 1945.82,-52.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1543.28,-208.64 1536.78,-212.22 1544.09,-213.48 1543.28,-208.64"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1948.28,-52.44 1946.61,-45.21 1943.41,-51.9 1948.28,-52.44"/>
<text text-anchor="middle" x="1972" 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="M2162.16,-205.29C2174.75,-195.63 2186,-187 2186,-187 2186,-187 2195.65,-99.32 2200.82,-52.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2160.38,-203.57 2156.32,-209.77 2163.37,-207.45 2160.38,-203.57"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2203.28,-52.44 2201.61,-45.21 2198.41,-51.9 2203.28,-52.44"/>
<text text-anchor="middle" x="2227" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">device interfaces</text>
</g>
<!-- ribp_targets&#45;&gt;gpio_controller -->
<g id="edge26" class="edge">
<g id="edge27" class="edge">
<title>ribp_targets&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1307.39,-232.5C1279.19,-232.5 1249.32,-232.5 1222.21,-232.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1222.02,-230.05 1215.02,-232.5 1222.02,-234.95 1222.02,-230.05"/>
<text text-anchor="middle" x="1261.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="M2013.39,-232.5C1985.19,-232.5 1955.32,-232.5 1928.21,-232.5"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1928.02,-230.05 1921.02,-232.5 1928.02,-234.95 1928.02,-230.05"/>
<text text-anchor="middle" x="1967.25" y="-238.1" font-family="Arial" font-size="8.00" fill="#374151">alternate functions</text>
</g>
<!-- uart0&#45;&gt;ext_io -->
<g id="edge41" class="edge">
<g id="edge42" class="edge">
<title>uart0&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2249,-205.95C2183.15,-165.91 2056.38,-88.81 1990.71,-48.87"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2248.11,-208.28 2255.37,-209.83 2250.66,-204.1 2248.11,-208.28"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1991.81,-46.67 1984.55,-45.12 1989.26,-50.85 1991.81,-46.67"/>
<text text-anchor="middle" x="2186" 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="M2504.87,-205.95C2438.83,-165.91 2311.69,-88.81 2245.83,-48.87"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2504.01,-208.29 2511.26,-209.83 2506.55,-204.1 2504.01,-208.29"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2246.91,-46.66 2239.66,-45.12 2244.37,-50.85 2246.91,-46.66"/>
<text text-anchor="middle" x="2441" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">UART pads</text>
</g>
<!-- uart0&#45;&gt;irq -->
<g id="edge35" class="edge">
<g id="edge36" class="edge">
<title>uart0&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2198.88,-212.64C2191.02,-211.03 2186,-210 2186,-210 2186,-210 1879,-178 1879,-178 1879,-178 1663.63,-160.05 1521.42,-148.2"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1521.46,-145.75 1514.28,-147.61 1521.05,-150.63 1521.46,-145.75"/>
<text text-anchor="middle" x="1970.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="M2454.88,-212.64C2447.02,-211.03 2442,-210 2442,-210 2442,-210 2130,-178 2130,-178 2130,-178 1923.12,-160.32 1784.46,-148.47"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1784.27,-145.99 1777.09,-147.84 1783.85,-150.87 1784.27,-145.99"/>
<text text-anchor="middle" x="2222.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ2</text>
</g>
<!-- i2c_controllers&#45;&gt;gpio_controller -->
<g id="edge36" class="edge">
<g id="edge37" class="edge">
<title>i2c_controllers&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1777.08,-252.51C1769.06,-254.04 1764,-255 1764,-255 1764,-255 1530,-287 1530,-287 1530,-287 1478,-287 1478,-287 1478,-287 1326.14,-263.35 1222.48,-247.21"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1222.71,-244.77 1215.42,-246.11 1221.96,-249.61 1222.71,-244.77"/>
<text text-anchor="middle" x="1504" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO3/4 ALT1</text>
<text text-anchor="middle" x="1504" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1250.14,-255.06C1304.06,-270.05 1365,-287 1365,-287 1365,-287 1417,-287 1417,-287 1417,-287 1733,-255 1733,-255 1733,-255 1735.42,-254.46 1739.52,-253.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1740.32,-255.88 1746.62,-251.97 1739.26,-251.1 1740.32,-255.88"/>
<text text-anchor="middle" x="1391" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO3/4 ALT1</text>
<text text-anchor="middle" x="1391" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text>
</g>
<!-- i2c_controllers&#45;&gt;irq -->
<g id="edge38" class="edge">
<g id="edge39" class="edge">
<title>i2c_controllers&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1777.08,-212.38C1769.06,-210.92 1764,-210 1764,-210 1764,-210 1609,-187 1609,-187 1609,-187 1538.37,-170.52 1479.03,-156.67"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1479.23,-154.21 1471.86,-155 1478.12,-158.98 1479.23,-154.21"/>
<text text-anchor="middle" x="1633.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="M1273.55,-211.67C1359.74,-195.33 1481.05,-172.32 1565.07,-156.38"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1565.65,-158.77 1572.07,-155.06 1564.73,-153.95 1565.65,-158.77"/>
<text text-anchor="middle" x="1469.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ7 / IRQ19</text>
</g>
<!-- gpio_bridge -->
<g id="node25" class="node">
<g id="node26" class="node">
<title>gpio_bridge</title>
<path fill="#e5e7eb" stroke="#4b5563" stroke-width="1.1" d="M1882.5,-155C1882.5,-155 1747.5,-155 1747.5,-155 1741.5,-155 1735.5,-149 1735.5,-143 1735.5,-143 1735.5,-131 1735.5,-131 1735.5,-125 1741.5,-119 1747.5,-119 1747.5,-119 1882.5,-119 1882.5,-119 1888.5,-119 1894.5,-125 1894.5,-131 1894.5,-131 1894.5,-143 1894.5,-143 1894.5,-149 1888.5,-155 1882.5,-155"/>
<text text-anchor="middle" x="1815" y="-140" font-family="Arial" font-size="10.00" fill="#111827">GPIO pad bridge</text>
<text text-anchor="middle" x="1815" 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="M2137.5,-155C2137.5,-155 2002.5,-155 2002.5,-155 1996.5,-155 1990.5,-149 1990.5,-143 1990.5,-143 1990.5,-131 1990.5,-131 1990.5,-125 1996.5,-119 2002.5,-119 2002.5,-119 2137.5,-119 2137.5,-119 2143.5,-119 2149.5,-125 2149.5,-131 2149.5,-131 2149.5,-143 2149.5,-143 2149.5,-149 2143.5,-155 2137.5,-155"/>
<text text-anchor="middle" x="2070" y="-140" font-family="Arial" font-size="10.00" fill="#111827">GPIO pad bridge</text>
<text text-anchor="middle" x="2070" 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="edge27" class="edge">
<g id="edge28" class="edge">
<title>gpio_controller&#45;&gt;gpio_bridge</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1215.38,-220.18C1255.37,-215 1294,-210 1294,-210 1294,-210 1721,-187 1721,-187 1721,-187 1750.1,-171.83 1775.91,-158.37"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1777.31,-160.41 1782.39,-155 1775.05,-156.06 1777.31,-160.41"/>
<text text-anchor="middle" x="1756" 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="M1888.44,-209.93C1928.2,-194.18 1981.69,-172.99 2020.3,-157.69"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2021.24,-159.95 2026.85,-155.1 2019.44,-155.4 2021.24,-159.95"/>
<text text-anchor="middle" x="1986" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g>
<!-- gpio_controller&#45;&gt;irq -->
<g id="edge28" class="edge">
<g id="edge29" class="edge">
<title>gpio_controller&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1190.51,-209.93C1236.46,-194.08 1298.35,-172.72 1342.75,-157.41"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1343.63,-159.7 1349.45,-155.1 1342.03,-155.06 1343.63,-159.7"/>
<text text-anchor="middle" x="1291" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1794.11,-209.81C1765.6,-194.32 1727.49,-173.6 1699.53,-158.4"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1700.69,-156.24 1693.37,-155.05 1698.35,-160.55 1700.69,-156.24"/>
<text text-anchor="middle" x="1760" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text>
</g>
<!-- timers&#45;&gt;irq -->
<g id="edge29" class="edge">
<g id="edge30" class="edge">
<title>timers&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1013.6,-211.84C1098.98,-195.48 1219.64,-172.37 1303.1,-156.37"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1303.64,-158.77 1310.05,-155.04 1302.71,-153.95 1303.64,-158.77"/>
<text text-anchor="middle" x="1206.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="M1627.44,-209.81C1634.37,-195.41 1643.48,-176.49 1650.6,-161.68"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1652.89,-162.57 1653.72,-155.2 1648.48,-160.45 1652.89,-162.57"/>
<text text-anchor="middle" x="1664.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ3 / IRQ4</text>
</g>
<!-- ws2812&#45;&gt;gpio_bridge -->
<g id="edge31" class="edge">
<g id="edge32" class="edge">
<title>ws2812&#45;&gt;gpio_bridge</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2013.72,-213.17C2005.45,-211.26 2000,-210 2000,-210 2000,-210 1832,-187 1832,-187 1832,-187 1827.62,-174.38 1823.31,-161.94"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1825.55,-160.95 1820.95,-155.14 1820.93,-162.55 1825.55,-160.95"/>
<text text-anchor="middle" x="1854.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="M2269.72,-213.17C2261.45,-211.26 2256,-210 2256,-210 2256,-210 2083,-187 2083,-187 2083,-187 2079.65,-174.38 2076.35,-161.94"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2078.71,-161.28 2074.55,-155.14 2073.97,-162.53 2078.71,-161.28"/>
<text text-anchor="middle" x="2105.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 ALT1</text>
</g>
<!-- ws2812&#45;&gt;irq -->
<g id="edge33" class="edge">
<g id="edge34" class="edge">
<title>ws2812&#45;&gt;irq</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2013.72,-213.17C2005.45,-211.26 2000,-210 2000,-210 2000,-210 1691,-187 1691,-187 1691,-187 1660,-178 1660,-178 1660,-178 1586.26,-166.7 1517.16,-156.11"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1517.36,-153.66 1510.07,-155.02 1516.61,-158.5 1517.36,-153.66"/>
<text text-anchor="middle" x="1703" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M2269.72,-213.17C2261.45,-211.26 2256,-210 2256,-210 2256,-210 1922,-187 1922,-187 1922,-187 1833.13,-170.25 1759.3,-156.34"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1759.54,-153.89 1752.21,-155 1758.63,-158.7 1759.54,-153.89"/>
<text text-anchor="middle" x="1934" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text>
</g>
<!-- apb_targets&#45;&gt;gpio_controller -->
<g id="edge39" class="edge">
<g id="edge40" class="edge">
<title>apb_targets&#45;&gt;gpio_controller</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M609.59,-252.51C617.81,-254.04 623,-255 623,-255 623,-255 976,-282.5 976,-282.5 976,-282.5 1012,-282.5 1012,-282.5 1012,-282.5 1040.5,-270.21 1069.25,-257.82"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1070.31,-260.03 1075.77,-255.01 1068.37,-255.53 1070.31,-260.03"/>
<text text-anchor="middle" x="994" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1037.59,-252.51C1045.81,-254.04 1051,-255 1051,-255 1051,-255 1324,-282.5 1324,-282.5 1324,-282.5 1360,-282.5 1360,-282.5 1360,-282.5 1733,-255 1733,-255 1733,-255 1735.42,-254.46 1739.52,-253.55"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1740.32,-255.88 1746.62,-251.97 1739.26,-251.1 1740.32,-255.88"/>
<text text-anchor="middle" x="1342" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text>
</g>
<!-- gpio_bridge&#45;&gt;ext_io -->
<g id="edge42" class="edge">
<g id="edge43" class="edge">
<title>gpio_bridge&#45;&gt;ext_io</title>
<path fill="none" stroke="#4b5563" stroke-width="1.2" d="M1839,-113.95C1860.61,-94.09 1889,-68 1889,-68 1889,-68 1900.85,-59.21 1914.01,-49.45"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1837.17,-112.3 1833.67,-118.84 1840.49,-115.91 1837.17,-112.3"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="1915.54,-51.37 1919.7,-45.23 1912.62,-47.43 1915.54,-51.37"/>
<text text-anchor="middle" x="1909" 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="M2094,-113.95C2115.61,-94.09 2144,-68 2144,-68 2144,-68 2155.85,-59.21 2169.01,-49.45"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2092.17,-112.3 2088.67,-118.84 2095.49,-115.91 2092.17,-112.3"/>
<polygon fill="#4b5563" stroke="#4b5563" stroke-width="1.2" points="2170.54,-51.37 2174.7,-45.23 2167.62,-47.43 2170.54,-51.37"/>
<text text-anchor="middle" x="2164" y="-70.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 45 KiB

+16 -2
View File
@@ -22,6 +22,11 @@ USER_EXTENSIONS_SCRIPT := $(RTL_PATH)/integration/generate_user_extensions.p
USER_EXTENSIONS_DIR := $(VARIANT_ROOT)/generated/user_extensions
USER_EXTENSIONS_STAMP := $(USER_EXTENSIONS_DIR)/.stamp
USER_EXTENSIONS_FILELIST := $(USER_EXTENSIONS_DIR)/user_extensions.fl
ARCHINFO_METADATA_SCRIPT := $(ROOT_PATH)/rtl/managed/clusterip/archinfo/scripts/generate_metadata.py
ARCHINFO_METADATA_DIR := $(VARIANT_ROOT)/generated/archinfo
ARCHINFO_METADATA_STAMP := $(ARCHINFO_METADATA_DIR)/.stamp
ARCHINFO_METADATA_SV := $(ARCHINFO_METADATA_DIR)/archinfo_integration_metadata.svh
ARCHINFO_METADATA_C := $(ARCHINFO_METADATA_DIR)/archinfo_integration_metadata.h
CLOCK_RESET_DOMAINS_SOURCE := $(RTL_PATH)/integration/clock_reset_domains.json
CLOCK_RESET_DOMAINS_SCRIPT := $(ROOT_PATH)/scripts/check_clock_reset_domains.py
MPW_STAMP := $(CACHE_ROOT)/stamps/mpw-$(LOCK_DIGEST).prepared
@@ -96,14 +101,23 @@ user-extensions: $(USER_EXTENSIONS_STAMP)
check-user-extensions:
$(FLOW_PYTHON) $(USER_EXTENSIONS_SCRIPT) --map $(USER_EXTENSIONS_SOURCE) --check
$(ARCHINFO_METADATA_STAMP): $(ARCHINFO_METADATA_SCRIPT) $(LOCK_FILE)
$(FLOW_PYTHON) $(ARCHINFO_METADATA_SCRIPT) --repo-root $(ROOT_PATH) --lock $(LOCK_FILE) \
--config-digest $(CONFIG_DIGEST) $(if $(filter YES,$(BUILD_RELEASE)),--release) \
--output-sv $(ARCHINFO_METADATA_SV) --output-c $(ARCHINFO_METADATA_C)
@touch $@
archinfo-metadata: $(ARCHINFO_METADATA_STAMP)
check-clock-reset-domains:
$(FLOW_PYTHON) $(CLOCK_RESET_DOMAINS_SCRIPT) --map $(CLOCK_RESET_DOMAINS_SOURCE) --root $(ROOT_PATH)
$(FILELIST_STAMP): $(FILELIST_TEMPLATES) $(RTL_PATH)/script/generate_filelist.py \
$(RTL_PATH)/script/filelist.py $(MEMORY_MAP_STAMP) $(PIN_MAP_STAMP) $(SOC_TOPOLOGY_STAMP) \
$(USER_EXTENSIONS_STAMP)
$(USER_EXTENSIONS_STAMP) $(ARCHINFO_METADATA_STAMP)
$(FLOW_PYTHON) $(RTL_PATH)/script/generate_filelist.py \
--output-dir $(GENERATED_FL_DIR) \
--incdir $(ARCHINFO_METADATA_DIR) \
$(foreach define,$(DEF_LIST),--define $(define))
@touch $@
@@ -159,4 +173,4 @@ endif
.PHONY: gen_mpw_code generate_filelist memory-map check-memory-map pin-map check-pin-map \
soc-topology check-soc-topology user-extensions check-user-extensions \
check-clock-reset-domains firmware
archinfo-metadata check-clock-reset-domains firmware
-1
View File
@@ -1,4 +1,3 @@
/clusterip/archinfo/rtl/archinfo_reg_pkg.sv
/clusterip/archinfo/rtl/archinfo_reg.sv
/clusterip/archinfo/rtl/apb4_archinfo.sv
/clusterip/rng/rtl/apb4_rng.sv
+2
View File
@@ -2,6 +2,7 @@
// retroSoC is licensed under Mulan PSL v2.
module i2c_formal;
// verilog_format: off
(* anyseq, gclk *) logic clk_i;
wire rst_n_i;
wire f_past_valid;
@@ -29,6 +30,7 @@ module i2c_formal;
wire tx_dma_stall;
wire rx_dma_stall;
wire irq;
// verilog_format: on
i2c_formal_design u_design (
.clk_i (clk_i),
+6 -1
View File
@@ -61,6 +61,7 @@ CRT_SRCS := $(ROOT_PATH)/crt/arch/riscv/startup.S \
$(ROOT_PATH)/crt/src/lib/string.c \
$(ROOT_PATH)/crt/src/lib/console.c \
$(ROOT_PATH)/crt/src/lib/printf.c \
$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/src/archinfo.c \
$(ROOT_PATH)/crt/src/core/archinfo.c \
$(ROOT_PATH)/crt/src/service/bench.c \
$(ROOT_PATH)/crt/src/service/booter.c \
@@ -126,6 +127,8 @@ endif
INC_PATH := -I$(SW_BUILD_DIR)/include \
-I$(MEMORY_MAP_C_DIR) \
-I$(USER_EXTENSIONS_DIR)/include \
-I$(ARCHINFO_METADATA_DIR) \
-I$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
-I$(ROOT_PATH)/crt/include \
$(addprefix -I,$(APP_INC_DIRS))
SRC_PATH := $(CRT_SRCS) $(APP_SRCS)
@@ -136,6 +139,8 @@ FIRMWARE_ELF := $(SW_BUILD_DIR)/firmware
ASM_FIRMWARE_NAME ?= retrosoc_asm
SW_HEADERS := $(shell find $(ROOT_PATH)/crt/include $(ROOT_PATH)/app -type f \
\( -name '*.h' -o -name '*.hpp' \) 2>/dev/null)
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
-type f -name '*.h' 2>/dev/null)
$(VERSION_HEADER): FORCE_VERSION $(ROOT_PATH)/crt/ver.py $(ROOT_PATH)/crt/ver.tmpl
@mkdir -p $(dir $@)
@@ -153,7 +158,7 @@ asm: $(MPW_VARIANT_STAMP) $(MEMORY_MAP_STAMP)
cp $(SW_BUILD_DIR)/asm/hello-asm.bin $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).bin
cp $(SW_BUILD_DIR)/asm/hello-asm.txt $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME)_all.txt
$(FIRMWARE_ELF): $(MPW_VARIANT_STAMP) $(MEMORY_MAP_STAMP) $(USER_EXTENSIONS_STAMP) $(VERSION_HEADER) $(SRC_PATH) $(SW_HEADERS) $(LDS_PATH) \
$(FIRMWARE_ELF): $(MPW_VARIANT_STAMP) $(MEMORY_MAP_STAMP) $(USER_EXTENSIONS_STAMP) $(ARCHINFO_METADATA_STAMP) $(VERSION_HEADER) $(SRC_PATH) $(SW_HEADERS) $(LDS_PATH) \
$(ROOT_PATH)/rtl/mini/mk/software.mk
@mkdir -p $(SW_BUILD_DIR)
cd $(SW_BUILD_DIR) && $(CP) -P -o $(LINK_TYPE).lds $(LDS_PATH)
+9 -3
View File
@@ -54,7 +54,9 @@ def expand_lint_config(content: str) -> str:
return expanded
def generate_all(output_dir: Path, defines: list[str]) -> list[Path]:
def generate_all(
output_dir: Path, defines: list[str], incdirs: list[Path] | None = None
) -> list[Path]:
output_dir.mkdir(parents=True, exist_ok=True)
generated: list[Path] = []
@@ -92,7 +94,8 @@ def generate_all(output_dir: Path, defines: list[str]) -> list[Path]:
generated.append(lint_destination)
def_file = output_dir / "def.fl"
atomic_write(def_file, " ".join(defines) + "\n")
include_tokens = [f"+incdir+{path.resolve()}" for path in (incdirs or [])]
atomic_write(def_file, " ".join([*include_tokens, *defines]) + "\n")
generated.append(def_file)
return generated
@@ -103,6 +106,9 @@ def parse_args() -> argparse.Namespace:
"--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR, help="output directory"
)
parser.add_argument("--define", action="append", default=[], help="filelist +define+ token")
parser.add_argument(
"--incdir", action="append", default=[], type=Path, help="generated include directory"
)
return parser.parse_args()
@@ -111,7 +117,7 @@ def main() -> int:
invalid = [item for item in args.define if not item.startswith("+define+")]
if invalid:
raise SystemExit(f"invalid define token(s): {' '.join(invalid)}")
generated = generate_all(args.output_dir.resolve(), args.define)
generated = generate_all(args.output_dir.resolve(), args.define, args.incdir)
print(f"generated {len(generated)} files in {args.output_dir.resolve()}")
return 0
+100 -13
View File
@@ -14,6 +14,7 @@
`include "ps2_define.svh"
`include "user_extensions.svh"
`include "soc_irq_config.svh"
`include "archinfo_integration_metadata.svh"
module ip_apb_wrapper (
// verilog_format: off
@@ -32,33 +33,119 @@ module ip_apb_wrapper (
// verilog_format: on
);
localparam logic [7:0] ARCHINFO_MGMT_HART_COUNT = 8'd1;
localparam logic [7:0] ARCHINFO_USER_CORE_COUNT = `USER_CORE_COUNT;
localparam logic [7:0] ARCHINFO_GPIO_COUNT = 8'd32;
localparam logic [7:0] ARCHINFO_IRQ_COUNT = `SOC_IRQ_VECTOR_WIDTH;
localparam logic [31:0] ARCHINFO_TOPOLOGY = {
ARCHINFO_IRQ_COUNT, ARCHINFO_GPIO_COUNT, ARCHINFO_USER_CORE_COUNT, ARCHINFO_MGMT_HART_COUNT
};
`ifdef HAVE_PLL
localparam logic ARCHINFO_HAVE_PLL = 1'b1;
`else
localparam logic ARCHINFO_HAVE_PLL = 1'b0;
`endif
`ifdef HAVE_SRAM_IF
localparam logic ARCHINFO_HAVE_SRAM_IF = 1'b1;
localparam logic [31:0] ARCHINFO_SRAM_BYTES = 32'd131_072;
`else
localparam logic ARCHINFO_HAVE_SRAM_IF = 1'b0;
localparam logic [31:0] ARCHINFO_SRAM_BYTES = 32'd0;
`endif
`ifdef HAVE_SRAM_MACRO
localparam logic ARCHINFO_HAVE_SRAM_MACRO = 1'b1;
`else
localparam logic ARCHINFO_HAVE_SRAM_MACRO = 1'b0;
`endif
localparam logic [31:0] ARCHINFO_FEATURES0 =
32'h0000_FFF8 | {31'd0, ARCHINFO_HAVE_PLL} |
({31'd0, ARCHINFO_HAVE_SRAM_IF} << 1) | ({31'd0, ARCHINFO_HAVE_SRAM_MACRO} << 2);
`ifdef PDK_IHP130
localparam logic [31:0] ARCHINFO_TECHNOLOGY = 32'h0201_0082;
`elsif PDK_GF180
localparam logic [31:0] ARCHINFO_TECHNOLOGY = 32'h0202_00B4;
`elsif PDK_SKY130
localparam logic [31:0] ARCHINFO_TECHNOLOGY = 32'h0203_0082;
`elsif PDK_ICS55
localparam logic [31:0] ARCHINFO_TECHNOLOGY = 32'h0204_0037;
`else
localparam logic [31:0] ARCHINFO_TECHNOLOGY = 32'h0000_0000;
`endif
// Generated timed and pure scalar APB interfaces preserve FPGA compatibility.
`include "soc_apb_interfaces.svh"
// Low-frequency peripherals retain their dedicated interfaces.
rtc_if u_rtc_if (
clk_aud_i,
rst_aud_n_i
.rtc_clk_i (clk_aud_i),
.rtc_rst_n_i(rst_aud_n_i)
);
wdg_if u_wdg_if (clk_aud_i);
tmr_if u_tmr_if (clk_aud_i);
wdg_if u_wdg_if (.rtc_clk_i(clk_aud_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
apb4_archinfo u_apb4_archinfo (u_archinfo_apb_if);
apb4_rng u_apb4_rng (u_rng_apb_if);
apb4_uart #(.FIFO_DEPTH(32)) u_apb4_uart (u_uart1_apb_if, uart);
apb4_pwm u_apb4_pwm (u_pwm_apb_if, pwm);
apb4_ps2 u_apb4_ps2 (u_ps2_apb_if, ps2);
apb4_rtc u_apb4_rtc (u_rtc_apb_if, u_rtc_if);
apb4_wdg u_apb4_wdg (u_wdg_apb_if, u_wdg_if);
apb4_crc u_apb4_crc (u_crc_apb_if);
apb4_tmr u_apb4_tmr (u_tmr_apb_if, u_tmr_if);
apb4_archinfo #(
.VENDOR_ID (32'h0000_0000),
.SOC_REVISION (32'h0001_0000),
.BUILD_ID (`ARCHINFO_INTEGRATION_BUILD_ID),
.CONFIG_ID (`ARCHINFO_INTEGRATION_CONFIG_ID),
.BUILD_STATUS (`ARCHINFO_INTEGRATION_BUILD_STATUS),
.REFERENCE_CLOCK_HZ(`SOC_EXT_CLK_HZ),
.SRAM_BYTES (ARCHINFO_SRAM_BYTES),
.TOPOLOGY (ARCHINFO_TOPOLOGY),
.FEATURES0 (ARCHINFO_FEATURES0),
.TECHNOLOGY (ARCHINFO_TECHNOLOGY)
) u_apb4_archinfo (
.device_id_i (128'h0000_0000_0000_0000_0000_0000_0000_0000),
.device_id_valid_i (1'b0),
.device_id_read_enable_i(1'b0),
.apb4 (u_archinfo_apb_if)
);
// verilog_format: on
apb4_rng u_apb4_rng (.apb4(u_rng_apb_if));
apb4_uart #(
.FIFO_DEPTH(32)
) u_apb4_uart (
.apb4(u_uart1_apb_if),
.uart(uart)
);
apb4_pwm u_apb4_pwm (
.apb4(u_pwm_apb_if),
.pwm (pwm)
);
apb4_ps2 u_apb4_ps2 (
.apb4(u_ps2_apb_if),
.ps2 (ps2)
);
apb4_rtc u_apb4_rtc (
.apb4(u_rtc_apb_if),
.rtc (u_rtc_if)
);
apb4_wdg u_apb4_wdg (
.apb4(u_wdg_apb_if),
.wdg (u_wdg_if)
);
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"
+15 -5
View File
@@ -20,11 +20,21 @@ module user_ip_wrapper (
// verilog_format: on
);
// verilog_format: off
apb4_if u_demo_apb4_if(clk_i, rst_n_i);
apb4_if u_user_apb4_if(clk_i, rst_n_i);
apb4_archinfo u_apb4_archinfo_ip(u_demo_apb4_if);
// verilog_format: on
apb4_if u_demo_apb4_if (
.pclk (clk_i),
.presetn(rst_n_i)
);
apb4_if u_user_apb4_if (
.pclk (clk_i),
.presetn(rst_n_i)
);
apb4_archinfo u_apb4_archinfo_ip (
.device_id_i (128'h0000_0000_0000_0000_0000_0000_0000_0000),
.device_id_valid_i (1'b0),
.device_id_read_enable_i(1'b0),
.apb4 (u_demo_apb4_if)
);
assign apb.pready = ~(|sel_i) ? u_demo_apb4_if.pready : u_user_apb4_if.pready;
assign apb.prdata = ~(|sel_i) ? u_demo_apb4_if.prdata : u_user_apb4_if.prdata;
+6 -3
View File
@@ -108,11 +108,14 @@ def test_nested_filelist_and_space_path_round_trip(tmp_path: Path) -> None:
def test_generate_all_is_stable_and_expands_paths(tmp_path: Path) -> None:
defines = ["+define+PDK_IHP130"]
generated = generate_all(tmp_path, defines)
generated_include = tmp_path / "archinfo metadata"
generated = generate_all(tmp_path, defines, [generated_include])
mtimes = {path: path.stat().st_mtime_ns for path in generated}
generate_all(tmp_path, defines)
generate_all(tmp_path, defines, [generated_include])
assert {path: path.stat().st_mtime_ns for path in generated} == mtimes
assert (tmp_path / "def.fl").read_text(encoding="utf-8") == " ".join(defines) + "\n"
assert (tmp_path / "def.fl").read_text(encoding="utf-8") == (
f"+incdir+{generated_include.resolve()} " + " ".join(defines) + "\n"
)
cluster = (tmp_path / "clusterip.fl").read_text(encoding="utf-8")
hazard3 = (tmp_path / "core_hazard3.fl").read_text(encoding="utf-8")
assert str(ROOT / "rtl/managed/clusterip") in cluster