kairo-gokko

kairo-gokko (39) コンパイル時間短縮のために data.rb をスリム化

目次ページに戻る require_remote にかかる時間がさすがに長すぎるので、なんとかしたい……。 開発効率的にも辛いですし、他の人に見てもらうときもなるべく待たせないようにしたい。 というわけで調べてみました。 ネックになっているのは data.rb のコンパ…

kairo-gokko (38-2) タイムチャートの改善 / FPSの表示

目次ページに戻る タイムチャートの表示によるパフォーマンス劣化をなんとかします。 FPSを表示 まずは定石通りに計測から始めようと思いますが、 ここはお手軽に FPS を見て確認するだけで済ませます。 今回はそれで十分そうなので。 FPS は Window.real_fp…

kairo-gokko (38-1) タイムチャートを表示

目次ページに戻る / 前 / 次 タイムチャート機能を追加しました。 おおざっぱなアイデアとしてはこうです。 各時点での監視対象箇所の状態を記録する 記録したデータを使ってチャートを描画 これだけといえばこれだけなので、そんなに難しくなさそうだと思っ…

kairo-gokko (37) リレーの効果音をノイズっぽい音に変更

目次ページに戻る / 前 / 次 リレーの状態が変わったときの効果音は (25) 状態変更の伝播の過程を見たい のときにやっつけで作ったものを使っていましたが、もうちょっとリレーっぽい音にしたいなーと思っていました。 メカニカルな感じというか、なんかこう…

リレー式論理回路シミュレータを自作して1bit CPUまで動かした

Qiita に引っ越しました。 qiita.com kairo-gokko 製作メモ

kairo-gokko 製作メモ

リレー式論理回路シミュレータを自作して1bit CPUまで動かした で書いた kairo-gokko の製作過程のメモ。 一度プロトタイプを作ってからリプレイしている感じなので、実際は2周目です。 数字は開発のステップ番号で、リポジトリの stepXX というタグの番号に…

kairo-gokko (36) 落ち穂拾いというか

目次ページに戻る / 前 / 次 1bit CPU まで作るという話に関していえば前回で一区切りなんですが、書いておかないといけないことがあるので、それを書いて今回でいったん最終回とします。 まず、回路を少し整理します。 通電 1 の回で「プラス極とマイナス極…

kairo-gokko (35) 1bit CPU 2

目次ページに戻る / 前 / 次 今回も「CPUの創りかた」に沿って進めます。 で、これが「オリジナルCPU試作2号機」です! 1号機と違うのは主に黄色く色を付けた部分ですね。 小さくてちょっと見にくいですが、 not リレーで反転しています。 これで、 NOT A が…

kairo-gokko (34) 1bit CPU 1

目次ページに戻る / 前 / 次 Dフリップフロップが手に入ったら 1bit CPU が作れます。 右上の出力を左上の入力につないであげるだけ (2つの子回路がつながって 1つになるので、片方の子回路のプラス極・マイナス極は消しました)。 できました! 1bit CPU …

kairo-gokko (33) Dフリップフロップ 2

目次ページに戻る / 前 / 次 前回作った回路をさらに改造します。 前回の回路を左右に2つ並べる 左側=前段 / 右側=後段 とする 後段の切り替え器部分を消し、代わりに前段の出力をつなげる 前段と後段の門番回路をつなげる 前段の方は NOT で反転する す…

kairo-gokko (32) Dフリップフロップ 1

目次ページに戻る / 前 / 次 前回、順序回路である RSフリップフロップが動かせることが分かりました。 曳光弾が通ったので、これで一安心です。 あとはリファクタリングなり最適化なりを、ゆるゆると、好きなだけやっていけばよいでしょう……。 といいつつ、…

kairo-gokko (31) RSフリップフロップ

目次ページに戻る / 前 / 次 さて、基本的な部品が揃ったところで、 「部品を組み合わせて何か作る」ステージに進みましょう、 まずは組み合わせ回路から……とも考えましたが、もういきなりフリップフロップを作ってしまいます。 というのは、さっさと曳光弾…

kairo-gokko (30) OR / NOR / XOR

目次ページに戻る / 前 / 次 基本的なところでいうと OR がまだ残っています。 作りましょう。 OR スイッチを並列つなぎにすると OR になります。 これまでグリッド線を描画していましたが、 見にくいような気がしてきたため、 コメントアウトして描画を止め…

kairo-gokko (29) AND / NAND

目次ページに戻る / 前 / 次 さて! ようやく準備が整いました。ここからがお楽しみですよ! AND NOT はすでに作ったので次は AND を作ります。 スイッチを直列つなぎにして equal リレーで切り替え。 NAND NOT と AND ができたということは……NAND が作れま…

kairo-gokko (28) 回路の選択

目次ページに戻る / 前 / 次 早く先に進みたいのですが、今回も主にブログに貼る都合による修正です。 今までの作りだと実行時に 1つの回路だけしか動かすことができませんでしたが、 上の画像のようにドロップダウンで複数の回路から選択して切り替えられる…

