intent/io-map-pin-mismatch

A net is not on the pin the design intent's IO map assigns it to.

Remedy

Move the net to the declared pin, or amend the IO map. A pin assignment that moved late and a map nobody updated look identical from here, and the firmware was written against the map.

What it checks

Every row of the declared IO map names a net, a device and a pin. This rule looks the pin up in the netlist and reports the rows where the pin carries something other than the net the map assigns to it.

The map is the declaration; the netlist is the design. Neither is derived from the other, which is what makes the comparison worth anything.

For hardware engineers

On any board carrying a large MCU or SoC, the pin assignment is decided long before the schematic exists. Someone works out which peripheral lands on which pin, firmware is written against that decision, and the schematic is drawn from it.

Then a pin assignment moves. Layout wanted a swap to clean up a crossing, or firmware hit a mux conflict and needed the peripheral somewhere else. The map is updated and one net does not get redrawn.

Nothing about the resulting board is electrically wrong, which is why no other rule finds it. Every net is properly driven, every rail is in range, every bus is terminated. The board simply disagrees with a document that, until now, nothing had ever read. It surfaces at bring-up as a peripheral that does not respond, and the time is spent looking at the peripheral rather than at the pin it is on.

The pin may be spelled either way

A map is authored in the vocabulary a datasheet and a firmware header use, the functional pin NAME (PTC11, SDA). A netlist answers in package DESIGNATORS (41, 12). An author should not have to know which one the checker wants, so both are tried.

Both go through the shared identifier comparison, so these agree:

in the map in the design why
PTE7 PTE07 a zero-padded index, compared numerically
TXD[1] TXD1 a bracketed index
adc0_se12 ADC0_SE12 letter case
ADC0_SE12 + an invisible character ADC0_SE12 pasted from a PDF or a spreadsheet

A match that needed any of that says so in the verdict. A row that agreed outright says nothing extra, so a note always means something really was inferred.

The answers that are not pass or fail

A name matching several pins is inconclusive, never a fail. A part type may declare one name on several pins, and a device with four GND pins is ordinary. The rule cannot decide which pin the map meant, and the row may well be correct, so it says exactly that and names the candidates. Naming the package designator instead makes the row decidable.

A pin the device does not declare is a fail. The map names something the part does not have, by either spelling, which is a defect in one document or the other.

A device the design does not carry is not-considered. A missing part is what the module and subsystem forms report; firing here as well would put one defect under two review items.

A device whose part type carried no pin list is not-considered, naming that. It is a gap in the READ rather than anything about the design, and it must not read as a wrong pin.

A declared net the design does not have is not-considered here, because intent/io-map-net-absent reports it. Reading a silence here as “the pin is fine” would be wrong; the row is answered next door.

A net name is compared more strictly than a pin name

A pin name is compared loosely on purpose, because vendor tables are inconsistent with themselves. A NET name is not: it is the design’s own identifier, so DDR_CK_P and DDR_CK_T_P are two nets rather than two spellings of one. Net comparison accepts an exact or a normalized match and refuses a fuzzy one.

Declaring it

io_map:
  - net: ADC_BATT_SENSE
    device: U101
    pin: PTC11
    function: ADC0_S17             # carried, NOT yet evaluated
    to: {device: U7000, pin: PG}   # optional far end

net, device and pin are required. A row missing any of them states nothing checkable.

function is carried and nothing reads it. Deciding whether a selected function is legal on a pin means reading the part’s alternate-function table, a pad-by-mode grid that the datasheet contract has no shape for. That is agni issue 667, and it is a different artifact from the pin FUNCTION table (one row per pin, name and number and I/O type), which is issue 188 and is done.

Every verdict on a row that declares one says outright that it was not evaluated, so filling the column in can never read as having it verified.

Fixing a finding

Either the net moved and the map did not, or the map moved and the schematic did not. Both happen and they look identical from here. The firmware was written against the map, so establish which document is current before editing either.