14. レッドストーン (論理回路)
Cairn はレッドストーンを 論理レベル で記述します。信号グラフを宣言すると、コンパイラが実際の ダスト・リピータ・トーチ・コンパレータを合成し、配置し、配線してボクセルに落とします。
P1 の効果が最も大きいのがここです。信号減衰、クロストーク、ディレイ計算は、AI がボクセル建築以上に 苦手とする物理ですが、いずれも論理記述から決定論的に導出されます。
論理層のファーストクラスの対象は挙動ではなく 信号依存グラフ です。時間は言語コアに持ちません (§14.4)。
14.1 2 つの層と v1 の境界
Section titled “14.1 2 つの層と v1 の境界”- Tier 0、物理配置。
repeater facing=north delay=2のように部品を置き、ブロックステートは 導出されます。挙動はモデル化しません (ブロックステート)。 - Tier 1、論理。 本章です。信号グラフを宣言し、コンパイラが合成 → 配置 → 配線でボクセルにします。
新しいキーワードは logic / circuit / assert の 3 つだけです。論理プリミティブは組み込みの
def ライブラリとして提供され、語彙は小さくクローズドなまま保たれます (P3)。
Verilog で言えば、v1 が許すのは assign 相当だけで、クロック付き代入は許しません。
| 範囲 | |
|---|---|
| 組み合わせ | and / or / not / xor / nand / nor / mux |
| 厳選した順序マクロ | latch / pulse / delay / edge_rising / edge_falling / counter |
スコープ外 (→ Tier 0 か raw) |
always / process / state / case / FSM / クロック付き代入 / CPU |
14.2 信号バインディング
Section titled “14.2 信号バインディング”センサが信号を発し、アクチュエータが消費します。どちらも先行フェーズで配置される物理メンバです (コンポーネント・編集・複数建築)。
# センサ → 信号lever id=sw side=front offset=2 y=1 -> sig.powerbutton id=bt side=front -> sig.ringdaylight id=dl at=.. -> sig.dayobserver id=ob at=.. facing=down -> sig.tickpressure_plate id=pp at=front.outside offset=0 y=0 -> sig.step
# アクチュエータ ← 信号lamp id=l1 at=.. lit_by=sig.lampspiston id=p1 at=.. powered_by=sig.mem facing=up sticky=truedoor id=d1 .. opened_by=sig.powerdispenser id=ds at=.. fired_by=sig.pulse facing=southこの対応は規範です。-> sig.X の末尾はセンサのもの、各アクチュエータキーはそれを読む 1 つのコンポー
ネントのものです。それ以外の場所に書かれたバインディングは何の回路も記述しておらず、受け入れればコン
ポーネントの無いポートがネットリストに載ります。
これを指摘するコードは 2 つあり、どちらになるかは所見を出すのに何が必要かで決まります。センサでない
メンバに付いた -> の末尾は E_MISPLACED_BINDING です。あるキーワードが信号を発せるかどうかはメン
バ行についての事実なので、check が答え、どのコマンドもそれを報告します。それを読まないコンポーネン
トに付いたアクチュエータキーは E_LOGIC_MISPLACED_BINDING で、これは synth パイプラインが出します。
上記のうち現在受け付けるのは door と pressure_plate だけです。 lit_by= / powered_by= /
fired_by= にはまだホストが無く、どこに書かれても拒否されます。
at=inside.<side> のプレートが置ける位置。 プレートは offset= の位置の壁セルを取り、そこから
1 ボクセル内側に置かれます。そのボクセルは壁リング(フットプリントの最外周の行と列で、walls が
各段を塗る場所)の厳密に内側でなければなりません。したがって offset は 1 から壁の長さ − 2 まで
(長さは front と back では size.w、left と right では size.h)で、そもそも内部を持つには
両軸とも size が 3 以上必要です。リングは walls メンバが塗るかどうかに関係なくフットプリントから
決まり、この規則は床の行 y = 0 を含むすべての y で成り立ちます。範囲外のプレートは置かれず
W_DEFERRED_MEMBER になります。-> バインディングはそれでも読まれるので、信号はそれを駆動する
プレートの無いままネットリストに残ります。
信号名。 センサは sig. 名前空間へ発し、アクチュエータはそこから読むので、名前空間の外の名前は
誰にも読まれません。logic 行の左辺でも、センサの -> の末尾でも、アクチュエータキーの値でも同じで、
E_LOGIC_INVALID_SIGNAL になります。名前は sig. とその後ろのセグメント 1 つです。opened_by=a は
a という信号への配線ではなく、opened_by=sig.a.b も何も指しません。
値より先にホストが検査されます。walls -> a の誤りは 1 つで、それはホストの誤り — 上記の
E_MISPLACED_BINDING — であり、センサ上なら値が受けるはずの E_LOGIC_INVALID_SIGNAL は付きません。
値をどう書いても walls はセンサになりません。
バインディングは [selector] の後に書き、中には書きません。
door[id=front] opened_by=sig.power は束縛し、door[id=front,opened_by=sig.power] は束縛しません。
角括弧は行が作用するメンバを選ぶもので、その中に書かれたものはバインディングとして読まれません。括弧
内の組は、外に出したあとも残る所見を得ます。それだけが問題なら角括弧を名指す
E_LOGIC_MISPLACED_BINDING、そうでなければホストかキーに対する所見です。
セレクタ行は角括弧が選ぶメンバを束縛します。 door[id=front] opened_by=sig.power は、同じスコー
プのトップレベルか level の直下に door id=front ... と宣言されたドアを束縛します。id= は、角括
弧なしで書かれたそのようなドアをちょうど 1 つ指す必要があります。パッチはそれだけで 1 行を占め、束縛
するドアの前にも後ろにも、トップレベルにも level の直下にも、ドアがどこにあっても書けます。セレク
タに id= が無いパッチ、その id を持つドアが無いパッチ、2 つのドアが同じ id を持つパッチは
E_LOGIC_UNRESOLVED_PATCH です。どのドアにも作用しないので、受け入れればコンポーネントの無いポート
がネットリストに載ります。セレクタ行が運ぶバインディングはドアのパッチだけなので、
pressure_plate[id=p] に付いた -> テールは、センサでないメンバのテールと同じく
E_MISPLACED_BINDING です。
アクチュエータは 1 つのキーにつき 1 つのバインディングを取ります。 ドアの opened_by= は、ドア自
身の行に書いても、パッチで書いても、その両方でも 1 つです。2 つ目は E_LOGIC_DUPLICATE_BINDING で
す。2 つのバインディングは 1 つのドアへの 2 本の配線、つまり論理層に書かれていないワイヤード OR にな
ってしまいます。信号は論理層で組み合わせます — logic sig.open = sig.a or sig.x と書き、ドアを
sig.open に束縛します。
4 つのアクチュエータキー以外のキーに sig. の値が付いている場合は E_LOGIC_UNKNOWN_BINDING_KEY で
す。値は「信号を配線するつもりだった」と言い、キーは「誰も読まない」と言っている状態で、これはタイポ
の形です (oepend_by=sig.power など)。
14.3 論理層は依存 DAG
Section titled “14.3 論理層は依存 DAG”信号どうしの依存を書きます。ブール結合とマクロ適用です。時間を含まない純粋なデータフローで、 コンパイラ内部では Logic IR になります。
logic sig.lamps = sig.power and not sig.daylogic sig.mem = latch(set=sig.a, reset=sig.b) # RS ラッチ (マクロ)logic sig.pulse = pulse(sig.ring, 4) # 単安定: 4 段logic sig.fire = edge_rising(sig.tick)logic sig.sel = mux(sel=sig.s, a=sig.x, b=sig.y)式に時間演算はありません。pulse(sig.ring, 4) の 4 は tick 値ではなく 段数 です。
14.4 時間モデル
Section titled “14.4 時間モデル”v1 で時間を持つのはマクロ (delay / pulse / edge / latch / counter) だけです。delay(3) は
内部でリピータ 3 個に落ちるセルマクロで、書くべき tick 演算子はありません。
ディレイは Logic IR にも Netlist IR にも載りません。Placement IR で初めて確定します (§14.8)。
and は論理的にはゼロディレイですが、tick 数が分かるのはセル選択 (Java なら and → ComparatorAND)
と配置後の実配線長が決まってからです。
数値が tick として現れるのは検証アサーション (§14.7) だけです。論理式の中で tick 演算を することはありません。
14.5 Place-and-route
Section titled “14.5 Place-and-route”DSL が見せるのは 2D のメンタルモデルです。純粋な 2D のフロアプランは行き詰まるので、内部実装は
擬似 2.5D で、plane / via / bridge の概念を持ちます (DSL には露出しません)。純粋な 2D では
扱えない回路クラス: fanout、バス、交差、コンパレータのフィードバック、オブザーバチェーン。
circuit region=basement void=3 # 高さ 3 のサービス層を確保し、ここに回路を配線する内部アルゴリズムは 5 段階です。
-
配置: トポロジカル順、左から右へ。セル同士の間に 1 列の空きを置きます。行は 入力パッドの列の次の列から始まり、遅くともアクチュエータのパッド列の手前の列で終わるので、
n個のセルの行には2n + 1列が要ります。最後の 1 列はアクチュエータのパッド自身の列です。2n列では最後のセルがその列に立ち、z = 0とz = 2のパッドと面で接してしまいます。 どちらのパッド列もセルの行にはパッドを置かないので、パッド列の隣に立つ端のセルは、そこに ある隣の座標を空いた隣接座標として持ち続けます。セル本体はブロックなので、ネットは その隣接座標を通って届きます。2 入力ゲートには 3 つの異なるネット (2 本のドライバと 自分の出力) が接するので、空いた隣接座標が 3 つ必要です。詰めて並べると行の途中のセルには 2 つしか残らず、領域をいくら広げても増えません。行を空けるのはそのためです。行はさらに、領域の手前の端から 1 行内側に立ちます。セルのあるスコープでは、I/O パッドは
z = 0から、セルの行を飛ばして並びます。セルの無いスコープにはセルの行が無いので、 そのパッドはz = 0からすべての行を使います。セルの行にパッドがあると、行がその列まで 届いたとき端のセルと面で接し、そのセルと無関係かもしれないネットの端子がセルの面を 1 つ 取ってしまいます。パッドをその行から外し、行をアクチュエータのパッド列の手前で終えれば、 行の検査が受け入れるどの幅でもパッドがセルに接することはありません。ダストは隣の座標のダストを 読むので、空き座標のレーンは何マス長くても 1 本のネットしか運べません。端に接したセルには レーンが 1 本しかなく、2 入力ゲートに接する 3 つのネットはそれを共有できません。1 行内側に すれば、どのセルにも両側にレーンが 1 本ずつできます。これはセル 1 つにつき 1 行では なくネットリスト全体で 1 行なので、列の間隔と違ってセル数に比例しません。どちらの間隔も、ショートの無い配線を 可能にする ものであって保証するものではありません。 通りすがりのネットが最後の 1 面を取ることはあり、そのスコープはショートさせずに拒否されます。 行が収まらない領域 —
n個のセルに2n + 1列、そして 3 行 — や、パッドの立つ行が 足りない領域 — パッドの多い側の辺でセンサーかアクチュエータ 1 つにつき 1 行、 セルのあるスコープではその辺に 2 つ以上あればセルの行の分をもう 1 行 — は、2 段階先で 到達不能なシンクとして落ちる前に、ここで拒否されます。 -
Steiner 配線: Manhattan で、既に立っているもの、そして既に敷かれたネットのダストを避けて。 セル本体と I/O パッドは予約されており、その上にダストは引けず、信号がその中を 通過 することも できません。コンポーネントは信号を発するか消費するかのどちらかだからです。したがってすべての シンクはネットの木の葉であり、fanout はシンクを数珠つなぎにするのではなく、行の脇に幹を通して 各シンクへ枝を出します。障害物が無ければ配線は直線の矩形経路です。あれば回り込むか、回る場所が 無ければ
void=<N>の予算内でbridge層へ登ります。1 つの座標に 2 つのネットが乗れば、2 つの信号を運ぶ 1 本のダストになります。同じ平面で 1 歩 隣り合う 2 本も同じです — ダストは隣のダストとつながるからです。そこでネットは 1 本ずつ敷かれ、 後のものは先に敷かれたダスト とその隣の座標 を避けます。これが交差の脱出であり、段階 4 では なくここで行うのは登った分を測るためです。
wire_lengthもディレイパスのティック数も、この 経路木から読み取られます。順序は fanout の降順、次にネット自身のキー — 全順序なので、1 つの レイアウトに対する答えは何度尋ねても 1 つです。「隣」は同一平面に限ります。層をまたいだ 2 本が互いを読むかどうかは、その間に何が立っている かで決まり、このモデルはそれを持ちません。内部モデルは疑似 2.5D で、ボクセルへの実現は物理 タイル層の担当です。層をまたいで 1 歩以内にある 2 本を隔てるのは、ルータではなくその層の義務 になります — 真上に重なった対も、1 歩ずれた対も。後者は redstone の階段であり、こちらのほうが 多く出ます。ある座標の真下は 1 つ、斜め下は 4 つあり、レーンを避けて登った経路は、そのレーンと 平行に走るあいだずっと 1 歩ずれた真横を通るからです。タイル層はこの義務を、
bridge座標が何 として実現されうるかの要件として負います (§14.6)。義務は推測させず、名指しします。脱出が層をまたいで 1 歩以内に ダスト 2 本 を残したスコープ には
W_ROUTE_CROSS_LAYER_CLEARANCEが出て、座標とネットを列挙します。その対が、レイアウト から導出するものではなく読み取れるものになります。これは助言であり、何も削りません。レイアウト に落ち度は無く、ルータがここで発明した規則は、自分のモデルでは確かめようのない理由でレイアウト を拒否することになるからです。示せる対処もありません。領域を広げても対は消えません。セルの両隣 のレーンが埋まっていて自分の玄関先で登るしかない場合、広げたぶんは、登ったあと上の層を走る距離 が伸びるだけです。W_ROUTE_CROSS_LAYER_CLEARANCE line 46 circuit=floor:routed netlist for struct `crossbar` leaves 12 pairs of dust within one step of each otheracross layers (2 stacked, 10 staircase).note: (4,1,1) on cell #0 stands directly over (4,0,1) on cell #1note: (5,1,1) on cell #0 stands directly over (5,0,1) on cell #1note: (1,1,1) on cell #0 stands a layer over, and one step across from, (1,0,0) on sig.aFix: nothing in the source is wrong — the pairs are what the escape costs, and enlargingthe region is not a remedy.セグメントの上限もここで、配線を 1 本も敷く前に測ります。ドライバとシンクのマンハッタン距離は 両者を結ぶあらゆる経路の下界なので、直線ですでに上限を超えているシンクは、ルータがどう回っても 超えます。そうしたスコープは段階 3 ではなくこの段階で
E_ATTENUATION_LIMITを受け取ります。 下界であって本測定ではありません。段階 3 より厳密に少なくしか拒否せず、何も置き換えません。 幅 256 の領域はパッドをドライバから 255 ブロックの位置に置き、そこへ 257 敷くことがあります。 それは上限超えですがこの検査には掛かりません。Fix 行が段階 3 と異なるのも同じ理由です。直線を 縮めるものは何もないので、ここでは領域の拡大は解決になりません。ルータの探索も同じ上限で打ち切ります。ネットの配線からシンクへの経路はそのシンクのセグメントの 一部なので、探索は上限の先を見ません。到達できなかったシンクは、その後 1 つずつ判定します。 ルータがそのシンクを塞がれていると証明できるとき、つまり面のどれからも到着できないとき、 上限が何も切り捨てないうちに探索する座標が尽きたとき、あるいはシンクが面する空き座標がすべて シンクから上限以内にあり、その中にネットの配線が無いときは、下記の
E_ROUTE_CONGESTIONです。 それ以外はこの段階でE_ATTENUATION_LIMITを受け取り、上限内の経路が無いことだけを告げます。 上限より広い空き領域の中で塞がれたシンクもこちらです。両方の種類のシンクを持つスコープでは、 メッセージは塞がれたほうについて述べます。この打ち切りがあるので、シンクを諦めるまでの手間は 予約領域ではなく上限に比例します。打ち切りが無かったころは、ネットが到達できる空き座標を すべて訪れてから拒否していました。 -
ディレイ挿入: 減衰限界 15 を超えるセグメントにのみバッファとしてリピータを入れます。 セグメントはドライバからそのシンクまでの 実配線 経路で測り、バッファはその経路上に立ちます。 2 点間の直線が常に配線とは限りません。v1 の上限 256 ブロックを超えるセグメントはバッファでは なく拒否で、コードは段階 2 が上げるのと同じ
E_ATTENUATION_LIMITです。違うのは、この パスが実際に敷かれた配線を測っている点です。リピータは背後のブロックを読み、正面のブロックを自分と同じ高さで駆動します。そのため立てられる のは、配線が同じ高さのまま座標をまっすぐ通り抜け、そこから何も分岐しない所だけです。同じネットの ダストが六面のいずれかで接している座標にも立てません。経路が別の道筋で届いているそのダストを、 リピータが切り離してしまうからです。直線の区間なら 15 ブロックごとです。その座標が曲がり角・層の 上り下り・分岐であれば、リピータはその手前でまっすぐ通る最後の座標に立ちます。そのため経路に よっては、長さだけから決まる数より 1 個多くリピータが要ります。手前へ戻る元の座標が分岐なら、 戻った先は幹の上にあり、1 ブロックで先のすべての枝をまかないます。分岐がそれより手前にあれば、 枝ごとに 1 個ずつ立ちます。リピータはシンクごとではなくネットの実配線の木に置き、各シンクには 自分の経路上のものが計上されます。減衰限界を超える区間にリピータを立てられる座標が 1 つも 無ければ
E_ATTENUATION_LIMITで拒否します。限界は各セグメントの始点からではなく、強度を回復する最後の部品 — センサーのパッド、リピータ、 トーチ — から数えます。セルのうち 2 つは、受け取った強度を回復せずにそのまま渡します。Bedrock の OR はダストの合流で、Java のコンパレータ AND は後ろの入力が運ぶ強度より強く出力しません。これらへ 入る配線と出る配線は、間にセルが立っていても 1 続きのダストとして数え、最も多く消費した入力から 測ります。このパスはコンパレータのどの入力が後ろかを追っていないので、最も多く消費したものを 取ります。その 1 続きに要るリピータは、累計が 15 を超える手前に置きます。セルから出る配線の上か、 セルに近い位置で立てられる座標がそこに無ければセルへ入る配線の上です。
-
交差の合法化: 段階 3 が数えたバッファのリピータに座標を割り当てます。この時点で配線を 合法化する必要はありません。リピータは自分のネットの実配線経路の上に立ち、その経路はその ネットだけのもので、他のどのネットも 1 歩以内には走っていないので、持ち上げるべきショートも、 奪い合う座標もありません。このパスも自分でネットを敷くので直線の上限を適用します。前段が 渡したネットリストからスコープがここへ到達することがあるためで、同じ理由から、リピータを 立てられる座標の無い区間も段階 3 と同じく拒否します。
-
エディションの合法化: §14.6 を参照。
配線は circuit 領域に閉じ込められます。収まらなければ fail-loud です。ドライバからの経路がすべて
塞がれているシンク — コンポーネント、先に敷かれたネットのダストとその隣の座標、あるいは予約の端で
— も、理由は違えど同じ拒否で、結べなかった 2 つの座標と、面を取ったネットを告げます。
E_ROUTE_CONGESTION line 21 circuit=basement: synthesized netlist needs ~3.2x the reserved area (void=3, region 9x7). Fix: increase `void`, enlarge region, or split into multiple `circuit` blocks.これらのパスが上げるもう 1 つの拒否が E_ATTENUATION_LIMIT で、4 つの形に対して上がります。
段階 2・3・4 はいずれも共通の 1 つの手順でネットを敷きます。その手順は、経路を敷く前に
ドライバとシンクを結ぶ直線を上限に照らし、ルータが探索した後に上限内の経路が届かないシンクを
拒否します。段階 3 はさらに実配線のセグメントを上限に照らします。段階 3 と 4 はどちらも、
減衰限界 15 を超えるダストの区間にリピータを立てられる座標が 1 つも無ければ拒否します。どちらも
同じ実配線の木から同じ規則でリピータの位置を求めるので、どの区間かについて両者は一致し、
メッセージは信号の届かなくなるノードを名乗ります。どの段階が拒否するかは、どれが先にそのスコープへ
到達したかだけで決まります。primary はそのパスが読んだネットリストを名乗ります
— 段階 2 なら placed、段階 3 なら routed、段階 4 なら delayed — ので、パイプラインのどこで
測られた形なのかがメッセージから読めます。
E_ATTENUATION_LIMIT line 13 circuit=floor: placed netlist for struct `wide_pack` puts output pad #0 299 blocks from its driver in a straight line — exceeds the v1 attenuation limit of 256 blocks, and no route between two coords is shorter than the straight line between them. Fix: split the logic across several `circuit` blocks, or reserve a `region=` whose pad column sits within the cap of the cells it serves — a larger reservation cannot help, because the straight line between these two is already over the cap.14.6 エディション差
Section titled “14.6 エディション差”3 層のセルライブラリが、エディション差をライブラリの中だけに閉じ込めます。
Logical Cell → Edition Cell → Physical Tile AND → Java: ComparatorAND → block array → Bedrock: TorchAND → block arrayタイル層は、place-and-route 由来の義務をひとつ自分で負います。bridge 座標は、他のネットの
真下の座標にも、他のネットの斜め下の座標にも導通しないタイルとして実現されます。自分のネットの
真下の座標は、そこへ登ってきた経路そのもの — via は別に置かれません — なので、導通しなければ
なりません。段階 2 (§14.5) は 2 つのネットを同一平面で 1 歩以上離して
保ち、回り込めないものは登って避けるので、ある 1 本が別のネットの真上に来るのは必ず脱出の結果で
あり、その 2 本を隔てるのはタイルの仕事です。
これは作者ではなくカタログへの要件であり、それを報せる finding よりも広い範囲を覆います。
W_ROUTE_CROSS_LAYER_CLEARANCE が名指しするのはダスト同士の対 — 2 つの信号が 1 本を共有し
かねないもの — であるのに対し、上の義務は bridge タイルの下にある他ネットの座標すべてに及び
ます。セル本体も I/O パッドも同じです。コンポーネントの上を登るのはそれを越える通常の手段なので、
それらまで名指しする finding は、未解決のものではなくレイアウトそのものを報告することになります。
- 吸収する: リピータ、オブザーバ、コンパレータ、向き。いずれもセル実装の差です。
- 吸収しない: QC (準接続)、BUD、更新順序。ブロック更新順序の暗黙の意味論に依存し、可搬な実装が 存在しません。
更新順序の意味論を要する論理は、サイレントな地雷ではなくコンパイルエラーになります。「recompile で あり transcode ではない」と整合します。
E_NO_PORTABLE_IMPL line 15: this circuit requires update-order (quasi-connectivity / BUD) semantics. No portable redstone implementation exists for the target edition. Fix: redesign the logic to be order-independent, or drop to Tier 0 with an @edition guard.手で置いたレッドストーンはエディションをまたぐと壊れます。論理記述であればコンパイラがエディションに 正しい回路を出せます。部品ではなく論理を書く最大の理由です。
14.7 検証
Section titled “14.7 検証”意図を宣言し、合成された回路を tick 単位でヘッドレスにシミュレートして照合します。アサーションは 3 種類です。
# 組み合わせ: 真理値表assert truth(sig.a, sig.b -> sig.out) { 00->0; 01->1; 10->1; 11->0 }
# レイテンシ — place-and-route がディレイを変えるので重要assert latency(sig.in -> sig.out) <= 4
# 時相 — 完全な LTL ではなく有界の eventually のみassert always(sig.button -> eventually sig.door_open within 8)自己修正ループ (P5) は synth → sim → diff → patch で、検証はターゲットエディションごとに走ります。 パッチが触るのは place-and-route のヒント、リピータ、バッファだけです。Logic IR は決して書き換えま せん。 論理を自動改変する自己修正は危険だからです。
E_SIM_ASSERTION_FAILED edition=bedrock: assert latency(sig.in -> sig.out) <= 4, but measured 6 (extra repeaters from crossing legalization). Patch target: placement hint / route. (logic is never auto-modified) Suggested: relax to <=6, enlarge circuit void to shorten routes, or pin cell placement.14.8 IR とフェーズへの接続
Section titled “14.8 IR とフェーズへの接続”Intent IR と block-array IR の間に、HDL と同じ分け方で 3 つの IR 層が入ります。
Intent IR logic 宣言 / circuit 領域 / 信号バインディング ↓ logic_synthLogic IR 論理式と依存 DAG。エディション中立、ゼロディレイ ↓Netlist IR セルとネット。Logical Cell の選択。まだディレイ無し ↓ logic_placePlacement IR セル座標 + 実配線長。ここでディレイが確定する ↓ logic_routeblock-array IR ダスト・リピータ・トーチ・コンパレータのボクセル実体フェーズモデル (コンパイルモデル) は fixtures の直後を
logic_synth → logic_place → logic_route に分割します。センサとアクチュエータが 3D に配置される
まで I/O ポートの座標が確定しないからです。
14.9 逆方向変換
Section titled “14.9 逆方向変換”schematic から取り込んだ手作りのレッドストーン (エコシステム連携) は、v1 では Tier 0 の raw として保持します。ダストの塊から論理を逆合成することはスコープ外です。generation-first かつ lossy な方針と整合します。