The chip atlas: an address for every part

Generated by tools/export-atlas-doc.py from web/{groups,graph,schematic,timing}.json. Nothing below is typed by hand. Regenerate after any change to the die data or to a derivation, and the document follows.

Every node, transistor and wire on this die gets exactly one address, and a prefix of an address is a valid way to name the set beneath it. The point is an IP address rather than a hostname: the front routes, the back identifies.

8365 addresses: 1547 nodes, 3510 transistors, 3308 wires. All unique, all parseable, checked by the generator before this file is written.

The rubric

<container> : <class> : <slot>

Parse from the right. The slot follows the last colon, the class the one before it, and the container is everything left over. A fixed field count does not work: container keys legitimately contain colons (alat:ADL/ABL), and a bundle names two of them (regs:a~sbus:sb).

Why the separator is a colon

Measured, not chosen. Across the die's 707 names the punctuation in use is # ( ) + - . / _; container keys add :. A colon appears in zero die names, and kind:id is already how this project spells a container everywhere else. . and / were both out: . is in 33 names and 14 keys, / in 47 and 5.

The three fields

fieldwhat it issource
containerwhich derived group the part belongs tothe chip map's partition: 132 groups over 23 kinds, every node exactly once
classthe shape of the pulldown network, which in NMOS is the boolean functionschematic.json's recognised gates
slotthe die's own number for the partsegdefs.js / transdefs.js, by way of the read-only submodule

The slot is the die's number, and that is the load-bearing decision

Every other field is a derivation, and derivations here move: the chip map has already changed which kind owns a contested node, and the interrupt walk has already changed its ownership rule. An address whose last field were derived would break on every such improvement.

The generator proves the property rather than asserting it. Reversing the kind ownership order re-owns 88 of 1547 nodes and moves 0 slots.

So a prefix is a claim that can be revised, and the slot is not. Strip an address to its last field and the part is still findable.

The class vocabulary is closed, and it is 34 tokens

NMOS has no AND gate and no OR gate. A pullup holds the output high and a pulldown network to ground beats it, so every static gate is an inverted sum of products: legs in parallel are the ORs, transistors in series are the ANDs. The leg profile is therefore a complete description of what the gate computes, not a label for it. aoi2.1 is NOT((A AND B) OR C).

classcountreading
inv534inverter
bus386no gate drives it: a bus bit or a pass-only node
nor21652-input NOR
dyn173precharged, 1 legs, no pullup
nor3533-input NOR
aoi2.146AND-OR-invert, legs 2 and 1 deep
nand2392-deep NAND
dyn336precharged, 3 legs, no pullup
nor5335-input NOR
nor8308-input NOR
nor4264-input NOR
nor7257-input NOR
aoi2.225AND-OR-invert, legs 2 and 2 deep
nor6206-input NOR
dyn49precharged, 4 legs, no pullup
dyn77precharged, 7 legs, no pullup
dyn56precharged, 5 legs, no pullup
dyn94precharged, 9 legs, no pullup
dyn23precharged, 2 legs, no pullup
dyn83precharged, 8 legs, no pullup
aoi2.2.23AND-OR-invert, legs 2 and 2 and 2 deep
aoi2.1.1.1.1.12AND-OR-invert, legs 2 and 1 and 1 and 1 and 1 and 1 deep
aoi2.2.2.12AND-OR-invert, legs 2 and 2 and 2 and 1 deep
aoi2.2.2.2.12AND-OR-invert, legs 2 and 2 and 2 and 2 and 1 deep
aoi2.2.12AND-OR-invert, legs 2 and 2 and 1 deep
aoi2.2.2.22AND-OR-invert, legs 2 and 2 and 2 and 2 deep
aoi2.1.12AND-OR-invert, legs 2 and 1 and 1 deep
aoi2.2.1.1.1.1.12AND-OR-invert, legs 2 and 2 and 1 and 1 and 1 and 1 and 1 deep
nor929-input NOR
aoi2.1.1.1.11AND-OR-invert, legs 2 and 1 and 1 and 1 and 1 deep
aoi2.1.1.11AND-OR-invert, legs 2 and 1 and 1 and 1 deep
dyn61precharged, 6 legs, no pullup
aoi2.1.1.1.1.1.11AND-OR-invert, legs 2 and 1 and 1 and 1 and 1 and 1 and 1 deep
inert1no driver and no switch: provably unobservable

