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
と考えられ、たしかに一致している。

・・・ふぅ、次にこういうエントリを書くときはもう少し頭の中を整理してから書こう。すごくわけの分からんエントリができた気分だ。