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
+521 -289

No files matched your search

+6 -2
View File
@@ -40,6 +40,7 @@ HAVE_SRAM_IF ?= NO
HAVE_SRAM_MACRO ?= NO HAVE_SRAM_MACRO ?= NO
PDK_BEHAV ?= NO PDK_BEHAV ?= NO
HAVE_SVA ?= NO HAVE_SVA ?= NO
BUILD_RELEASE ?= NO
JTAG_IDCODE ?= DEADBEEF JTAG_IDCODE ?= DEADBEEF
EXT_CLK_HZ ?= 72000000 EXT_CLK_HZ ?= 72000000
CLINT_TIMEBASE_HZ ?= 1000000 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)'; \ if [ "$$count" -gt "$(MAX_JOBS)" ]; then printf '%s' '$(MAX_JOBS)'; \
else printf '%s' "$$count"; fi) else printf '%s' "$$count"; fi)
CONFIG_KEY_VARS := SOC PDK HAVE_PLL HAVE_SRAM_IF HAVE_SRAM_MACRO PDK_BEHAV HAVE_SVA \ 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 COREMARK_MODE RTL_TOP FIRMWARE_NAME
VARIANT_ID := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/config_key.py \ VARIANT_ID := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/config_key.py \
--lock $(LOCK_FILE) --profile $(PROFILE_NAME) --timestamp $(BUILD_TIMESTAMP) \ --lock $(LOCK_FILE) --profile $(PROFILE_NAME) --timestamp $(BUILD_TIMESTAMP) \
@@ -90,8 +91,9 @@ VARIANT_ID := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/c
ifeq ($(VARIANT_ID),) ifeq ($(VARIANT_ID),)
$(error Failed to calculate build variant ID) $(error Failed to calculate build variant ID)
endif endif
LOCK_DIGEST := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/dependency_lock.py \ LOCK_DIGEST := $(strip $(shell $(VCS_SHELL_PYTHON) $(ROOT_PATH)/scripts/dependency_lock.py \
--lock $(LOCK_FILE) --digest | tail -n 1)) --lock $(LOCK_FILE) --digest | tail -n 1))
CONFIG_DIGEST := $(lastword $(subst -, ,$(VARIANT_ID)))
export BUILD_TIMESTAMP export BUILD_TIMESTAMP
VARIANT_ROOT := $(abspath $(BUILD_ROOT))/$(VARIANT_ID) VARIANT_ROOT := $(abspath $(BUILD_ROOT))/$(VARIANT_ID)
SW_BUILD_DIR := $(VARIANT_ROOT)/sw 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,HAVE_SRAM_MACRO,$(VALID_BOOL))
$(call validate_value,PDK_BEHAV,$(VALID_BOOL)) $(call validate_value,PDK_BEHAV,$(VALID_BOOL))
$(call validate_value,HAVE_SVA,$(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,WAVE,$(VALID_BOOL))
$(call validate_value,FORMAL,$(VALID_BOOL)) $(call validate_value,FORMAL,$(VALID_BOOL))
$(call validate_value,VCS_USE_LSF,$(VALID_BOOL)) $(call validate_value,VCS_USE_LSF,$(VALID_BOOL))
@@ -313,6 +316,7 @@ config:
VCS_USE_LSF '$(VCS_USE_LSF)' PDK '$(PDK)' \ VCS_USE_LSF '$(VCS_USE_LSF)' PDK '$(PDK)' \
HAVE_PLL '$(HAVE_PLL)' HAVE_SRAM_IF '$(HAVE_SRAM_IF)' \ HAVE_PLL '$(HAVE_PLL)' HAVE_SRAM_IF '$(HAVE_SRAM_IF)' \
HAVE_SRAM_MACRO '$(HAVE_SRAM_MACRO)' PDK_BEHAV '$(PDK_BEHAV)' HAVE_SVA '$(HAVE_SVA)' \ HAVE_SRAM_MACRO '$(HAVE_SRAM_MACRO)' PDK_BEHAV '$(PDK_BEHAV)' HAVE_SVA '$(HAVE_SVA)' \
BUILD_RELEASE '$(BUILD_RELEASE)' \
JTAG_IDCODE '$(JTAG_IDCODE)' EXT_CLK_HZ '$(EXT_CLK_HZ)' \ JTAG_IDCODE '$(JTAG_IDCODE)' EXT_CLK_HZ '$(EXT_CLK_HZ)' \
CLINT_TIMEBASE_HZ '$(CLINT_TIMEBASE_HZ)' \ CLINT_TIMEBASE_HZ '$(CLINT_TIMEBASE_HZ)' \
ISA '$(ISA)' HAVE_CSR '$(HAVE_CSR)' APP '$(APP)' \ 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. `coremark`, `debug`, and `shell` applications.
- Open-source behavioral simulation with Icarus Verilog and Verilator, synthesis with - Open-source behavioral simulation with Icarus Verilog and Verilator, synthesis with
Yosys, netlist simulation with Icarus Verilog, and timing analysis with OpenSTA. 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 - Checksum-verified dependency and toolchain locks, structured flow results, warning
baselines, metrics collection, SBOM generation, and checksummed release packages. baselines, metrics collection, SBOM generation, and checksummed release packages.
@@ -73,7 +75,8 @@ user core.
CI Verilator firmware simulations explicitly select the `ci_smoke` CI Verilator firmware simulations explicitly select the `ci_smoke`
application, which checks UART, archinfo APB readback, and test-status 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, as their default for manual diagnostics. To run the full report in Verilator,
use: 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. | | `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. | | `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. | | `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. | | `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. | | `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/core/soc.h>
#include <retrosoc/hal/clint.h> #include <retrosoc/hal/clint.h>
#include <retrosoc/hal/gpio.h> #include <retrosoc/hal/gpio.h>
@@ -6,13 +7,12 @@
#include <retrosoc/lib/printf.h> #include <retrosoc/lib/printf.h>
#include <retrosoc/service/test.h> #include <retrosoc/service/test.h>
static bool rs_ci_smoke_archinfo_matches_reset_values(void) { static bool rs_ci_smoke_archinfo_v2(void) {
const uint32_t archinfo_sys = reg_archinfo_sys; rs_archinfo_t info;
const uint32_t archinfo_idl = reg_archinfo_idl; uint32_t device_id[4];
const uint32_t archinfo_idh = reg_archinfo_idh;
return (archinfo_sys == UINT32_C(0x000F1010)) && (archinfo_idl == UINT32_C(0xFFFF2022)) && return (rs_archinfo_read(&info) == RS_OK) && (rs_archinfo_validate_build(&info) == RS_OK) &&
(archinfo_idh == UINT32_C(0x00FFFFFF)); (rs_archinfo_read_device_id(device_id) == RS_ENOTSUP);
} }
static bool rs_ci_smoke_clint_standard_map(void) { static bool rs_ci_smoke_clint_standard_map(void) {
@@ -173,7 +173,7 @@ int main(void) {
rs_test_finish(RS_TEST_FAILED, 7U); 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); rs_test_finish(RS_TEST_FAILED, 1U);
} }
printf("ci_smoke: archinfo passed\n"); printf("ci_smoke: archinfo passed\n");
+1 -1
View File
@@ -60,7 +60,7 @@
"submodules": ["libraries/sky130_fd_sc_hd/latest"], "submodules": ["libraries/sky130_fd_sc_hd/latest"],
"license": "Apache-2.0" "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_clint": {"url": "https://github.com/retroSoC/clint.git", "revision": "ce49f1a5501c0a9f18c0e3f358417648f3f2fb18", "destination": "rtl/managed/clusterip/clint", "license": "NOASSERTION"},
"cluster_common": {"url": "https://github.com/retroSoC/common.git", "revision": "16ee9a5cfdc1248f35f0993710e3cb89464c19d9", "destination": "rtl/managed/clusterip/common", "license": "NOASSERTION"}, "cluster_common": {"url": "https://github.com/retroSoC/common.git", "revision": "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"}, "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 #ifndef RETROSOC_ARCHINFO_H
#define 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); void ip_archinfo_test(int argc, char **argv);
#endif #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_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_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)) #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 // rng
#define reg_rng_ctrl RS_SOC_REG32(RS_SOC_APB_RNG_BASE, UINT32_C(0x00)) #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)) #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/core/soc.h>
#include <retrosoc/lib/printf.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) { void ip_archinfo_test(int argc, char **argv) {
rs_archinfo_t info;
rs_status_t status;
(void)argc; (void)argc;
(void)argv; (void)argv;
printf("[APB IP] archinfo test\n");
printf("[ARCHINFO SYS] %x\n", reg_archinfo_sys); status = rs_archinfo_read(&info);
printf("[ARCHINFO IDL] %x\n", reg_archinfo_idl); if (status != RS_OK) {
printf("[ARCHINFO IDH] %x\n", reg_archinfo_idh); 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 DVP @%p\n", (void *)&reg_dvp_recven);
printf(" 1 x I2C1 @%p\n", printf(" 1 x I2C1 @%p\n",
(void *)(uintptr_t)RS_SOC_RIBP_I2C1_BASE); (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 RNG @%p\n", (void *)&reg_rng_ctrl);
printf(" 1 x UART1(ADV) @%p\n", (void *)&reg_uart1_lcr); printf(" 1 x UART1(ADV) @%p\n", (void *)&reg_uart1_lcr);
printf(" 1 x PWM(4CHNL) @%p\n", (void *)&reg_pwm_ctrl); 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 `bringup` retains the full automatic application-information report for
manual runs. 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 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 `slow_1p08V_125C`, GF180 uses `ss_125C_4v50`, ICS55 uses the H7CR
`ss_1p08_125C` view, and SKY130 uses `ss_100C_1v40`. `ss_1p08_125C` view, and SKY130 uses `ss_100C_1v40`.
@@ -96,6 +105,7 @@ one timestamp to all of its child Make commands.
```text ```text
build/<variant>/ build/<variant>/
generated/mpw/<simulator>/ generated/mpw/<simulator>/
generated/archinfo/
generated/pin_map/ generated/pin_map/
sw/ sw/
sim/<simulator>/ sim/<simulator>/
+7 -2
View File
@@ -152,7 +152,11 @@ digraph mini_soc_block_diagram {
]; ];
apb_targets [ apb_targets [
fillcolor="#E6F4EA", 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 [ gpio_bridge [
fillcolor="#E5E7EB", fillcolor="#E5E7EB",
@@ -169,7 +173,7 @@ digraph mini_soc_block_diagram {
{ rank=same; user_core; dma; } { rank=same; user_core; dma; }
{ rank=same; fault; fabric; sram; } { rank=same; fault; fabric; sram; }
{ rank=same; ribp_adapter; apb_adapter; } { 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; } { rank=same; gpio_bridge; irq; }
ext_clock -> rcu [label="clock / reset"]; 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 -> gpio_controller [label="RIBP\nuser/admin"];
ribp_adapter -> timers [label="RIBP"]; ribp_adapter -> timers [label="RIBP"];
ribp_adapter -> ws2812 [label="RIBP"]; ribp_adapter -> ws2812 [label="RIBP"];
apb_adapter -> archinfo [label="APB"];
apb_adapter -> apb_targets [label="APB"]; apb_adapter -> apb_targets [label="APB"];
ribp_targets -> gpio_controller [label="alternate functions"]; ribp_targets -> gpio_controller [label="alternate functions"];
+252 -237
View File
@@ -4,19 +4,19 @@
<!-- Generated by graphviz version 2.43.0 (0) <!-- Generated by graphviz version 2.43.0 (0)
--> -->
<!-- Title: mini_soc_block_diagram Pages: 1 --> <!-- Title: mini_soc_block_diagram Pages: 1 -->
<svg width="2433pt" height="896pt" <svg width="2689pt" 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"> 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)"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 892.48)">
<title>mini_soc_block_diagram</title> <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> <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"> <g id="clust1" class="cluster">
<title>cluster_asic</title> <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> <text text-anchor="middle" x="196.5" y="-769.28" font-family="Arial" font-size="14.00" fill="#111827">retrosoc_asic</text>
</g> </g>
<g id="clust2" class="cluster"> <g id="clust2" class="cluster">
<title>cluster_soc</title> <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> <text text-anchor="middle" x="407.5" y="-727.88" font-family="Arial" font-size="12.00" fill="#334155">retrosoc</text>
</g> </g>
<!-- ext_clock --> <!-- ext_clock -->
@@ -44,475 +44,490 @@
<!-- ext_io --> <!-- ext_io -->
<g id="node2" class="node"> <g id="node2" class="node">
<title>ext_io</title> <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"/> <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="1949" y="-31" font-family="Arial" font-size="10.00" fill="#111827">External I/O and memory</text> <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="1949" 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="-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> <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> </g>
<!-- ext_jtag --> <!-- ext_jtag -->
<g id="node3" class="node"> <g id="node3" class="node">
<title>ext_jtag</title> <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"/> <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="635" y="-845.48" font-family="Arial" font-size="10.00" fill="#111827">Management JTAG</text> <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="635" y="-834.48" font-family="Arial" font-size="10.00" fill="#111827">TCK, TMS, TDI, TRST_n, TDO</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> </g>
<!-- jtag_dtm --> <!-- jtag_dtm -->
<g id="node6" class="node"> <g id="node6" class="node">
<title>jtag_dtm</title> <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"/> <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="635" y="-663.98" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 JTAG DTM</text> <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="635" y="-652.98" font-family="Arial" font-size="10.00" fill="#111827">10 MHz asynchronous TCK domain</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> </g>
<!-- ext_jtag&#45;&gt;jtag_dtm --> <!-- ext_jtag&#45;&gt;jtag_dtm -->
<g id="edge2" class="edge"> <g id="edge2" class="edge">
<title>ext_jtag&#45;&gt;jtag_dtm</title> <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"/> <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="637.45,-686.14 635,-679.14 632.55,-686.14 637.45,-686.14"/> <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="655" y="-795.08" font-family="Arial" font-size="8.00" fill="#374151">JTAG pads</text> <text text-anchor="middle" x="760" y="-795.08" font-family="Arial" font-size="8.00" fill="#374151">JTAG pads</text>
</g> </g>
<!-- fabric --> <!-- fabric -->
<g id="node11" class="node"> <g id="node11" class="node">
<title>fabric</title> <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"/> <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="1159" y="-455.24" font-family="Arial" font-size="10.00" fill="#111827">RIB fabric</text> <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="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="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="1159" y="-433.24" font-family="Arial" font-size="10.00" fill="#111827">INCR1 / INCR4, access policy, fault reporting</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> </g>
<!-- rcu&#45;&gt;fabric --> <!-- rcu&#45;&gt;fabric -->
<g id="edge3" class="edge"> <g id="edge3" class="edge">
<title>rcu&#45;&gt;fabric</title> <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"/> <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="1025.15,-471.97 1031.66,-468.43 1024.36,-467.13 1025.15,-471.97"/> <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="724" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">system clock / reset</text> <text text-anchor="middle" x="664" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">system clock / reset</text>
</g> </g>
<!-- clint --> <!-- clint -->
<g id="node17" class="node"> <g id="node17" class="node">
<title>clint</title> <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"/> <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="709" y="-241" font-family="Arial" font-size="10.00" fill="#111827">CLINT</text> <text text-anchor="middle" x="467" 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="467" 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> <text text-anchor="middle" x="467" y="-219" font-family="Arial" font-size="10.00" fill="#111827">mtime, mtimecmp and MSIP</text>
</g> </g>
<!-- rcu&#45;&gt;clint --> <!-- rcu&#45;&gt;clint -->
<g id="edge8" class="edge"> <g id="edge8" class="edge">
<title>rcu&#45;&gt;clint</title> <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"/> <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="675.27,-261.28 679.47,-255.17 672.37,-257.33 675.27,-261.28"/> <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="525.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">1 MHz tick</text> <text text-anchor="middle" x="392.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">1 MHz tick</text>
</g> </g>
<!-- mgmt_core --> <!-- mgmt_core -->
<g id="node5" class="node"> <g id="node5" class="node">
<title>mgmt_core</title> <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"/> <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="1218" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Management core</text> <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="1218" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">Fixed Hazard3, branch predictor</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="1218" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">JTAG Debug Module always present</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> </g>
<!-- mgmt_adapter --> <!-- mgmt_adapter -->
<g id="node8" class="node"> <g id="node8" class="node">
<title>mgmt_adapter</title> <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"/> <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="1159" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">RIBP2RIB</text> <text text-anchor="middle" x="1016" y="-558.48" font-family="Arial" font-size="10.00" fill="#111827">RIBP2RIB</text>
</g> </g>
<!-- mgmt_core&#45;&gt;mgmt_adapter --> <!-- mgmt_core&#45;&gt;mgmt_adapter -->
<g id="edge9" class="edge"> <g id="edge9" class="edge">
<title>mgmt_core&#45;&gt;mgmt_adapter</title> <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"/> <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="1175.02,-583.85 1169.31,-579.12 1170.83,-586.38 1175.02,-583.85"/> <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="1199.5" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="1178.5" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- debug_module --> <!-- debug_module -->
<g id="node7" class="node"> <g id="node7" class="node">
<title>debug_module</title> <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"/> <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="911" y="-669.48" font-family="Arial" font-size="10.00" fill="#111827">Hazard3 Debug Module</text> <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="911" y="-658.48" font-family="Arial" font-size="10.00" fill="#111827">abstract commands, no SBA</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="911" y="-647.48" font-family="Arial" font-size="10.00" fill="#111827">management&#45;hart&#45;only reset</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> </g>
<!-- jtag_dtm&#45;&gt;debug_module --> <!-- jtag_dtm&#45;&gt;debug_module -->
<g id="edge4" class="edge"> <g id="edge4" class="edge">
<title>jtag_dtm&#45;&gt;debug_module</title> <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"/> <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="831.12,-663.43 838.12,-660.98 831.12,-658.53 831.12,-663.43"/> <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="780.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">DMI, asynchronous CDC</text> <text text-anchor="middle" x="885.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">DMI, asynchronous CDC</text>
</g> </g>
<!-- debug_module&#45;&gt;mgmt_core --> <!-- debug_module&#45;&gt;mgmt_core -->
<g id="edge5" class="edge"> <g id="edge5" class="edge">
<title>debug_module&#45;&gt;mgmt_core</title> <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"/> <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="1121.77,-663.43 1128.77,-660.98 1121.77,-658.53 1121.77,-663.43"/> <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="1056.25" y="-666.58" font-family="Arial" font-size="8.00" fill="#374151">halt, resume, abstract commands</text> <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> </g>
<!-- debug_module&#45;&gt;mgmt_adapter --> <!-- debug_module&#45;&gt;mgmt_adapter -->
<g id="edge6" class="edge"> <g id="edge6" class="edge">
<title>debug_module&#45;&gt;mgmt_adapter</title> <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"/> <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="1120.74,-579.74 1126.35,-574.89 1118.94,-575.18 1120.74,-579.74"/> <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="1080" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">reset after bridge idle</text> <text text-anchor="middle" x="1054" y="-609.08" font-family="Arial" font-size="8.00" fill="#374151">reset after bridge idle</text>
</g> </g>
<!-- timers --> <!-- timers -->
<g id="node22" class="node"> <g id="node22" class="node">
<title>timers</title> <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"/> <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="911" y="-241" font-family="Arial" font-size="10.00" fill="#111827">General timers 0/1</text> <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="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="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="911" y="-219" font-family="Arial" font-size="10.00" fill="#111827">periodic / one&#45;shot, compare, debug freeze</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> </g>
<!-- debug_module&#45;&gt;timers --> <!-- debug_module&#45;&gt;timers -->
<g id="edge7" class="edge"> <g id="edge7" class="edge">
<title>debug_module&#45;&gt;timers</title> <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"/> <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="913.45,-262.24 911,-255.24 908.55,-262.24 913.45,-262.24"/> <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="922" y="-444.84" font-family="Arial" font-size="8.00" fill="#374151">halted</text> <text text-anchor="middle" x="1715" y="-444.84" font-family="Arial" font-size="8.00" fill="#374151">halted</text>
</g> </g>
<!-- mgmt_adapter&#45;&gt;fabric --> <!-- mgmt_adapter&#45;&gt;fabric -->
<g id="edge10" class="edge"> <g id="edge10" class="edge">
<title>mgmt_adapter&#45;&gt;fabric</title> <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"/> <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="1161.45,-490.57 1159,-483.57 1156.55,-490.57 1161.45,-490.57"/> <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="1166" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text> <text text-anchor="middle" x="1023" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g> </g>
<!-- user_core --> <!-- user_core -->
<g id="node9" class="node"> <g id="node9" class="node">
<title>user_core</title> <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"/> <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="1451" y="-569.48" font-family="Arial" font-size="10.00" fill="#111827">Selected user core</text> <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="1451" 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="-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> <text text-anchor="middle" x="1126" y="-547.48" font-family="Arial" font-size="10.00" fill="#111827">PicoRV32 at C5</text>
</g> </g>
<!-- user_core&#45;&gt;fabric --> <!-- user_core&#45;&gt;fabric -->
<g id="edge11" class="edge"> <g id="edge11" class="edge">
<title>user_core&#45;&gt;fabric</title> <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"/> <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="1281.23,-472.74 1273.86,-473.59 1280.15,-477.52 1281.23,-472.74"/> <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="1432" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text> <text text-anchor="middle" x="1087" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g> </g>
<!-- dma --> <!-- dma -->
<g id="node10" class="node"> <g id="node10" class="node">
<title>dma</title> <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"/> <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="1987" y="-563.98" font-family="Arial" font-size="10.00" fill="#111827">DMA</text> <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="1987" y="-552.98" font-family="Arial" font-size="10.00" fill="#111827">RIB master and RIBP target</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> </g>
<!-- dma&#45;&gt;fabric --> <!-- dma&#45;&gt;fabric -->
<g id="edge12" class="edge"> <g id="edge12" class="edge">
<title>dma&#45;&gt;fabric</title> <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"/> <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="1293.64,-467.13 1286.34,-468.43 1292.85,-471.97 1293.64,-467.13"/> <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="1635" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text> <text text-anchor="middle" x="1210" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g> </g>
<!-- uart0 --> <!-- uart0 -->
<g id="node19" class="node"> <g id="node19" class="node">
<title>uart0</title> <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"/> <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="2291" y="-241" font-family="Arial" font-size="10.00" fill="#111827">UART0 V2</text> <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="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="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="2291" y="-219" font-family="Arial" font-size="10.00" fill="#111827">framing/errors, IRQ2, DMA&#45;paced</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> </g>
<!-- dma&#45;&gt;uart0 --> <!-- dma&#45;&gt;uart0 -->
<g id="edge34" class="edge"> <g id="edge35" class="edge">
<title>dma&#45;&gt;uart0</title> <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"/> <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="2267.62,-262.2 2270.6,-255.41 2264.04,-258.86 2267.62,-262.2"/> <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="2174.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TX/RX data</text> <text text-anchor="middle" x="1889.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TX/RX data</text>
</g> </g>
<!-- i2c_controllers --> <!-- i2c_controllers -->
<g id="node20" class="node"> <g id="node20" class="node">
<title>i2c_controllers</title> <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"/> <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="1882" y="-241" font-family="Arial" font-size="10.00" fill="#111827">I2C0 / I2C1 V2</text> <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="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="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="1882" y="-219" font-family="Arial" font-size="10.00" fill="#111827">7/10&#45;bit, IRQ7/19, DMA&#45;paced</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> </g>
<!-- dma&#45;&gt;i2c_controllers --> <!-- dma&#45;&gt;i2c_controllers -->
<g id="edge37" class="edge"> <g id="edge38" class="edge">
<title>dma&#45;&gt;i2c_controllers</title> <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"/> <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="1893.52,-261.32 1889.05,-255.41 1888.86,-262.82 1893.52,-261.32"/> <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="1971" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">DATA_CMD / RXDATA</text> <text text-anchor="middle" x="1280" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">DATA_CMD / RXDATA</text>
</g> </g>
<!-- ws2812 --> <!-- ws2812 -->
<g id="node23" class="node"> <g id="node23" class="node">
<title>ws2812</title> <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"/> <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="2093" y="-241" font-family="Arial" font-size="10.00" fill="#111827">WS2812 TX</text> <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="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="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="2093" y="-219" font-family="Arial" font-size="10.00" fill="#111827">16&#45;word FIFO, IRQ17, DMA&#45;fed</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> </g>
<!-- dma&#45;&gt;ws2812 --> <!-- dma&#45;&gt;ws2812 -->
<g id="edge32" class="edge"> <g id="edge33" class="edge">
<title>dma&#45;&gt;ws2812</title> <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"/> <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="2086.05,-262.83 2085.89,-255.41 2081.39,-261.31 2086.05,-262.83"/> <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="2071.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TXDATA writes</text> <text text-anchor="middle" x="1703.5" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">TXDATA writes</text>
</g> </g>
<!-- fault --> <!-- fault -->
<g id="node12" class="node"> <g id="node12" class="node">
<title>fault</title> <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"/> <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="1608" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">Error slave</text> <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="1608" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">access and protocol faults</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> </g>
<!-- fabric&#45;&gt;fault --> <!-- fabric&#45;&gt;fault -->
<g id="edge13" class="edge"> <g id="edge13" class="edge">
<title>fabric&#45;&gt;fault</title> <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"/> <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="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="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="1563.13,-470.05 1568.47,-464.9 1561.08,-465.59 1563.13,-470.05"/> <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="1392" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">invalid / denied</text> <text text-anchor="middle" x="1249" y="-509.08" font-family="Arial" font-size="8.00" fill="#374151">invalid / denied</text>
</g> </g>
<!-- sram --> <!-- sram -->
<g id="node13" class="node"> <g id="node13" class="node">
<title>sram</title> <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"/> <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="1453" y="-449.74" font-family="Arial" font-size="10.00" fill="#111827">On&#45;chip SRAM</text> <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="1453" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">optional RIB2RAM path</text> <text text-anchor="middle" x="1356" y="-438.74" font-family="Arial" font-size="10.00" fill="#111827">optional RIB2RAM path</text>
</g> </g>
<!-- fabric&#45;&gt;sram --> <!-- fabric&#45;&gt;sram -->
<g id="edge14" class="edge"> <g id="edge14" class="edge">
<title>fabric&#45;&gt;sram</title> <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"/> <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="1384.81,-449.19 1391.81,-446.74 1384.81,-444.29 1384.81,-449.19"/> <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="1365.31" y="-452.34" font-family="Arial" font-size="8.00" fill="#374151">RIB</text> <text text-anchor="middle" x="1245.31" y="-452.34" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g> </g>
<!-- ribp_adapter --> <!-- ribp_adapter -->
<g id="node14" class="node"> <g id="node14" class="node">
<title>ribp_adapter</title> <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"/> <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="1422" y="-334.5" font-family="Arial" font-size="10.00" fill="#111827">RIB2RIBP</text> <text text-anchor="middle" x="1500" y="-334.5" font-family="Arial" font-size="10.00" fill="#111827">RIB2RIBP</text>
</g> </g>
<!-- fabric&#45;&gt;ribp_adapter --> <!-- fabric&#45;&gt;ribp_adapter -->
<g id="edge15" class="edge"> <g id="edge15" class="edge">
<title>fabric&#45;&gt;ribp_adapter</title> <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"/> <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="1383.76,-356.31 1389.31,-351.39 1381.9,-351.78 1383.76,-356.31"/> <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="1328" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text> <text text-anchor="middle" x="1227" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g> </g>
<!-- apb_adapter --> <!-- apb_adapter -->
<g id="node15" class="node"> <g id="node15" class="node">
<title>apb_adapter</title> <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"/> <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="1072" y="-340" font-family="Arial" font-size="10.00" fill="#111827">RIB2APB</text> <text text-anchor="middle" x="930" 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> <text text-anchor="middle" x="930" y="-329" font-family="Arial" font-size="10.00" fill="#111827">direct APB bridge</text>
</g> </g>
<!-- fabric&#45;&gt;apb_adapter --> <!-- fabric&#45;&gt;apb_adapter -->
<g id="edge16" class="edge"> <g id="edge16" class="edge">
<title>fabric&#45;&gt;apb_adapter</title> <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"/> <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="1092.05,-358.93 1085.74,-355.02 1088.24,-362.01 1092.05,-358.93"/> <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="1117" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text> <text text-anchor="middle" x="974" y="-380.6" font-family="Arial" font-size="8.00" fill="#374151">RIB</text>
</g> </g>
<!-- sysctrl --> <!-- sysctrl -->
<g id="node16" class="node"> <g id="node16" class="node">
<title>sysctrl</title> <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"/> <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="1657" y="-241" font-family="Arial" font-size="10.00" fill="#111827">SYSCTRL</text> <text text-anchor="middle" x="1394" 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="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="1657" y="-219" font-family="Arial" font-size="10.00" fill="#111827">fault and performance control</text> <text text-anchor="middle" x="1394" y="-219" font-family="Arial" font-size="10.00" fill="#111827">fault and performance control</text>
</g> </g>
<!-- ribp_adapter&#45;&gt;sysctrl --> <!-- ribp_adapter&#45;&gt;sysctrl -->
<g id="edge17" class="edge"> <g id="edge17" class="edge">
<title>ribp_adapter&#45;&gt;sysctrl</title> <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"/> <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="1610.26,-260.4 1615.36,-255.01 1608.01,-256.04 1610.26,-260.4"/> <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="1577.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="1457.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- ribp_adapter&#45;&gt;clint --> <!-- ribp_adapter&#45;&gt;clint -->
<g id="edge18" class="edge"> <g id="edge18" class="edge">
<title>ribp_adapter&#45;&gt;clint</title> <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"/> <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="789,-251.63 781.61,-252.25 787.77,-256.37 789,-251.63"/> <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="960.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="774.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- ribp_targets --> <!-- ribp_targets -->
<g id="node18" class="node"> <g id="node18" class="node">
<title>ribp_targets</title> <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"/> <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="1422" y="-241" font-family="Arial" font-size="10.00" fill="#111827">RIBP target wrapper</text> <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="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="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="1422" y="-219" font-family="Arial" font-size="10.00" fill="#111827">I2S</text> <text text-anchor="middle" x="2128" y="-219" font-family="Arial" font-size="10.00" fill="#111827">I2S</text>
</g> </g>
<!-- ribp_adapter&#45;&gt;ribp_targets --> <!-- ribp_adapter&#45;&gt;ribp_targets -->
<g id="edge19" class="edge"> <g id="edge19" class="edge">
<title>ribp_adapter&#45;&gt;ribp_targets</title> <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"/> <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="1424.45,-262.26 1422,-255.26 1419.55,-262.26 1424.45,-262.26"/> <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="1431.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="1631.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- ribp_adapter&#45;&gt;uart0 --> <!-- ribp_adapter&#45;&gt;uart0 -->
<g id="edge20" class="edge"> <g id="edge20" class="edge">
<title>ribp_adapter&#45;&gt;uart0</title> <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"/> <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="2192.51,-256.17 2198.88,-252.36 2191.53,-251.37 2192.51,-256.17"/> <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="1999.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="1747.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- ribp_adapter&#45;&gt;i2c_controllers --> <!-- ribp_adapter&#45;&gt;i2c_controllers -->
<g id="edge21" class="edge"> <g id="edge21" class="edge">
<title>ribp_adapter&#45;&gt;i2c_controllers</title> <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"/> <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="1779.2,-258.92 1785.5,-255 1778.13,-254.13 1779.2,-258.92"/> <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="1688.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="1308.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- gpio_controller --> <!-- gpio_controller -->
<g id="node21" class="node"> <g id="node21" class="node">
<title>gpio_controller</title> <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"/> <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="1128" y="-241" font-family="Arial" font-size="10.00" fill="#111827">GPIO V2</text> <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="1128" y="-230" font-family="Arial" font-size="10.00" fill="#111827">user + management RIBP windows</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="1128" y="-219" font-family="Arial" font-size="10.00" fill="#111827">atomic I/O, filter, locks, IRQ18</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> </g>
<!-- ribp_adapter&#45;&gt;gpio_controller --> <!-- ribp_adapter&#45;&gt;gpio_controller -->
<g id="edge22" class="edge"> <g id="edge22" class="edge">
<title>ribp_adapter&#45;&gt;gpio_controller</title> <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"/> <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="1197.09,-254.99 1189.68,-255 1195.48,-259.62 1197.09,-254.99"/> <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="1321" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <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="1321" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">user/admin</text> <text text-anchor="middle" x="1570" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">user/admin</text>
</g> </g>
<!-- ribp_adapter&#45;&gt;timers --> <!-- ribp_adapter&#45;&gt;timers -->
<g id="edge23" class="edge"> <g id="edge23" class="edge">
<title>ribp_adapter&#45;&gt;timers</title> <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"/> <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="1020.97,-253.06 1013.63,-254.09 1020.01,-257.86 1020.97,-253.06"/> <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="1221.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="1508.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- ribp_adapter&#45;&gt;ws2812 --> <!-- ribp_adapter&#45;&gt;ws2812 -->
<g id="edge24" class="edge"> <g id="edge24" class="edge">
<title>ribp_adapter&#45;&gt;ws2812</title> <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"/> <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="2007.45,-255.79 2013.72,-251.83 2006.35,-251.02 2007.45,-255.79"/> <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="1838.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text> <text text-anchor="middle" x="1689.5" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">RIBP</text>
</g> </g>
<!-- apb_targets --> <!-- apb_targets -->
<g id="node24" class="node"> <g id="node24" class="node">
<title>apb_targets</title> <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"/> <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="502" y="-241" font-family="Arial" font-size="10.00" fill="#111827">APB target wrapper</text> <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="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="930" y="-230" font-family="Arial" font-size="10.00" fill="#111827">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> <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> </g>
<!-- apb_adapter&#45;&gt;apb_targets --> <!-- apb_adapter&#45;&gt;apb_targets -->
<g id="edge25" class="edge"> <g id="edge26" class="edge">
<title>apb_adapter&#45;&gt;apb_targets</title> <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"/> <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="616.82,-251.66 609.5,-252.83 615.96,-256.48 616.82,-251.66"/> <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="846" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">APB</text> <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> </g>
<!-- irq --> <!-- irq -->
<g id="node26" class="node"> <g id="node27" class="node">
<title>irq</title> <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"/> <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="1399" y="-140" font-family="Arial" font-size="10.00" fill="#111827">Interrupt aggregation</text> <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="1399" y="-129" font-family="Arial" font-size="10.00" fill="#111827">RIBP and APB target IRQs to management core</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> </g>
<!-- clint&#45;&gt;irq --> <!-- clint&#45;&gt;irq -->
<g id="edge30" class="edge"> <g id="edge31" class="edge">
<title>clint&#45;&gt;irq</title> <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"/> <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="1277.31,-154.97 1283.97,-151.71 1276.73,-150.11 1277.31,-154.97"/> <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="1098.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">machine IRQ0 / IRQ1</text> <text text-anchor="middle" x="1079.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">machine IRQ0 / IRQ1</text>
</g> </g>
<!-- ribp_targets&#45;&gt;ext_io --> <!-- ribp_targets&#45;&gt;ext_io -->
<g id="edge40" class="edge"> <g id="edge41" class="edge">
<title>ribp_targets&#45;&gt;ext_io</title> <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"/> <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="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="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="1948.28,-52.44 1946.61,-45.21 1943.41,-51.9 1948.28,-52.44"/> <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="1972" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">device interfaces</text> <text text-anchor="middle" x="2227" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">device interfaces</text>
</g> </g>
<!-- ribp_targets&#45;&gt;gpio_controller --> <!-- ribp_targets&#45;&gt;gpio_controller -->
<g id="edge26" class="edge"> <g id="edge27" class="edge">
<title>ribp_targets&#45;&gt;gpio_controller</title> <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"/> <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="1222.02,-230.05 1215.02,-232.5 1222.02,-234.95 1222.02,-230.05"/> <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="1261.25" y="-238.1" font-family="Arial" font-size="8.00" fill="#374151">alternate functions</text> <text text-anchor="middle" x="1967.25" y="-238.1" font-family="Arial" font-size="8.00" fill="#374151">alternate functions</text>
</g> </g>
<!-- uart0&#45;&gt;ext_io --> <!-- uart0&#45;&gt;ext_io -->
<g id="edge41" class="edge"> <g id="edge42" class="edge">
<title>uart0&#45;&gt;ext_io</title> <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"/> <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="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="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="1991.81,-46.67 1984.55,-45.12 1989.26,-50.85 1991.81,-46.67"/> <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="2186" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">UART pads</text> <text text-anchor="middle" x="2441" y="-135.1" font-family="Arial" font-size="8.00" fill="#374151">UART pads</text>
</g> </g>
<!-- uart0&#45;&gt;irq --> <!-- uart0&#45;&gt;irq -->
<g id="edge35" class="edge"> <g id="edge36" class="edge">
<title>uart0&#45;&gt;irq</title> <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"/> <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="1521.46,-145.75 1514.28,-147.61 1521.05,-150.63 1521.46,-145.75"/> <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="1970.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ2</text> <text text-anchor="middle" x="2222.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ2</text>
</g> </g>
<!-- i2c_controllers&#45;&gt;gpio_controller --> <!-- i2c_controllers&#45;&gt;gpio_controller -->
<g id="edge36" class="edge"> <g id="edge37" class="edge">
<title>i2c_controllers&#45;&gt;gpio_controller</title> <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"/> <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="1222.71,-244.77 1215.42,-246.11 1221.96,-249.61 1222.71,-244.77"/> <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="1504" y="-289.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO3/4 ALT1</text> <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="1504" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text> <text text-anchor="middle" x="1391" y="-280.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO7/8 ALT0</text>
</g> </g>
<!-- i2c_controllers&#45;&gt;irq --> <!-- i2c_controllers&#45;&gt;irq -->
<g id="edge38" class="edge"> <g id="edge39" class="edge">
<title>i2c_controllers&#45;&gt;irq</title> <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"/> <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="1479.23,-154.21 1471.86,-155 1478.12,-158.98 1479.23,-154.21"/> <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="1633.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ7 / IRQ19</text> <text text-anchor="middle" x="1469.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ7 / IRQ19</text>
</g> </g>
<!-- gpio_bridge --> <!-- gpio_bridge -->
<g id="node25" class="node"> <g id="node26" class="node">
<title>gpio_bridge</title> <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"/> <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="1815" y="-140" font-family="Arial" font-size="10.00" fill="#111827">GPIO pad bridge</text> <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="1815" y="-129" font-family="Arial" font-size="10.00" fill="#111827">PDK capability&#45;adapted controls</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> </g>
<!-- gpio_controller&#45;&gt;gpio_bridge --> <!-- gpio_controller&#45;&gt;gpio_bridge -->
<g id="edge27" class="edge"> <g id="edge28" class="edge">
<title>gpio_controller&#45;&gt;gpio_bridge</title> <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"/> <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="1777.31,-160.41 1782.39,-155 1775.05,-156.06 1777.31,-160.41"/> <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="1756" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text> <text text-anchor="middle" x="1986" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g> </g>
<!-- gpio_controller&#45;&gt;irq --> <!-- gpio_controller&#45;&gt;irq -->
<g id="edge28" class="edge"> <g id="edge29" class="edge">
<title>gpio_controller&#45;&gt;irq</title> <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"/> <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="1343.63,-159.7 1349.45,-155.1 1342.03,-155.06 1343.63,-159.7"/> <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="1291" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text> <text text-anchor="middle" x="1760" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ18</text>
</g> </g>
<!-- timers&#45;&gt;irq --> <!-- timers&#45;&gt;irq -->
<g id="edge29" class="edge"> <g id="edge30" class="edge">
<title>timers&#45;&gt;irq</title> <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"/> <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="1303.64,-158.77 1310.05,-155.04 1302.71,-153.95 1303.64,-158.77"/> <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="1206.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ3 / IRQ4</text> <text text-anchor="middle" x="1664.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ3 / IRQ4</text>
</g> </g>
<!-- ws2812&#45;&gt;gpio_bridge --> <!-- ws2812&#45;&gt;gpio_bridge -->
<g id="edge31" class="edge"> <g id="edge32" class="edge">
<title>ws2812&#45;&gt;gpio_bridge</title> <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"/> <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="1825.55,-160.95 1820.95,-155.14 1820.93,-162.55 1825.55,-160.95"/> <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="1854.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 ALT1</text> <text text-anchor="middle" x="2105.5" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">GPIO2 ALT1</text>
</g> </g>
<!-- ws2812&#45;&gt;irq --> <!-- ws2812&#45;&gt;irq -->
<g id="edge33" class="edge"> <g id="edge34" class="edge">
<title>ws2812&#45;&gt;irq</title> <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"/> <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="1517.36,-153.66 1510.07,-155.02 1516.61,-158.5 1517.36,-153.66"/> <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="1703" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text> <text text-anchor="middle" x="1934" y="-180.6" font-family="Arial" font-size="8.00" fill="#374151">IRQ17</text>
</g> </g>
<!-- apb_targets&#45;&gt;gpio_controller --> <!-- apb_targets&#45;&gt;gpio_controller -->
<g id="edge39" class="edge"> <g id="edge40" class="edge">
<title>apb_targets&#45;&gt;gpio_controller</title> <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"/> <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="1070.31,-260.03 1075.77,-255.01 1068.37,-255.53 1070.31,-260.03"/> <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="994" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text> <text text-anchor="middle" x="1342" y="-285.1" font-family="Arial" font-size="8.00" fill="#374151">user_gpio</text>
</g> </g>
<!-- gpio_bridge&#45;&gt;ext_io --> <!-- gpio_bridge&#45;&gt;ext_io -->
<g id="edge42" class="edge"> <g id="edge43" class="edge">
<title>gpio_bridge&#45;&gt;ext_io</title> <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"/> <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="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="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="1915.54,-51.37 1919.7,-45.23 1912.62,-47.43 1915.54,-51.37"/> <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="1909" y="-70.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text> <text text-anchor="middle" x="2164" y="-70.6" font-family="Arial" font-size="8.00" fill="#374151">pad control</text>
</g> </g>
</g> </g>
</svg> </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_DIR := $(VARIANT_ROOT)/generated/user_extensions
USER_EXTENSIONS_STAMP := $(USER_EXTENSIONS_DIR)/.stamp USER_EXTENSIONS_STAMP := $(USER_EXTENSIONS_DIR)/.stamp
USER_EXTENSIONS_FILELIST := $(USER_EXTENSIONS_DIR)/user_extensions.fl 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_SOURCE := $(RTL_PATH)/integration/clock_reset_domains.json
CLOCK_RESET_DOMAINS_SCRIPT := $(ROOT_PATH)/scripts/check_clock_reset_domains.py CLOCK_RESET_DOMAINS_SCRIPT := $(ROOT_PATH)/scripts/check_clock_reset_domains.py
MPW_STAMP := $(CACHE_ROOT)/stamps/mpw-$(LOCK_DIGEST).prepared MPW_STAMP := $(CACHE_ROOT)/stamps/mpw-$(LOCK_DIGEST).prepared
@@ -96,14 +101,23 @@ user-extensions: $(USER_EXTENSIONS_STAMP)
check-user-extensions: check-user-extensions:
$(FLOW_PYTHON) $(USER_EXTENSIONS_SCRIPT) --map $(USER_EXTENSIONS_SOURCE) --check $(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: check-clock-reset-domains:
$(FLOW_PYTHON) $(CLOCK_RESET_DOMAINS_SCRIPT) --map $(CLOCK_RESET_DOMAINS_SOURCE) --root $(ROOT_PATH) $(FLOW_PYTHON) $(CLOCK_RESET_DOMAINS_SCRIPT) --map $(CLOCK_RESET_DOMAINS_SOURCE) --root $(ROOT_PATH)
$(FILELIST_STAMP): $(FILELIST_TEMPLATES) $(RTL_PATH)/script/generate_filelist.py \ $(FILELIST_STAMP): $(FILELIST_TEMPLATES) $(RTL_PATH)/script/generate_filelist.py \
$(RTL_PATH)/script/filelist.py $(MEMORY_MAP_STAMP) $(PIN_MAP_STAMP) $(SOC_TOPOLOGY_STAMP) \ $(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 \ $(FLOW_PYTHON) $(RTL_PATH)/script/generate_filelist.py \
--output-dir $(GENERATED_FL_DIR) \ --output-dir $(GENERATED_FL_DIR) \
--incdir $(ARCHINFO_METADATA_DIR) \
$(foreach define,$(DEF_LIST),--define $(define)) $(foreach define,$(DEF_LIST),--define $(define))
@touch $@ @touch $@
@@ -159,4 +173,4 @@ endif
.PHONY: gen_mpw_code generate_filelist memory-map check-memory-map pin-map check-pin-map \ .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 \ 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/archinfo_reg.sv
/clusterip/archinfo/rtl/apb4_archinfo.sv /clusterip/archinfo/rtl/apb4_archinfo.sv
/clusterip/rng/rtl/apb4_rng.sv /clusterip/rng/rtl/apb4_rng.sv
+2
View File
@@ -2,6 +2,7 @@
// retroSoC is licensed under Mulan PSL v2. // retroSoC is licensed under Mulan PSL v2.
module i2c_formal; module i2c_formal;
// verilog_format: off
(* anyseq, gclk *) logic clk_i; (* anyseq, gclk *) logic clk_i;
wire rst_n_i; wire rst_n_i;
wire f_past_valid; wire f_past_valid;
@@ -29,6 +30,7 @@ module i2c_formal;
wire tx_dma_stall; wire tx_dma_stall;
wire rx_dma_stall; wire rx_dma_stall;
wire irq; wire irq;
// verilog_format: on
i2c_formal_design u_design ( i2c_formal_design u_design (
.clk_i (clk_i), .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/string.c \
$(ROOT_PATH)/crt/src/lib/console.c \ $(ROOT_PATH)/crt/src/lib/console.c \
$(ROOT_PATH)/crt/src/lib/printf.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/core/archinfo.c \
$(ROOT_PATH)/crt/src/service/bench.c \ $(ROOT_PATH)/crt/src/service/bench.c \
$(ROOT_PATH)/crt/src/service/booter.c \ $(ROOT_PATH)/crt/src/service/booter.c \
@@ -126,6 +127,8 @@ endif
INC_PATH := -I$(SW_BUILD_DIR)/include \ INC_PATH := -I$(SW_BUILD_DIR)/include \
-I$(MEMORY_MAP_C_DIR) \ -I$(MEMORY_MAP_C_DIR) \
-I$(USER_EXTENSIONS_DIR)/include \ -I$(USER_EXTENSIONS_DIR)/include \
-I$(ARCHINFO_METADATA_DIR) \
-I$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
-I$(ROOT_PATH)/crt/include \ -I$(ROOT_PATH)/crt/include \
$(addprefix -I,$(APP_INC_DIRS)) $(addprefix -I,$(APP_INC_DIRS))
SRC_PATH := $(CRT_SRCS) $(APP_SRCS) SRC_PATH := $(CRT_SRCS) $(APP_SRCS)
@@ -136,6 +139,8 @@ FIRMWARE_ELF := $(SW_BUILD_DIR)/firmware
ASM_FIRMWARE_NAME ?= retrosoc_asm ASM_FIRMWARE_NAME ?= retrosoc_asm
SW_HEADERS := $(shell find $(ROOT_PATH)/crt/include $(ROOT_PATH)/app -type f \ SW_HEADERS := $(shell find $(ROOT_PATH)/crt/include $(ROOT_PATH)/app -type f \
\( -name '*.h' -o -name '*.hpp' \) 2>/dev/null) \( -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 $(VERSION_HEADER): FORCE_VERSION $(ROOT_PATH)/crt/ver.py $(ROOT_PATH)/crt/ver.tmpl
@mkdir -p $(dir $@) @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.bin $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).bin
cp $(SW_BUILD_DIR)/asm/hello-asm.txt $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME)_all.txt 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 $(ROOT_PATH)/rtl/mini/mk/software.mk
@mkdir -p $(SW_BUILD_DIR) @mkdir -p $(SW_BUILD_DIR)
cd $(SW_BUILD_DIR) && $(CP) -P -o $(LINK_TYPE).lds $(LDS_PATH) 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 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) output_dir.mkdir(parents=True, exist_ok=True)
generated: list[Path] = [] generated: list[Path] = []
@@ -92,7 +94,8 @@ def generate_all(output_dir: Path, defines: list[str]) -> list[Path]:
generated.append(lint_destination) generated.append(lint_destination)
def_file = output_dir / "def.fl" 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) generated.append(def_file)
return generated return generated
@@ -103,6 +106,9 @@ def parse_args() -> argparse.Namespace:
"--output-dir", type=Path, default=DEFAULT_OUTPUT_DIR, help="output directory" "--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("--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() return parser.parse_args()
@@ -111,7 +117,7 @@ def main() -> int:
invalid = [item for item in args.define if not item.startswith("+define+")] invalid = [item for item in args.define if not item.startswith("+define+")]
if invalid: if invalid:
raise SystemExit(f"invalid define token(s): {' '.join(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()}") print(f"generated {len(generated)} files in {args.output_dir.resolve()}")
return 0 return 0
+100 -13
View File
@@ -14,6 +14,7 @@
`include "ps2_define.svh" `include "ps2_define.svh"
`include "user_extensions.svh" `include "user_extensions.svh"
`include "soc_irq_config.svh" `include "soc_irq_config.svh"
`include "archinfo_integration_metadata.svh"
module ip_apb_wrapper ( module ip_apb_wrapper (
// verilog_format: off // verilog_format: off
@@ -32,33 +33,119 @@ module ip_apb_wrapper (
// verilog_format: on // 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. // Generated timed and pure scalar APB interfaces preserve FPGA compatibility.
`include "soc_apb_interfaces.svh" `include "soc_apb_interfaces.svh"
// Low-frequency peripherals retain their dedicated interfaces. // Low-frequency peripherals retain their dedicated interfaces.
rtc_if u_rtc_if ( rtc_if u_rtc_if (
clk_aud_i, .rtc_clk_i (clk_aud_i),
rst_aud_n_i .rtc_rst_n_i(rst_aud_n_i)
); );
wdg_if u_wdg_if (clk_aud_i); wdg_if u_wdg_if (.rtc_clk_i(clk_aud_i));
tmr_if u_tmr_if (clk_aud_i); tmr_if u_tmr_if (.exclk_i(clk_aud_i));
assign u_tmr_if.capch_i = tmr_capch_i; assign u_tmr_if.capch_i = tmr_capch_i;
`include "soc_apb_bridges.svh" `include "soc_apb_bridges.svh"
// verilog_format: off // verilog_format: off
apb4_archinfo u_apb4_archinfo (u_archinfo_apb_if); apb4_archinfo #(
apb4_rng u_apb4_rng (u_rng_apb_if); .VENDOR_ID (32'h0000_0000),
apb4_uart #(.FIFO_DEPTH(32)) u_apb4_uart (u_uart1_apb_if, uart); .SOC_REVISION (32'h0001_0000),
apb4_pwm u_apb4_pwm (u_pwm_apb_if, pwm); .BUILD_ID (`ARCHINFO_INTEGRATION_BUILD_ID),
apb4_ps2 u_apb4_ps2 (u_ps2_apb_if, ps2); .CONFIG_ID (`ARCHINFO_INTEGRATION_CONFIG_ID),
apb4_rtc u_apb4_rtc (u_rtc_apb_if, u_rtc_if); .BUILD_STATUS (`ARCHINFO_INTEGRATION_BUILD_STATUS),
apb4_wdg u_apb4_wdg (u_wdg_apb_if, u_wdg_if); .REFERENCE_CLOCK_HZ(`SOC_EXT_CLK_HZ),
apb4_crc u_apb4_crc (u_crc_apb_if); .SRAM_BYTES (ARCHINFO_SRAM_BYTES),
apb4_tmr u_apb4_tmr (u_tmr_apb_if, u_tmr_if); .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 // 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. // Generated IRQ ownership and core-vector bit assignments are topology checked.
`include "soc_apb_irq_bindings.svh" `include "soc_apb_irq_bindings.svh"
+15 -5
View File
@@ -20,11 +20,21 @@ module user_ip_wrapper (
// verilog_format: on // verilog_format: on
); );
// verilog_format: off apb4_if u_demo_apb4_if (
apb4_if u_demo_apb4_if(clk_i, rst_n_i); .pclk (clk_i),
apb4_if u_user_apb4_if(clk_i, rst_n_i); .presetn(rst_n_i)
apb4_archinfo u_apb4_archinfo_ip(u_demo_apb4_if); );
// verilog_format: on 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.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; 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: def test_generate_all_is_stable_and_expands_paths(tmp_path: Path) -> None:
defines = ["+define+PDK_IHP130"] 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} 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 {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") cluster = (tmp_path / "clusterip.fl").read_text(encoding="utf-8")
hazard3 = (tmp_path / "core_hazard3.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 assert str(ROOT / "rtl/managed/clusterip") in cluster