ENIACのようにCPUは半導体以外でも作れる

KOBA789氏(以下、KOBA789):よろしくお願いします。KOBA789です。タイトルでわかると思うのですが、作っている途中と下に書いてあります。つまりCPUはできていません。オチが先に来てますが。

まず予防線を張らせてほしいのですが、非常に役に立たない話をするので休憩タイムだと思ってリラックスして聞いてください。

では自己紹介から始めようと思います。みなさんご存じのとおり、ここに来ている人間なのでパソコンオタクです。最終学歴は高卒で現在無職(※取材当時)、人生の春休み中です。

最近取り立ててしゃべることは、DBMS(データベース管理システム)を自作していますということくらいですね。こういう記事を書きました。DBMS好きな方がこの中にいたら、ぜひお友だちになってください。

ですが、今日は自作DBMSの話はしません。ついでに言うとCPUの話もしません。タイトルに入れておきながらCPUの話はしません。今日の内容ですが、なんらかのシミュレータの話と、WebAssemblyを使う側の話と、WebGLの話と、Rustの話をします。

今日WebAssemblyの話をする人がほかにもいるし、Rustの話をする人も数人いるのでほかの登壇者が私より詳しくしゃべってくれるんじゃないかという気はするんですけど。まあ、そこはね、腹括ってやっていきます。

近年自作CPUがアツいんですね。自作CPUはしたことがありますか? という完全100パーセントハッタリの図があります。人類には自作CPUを作ったことがある人とこれから作る人しかいません。私は作ったことがないのでこれから作る側ですが、私も作りたいなと思ったわけですね。

「CPUの原料ってシリコンなんですよ! 意外にこれ知られてないんですけど」という有名な言葉があります。みなさんの中ではおそらく常識で、シリコンだというのはみなさん知っていると思います。

ですが、はたしてそうだろうか? という話が今回のメインテーマでございます。

CPUは半導体以外でも作れるんですよ。かの有名なENIACを思い起こしてみれば、あれは真空管ですよね。半導体ではないわけです。論理回路相当の回路を構成できれば、最悪電子回路じゃなくてもいいのですが、ここでは電子回路にしましょう。最悪、論理回路を構成できれば素子はなんでもよくて、トランジスタである必要はありません。

そもそも半導体で作ったCPUは、動いているかどうかがよくわからないんですよね。物理的に非常にミクロな世界で動いているので人間の肉眼では見られません。

わざわざ人間様が、たくさんのトランジスタを何億個とか集めて大事な計算をしているのに、努力が一切感じられずにけしからんと。こんなので計算をしている気になってもらっては困ると。もっと努力を見せろということになるわけですね。

小学生の時に300個の電磁リレーを小遣いで購入

ここに写真がありますが、これが何だか、みなさんわかりますか? これは私が小学生の時に秋月で買った電磁リレー300個です。樹脂製のレールといって、細長い筒のようなものにダーっと端から並んで入っています。それが束になってダンボール箱に入っている写真です。計300個あります。

このリレーでCPUが作れるのではないか。たぶん、300個だと足りないのですが、計算機っぽいなにかはできるはずなので、ぜひとも小学生の時に買った大量のリレーを活用したいと思いました。

当時の小学生の私のお小遣いでは、300個のリレーを買うのもけっこうキツかったですね。1個100円なので3万円くらい払って買ったのかな。現在の価値で換算すると30万円くらいです。

リレーは何かというと、スイッチング素子の1つです。仕組みは非常に簡単で、バイポーラトランジスタみたいにNとPとNがあって、そこに電子が……という狐につままれたような説明をする必要は一切ありません。

電磁石が左側にあって、右側に鉄板でできた接点があります。鉄板は当然金属なので電気を流します。この鉄板をコイルで引っ張ると、浮いている部分がピチッと張り付いて電気が流れるという非常に素朴な仕組みです。

これ1個ずつがリレーなんですが、後ろにある黒い四角い箱の中にこういうパーツが入っています。

コイルで引っ張って、物理的に鉄板を動かしてパッチンパッチンとやるので動作音がするんですよ。みなさんも自動車のウインカー、カッチカッチという音を聞いたことがあると思うのですが、あれが電磁リレーです。

最近はスピーカーから鳴らしていますが、20年くらい前までの車は本当に電磁リレーでカッチン、カッチンとやっていました。

リレーは、特有の困りごとがトランジスタと違っていくらかあります。通常の論理回路ほど知見が共有されていません。共有されているのかもしれませんが、インターネットはトランジスタよりあとにできたものなんですね。

なので、トランジスタより前の歴史である電磁リレーに関することがWeb上にほとんど転がっていないんですよ。

いわゆる論理回路に関しては、論理圧縮のコツがいくらでも研究されていますし、いろいろと解説もあるのですが、リレーはそういうのがありません。当然ですが、電磁リレーで今さらCPUを作ろうとか、でかい規模の論理回路を作ろうとかをやっている人はほとんどいません。