The tail is long, and that is the die being irregular rather than the rule being loose: 17 of the 34 classes hold fewer than five gates each, 11 of those being AOI shapes that the ALU and the flag logic build once. The rest are dyn2, dyn6, dyn8, dyn9, inert, nor9.

Facts ride as tags, never as fields

An address needs exactly one discriminator and it must be immutable. Anything else true about a part is a tag: queryable, unordered, and free to change without moving anything.

sbus:sb:bus:#1188                  name=sb3  bit=3@sb  depth=6
regs:x.SBX:dyn3:#1186              name=dpc3_SBX  opens=8  precharged  phase=phi1  depth=5  also=sbus:off  also=dpc:phi1
regs:a:bus:#737                    name=a0  bit=0@a  depth=7
clock:gen:dyn5:#943                name=cclk  opens=243  precharged  depth=4

bit= uses the tracer's measured bus-stem rule (letters only, no not complement, bit 0 named, at least seven of bits 0..7), which lands on 24 stems. depth= is hops from the nearest pin. phase= is measured by running the chip. also= names a container that claims this node in the overlapping layer but lost it in the partition.

Where the names come from

Worth stating because none of it is ours, and the answer is three deep. The source is 6502_datapath.wiki in the preservation archive.

schemeexamplewhat it is
HansonY/SB, SB/XSOURCE/DEST, from the block diagram drawn off the MOS blueprints
BalazsR1x7, Dkx2a positional grid, off his own die photograph
JSSim, and so oursdpc4_SSBposition prefix plus Hanson's name

So half of a control-line name is a coordinate and half is a function. The prefix is a real ordering: sorting the lines by their dpc index sorts them left to right across the die, with six inversions in 43, all adjacent pairs. Two indices are negative, dpc-1_ADL/ABL and dpc-2_ADH/ABH, because the address latch loads sit left of where the datapath's numbering starts.

tools/check-dpc-vs-wiki.py re-asks the wiki's claims of the chip.

The entries

132 groups over 23 kinds, covering all 1547 nodes exactly once, plus 138 containers that overlap on purpose. n is the node count; a group with a . in its id is a child of the one above it.

regs: registers

address prefixnlabel
regs:s32S
regs:s.SS5SS
regs:s.SBS4SBS
regs:s.SADL5SADL
regs:s.SSB5SSB
regs:a24A
regs:a.SBAC5SBAC
regs:a.ACDB5ACDB
regs:a.ACSB5ACSB
regs:x24X
regs:x.SBX5SBX
regs:x.XSB5XSB
regs:y24Y
regs:y.SBY5SBY
regs:y.YSB5YSB
regs:shared.s.SS-s.SBS-a.SBAC-x.SBX-y.SBY1shared by s.SS, s.SBS, a.SBAC, x.SBX, y.SBY
regs:shared.s.SS-s.SBS-a.SBAC-a.ACDB-a.ACSB-x.SBX-x.XSB-y.SBY-y.YSB1shared by s.SS, s.SBS, a.SBAC, a.ACDB, a.ACSB, x.SBX, x.XSB, y.SBY, y.YSB
regs:shared.s.SS-s.SBS1shared by s.SS, s.SBS

flags: status flags

address prefixnlabel
flags:C14C flag
flags:Z11Z flag
flags:I9I flag
flags:D9D flag
flags:B2B flag
flags:V24V flag
flags:N7N flag
flags:shared3shared flag logic
flags:out6P readout

alat: address latches

address prefixnlabel
alat:abl56ABL
alat:abh56ABH
alat:ADL/ABL18ADL/ABL
alat:ADH/ABH5ADH/ABH
alat:low4ADL constants
alat:high8ADH constants

dbus: data bus

address prefixnlabel
dbus:idl32idl
dbus:dor48dor
dbus:idb8idb
dbus:DL/ADH17DL/ADH
dbus:DL/DB5DL/DB
dbus:DL/ADL4DL/ADL
dbus:SBDB5SBDB
dbus:PCLDB7PCLDB
dbus:PCHDB5PCHDB
dbus:rw20rw

irp: instruction register

address prefixnlabel
irp:pd24pd
irp:load24load
irp:ir16ir
irp:pre7pre
irp:irline32irline3
irp:clear1clear
irp:fetch2fetch

sbus: special bus

address prefixnlabel
sbus:sb8sb
sbus:dasb12dasb
sbus:SBADH7SBADH
sbus:onto2onto
sbus:off1off

