Publications
This directory owns manually built technical publications. The Mini datasheet is an English product document with a separate MPW compatibility appendix. It does not define or change RTL, register ABIs, build profiles or hardware quality policy. The canonical RTL/configuration inputs remain authoritative.
Mini datasheet
The prototype chip brand is Rill(清溪). Its bilingual label replaces the
visible document ID in the existing cover metadata line; running headers prefix
the retained document title with Rill. The document title/ID remain unchanged
in identity metadata. Header height and the reserved cover logo area are fixed.
Noto Sans CJK SC Bold 2.004 is pinned through the media revision for the brand's
Chinese glyphs; its unmodified font, OFL license, provenance and hashes are stored
with the other media fonts. This cover round uses v05-rill- change markers and
compares against the retained 779-page presentation edition (PDF SHA-256
a69d55cff0e9b8bb4625072ca494f33eec709871d0eb4003403a2ccc0f197c82).
- Entry: datasheets/retroSoC-mini-datasheet.typ.
- Identity, reviewed hardware commit and reference profiles: datasheets/mini.json.
- Layout, diagrams and chapter content:
datasheets/style.typ,datasheets/figures.typanddatasheets/sections/. - Layout standard: datasheets/style.md.
- IP-to-window/IRQ/source coverage: datasheets/ip-catalog.json.
- Build and validation: build_datasheet.py.
The v0.5 DRAFT includes detailed per-IP functional, protocol, register/bitfield and software reference chapters. Each actual IP starts on a new page; UART/SDIO instances share their common register descriptions. CPU ISA/CSR manuals remain outside this publication's scope.
The current 2026-09-22 refresh retains v0.5 DRAFT and binds it to reviewed dev commit
c3de7c602a7ca0f0f9ade9d3ffb59339bc34fb8b. NPU retains its independent chapter
after APU. The reviewed contract contains 42 IP chapters and 109 frozen entries;
the nine-category Overview contains 45 labels. Existing register anchors remain
stable. The main reference stays IHP130 PRODUCT / 32 KiB SRAM, with the dedicated
configs/ci/ihp130-apu.mk configuration identified separately.
The content review distinguishes already covered
material, refreshed implementation facts, default-disabled features, and missing
measurement evidence. APU's checked-in WAV/FLAC image is statically assembled by
dev_reference.py: image availability is separate from corpus qualification.
The 109-entry chapter review records final page
numbers, implementation status, document completeness, sources and recommendations
for the delivered PDF snapshot.
MP3 remains a reserved trap entry. Default PRODUCT keeps KWS gated off; the P9
acceptance profile advertises capability 0x3FD and digest 0x63E96066.
APU KWS storage includes 15 coefficient and 17 proof-memo macro wrappers in the
qualified configuration; physical replacement remains evidence-bound. NPU has
eight executable operator classes, 64 KiB private SRAM and
an integrated eight-beat AXI64 DMA limit; its reusable DMA default is not the
deployed limit. Native Linux NPU/ASoC support is not inferred from HP smoke code.
CI workflow outcomes are a separately scoped snapshot, including failures and
skipped downstream tests; they do not populate per-IP hardware pass records.
The preceding emphasis round compared against the retained 779-page PDF with
SHA-256 25257e5243e945401c8a214d4043819cf802a7fa2d22b04d83b513ce9075647b.
It used v05-emphasis- markers for the cover contact, partial Functional mark
and selected body emphasis. Earlier v05-refresh- boot/mailbox, APU, environment
and navigation corrections remain historical. The version and document date are retained. This presentation is built directly
from the reviewed current dev checkout; its complete source SHA and timestamped
CI observations identify the build. Runtime-library/bootstrap increments were
reviewed separately and do not change the hardware interfaces.
The cover stores the author name and email separately; PDF author metadata keeps
the name. Artifact marks explicitly support empty, left-half and full states.
Body emphasis uses selected Inter Bold phrases, including explicit **...**
spans in generated IP text, while code and diagram labels retain their own rules.
See the layout/content standard for exact geometry,
emphasis scope and validation requirements. Rebuild all page-dependent records
after typography changes and retain the previous PDF and actual test verdicts.
The full drawing layer uses bytefield 0.0.8, rivet 0.3.1, blockcell 0.1.0 and circuiteria 0.2.1. All 42 IP chapters and four system hardware figures use source-bound circuits. Binary layouts cover descriptors, boot/microcode bundles, serial framing and media/crypto packing. APU's seven current instruction classes and 62 operations are grouped by format, operand constraints and tool target. Storage figures cover architectural FIFOs, line buffers, packet/table/control memory, descriptor examples, address windows, linker/load placement and budgets. Overview classification, access matrices, software flows, register bit layouts and WaveDrom keep their existing rendering.
Section 2.1.1 contains a compact functional overview drawn independently with locked CeTZ 0.5.2. It uses regular 9 pt text for ordinary labels, regular 8 pt text inside compact CDC/Gateway cells, and bold 9 pt bus/domain labels. Individually named PRODUCT IP/instance rows, external signal groups and explicit Gateway A/B fan-in. AXI32/AXI64 labels appear only in bus-spine and bridge symbols. Clock-domain backgrounds are separate from IP categories. All 46 Circuiteria figures retain their existing renderer. The 142 specialized figures include NPU's circuit, three binary layouts and two storage figures.
soc_diagram_reference.py checks datasheets/soc-architecture.json
against PRODUCT IP coverage, selected RTL clock/interface bindings, gateway
clients, stream routes, pin groups and alternate-function mappings. Its CeTZ
renderer is datasheets/soc-architecture.typ. The diagram is recorded under
Introduction; the NPU node is tied to its chapter and HP-domain background.
soc_diagram_geometry.py supplies the exact paths and arrowheads to CeTZ and
checks orthogonality, visible shafts, symbol avoidance and arrow clearance.
The arrowheads are 1 x 0.8 mm with at least 1 mm visible shaft and 0.5 mm
clearance outside stroke envelopes. A 64 mm / 102 mm reference grid, separated
by 6 mm, places the three-by-three domain key alongside the explanations.
soc_diagram_pdf.py checks final label regions, actual size/weight and routes
against exported character boxes. FontTools compares embedded Inter outlines
with the locked 400/700 instances because variable subsets retain Regular names.
diagram_reference.py coordinates the circuit, binary, instruction and storage
adapters. The catalogs under datasheets/diagram-*.json record sources and
primary/shared chapter placement; diagram-packages.typ owns their appearance.
diagram_coverage.py records covered/shared/not-applicable categories for all
109 frozen entries and rejects declared drawings absent from renderer output.
Instance port directions, selected signal widths, descriptor arrays, FIFO
parameters and linker regions are checked against their actual definitions.
Rendering a connected interface or accepted instruction encoding does not remove
current admission/capability/delivery restrictions.
package_reference.py identifies dependencies by name/version, validates each
cache and walks its runtime imports. CeTZ 0.3.4 and oxifmt 0.2.1 are retained for
these packages alongside CeTZ 0.5.2 and oxifmt 1.0.0; tidy 0.3.0 is a runtime
input of circuiteria. Waveforms retain wavy 0.1.3 and jogs 0.2.4.
Setup uses checksum-locked archives, and build/check require the
complete local cache. The manifest records version-qualified package digests
and their runtime import graph. Third-party manual sources are not built.
Software execution and structure baseline
The draft details generic LP startup/linker initialization, conditional exception/IRQ support, OpenSBI/device-tree/kernel/rootfs handoff, and the ordered bringup/CI smoke diagnostics. Application result tables retain stage identity when numeric codes repeat and distinguish a C return from a TEST_STATUS write. Source-level controller self-tests and known-answer checks are described by their actual coverage; they are not new hardware pass reports.
datasheets/system-reference.json.software holds the reviewed semantic records
and source bindings. software_reference.py derives startup choices, software
IRQ bounds, platform properties, mailbox publication order and terminal branches.
The manifest includes their runtime, application, configuration and tool sources.
The structure contract freezes the final
outlined level-one/two headings and all IP entries, including deeper IP titles,
their levels, order and stable anchors. Build/check validate the resolved heading
record; document-structure.json is hashed in the manifest. Deeper explanatory
subsections, content, figures and pagination can change without altering the
contract. Normal builds never regenerate it. A later explicit structure-change
task must review the revised contract alongside the document. This publication
baseline does not change DRAFT status or the repository's RTL maturity policy.
The runtime reference also separates polling budgets from time units and API
returns from hardware completion. Ten selected helpers retain their reviewed
zero-budget, partial-transfer and recovery semantics, with source-body bindings.
The HP boot chapter contains byte-level bundle tables, generator-versus-loader
rules and a deterministic synthetic serialization example produced by the
existing packager. The synthetic files are temporary and are not bootable images.
api_bundle_reference.py supplies these records through the existing software
data layer; tests/test_publication_api_bundle.py compares the format and tests
original C function bodies against memory-backed register substitutes in Linux.
Current capabilities and historical evidence
dev_reference.py reads the configured APU identities and deployed NPU geometry,
capability, descriptor and burst limits. It rejects live shell-only NPU or blanket
APU KWS-disabled claims. Declaration/source checks alone do not establish semantic
completeness, so the content and chapter reviews also record what was retained,
updated or awaits evidence, with a concrete recommendation.
CI snapshots keep status separate from nullable conclusion. Queued/in-progress
runs have no verdict. Retain the complete source SHA, UTC check time, run URL and
job/step scope. Refresh the snapshot for the document commit before final delivery;
do not reuse a previous commit's formatting failure or passing outcome. Distinguish
a failed prerequisite from skipped runtime stages and completed scoped tests.
Historical GA2D/NPU records remain dated narrative references unless their raw
artifacts, source, profile and stage can be verified. APU smoke subsets and tests
that return early without tools/data are not full-corpus or sustained-audio passes.
Previous local test counts remain historical, not this refresh's validation result.
Publication tests/builds do not promote RTL maturity or physical qualification.
Source review follows the selected runtime stage through the complete terminal
sequence. The HP_LINUX_READY marker is also used by freestanding acceptance
payloads; it alone does not prove Linux readiness or completion of the later GA2D
and cache-clean handoff. Keep mailbox offsets, event purposes, polling units and
failure/reset ownership consistent in summaries, tables, diagrams and detailed
prose. Source-binding checks complement this semantic review rather than replace it.
System-use reference
The same reviewed snapshot also includes configuration/feature availability, three typical system compositions, non-coherent buffer/DMA handoff, operating states/reset effects, resource ownership, access-control boundaries, debug/fault recovery, external-interface constraints, boot/recovery and software support. Electrical, thermal, performance and power sections describe required conditions and evidence without manufacturing values for uncharacterized hardware. Known limitations and revision compatibility are collected before Document Control.
datasheets/system-reference.json owns the publication's 42-IP support inventory,
limitation records and source/test/report references. system_reference.py
checks coverage, unique identifiers, paths and evidence context; the builder
emits data.json.system_reference and hashes these dependencies. Boot-image
addresses and bounds are extracted from the existing loader header. No hardware
or software ABI is generated. The source of truth remains the reviewed RTL,
configuration, HAL, boot loader and Linux platform files.
Implementation, test availability and reviewed successful runs are separate states. A Linux device-tree node or bare-metal HAL is not native driver support. The supplied initial console uses SBI. The loader's DMA failure path falls back to software copy/CRC. Its ready/result/cache waits use bounded polling iterations; the initial ready message does not complete the later acceptance and ownership return. CRC is not authentication. Power isolation, qualified entropy, physical ratings and production APU codec support are not inferred from controller capabilities.
The cross-IP reference additionally covers register access conventions,
transaction/credit/arbitration rules, DMA request and interrupt routing,
resource coexistence, clock/divider examples and external-memory compatibility.
Two usage appendices provide software/buffer budgets and terminology/document
navigation. programming_reference.py collects the corresponding
system-reference.json.programming records, verifies RTL/SDK selector parity
and connection evidence, extracts interrupt/credit data, and calculates bounded
timing and buffer examples. The pure timing calculations are cross-checked
against the existing C helpers by tests/test_publication_programming.py in the
Linux host environment. No MMIO or new firmware/RTL simulation is involved in
those calculation checks.
The current native JPEG path is connected to master slot 6 with one normal read and one normal write credit at class 8. This bounded transport evidence does not promote standalone codec tests into an end-to-end SoC DMA result. Existing IP register/codec details remain available while system-level qualification remains separate.
The implementation-detail layer adds the LP/HP configuration comparison, reset
initial-state/dependency summary, interface selection/subset matrices, multimedia
format interoperability and an image-maintenance chapter. Its publication-only
records live under system-reference.json.product_details; the
implementation_reference.py collector validates source/reset bindings and
extracts explicit LP/HP parameters, PMA envelopes and build flags. The LP firmware
ISA/CSR choices are kept separate from hardware parameters. Unreviewed upstream
defaults and cache capacity are not inferred from the HP generator's sets/ways.
The Multimedia overview is outside the actual I2S IP page markers; its label ends the preceding IP header scope. All actual IP sections retain independent page starts. Interface/format agreement does not remove the existing JPEG or APU integration gates. The source-level matrices contain no compliance claims.
Image-maintenance examples only describe the existing SRAM-loader flow.
passed=true with executed=false is script preparation, not device programming.
tests/test_publication_implementation.py verifies that distinction with mocked
tool invocation, along with CPU/reset/capability-source checks. No live debugger,
erase/program action, new core generation or hardware measurement is performed.
Board constraint inputs are listed separately from the still-missing approved
schematic, physical package and matching characterization evidence.
The retrieval appendices add a complete instance-qualified register address index
and scoped fault/status-code lookup. retrieval_reference.py reuses the register
records and validates publication mappings in system-reference.json.retrieval.
It checks array geometry and all expanded addresses while retaining compact
formulas in the PDF, separates GPIO windows/MPW selections, and preserves shared
definition links. Diagnostic enums, masks, field positions, HP boot application
codes, SDK returns and simulator verdicts keep distinct scopes. Their declarations
and producing branches are source-checked; they do not imply feature availability.
Release Verification Summary records test entrypoints, applicable profiles/stages, matching-report availability and the repository RTL readiness declaration. It does not promote readiness or replace missing reports with publication test results. Existing physical/electrical chapters specify the identity and evidence fields needed before package, PCB, numerical and ordering data can be released.
Spacing and document flow
The layout standard records the implemented page,
typography, spacing, navigation and diagram rules, including the compact cover
and current table-caption behavior. Shared spacing lives in the rhythm
configuration in datasheets/style.typ; update the standard together with
intentional layout changes and verify actual spacing in the rendered PDF.
The publication converter preserves real nested lists and explicit step numbers;
its regressions are covered by tests/test_publication_prose.py.
Detailed IP reference sources
datasheets/register-profiles.jsonselects the reviewed RTL, managed IP, register groups and instance geometry. Repeated banks retain their real base/stride/count instead of duplicating every instance.datasheets/register-annotations.jsonsupplies reviewed field semantics, access qualifications, conditional reset values and explicit special cases.register_reference.pyextracts publication data without generating RTL or C definitions. It follows explicit readback packing and selected named producer bindings, applies the annotations, and checks offsets, register/field reset agreement, value ranges and complete non-overlapping 32-bit layouts. Register entries link to RTL and C sources; explicit semantic overrides retain a source pointer and review note.datasheets/ip-content.json,features.jsonandips/own the functional chapters. The original grouping and meaningful child sections are retained.datasheets/overview-groups.jsoncontains only integrated IP names and functional categories. Its membership is checked against the topology.datasheets/waveforms.jsoncontains the WaveDrom examples and per-lane RTL declaration bindings, polarity/meaning, clock scope and behavior review.waveform_reference.pyvalidates declaration coverage and selections and generateswaveform-audit.json; it is a static review aid, not a simulator.waveforms.typruns the pinned wavy renderer through jogs and normalizes SVG typography before embedding the vector result. The package itself is not patched. Representative wait, timeout, backpressure and recovery cases accompany the external-interface examples. Circuit figures separately label selected control, data and clock-domain relationships and retain instance-specific restrictions.
Fixed, conditional and live reset values are distinguished. A dynamic status word is not silently assigned a zero reset constant. The expanded P5 source snapshot reports APU APB V1.1 and a 32 KiB control store while retaining APUMC V1 image compatibility.
The title remains retroSoC Mini Gen2/Gen2+. PRODUCT is the main configuration;
MPW retains its own appendix. No difference between Gen2 and Gen2+ is inferred.
The reference is configs/ci/ihp130.mk, with 32 KiB SRAM. The HP boot example
uses configs/ci/ihp130-hp.mk; legacy selection uses configs/cluster/mini-mpw.mk.
Manual workflow
Use Python 3.10 or newer, Git and Typst 0.15.1. PDF checks additionally use
pypdf, pdfplumber and fonttools, available in the Codex bundled document runtime. The
build uses Python's standard library and the installed Typst CLI; Python 3.10
also uses the tomli backport already pinned in requirements/build.txt.
From the repository root:
python publications/build_datasheet.py setup
python publications/build_datasheet.py build
python publications/build_datasheet.py check
Validate the displayed SDK call examples with an installed C compiler:
python publications/check_examples.py --cc gcc
This generates only build-local reference-profile headers and runs freestanding syntax checks. It does not execute the examples or assert hardware validation.
Pass --typst PATH to setup/build, or set TYPST, if the CLI is not on PATH.
setup --update updates clean managed checkouts to their reviewed lock entries
and restores modified package caches. It refuses to overwrite dirty repositories.
Setup obtains the locked media, Common/peripheral and Hazard3 sources used by
the canonical clock/reset checker. It does not install EDA tools or PDKs.
Normal build/check does not fetch updates. Once setup is complete, building is offline. The compiler is invoked with system fonts disabled, only the media font directory and the verified package cache. No root Makefile target or automatic publication workflow is added.
If the requested baseline is current dev, review the complete increment from
the previous publication SHA, update the source identity and CI observation,
then build directly in that checkout while preserving unrelated local changes.
Do not advance the advertised revision merely to silence a snapshot error.
Use an isolated checkout only when retaining an older reviewed snapshot is
actually required by the task. Its managed inputs must remain inside that
checkout, and its path/input hashes belong in the build manifest. Do not bypass
the source check in either workflow; remove temporary checkouts when requested.
Output goes to build/datasheet-mini-<YYYY-MM-DD-HH-MM>-<input-hash>/:
retrosoc-mini-gen2-gen2plus-datasheet.pdf: final document;data.json: profile-resolved engineering tables;manifest.json: source hashes, reviewed commit, configuration, media commit, font hashes, package hashes, compiler version and PDF digest;typst.logandcheck-report.json: compiler and PDF checks.ip-pages.json: queried start/end pages used to enforce per-IP page breaks.layout-regions.json: renderer-marked continuation-text regions, hashed in the manifest to limit the 8.5 pt continuation-notice exception.page-roles.json: the renderer-declared unique closing page, hashed in the manifest. Only this final page omits running headers, footers and printed page numbers; it still contributes to the document's total page count.waveform-audit.json: source files/scopes, declaration lines, resolved lane widths and behavior-review qualifications for every waveform.change-markers.json: paired layout positions for the current edit's substantive content, explicit cross-references and navigation changes; hashed in the manifest.document-structure.json: resolved headings checked against the frozen chapter/IP contract and protected by a manifest digest.diagram-inventory.json: every specialized diagram's package, sources, actual page and visual bounds; missing or duplicate renderer uses fail the build.diagram-coverage.json: per-entry coverage of the 109 frozen structure records, including shared diagrams, source pointers and explicit not-applicable reasons.changed-pages.json: final page-range report, generated after PDF checking with the command below; binds the previous delivered PDF and final PDF digests. Global presentation changes, such as the repository footer on every page, are separate from content and navigation ranges; pagination alone is not a rewrite.
For a content-edit handoff, retain the previous PDF and run:
python publications/report_changes.py --baseline build/<previous>/<filename>.pdf --pdf build/<final>/<filename>.pdf
The report checks printed footers and PDF/marker integrity. The closing page is
identified by its viewer page with null printed-page values and unprinted
numbering; every ordinary page retains the full footer requirement. Review its ranges
against the rendered content, then include them in the final change summary.
Subsequent pages whose only differences are pagination or automatic numbering
are described separately from substantive edits. Maintain the paired markers for
the current editing round rather than carrying forward stale change claims.
The document date fixes the PDF creation timestamp. Identical inputs produce
identical PDF bytes; the build-directory timestamp is not printed in the PDF.
--output-dir build/<directory> selects a build-local destination for iteration.
check --pdf build/<directory>/<filename>.pdf checks a specific manifest-backed
PDF; otherwise it checks the last build. check --source-only checks inputs and
coverage without requiring the PDF inspection libraries, after setup.
Source and asset ownership
The ignored publications/media/ checkout is the independent
retroSoC/media repository. Fonts, licenses and
static image assets belong there. Current engineering diagrams are editable
Typst/CeTZ source here; they are emitted as vector drawing operators in the PDF.
The three original SVGs are archived byte-for-byte in media and are not used as
current architecture diagrams. Do not reintroduce copies beside the Typst files.
The shared dependency lock pins media,
all eleven runtime package name/version pairs documented above, and the required
local Typst version.
Media's .gitattributes prevents platform line-ending conversion of hashed
assets. Every file listed in media's assets.json is checked before building.
Typst package extraction uses the shared safe archive helper and a file-hash
manifest. Packages are confined to .cache/retrosoc/publications/.
To change assets, edit and review the media repository, regenerate its hash
inventory, commit/push there, then update only publication_media.revision in
the main lock. A normal build never commits, pushes, or changes asset revisions.
Updating technical content
Follow CONTRIBUTING.md and the
Git workflow when preparing publication contributions.
Ordinary PRs target dev and default to merge commits; preserve unrelated history
and use the repository PR template. These are maintenance instructions, not a
product chapter.
- Review the current dev RTL and committed configurations; set the complete
reviewed SHA in
mini.jsonand record the UTC source/CI observation time. Recheck dev before handoff and review any subsequent delta before advancing the snapshot. The builder rejects changed technical sources relative to this snapshot, including uncommitted tracked changes. - Assess every frozen chapter: retain adequate content, correct stale facts and
record specific source/specification or evidence gaps. Reconcile Features,
summaries, tables, detailed prose, diagrams and examples for the same fact.
Update explanatory prose and
ip-catalog.jsononly as needed. Every allocated region, including reserved ranges, and every LP IRQ must have exactly one owner in the publication catalog. Keep still-integrated IPs and their child headings. - Address, LP IRQ, GPIO, pad and access-policy data come from existing canonical generators. SRAM uses the selected profile size, not the JSON maximum.
- Review RTL when an architecture document disagrees. Current important cases: JPEG occupies AXI64 slot 6; APU advertises WAV/FLAC job/transport infrastructure while MP3 remains unsupported and KWS requires the P7 configuration; full production qualification is not established. Managed-IP links use their locked upstream commits, not nonexistent main-repository blob paths.
- Record official commercial reference identity, version, release/check dates
and the organization adopted in the content review. Keep release-specific
source/baseline/marker decisions there and long-lived maintenance rules in
datasheets/style.md. Do not borrow device specifications or qualification. - Compile, check, render all pages and inspect 100% scale and grayscale. Verify the existing document-map links and current-round change ranges against the previous delivered PDF. Report current checks with their actual scope and outcomes; do not reuse prior test totals as a current pass.
Deliberately unfilled specifications
| Topic | Missing evidence |
|---|---|
| Package and pin numbering | Approved outline, physical pin/pad mapping, pin 1 and thermal pad |
| Electrical and clock ratings | PDK/corners, supply and threshold limits, PLL jitter, load conditions |
| Power, frequency and area | Exact workload/configuration and reproducible measured/signoff reports |
| PCB and external interfaces | Approved schematic, banks, external devices and board timing |
| Assembly and ordering | Supplier reflow/MSL data, part numbers, grades and availability |
| Linux and APU | Native driver/boot/performance qualification beyond the source-level support matrix, and remaining codec/KWS delivery |
| Silicon and roadmap | Identified lot/revision, measurement setup and reviewed release milestones |
TBD never means zero. The legacy 196 MHz, QFN128 dimensions, PicoRV32/TIM2/ ONEWIRE/GA feature claims and Lorem ipsum are not carried forward as product specifications. CRC remains under the preserved integrity/security grouping, with an explicit statement that CRC is not encryption.
Validation boundary
python scripts/dependency_lock.py --lock dependencies/dependencies.lock.json
ruff check .
python -m pytest -q
python publications/build_datasheet.py check
git diff --check
The focused exporter tests are tests/test_publications.py and
tests/test_publication_registers.py; tests/test_publication_system.py covers
support/evidence metadata and boot-layout extraction. Existing memory,
topology and pin-map tests cover the reused canonical validators. PDF checks
verify snapshot freshness, metadata, embedded fonts, bookmarks, navigable links,
minimum 9 pt text (8.5 pt inside marked continuation notices and 8 pt only in
the approved SoC CDC/Gateway cells), page-bound
text, per-IP starts and presence of every generated pad/window.
Quarter-turn labels use their rendered font-height axis: PDFMiner reports glyph
advance as size for rotated text, so the checker measures the rotated bounding
width instead. The minimum remains 9 pt outside the explicitly marked exceptions.
They complement manual inspection of diagram meaning, continued headers,
footnotes, page balance and grayscale readability.
tests/test_publication_diagrams.py and tests/test_publication_full_diagrams.py
cover field/source drift, all instruction families, C descriptor layouts, actual
storage geometry, named instance ports, chapter coverage and renderer completeness.
Ordinary-page footers display the complete clickable repository URL; the unique
unnumbered closing page has its own body link and no running furniture.
tests/test_publication_closing.py checks that this exception cannot hide a
missing ordinary footer, duplicate/non-final page role or modified role record.
Contents bolds only
level-one chapter numbers/titles, leaving leaders/page numbers and flat lists regular.
No RTL/HAL change is made by this publication flow. Simulation, synthesis, CDC/RDC and physical/silicon signoff remain hardware validation tasks and are not implied by a successful PDF build.
Layout references: ESP32-P4 datasheet, STM32H743 datasheet, and CeTZ documentation.