NandGame が面白過ぎて年末年始ハマった その4

4 min読了の目安(約3600字TECH技術記事

NandGame 完結編

今まで 3 回に渡って解いてきた NandGame もついに完結である。もはや年末年始でも何でもないが、そこは気にしない。
せっかくなので、今までの記事へのリンクも貼っておく。

https://zenn.dev/kariya_mitsuru/articles/eba752aac8aa54
https://zenn.dev/kariya_mitsuru/articles/d9f409ae710d82
https://zenn.dev/kariya_mitsuru/articles/bf0a66c4ff7000
ちなみに、今回もバリバリネタバレ全開なので、まさかいないとは思うが万一まだゲームをやっていない方は是非コンプリートしてから読んで欲しい。

Processor

プロセッサである。いよいよ大詰めだ。

Combined Memory

「コンバインドメモリー」だそうだ。良く分からないが、レジスタとメモリをぶっこんだもののようだ。
とは言え構成するのは何も難しいことはなく、せいぜい既製品の register に惑わされずに自作部品の register を使用すればいいだけだ。

195 Nand + 63488 Nand で正解だ。
ちなみに、RAM の部分は別にカウントしてくれるらしい。

Instruction Decoder

命令デコーダである。
入力のビット 15 の状態によって、W の側に出すか W じゃない側に出すかを決めるようだ。
出すか出さないかを切り替えると言う事であれば、構成済みの mask inv 16 が使えるかと思いきや、なんとツールボックスに inv 16 が無い。
さすがに意味なく全く同一の inv 16 を作るのもしゃくなので、仕方なく mask 16 を作ろうかと思ったが、よくよく考えるとビット 15 は制御に使用されているのでマスク対象とする必要がない。つまりここで必要なのは mask 15 だ。

ここでは制御ビットも mask 15 の中で生成してしまった。これだと W じゃない側に使えないじゃないか、と思われるかもしれない。だが、勘のいい方はすでに気付いていると思うが、W じゃない側は出力が 14 ビットしかない。しかも、ci は制御ビットである。つまり W じゃない側のために mask 13 も必要なのだ。

そしてこれらを使用して命令デコーダを構成する。

オーケー、59 Nand だ。ちなみに、ちょっと出力の右側が隠れてしまっているが、まっすぐ繋がっているだけなので見えなくても問題ないと思う。
しかしこれで満足してはいけない。気になるのは出力 a の部分だ。こいつだけ他のビットと違って、ビット 15 が 0 の時には 1 を出力しなければならないので、このような構成になっている。
入出力を整理するとこのようになる。

入力ビット 15 入力ビット 5 出力 a
0 0 1
0 1 1
1 0 0
1 1 1

つまり、これはビット 5 を反転して Nand すればいいだけだ。めんどうなのでこれも mask 13 に入れてしまおう。(mask とは…)

そして、これを使うと命令デコーダはこのようになる。

オーケー、57 Nand でエンドだ。

Control Unit

制御ユニットである。メモリも含めて制御ユニットと呼ぶのはどうなんだろう、と思わなくもないが、それは置いておくとしよう。
こいつも構成するのは難しくはない。せいぜい既製品の select 16 に惑わされなければいいだけだ。

オーケー、837 Nand + 63488 Nand で完了だ。
なお、例によって嫌がらせのようにツールボックスに Inv が無いので Nand で代用してある。

Program Engine

プログラムエンジンだそうだ。最早何の説明も必要ないだろう。

220 Nand で終了だ。
ちなみに、ROM はノーカンらしい。

Computer

ついに来た。コンピュータだ。これも何の説明も必要ないだろう。

1057 Nand + 63488 Nand でエンドだ。

Input and Output

入出力である。入力にマスクが必要な事以外、何の工夫の余地もない。
なお、もう気付いていると思うが、mask 7 が必要になる。

あとは組むだけだ。

17 Nand でミッションコンプリートだ。

Arithmetics(Optional Levels)

せっかくなので、Optional Levels もやってしまおうと思う。
とは言っても、Nor、Xnor、Left Shift は取り立てて見るところもないだろうから、Logic の方はスキップとさせていただく。

Multiplication

乗算器である。筆算と同様、桁をずらしては加算を繰り返すだけだ。まあ Nand 数は多くなるだろうが、これまで散々自作部品を構成して来たので恐れることは何もない。
と言うわけで、まずは「桁をずらしては加算」を行う shift add を構成する。

S はひとつ前の加算結果、A は加算する数、L0 は加算するか否かを決定するビットだ。特に難しいことはしていない。例によって既製品に惑わされずに自作部品で固めている。なお、加算の前に A をシフトしているのがポイントだ。
これをもりもり使って構成したのがこれだ。

最下位だけはひとつ前の加算結果が無いため、shift add を使用せずに mask inv 16 と inv 16 を使用している。
これで 2597 Nand だ。

ついに終わった

NandGame、どうだっただろうか。Nand を大切に思う心は育っただろうか。
なお、重ね重ねのお願いになるが、もしこれらよりも少ない Nand で解けたら是非教えて欲しい