sdp: store pipeline

address prefixnlabel
sdp:detect4DETECT

rdy: ready logic

address prefixnlabel
rdy:in4RDY receiver
rdy:master1master
rdy:copies8copies

pcr: program counter

address prefixnlabel
pcr:pcl8pcl
pcr:pch8pch
pcr:pclp8pclp
pcr:pchp8pchp
pcr:PCLPCL6PCLPCL
pcr:ADLPCL4ADLPCL
pcr:PCLADL5PCLADL
pcr:PCHPCH6PCHPCH
pcr:ADHPCH4ADHPCH
pcr:PCHADH6PCHADH

pipe: pipeline latches

address prefixnlabel
pipe:named12named pipe latches
pipe:unk19pipeUNK latches

sync: SYNC

address prefixnlabel
sync:sync4SYNC generator

clock: clock generator

address prefixnlabel
clock:gen16clock generator

intr: interrupts

address prefixnlabel
intr:irq6IRQ path
intr:nmi18NMI path
intr:res6RES path
intr:shared4shared interrupt path
intr:vector3vector selection

branch: branch logic

address prefixnlabel
branch:cross2branch: cross
branch:direction8branch: direction
branch:taken7branch: taken

decimal: decimal correction

address prefixnlabel
decimal:bcd51decimal correction

alu: ALU

address prefixnlabel
alu:bit010bit0
alu:bit111bit1
alu:bit211bit2
alu:bit311bit3
alu:bit410bit4
alu:bit511bit5
alu:bit611bit6
alu:bit711bit7
alu:shared7shared
alu:a8a
alu:b16b
alu:cin14cin
alu:cout7cout
alu:vout4vout
alu:in23in
alu:fn25fn
alu:out35out

incr: PC incrementer

address prefixnlabel
incr:pc86PC incrementer

chain: timing chain

address prefixnlabel
chain:T09T0 cell (clock1)
chain:T11T1 cell (clock2)
chain:T24T2 cell (t2)
chain:T34T3 cell (t3)
chain:T44T4 cell (t4)
chain:T54T5 cell (t5)
chain:shared3shared chain logic

bus: internal bus

address prefixnlabel
bus:adl8adl
bus:adh8adh

stage: decode terms

address prefixnlabel
stage:T033T0 terms
stage:T217T2 terms
stage:T310T3 terms
stage:T49T4 terms
stage:T58T5 terms
stage:T+11T+ terms
stage:any33any terms

pins: pins

address prefixnlabel
pins:input6input pins
pins:output16output pins
pins:bidirectional8bidirectional pins

rest: rest of a block

address prefixnlabel
rest:04rest of Unaccounted
rest:326rest of Decode PLA
rest:410rest of Control pipeline
rest:54rest of Timing chain
rest:67rest of Interrupts & vectors
rest:83rest of ALU

logic: static logic

address prefixnlabel
logic:040shared static logic
logic:36gates driving Decode PLA
logic:427gates driving Control pipeline
logic:52gates driving Timing chain
logic:69gates driving Interrupts & vectors
logic:87gates driving ALU
logic:129gates driving Data bus

Containers that exist only in the overlapping layer

These claim no node in the partition, because everything in them is already owned by a derivation that is more specific. They are still the honest answer to "what is this node part of".

containernwhy it is absorbed
sbus:link1absorbed whole by the special bus
sdp:sd14the address latches' ADL/ABL cone reads it and outranks it
sdp:sd27same, one cycle later
dpc:phi118a clock phase is not a fact about the wiring, so it is added last
dpc:both26same
dpc:unreached2same, for the lines the probe programs never raise

122 nodes are in more than one container, at most 5. That number is not a defect: a node in the decimal correction is also in an ALU slice, and saying only one of those is a consequence of a drawing needing disjoint boxes.

What the address cannot tell you

  • Direction. A pass transistor conducts both ways, so topology alone cannot say which end is the source. Hanson's SOURCE/DEST names are the only record of it, and they are authored, not measured.
  • Neighbourhood. depth= is hops from a pin, which is a distance, not a neighbourhood. "What is within two hops" is a query, not a coordinate.
  • Which container is most interesting. The partition picks one owner so a box can be drawn. also= carries the rest.
  • Anything about node 866. It classifies as inert and that is correct: it gates one transistor and nothing in the chip can drive it, so no run can ever observe it.