チップアトラス: すべての部品に住所を
web/{groups,graph,schematic,timing}.json から tools/export-atlas-doc.py が
生成している。以下のどれも手で打ったものではない。ダイデータか導出を変えたら
作り直せば、この文書が付いてくる。
このダイの上のノード、トランジスタ、ワイヤはそれぞれちょうど一つのアドレスを
持ち、アドレスの接頭辞はその下にある集合を名指す正当なやり方になる。狙いは
ホスト名ではなく IP アドレスだ: 前が経路を決め、後ろが同定する。
8365 アドレス: ノード 1547、トランジスタ 3510、ワイヤ 3308。すべて一意で、
すべて解析できる。このファイルが書かれる前に生成器が検査している。
書き方の規則
<container> : <class> : <slot>
右から解析する。 スロットは最後のコロンの後、クラスはその一つ前、そして
コンテナは残り全部だ。フィールド数を固定するやり方は使えない: コンテナのキー
は正当にコロンを含むことがあり (alat:ADL/ABL)、束は二つのコンテナを名指す
(regs:a~sbus:sb)。
区切りがコロンである理由
これを決めたのは趣味ではなく、ダイだ。707 個の名前にわたって使われている
約物は # ( ) + - . / _ で、コンテナのキーが : を足す。ダイの名前にコロンは
一つも現れないし、kind:id はこのプロジェクトが他のどこでもコンテナを
綴るやり方でもある。. と / はどちらも落ちた: . は 33 個の名前と 14 個の
キーに、/ は 47 個と 5 個にある。
三つのフィールド
| フィールド | 何か | 出どころ |
|---|
| container | その部品が属する導出されたグループ | チップマップの分割: 23 種類にまたがる 132 グループ、どのノードもちょうど一度 |
| class | プルダウン網の形。NMOS ではそれがそのままブール関数だ | schematic.json が認識したゲート |
| slot | その部品に対するダイ自身の番号 | 読み取り専用のサブモジュール経由の segdefs.js / transdefs.js |
スロットはダイの番号であり、そこが荷重を受けている決定
他のフィールドはどれも導出であり、ここでの導出は動く: チップマップは、争わ
れているノードをどの種類が持つかを既に変えているし、割り込みの歩き方は
その所有の規則を既に変えている。最後のフィールドが導出であるようなアドレスは、
そうした改善のたびに壊れることになる。
生成器はその性質を主張する代わりに証明する。種類の所有順を逆にすると
1547 ノードのうち 88 の持ち主が変わり、スロットは 0 個動く。
だから接頭辞は改められる主張であり、スロットはそうではない。アドレスを最後の
フィールドまで削っても、その部品はまだ見つかる。
クラスの語彙は閉じていて、34 語ある
NMOS に AND ゲートは無く、OR ゲートも無い。プルアップが出力を high に保ち、
接地へのプルダウン網がそれに勝つので、どの静的ゲートも積和の反転だ: 並列な脚
が OR、直列なトランジスタが AND になる。だから脚の内訳は、ゲートに付けた札
ではなく、そのゲートが計算するものの完全な記述だ。aoi2.1 は
NOT((A AND B) OR C) である。
| クラス | 個数 | 読み方 |
|---|
inv | 534 | インバータ |
bus | 386 | どのゲートも駆動していない: バスの 1 ビットか、通過だけのノード |
nor2 | 165 | 2 入力 NOR |
dyn1 | 73 | プリチャージ、脚 1 本、プルアップ無し |
nor3 | 53 | 3 入力 NOR |
aoi2.1 | 46 | AND-OR-invert、脚の深さ 2 と 1 |
nand2 | 39 | 2 入力の NAND |
dyn3 | 36 | プリチャージ、脚 3 本、プルアップ無し |
nor5 | 33 | 5 入力 NOR |
nor8 | 30 | 8 入力 NOR |
nor4 | 26 | 4 入力 NOR |
nor7 | 25 | 7 入力 NOR |
aoi2.2 | 25 | AND-OR-invert、脚の深さ 2 と 2 |
nor6 | 20 | 6 入力 NOR |
dyn4 | 9 | プリチャージ、脚 4 本、プルアップ無し |
dyn7 | 7 | プリチャージ、脚 7 本、プルアップ無し |
dyn5 | 6 | プリチャージ、脚 5 本、プルアップ無し |
dyn9 | 4 | プリチャージ、脚 9 本、プルアップ無し |
dyn2 | 3 | プリチャージ、脚 2 本、プルアップ無し |
dyn8 | 3 | プリチャージ、脚 8 本、プルアップ無し |
aoi2.2.2 | 3 | AND-OR-invert、脚の深さ 2 と 2 と 2 |
aoi2.1.1.1.1.1 | 2 | AND-OR-invert、脚の深さ 2 と 1 と 1 と 1 と 1 と 1 |
aoi2.2.2.1 | 2 | AND-OR-invert、脚の深さ 2 と 2 と 2 と 1 |
aoi2.2.2.2.1 | 2 | AND-OR-invert、脚の深さ 2 と 2 と 2 と 2 と 1 |
aoi2.2.1 | 2 | AND-OR-invert、脚の深さ 2 と 2 と 1 |
aoi2.2.2.2 | 2 | AND-OR-invert、脚の深さ 2 と 2 と 2 と 2 |
aoi2.1.1 | 2 | AND-OR-invert、脚の深さ 2 と 1 と 1 |
aoi2.2.1.1.1.1.1 | 2 | AND-OR-invert、脚の深さ 2 と 2 と 1 と 1 と 1 と 1 と 1 |
nor9 | 2 | 9 入力 NOR |
aoi2.1.1.1.1 | 1 | AND-OR-invert、脚の深さ 2 と 1 と 1 と 1 と 1 |
aoi2.1.1.1 | 1 | AND-OR-invert、脚の深さ 2 と 1 と 1 と 1 |
dyn6 | 1 | プリチャージ、脚 6 本、プルアップ無し |
aoi2.1.1.1.1.1.1 | 1 | AND-OR-invert、脚の深さ 2 と 1 と 1 と 1 と 1 と 1 と 1 |
inert | 1 | 駆動もスイッチも無い: 観測できないと証明できる |
尾は長く、それは規則が緩いのではなくダイが不規則だということだ: 34 クラスの
うち 17 はそれぞれ 5 個未満のゲートしか持たず、そのうち 11 は ALU とフラグの
論理が一度だけ組む AOI の形だ。残りは dyn2、dyn6、dyn8、dyn9、
inert、nor9。
事実はタグとして乗り、フィールドにはならない
アドレスに要る識別子はちょうど一つで、それは不変でなければならない。部品に
ついて他に真であることは、すべてタグだ: 問い合わせられて、順序を持たず、何も
動かさずに変わっていい。
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= はトレーサが実測したバスの幹の規則 (文字だけ、not の補数は無し、
ビット 0 に名前があり、ビット 0..7 のうち少なくとも七つ) を使い、24 本の幹
に落ち着く。depth= は最も近いピンからのホップ数。phase= はチップを走らせて
実測している。also= は、重なり合う層ではこのノードを自分のものだと言うが、
分割では取り負けたコンテナを名指す。
名前はどこから来たか
どれも私たちのものではないので、述べておく価値がある。答えは三段深い。出どころ
は保存アーカイブの 6502_datapath.wiki だ。
| 体系 | 例 | 何か |
|---|
| Hanson | Y/SB, SB/X | SOURCE/DEST。MOS の設計図から描かれたブロック図のもの |
| Balazs | R1x7, Dkx2 | 位置の格子。彼自身のダイ写真から |
| JSSim、そして私たちのもの | dpc4_SSB | 位置の接頭辞に、Hanson の名前を足したもの |
だから制御線の名前は、半分が座標で半分が機能だ。接頭辞は本物の順序になって
いる: 線を dpc の番号で並べるとダイを左から右へ並ぶ順になり、43 本のうち
6 箇所の逆転はすべて隣どうしの組だ。番号が負のものが二つ、dpc-1_ADL/ABL と
dpc-2_ADH/ABH があるのは、アドレスラッチのロードがデータパスの番号が始まる
場所より左に座っているからだ。
tools/check-dpc-vs-wiki.py は wiki の主張をチップに問い直す。
項目
23 種類にまたがる 132 グループが、1547 ノードのすべてをちょうど一度覆い、
それに意図して重なる 138 個のコンテナが加わる。n はノード数。id に . が
入っているグループは、その上のグループの子だ。
regs: レジスタ
| アドレスの接頭辞 | n | ラベル |
|---|
regs:s | 32 | S |
regs:s.SS | 5 | SS |
regs:s.SBS | 4 | SBS |
regs:s.SADL | 5 | SADL |
regs:s.SSB | 5 | SSB |
regs:a | 24 | A |
regs:a.SBAC | 5 | SBAC |
regs:a.ACDB | 5 | ACDB |
regs:a.ACSB | 5 | ACSB |
regs:x | 24 | X |
regs:x.SBX | 5 | SBX |
regs:x.XSB | 5 | XSB |
regs:y | 24 | Y |
regs:y.SBY | 5 | SBY |
regs:y.YSB | 5 | YSB |
regs:shared.s.SS-s.SBS-a.SBAC-x.SBX-y.SBY | 1 | 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.YSB | 1 | s.SS, s.SBS, a.SBAC, a.ACDB, a.ACSB, x.SBX, x.XSB, y.SBY, y.YSB が共有 |
regs:shared.s.SS-s.SBS | 1 | s.SS, s.SBS が共有 |
flags: ステータスフラグ
| アドレスの接頭辞 | n | ラベル |
|---|
flags:C | 14 | C フラグ |
flags:Z | 11 | Z フラグ |
flags:I | 9 | I フラグ |
flags:D | 9 | D フラグ |
flags:B | 2 | B フラグ |
flags:V | 24 | V フラグ |
flags:N | 7 | N フラグ |
flags:shared | 3 | 共有のフラグ論理 |
flags:out | 6 | P の読み出し |
alat: アドレスラッチ
| アドレスの接頭辞 | n | ラベル |
|---|
alat:abl | 56 | ABL |
alat:abh | 56 | ABH |
alat:ADL/ABL | 18 | ADL/ABL |
alat:ADH/ABH | 5 | ADH/ABH |
alat:low | 4 | ADL の定数 |
alat:high | 8 | ADH の定数 |
dbus: データバス
| アドレスの接頭辞 | n | ラベル |
|---|
dbus:idl | 32 | idl |
dbus:dor | 48 | dor |
dbus:idb | 8 | idb |
dbus:DL/ADH | 17 | DL/ADH |
dbus:DL/DB | 5 | DL/DB |
dbus:DL/ADL | 4 | DL/ADL |
dbus:SBDB | 5 | SBDB |
dbus:PCLDB | 7 | PCLDB |
dbus:PCHDB | 5 | PCHDB |
dbus:rw | 20 | rw |
irp: 命令レジスタ
| アドレスの接頭辞 | n | ラベル |
|---|
irp:pd | 24 | pd |
irp:load | 24 | load |
irp:ir | 16 | ir |
irp:pre | 7 | pre |
irp:irline3 | 2 | irline3 |
irp:clear | 1 | clear |
irp:fetch | 2 | fetch |
sbus: 特殊バス
| アドレスの接頭辞 | n | ラベル |
|---|
sbus:sb | 8 | sb |
sbus:dasb | 12 | dasb |
sbus:SBADH | 7 | SBADH |
sbus:onto | 2 | onto |
sbus:off | 1 | off |
sdp: ストアのパイプライン
| アドレスの接頭辞 | n | ラベル |
|---|
sdp:detect | 4 | DETECT |
rdy: レディ論理
| アドレスの接頭辞 | n | ラベル |
|---|
rdy:in | 4 | RDY の受け |
rdy:master | 1 | master |
rdy:copies | 8 | copies |
pcr: プログラムカウンタ
| アドレスの接頭辞 | n | ラベル |
|---|
pcr:pcl | 8 | pcl |
pcr:pch | 8 | pch |
pcr:pclp | 8 | pclp |
pcr:pchp | 8 | pchp |
pcr:PCLPCL | 6 | PCLPCL |
pcr:ADLPCL | 4 | ADLPCL |
pcr:PCLADL | 5 | PCLADL |
pcr:PCHPCH | 6 | PCHPCH |
pcr:ADHPCH | 4 | ADHPCH |
pcr:PCHADH | 6 | PCHADH |
pipe: パイプラインのラッチ
| アドレスの接頭辞 | n | ラベル |
|---|
pipe:named | 12 | 名前付きのパイプラインラッチ |
pipe:unk | 19 | pipeUNK のラッチ |
sync: SYNC
| アドレスの接頭辞 | n | ラベル |
|---|
sync:sync | 4 | SYNC の生成器 |
clock: クロック生成器
| アドレスの接頭辞 | n | ラベル |
|---|
clock:gen | 16 | クロック生成器 |
intr: 割り込み
| アドレスの接頭辞 | n | ラベル |
|---|
intr:irq | 6 | IRQ の経路 |
intr:nmi | 18 | NMI の経路 |
intr:res | 6 | RES の経路 |
intr:shared | 4 | 共有の割り込み経路 |
intr:vector | 3 | ベクタの選択 |
branch: 分岐の論理
| アドレスの接頭辞 | n | ラベル |
|---|
branch:cross | 2 | 分岐: ページ越え |
branch:direction | 8 | 分岐: 向き |
branch:taken | 7 | 分岐: 成立 |
decimal: 十進補正
| アドレスの接頭辞 | n | ラベル |
|---|
decimal:bcd | 51 | 十進補正 |
alu: ALU
| アドレスの接頭辞 | n | ラベル |
|---|
alu:bit0 | 10 | bit0 |
alu:bit1 | 11 | bit1 |
alu:bit2 | 11 | bit2 |
alu:bit3 | 11 | bit3 |
alu:bit4 | 10 | bit4 |
alu:bit5 | 11 | bit5 |
alu:bit6 | 11 | bit6 |
alu:bit7 | 11 | bit7 |
alu:shared | 7 | shared |
alu:a | 8 | a |
alu:b | 16 | b |
alu:cin | 14 | cin |
alu:cout | 7 | cout |
alu:vout | 4 | vout |
alu:in | 23 | in |
alu:fn | 25 | fn |
alu:out | 35 | out |
incr: PC のインクリメンタ
| アドレスの接頭辞 | n | ラベル |
|---|
incr:pc | 86 | PC のインクリメンタ |
chain: タイミングチェーン
| アドレスの接頭辞 | n | ラベル |
|---|
chain:T0 | 9 | T0 のセル (clock1) |
chain:T1 | 1 | T1 のセル (clock2) |
chain:T2 | 4 | T2 のセル (t2) |
chain:T3 | 4 | T3 のセル (t3) |
chain:T4 | 4 | T4 のセル (t4) |
chain:T5 | 4 | T5 のセル (t5) |
chain:shared | 3 | 共有のチェーン論理 |
bus: 内部バス
| アドレスの接頭辞 | n | ラベル |
|---|
bus:adl | 8 | adl |
bus:adh | 8 | adh |
stage: デコードの項
| アドレスの接頭辞 | n | ラベル |
|---|
stage:T0 | 33 | T0 の項 |
stage:T2 | 17 | T2 の項 |
stage:T3 | 10 | T3 の項 |
stage:T4 | 9 | T4 の項 |
stage:T5 | 8 | T5 の項 |
stage:T+ | 11 | T+ の項 |
stage:any | 33 | any の項 |
pins: ピン
| アドレスの接頭辞 | n | ラベル |
|---|
pins:input | 6 | 入力ピン |
pins:output | 16 | 出力ピン |
pins:bidirectional | 8 | 双方向ピン |
rest: ブロックの残り
| アドレスの接頭辞 | n | ラベル |
|---|
rest:0 | 4 | Unaccounted の残り |
rest:3 | 26 | Decode PLA の残り |
rest:4 | 10 | Control pipeline の残り |
rest:5 | 4 | Timing chain の残り |
rest:6 | 7 | Interrupts & vectors の残り |
rest:8 | 3 | ALU の残り |
logic: 静的な論理
| アドレスの接頭辞 | n | ラベル |
|---|
logic:0 | 40 | 共有の静的論理 |
logic:3 | 6 | Decode PLA を駆動するゲート |
logic:4 | 27 | Control pipeline を駆動するゲート |
logic:5 | 2 | Timing chain を駆動するゲート |
logic:6 | 9 | Interrupts & vectors を駆動するゲート |
logic:8 | 7 | ALU を駆動するゲート |
logic:12 | 9 | Data bus を駆動するゲート |
重なり合う層にしか存在しないコンテナ
これらは分割ではノードを一つも自分のものにしていない。中にあるものはすべて、
もっと限定的な導出がすでに持っているからだ。それでも、「このノードは何の一部
なのか」に対する正直な答えではある。
| コンテナ | n | なぜ吸収されるか |
|---|
sbus:link | 1 | 特殊バスが丸ごと吸収する |
sdp:sd1 | 4 | アドレスラッチの ADL/ABL の円錐がこれを読み、順位で勝つ |
sdp:sd2 | 7 | 同じ。1 サイクル後 |
dpc:phi1 | 18 | クロック位相は配線についての事実ではないので、最後に足される |
dpc:both | 26 | 同じ |
dpc:unreached | 2 | 同じ。プローブのプログラムが一度も上げない線のぶん |
122 ノードは複数のコンテナに入っていて、最大で 5 個だ。この数は欠陥では
ない: 十進補正にあるノードは ALU の一枚にもあり、そのうち一つだけだと言うのは、
図が互いに素な箱を必要とすることの結果にすぎない。
アドレスが教えてくれないこと
- 向き。 パス・トランジスタは両方向に導通するので、トポロジだけではどちら
の端がソースなのかを言えない。Hanson の
SOURCE/DEST の名前だけがその記録
であり、あれは書き下ろしで、実測ではない。
- 近所。
depth= はピンからのホップ数で、距離であって近所ではない。
「2 ホップ以内に何があるか」は問い合わせであって、座標ではない。
- どのコンテナがいちばん面白いか。 分割は箱を描けるように持ち主を一つ
選ぶ。残りは
also= が運ぶ。
- ノード 866 について何でも。 これは
inert に分類され、それは正しい:
トランジスタ一つをゲートしているが、チップの中のどれもそれを駆動できない
ので、どんな走行も決してそれを観測できない。