exercise 3.30 続き
今度は実際に時間を考える。
時間の表記については
inverter-delayをi
and-delayをa
or-delayをo
と言う感じで。
half-adder
sumは max(a+i, o) + a
carryは a
full-adder
half-adderのsumとcarryをそれぞれs,cとおくと、
sumは s
carryは s+c+o
ripple-adder
最悪の場合、C1~Cn-1まで信号が伝わる時間を考えないといけないので、
(n-1)*(s+c+o) + max(s, s+c+o) = n*(s+c+o)
(maxは最後のS1とCの時間を比較)
と、自分でもよく分からなくなってくる説明を書いてみた。
こういうときは実行するのが一番だな。
ちなみに先ほどのコードにあった、make-wire-listとかつかうと少し分かりにくいので、いちいち自分でリストを作った。すごく・・・めんどくさいです。
(define the-agenda (make-agenda)) (define inverter-delay 2) (define and-gate-delay 3) (define or-gate-delay 5) (define a1 (make-wire)) (define a2 (make-wire)) (define a3 (make-wire)) (define b1 (make-wire)) (define b2 (make-wire)) (define b3 (make-wire)) (define s1 (make-wire)) (define s2 (make-wire)) (define s3 (make-wire)) (define A (list a1 a2 a3)) (define B (list b1 b2 b3)) (define S (list s1 s2 s3)) (define c (make-wire)) (probe 'a1 a1) (probe 'a2 a2) (probe 'a3 a3) (probe 'b1 b1) (probe 'b2 b2) (probe 'b3 b3) (probe 's1 s1) (probe 's2 s2) (probe 's3 s3) (probe 'c c) (ripple-carry-adder A B S c) (set-signal! a1 1) (set-signal! a2 1) (set-signal! a3 1) (propagate) (set-signal! b3 1) (propagate)
・・・出力は
a1 0 New-value = 0 a2 0 New-value = 0 a3 0 New-value = 0 b1 0 New-value = 0 b2 0 New-value = 0 b3 0 New-value = 0 s1 0 New-value = 0 s2 0 New-value = 0 s3 0 New-value = 0 c 0 New-value = 0 a1 0 New-value = 1 a2 0 New-value = 1 a3 0 New-value = 1 s1 8 New-value = 1 s2 8 New-value = 1 s3 8 New-value = 1 b3 8 New-value = 1 s3 24 New-value = 0 s2 40 New-value = 0 c 56 New-value = 1 s1 56 New-value = 0
ということで、a=111,b=0からb=1に変更すると
56-8=48
の時間がかかっていると。上のコードにあるように、
i=2
a=3
o=5
より、
s=8
c=3
であるから
かかる時間は
3*(s+c+o)=3*(16)=48
と考えられ、たしかに一致している。
・・・ふぅ、次にこういうエントリを書くときはもう少し頭の中を整理してから書こう。すごくわけの分からんエントリができた気分だ。