なので、開発に便利なツールもろくにありません。普通の論理回路だったらシミュレータがあるんですよね。FPGA開発する時にたぶん使ったことがあると思いますが、タイミングチャートがバーッと出て便利なやつです。

当然ながら、電磁リレーの世界にはありません。電磁リレーとトランジスタはやっぱり仕組みが違うので、回路の作り方もちょっと違います。なので、そのまま流用できるものでもありません。

1個100円するリレーをたくさん並べて、「よっしゃ、これでハンダ付けして動かしたるで!」とハンダ付けして組み上げたにもかかわらず動かなかったら大変悲しいわけですよ。

物理的な可動部がある分だけ、リレーはトランジスタと違って1個の単価が非常に高いんですよね。重量もあるし、送料もかかります。それをハンダ付けして動かないというのは非常に悲しい。

まずはコンピューター上で動く回路CADを制作

なので、まずは回路CADを作ろうと思いました。ぶっつけ本番でリレーをハンダ付けして、「えいや! きっとこれは動くんや。俺の頭の中ではこの回路は正しく動くんや!」と作って動かないとかなり悲しいので。

コンピューター上で動く回路CADを作って、そこでシミュレーションまでして、おそらく動くだろうと確認してから実際に作り始めたい。実機はシミュレーションしたあとに作り始めたいと思いました。

ここから思い出すシリーズなのですが、なんと私、過去にもKernel/VMでこの手の話をしたことがあります。よーく見ると7年前にも同じような発表をしているんですね。さらによく見ると、その翌年にも同じような発表をしています。2014年、2015年とやっていて、なんと今回の発表は3度目の正直でございます。

3度目の正直で何が変わったかというと、今回は使いづらいシミュレータだけではなくてCADも作ったというところが進捗になります。小学生時代に300個リレーを買って、これで計算機作るぞと言って、早何年だ……20年くらい経つのか。

20年間、「よし、これをハンダ付けすると悲しいからシミュレータを作るぞ」と言って、「シミュレータだけだと設計が大変だから、CADも作るぞ」と言って、ようやくここまで来たというのが今日のお話でございます。

お品書き、ようやっとここまで来ました。流れとしてはシミュレータを作って、さらにそのシミュレータを使えるCADを作るという流れです。最後はデモでございます。さっきも書いてあったのですが、CADを作るところで大変盛り上がってしまって、CPUを作るところまでは間に合いませんでした。

CPUを作る話は4度目の正直を期待していただいて、今回はCADを作るところまででございます。おそらく今日の発表の中では相当レイヤーが高い話です。

まずはRustでシミュレータを作る

まずシミュレータを作っていきます。そもそも電磁リレーの回路がどんなものなんですかという話をします。電磁リレーの回路は、さっき言ったとおりコイルと接点があるので、コイルと接点をつないで作ります。回路図の上の記号はこんな感じで、丸いやつと棒がたくさんあるやつでコイルと接点を表します。

回路設計の時のコツが1つあって、コイルの片側は必ずグラウンドに落とします。当然コイルは向きがないので、線がピロピロと2本出ていて、どっちをなににつなげてもいいです。ですが、そういうことをやるとショートする回路を簡単に作れちゃいます。

厳密には、コイルの片側をグラウンドに落とすというより、グラウンドは絶対にコイルの片側に付いていると言ったほうが正しいです。こうすることによって、必ずグラウンドには負荷が常にくっついている状態です。要はプラスとマイナスが直接触れ合う機会を永久になくしているわけですね。

こうすると絶対にショートしないので、回路設計が安心してできます。さらに言うと、後述するシミュレータを作る時にもこういう制約を導入してあげると作りやすくなります。

回路を書いていきます。回路は何なのかという話をすると、つまるところグラフです。接点をノードにして、配線をエッジにしたグラフです。なので、グラフ関連の一般的なアルゴリズムがいろいろと使えます。

回路をグラフとして見ると、電気が流れるというのはつまるところ連結成分です。当たり前ですよね。ノードとノードがエッジでつながっているから、そこを電気が流れます。つながっているから連結成分です。これを使っていきます。

さっき、必ずリレーのコイルの片側にはグラウンドをくっつけておきますという話をしたのですが、リレーのコイルに電気が流れるかどうかは、グラウンドにつながっていない側の1点が電源につながっているかだけで判断できます。片側はマイナスに、グラウンドにべちゃっとくっつけたので考える必要がある端子は片側だけです。

グラフの中の連結成分をバーッと求めて、その連結成分に電源があるかどうかを判定すれば、その電磁リレーを動かすべきか動かさないべきかを判断できます。ということで、簡単にシミュレータが作れます。

今説明した内容をRustでバラバラと適当に書くとシミュレータができます。これはGitHubに公開しているので、気になる人は読んでください。非常に素朴な実装になっています。

(次回へつづく)