kairo-gokko (27) equal リレー

目次ページに戻る / 前 / 次 equal リレーを追加します。 not リレーのときとほとんど同じです。 テスト用回路はこう。 動かした様子です。 以下の iframe で実際に動かせます。 音量小さめにしていますが音が出ます。 こちらも同じものです。 https://sonot…

kairo-gokko (26) 見た目の修正など

目次ページに戻る / 前 / 次 先に進む前に見た目に関する修正をここでやっておきます。 今やらなくてもいいものばかりなのですが (実際にプロトタイプの時はどれも後回しにしていました)、 ブログ記事を書く都合による修正と、 ついでなので見た目まわりを…

kairo-gokko (25) 状態変更の伝播の過程を見たい

目次ページに戻る / 前 / 次 前回は状態更新処理をループさせることで 2段、3段とリレーが連なった場合でも動くようにしました。 前回の回路はうまく動きましたが、そういえば無限ループになる場合はないのでしょうか? あります。 たとえば次の回路では無限…

kairo-gokko (24) リレー 3

目次ページに戻る / 前 / 次 いやー、なにはともあれ NOT ゲートが動きましたね。 とにかく動くということが分かったので、ハリボテ部分をまともな形に修正していきます。 現状ではどこがハリボテかというと、リレーによるスイッチへの作用が2段階以上になる…

kairo-gokko (23) リレー 2

目次ページに戻る / 前 / 次 前回は not リレーの表示まで実装しました。 今回は、リレーの通電状態が変わったときに隣のスイッチを切り替える部分を作りましょう。 汎用的なものを目指すのはいったん脇に置いといて、まずはこの回路を動かすことだけを考え…

kairo-gokko (22) リレー 1

目次ページに戻る / 前 / 次 リレーを追加します! リレーとは何か!? 説明しよう! リレーとは電磁石で(つまり電気による制御で)スイッチの ON/OFF を切り替える装置である。 以上。 あとはググッて調べてください。 ググりました? 分かりましたね? で…

kairo-gokko (21) ランプ

目次ページに戻る / 前 / 次 物理回路と違って導線自体が光って見えるため実用性という意味では必要性は薄めですが、 ランプを追加します。 通電していることがちょっとだけ分かりやすいとか、通電確認したい箇所を強調できるとか、光が灯るのは象徴的でよい…

kairo-gokko (20) タッチ操作対応など

目次ページに戻る / 前 / 次 スイッチ以外をクリックしたときにエラーになるのを修正 Circuit#find_switch_by_position を修正。 クリックした位置にスイッチがない場合に nil を返すように。 もっと早く直しておけばよかった……。 --- a/circuit.rb +++ b/ci…

kairo-gokko (19) Circuitクラスを改めて追加 / リファクタリングなど

目次ページに戻る / 前 / 次 test/helper を追加 テストのファイルが 2つに増えたので、共通部分を helper にまとめておきます。 # test/helper.rb require "minitest/autorun" $LOAD_PATH.unshift File.expand_path("..", __dir__) 各テストファイルの requ…

kairo-gokko (18) 回路の分割 2

目次ページに戻る / 前 / 次 子回路へ分割の実装編です。 修正前はこうなっていたのを、 # class ChildCircuit def self.create(lines, rects) all_plus_poles = ... all_minus_poles = ... all_switches = ... wf_set = to_wire_fragments(lines) all_edges…

kairo-gokko (17) 回路の分割 1

目次ページに戻る / 前 / 次 通電判定の説明で使った図を 2つ並べてみました。 たとえば 1枚の基板上(机の上とかでもいいですが)にこういうふうに並べて配置されている状況を想像してみます。 エッジについて通電判定するためにダイクストラ法を使って最短…

kairo-gokko (16) 通電 7

目次ページに戻る / 前 / 次 前回やや強引に通電判定エンジンができたということにしましたので、 アプリケーション本体に組み込みます。 ちゃんと動いてくれるでしょうか? エッジが 1本、 4本以外のときは未対応として例外を投げていましたが、 ここを upd…

kairo-gokko (15-2) 通電 6

目次ページに戻る / 前 / 次 さて、アイデアはアイデアとして、 問題はどうやって経路を辿るかです。 最初は データの整形 3 のときのように辿っていけばええんやろ? と素朴にやってみてたんですがうまくいかず……。 問題に向き合って正攻法でやらないとダメ…

kairo-gokko (15-1) 通電 5

目次ページに戻る / 前 / 次 前回はエッジ 4本の場合の中でも限定的な配線パターンを対象に、それだけをなんとかする通電判定処理を作ってみました。 しかし、あのやり方ではすぐに行き詰まるでしょう。 エッジが 5本でも 100本でも解決できる汎用的な方法は…

kairo-gokko (14) 通電 4

目次ページに戻る / 前 / 次 前回はエッジ1本と複数のスイッチのケースまで対応しました。 今回はもう少し複雑なパターンとして、途中で分岐してスイッチが並列になっている回路の通電判定を考えます。 「並列つなぎ」というやつですね。 小学校の理科でやる…