さかもとのブログ

つらつらと

xor回路シュミレータ

SICPの3.3.4でディジタル回路のシュミレータを作るのだが、そういえばどうせなのでXORも作ってみようとふと思い、この節の復習も兼ねて作ってみた。といっても簡単だけど。

(define (xor-gate a1 a2 output)
  (define (xor-action-procedure)
    (let [(new-value
           (logical-xor (get-signal a1)
                        (get-signal a2)))]
      (after-delay xor-gate-delay
                   (lambda ()
                     (set-signal! output new-value)))))
  (add-action! a1 xor-action-procedure)
  (add-action! a2 xor-action-procedure)
  'ok)

(define (logical-xor x y)
  (if (= x y) 0 1))

テスト

;;test
(define the-agenda (make-agenda))
(define input-1 (make-wire))
(define input-2 (make-wire))
(define output (make-wire))

(probe 'input-1 input-1)
(probe 'input-2 input-2)
(probe 'output output)

(xor-gate input-1 input-2 output)
(set-signal! input-1 1)
(propagate)

(set-signal! input-2 1)
(propagate)

結果

gosh> the-agenda
gosh> input-1
gosh> input-2
gosh> output
gosh> input-1 0 New-value = 0
#<undef>
gosh> input-2 0 New-value = 0
#<undef>
gosh> output 0 New-value = 0
#<undef>
gosh> ok
gosh> input-1 0 New-value = 1
done
gosh> output 4 New-value = 1
done
gosh> input-2 4 New-value = 1
done
gosh> output 8 New-value = 0
done

問題なし。