Upgrade to Pro — share decks privately, control downloads, hide ads and more …

赤間仁志さんのプラレールによる半加算器

Hidemi KAWAI
November 02, 2016
700

 赤間仁志さんのプラレールによる半加算器

Hidemi KAWAI

November 02, 2016
Tweet

Transcript

  1. おことわり • このスライド資料は主に川合が社内での説明の ために作ったもので、完成度がほどほどになって おります。すみません。 – 時間をかけていいものを作るよりも、早く概要をお知ら せすることを優先したためです。 • 資料内に出てくるプラレールの写真は、ver.1.0の

    もので、最新のver.1.1とは一部違っております。 • どうしても写真では分かりにくい部分があります。 それは是非実物で確認してください。 – [サイボウズ以外の方へ] 社外で展示することもありま すので、検索などで調べてみてください!
  2. 赤間仁志さんについて • 2015年度 サイボウズ・ラボユース生 – プログラミング言語を開発 – 川合が指導担当 • なぜプラレールをサイボウズ社内で?

    – ラボユース生の卒業プレゼントで、「広い社内で のびのびとプラレールする権利+レール購入費」 をプレゼントしたからです!
  3. 半加算器とは? • 2進数における足し算(2つの入力) 0 + 0 = 00 0 +

    1 = 01 1 + 0 = 01 1 + 1 = 10 ↑ こういう計算ができる仕組みが 「半加算器」と呼ばれる 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 ちなみに、3つの1ビットの入力から計算して、2ビットの和を算出する仕組みは 「全加算器」と呼ばれる
  4. 今回の半加算器の仕様 • (1) AとBに、0か1をセット(人間が手でやる) • (2) スタート地点から電車を走らせる • (3) 電車があれこれと走る

    • (4) やがて電車はスタート地点に戻ってくる • (5) SやCが正しく計算されている! 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
  5. 半加算器の説明 下: A 上: B 下: C 上:S 下: スタート位置

    自動ターン アウトレール 3階建て-1 自動ターン アウトレール 3階建て-2 2階: X Y 2階: Z ここはお金が かかっていて かっこいい 自動ターンアウ トレールが6個も 並んでいる! XYZについて は後述
  6. 右上を拡大(ちなみに演算後) • 重要な部分が 集まっている場所 です 入力A(1階) 入力B(2階) 入A 入B →

    出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 出力C(1階) 出力S(2階) スタート位置 (1階)
  7. A = 0 の場合(1) • (1) まず、電車 は図の経路を 通り、X=0にした あと、Aの場所

    に戻ってきます A(1階) X 自動ターンアウト レール-1 (2階) 電車の進行方向 スタート位置 ここから出発
  8. A = 0 の場合(2) • (2) 次に、電車 は図の経路を 通り、Y=0にした あと、Aの場所に

    戻ってきます A Y 自動-1(2階) 自動-2(2階) ここから出発
  9. A = 0 の場合(3) 補足 • なぜ X=0 を二度やるのですか? –

    本当は二度やる必要はないです – 自動ターンアウトレールが交互に切り替わるので、 やむを得ないのです
  10. A = 0 の場合(4) • (4) 次に、電車は 図の経路を通り、 Z=0にしたあと、 Bの場所へ行きま

    す(後半へ続く) A(1階) Z 自動-1(2階) 自動-2(2階) 2階 2階 3階 3階 2階 ここから出発 B(2階) 複雑なので実物を指で 追う方が分かりやすいです
  11. A = 1 の場合 • A=0の場合と同様に、X, Y, Zをそれぞれ1にして いきます –

    自動ターンアウトレールの1階を使うところが違い ます(A=0の場合は2階を使っていました) – A=0の場合と同様に、X=1は二度実行してしまいま す – 図を作るのが面倒なので、図は省略します(すみ ません!)
  12. B = 0 で A = 0 の場合 • (1)電車は図の

    経路を通り、Xの 値に応じて分岐 します ゆえにS=0になる そしてBの位置に 戻ります B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
  13. B = 0 で A = 1 の場合 • (1')電車は図の

    経路を通り、Xの 値に応じて分岐 します ゆえにS=1になり そしてBの位置に 戻ってきます B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
  14. ここまでのまとめ • B=0の場合、Bの位置から出発して、2周します – 1周目はXを参照してSを計算 – 2周目は無条件にC=0にしに行く – Cに値を設定し終わると、 スタート位置へ帰って

    終了 • つまりB=0の場合は、Xしか見てません – YやZにもAの値をコピーしましたが使っていません • 自動-1(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
  15. B = 1 の場合 • B = 1 の場合も同様に計算していきます –

    図は省略 – 1周目でSを計算(Yを参照) – 2周目でCを計算(Zを参照) – Cに値を設定し終わると、スタート位置へ帰って終了 • B=1の場合はXを参照しません – XにもAの値をコピーしましたが使っていません • 自動-2(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
  16. 考察(2) • SやCの計算に当たっては、全く別の4つの経路 が用意されています – (1) B=0の時のS計算用の経路 – (2) B=0の時のC計算用の経路(C=0に固定)

    – (3) B=1の時のS計算用の経路 – (4) B=1の時のC計算用の経路 • B入力のターンアウトレールによって(1)&(2)か、 (3)&(4)に行くかを最初に振り分けています • その後、3階の自動ターンアウトレールによって 1周目に(1)か(3)、2周目に(2)か(4)に行きます
  17. 考察(3) • A入力を読み取るループでは、X,Y,Zに値を コピー するだけで、SやCの計算はしていません • コピーのための6つの経路があります – (1) X=0にするための経路

    – (2) Y=0にするための経路 – (3) Z=0にするための経路(&終わったらB入力へ) – (4) X=1にするための経路 – (5) Y=1にするための経路 – (6) Z=1にするための経路(&終わったらB入力へ)
  18. 考察(4) • 自動ターンアウトレールを使ったループ構造 自動 自動 スタート位置 1回目と3回目 2回目 4回目 ①

    ② ③ 自動ターンアウトレールは、あらかじめすべて直進状態で初期化しておく 自動ターンアウトレールは、「切り替わってから分岐する」ので、最初は曲がる 上図だと、①→②→①→③の順に電車が走る ③を抜けた時点で、自動ターンアウトレールはすべて直進状態に戻っている (Xの設定) (Yの設定) (Zの設定)
  19. 考察(6) • X, Y, Zの原理(混線をさける仕組み) Xなど 改造レール 改造レール 改造レール ①から入るとXに0を書き込んで③へ抜けます

    ②から入るとXに1を書き込んで③へ抜けます ④から入るとXの値によって⑤か⑥へ分岐します (混線=読むときと書くときとで、経路が混ざってしまうこと)
  20. 補足 • 考察(6)で「混線」を避ける必要があるのはな ぜか? – たとえば、Aの値がXにコピーされる – Sの値を計算するために、Xの値を逆走することで 参照するとき、もし混線をさける仕組みがなけれ ば、結局電車は単にA地点に戻る

    • Xの値が0か1であるかに関わりなく – 何もしないまま同じ場所に戻ってしまっては、Xの 値によって結果を変えることができない – それではSの計算なんてできない