mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-05 06:32:37 +00:00
- Updated filelist to include new XPI source files. - Modified IRQ compatibility mapping for XPI in the SOC topology generator. - Adjusted JSON topology configuration to reflect new IRQ signal naming. - Changed software.mk to reference the new XPI HAL source file. - Enhanced APB4 peripheral module to include XPI IRQ signal. - Updated RTL style audit to include new XPI files. - Documented new XPI programming script in README. - Added a new script for programming XPI flash through OpenOCD. - Enhanced XPI IO testbench to validate new LUT engine and isolation behavior. - Created unit tests for the new XPI programming tool and its functionalities.
74 lines
2.2 KiB
Python
74 lines
2.2 KiB
Python
from pathlib import Path
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
|
|
from scripts.program_xpi_flash import (
|
|
FlashChunk,
|
|
build_gdb_commands,
|
|
parse_symbol_address,
|
|
run,
|
|
split_image,
|
|
)
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
def test_split_image_preserves_sector_boundaries() -> None:
|
|
chunks = split_image(bytes(range(256)) * 20, 0x0F80)
|
|
|
|
assert [(chunk.address, len(chunk.data)) for chunk in chunks] == [
|
|
(0x0F80, 128),
|
|
(0x1000, 4096),
|
|
(0x2000, 896),
|
|
]
|
|
assert b"".join(chunk.data for chunk in chunks) == bytes(range(256)) * 20
|
|
|
|
|
|
@pytest.mark.parametrize("address,data", [(0, b""), (-1, b"x"), (0x0100_0000, b"x")])
|
|
def test_split_image_rejects_invalid_ranges(address: int, data: bytes) -> None:
|
|
with pytest.raises(ValueError):
|
|
split_image(data, address)
|
|
|
|
|
|
def test_parse_staging_symbol() -> None:
|
|
output = "30000100 T main\n30002400 B rs_xpi_flash_staging\n"
|
|
|
|
assert parse_symbol_address(output, "rs_xpi_flash_staging") == 0x30002400
|
|
|
|
|
|
def test_gdb_script_loads_sram_buffer_and_checks_each_sector(tmp_path: Path) -> None:
|
|
chunk_path = tmp_path / "chunk.bin"
|
|
chunk_path.write_bytes(b"abc")
|
|
commands = build_gdb_commands(
|
|
tmp_path / "loader.elf",
|
|
"localhost:3333",
|
|
0x30002000,
|
|
[(FlashChunk(0x1234, b"abc"), chunk_path)],
|
|
)
|
|
|
|
assert "target extended-remote localhost:3333" in commands
|
|
assert f"restore {chunk_path.resolve()} binary 0x30002000" in commands
|
|
assert "rs_xpi_flash_update(0x00001234, 3)" in commands
|
|
assert "XPI_FLASH_PROGRAM_PASS" in commands
|
|
|
|
|
|
def test_dry_run_requires_persistent_script_path(tmp_path: Path) -> None:
|
|
args = SimpleNamespace(
|
|
execute=False,
|
|
gdb_script=None,
|
|
loader=tmp_path / "loader.elf",
|
|
image=tmp_path / "image.bin",
|
|
)
|
|
|
|
with pytest.raises(ValueError, match="--gdb-script"):
|
|
run(args)
|
|
|
|
|
|
def test_jtag_loader_keeps_gdb_entry_points() -> None:
|
|
linker_script = (ROOT / "crt/linker/jtag_sram.lds").read_text(encoding="utf-8")
|
|
|
|
assert "KEEP(*(.text.rs_xpi_flash_probe))" in linker_script
|
|
assert "KEEP(*(.text.rs_xpi_flash_update))" in linker_script
|
|
assert "KEEP(*(.bss.rs_xpi_flash_staging))" in linker_script
|