<< Previous exercise (3.29) | Index | Next exercise (3.31) >>
(define (ripple-carry-adder a-list b-list s-list c) (if (null? a-list) (begin (set-signal! c 0) c) (begin (full-adder (car a-list) (car b-list) (ripple-carry-adder (cdr a-list) (cdr b-list) (cdr s-list) (make-wire)) (car s-list) c) c))) ;; ============================test============================ (define (inc init) (lambda (m) (cond ((number? m) (set! init (+ init m))) ((eq? m 'get) init)))) (define counter (inc 0)) (define (read-count) (counter 1) (counter 'get)) (define (make-wire) (cons'c (read-count))) (define set-signal! set-cdr!) (define (full-adder a b c-in sum c-out) (newline) (display (list a b c-in sum c-out))) (load "ripple-carry-adder.scm") (ripple-carry-adder (list 1 2 3 4 5 6 7 8) (list 1 2 3 4 5 6 7 8) (list 1 2 3 4 5 6 7 8) (cons 'c 'out)) ; (define t-and and-gate-delay) ; (define t-or or-gate-delay) ; (define t-not inverter-delay) ; (define t-ha-s (+ t-and (max t-or (+ t-not t-and)))) ; (define t-ha-s ; (if (>= t-or (+ t-not t-and)) ; (+ t-and t-or) ; (+ (* 2 t-and) t-not))) ; (define t-ha-c t-and) ; (define t-fa-s (+ t-ha-s (max 0 t-ha-s))) ; (define t-fa-s (* 2 t-ha-s)) ; (define t-fa-c (+ t-or (max t-ha-c (+ t-ha-c (max 0 t-ha-s))))) ; (define t-fa-c (+ t-or t-ha-c t-ha-s)) ; (define t-fa-c (+ t-or t-and t-ha-s)) ; (= (- t-fa-s t-fa-c) (- t-ha-s t-or t-and)) ; (if (>= t-or (+ t-not t-and)) ; (= t-fa-s t-fa-c) ; (>= t-fa-s t-fa-c)) ; (= (max t-fa-s t-fa-c) t-fa-s) ; (define t-fa t-fa-s) ; (define t-rca-c (+ t-fa-c (max 0 0 t-rca-c1))) ; (define t-rca-c (+ t-fa-c t-rca-c1)) ; (define t-rca-ci (+ t-fa-c t-rca-ci+1)) ; (define t-rca-s1 (+ t-fa-s (max 0 0 t-rca-c1))) ; (define t-rca-s1 (+ t-fa-s t-rca-c1)) ; (define t-rca (max t-rca-c t-rca-s1 t-rca-s2 ... t-rca-sn)) ; (define t-rca t-rca-s1) ; (define t-rca (+ t-fa-s t-rca-cn (* (- n 1) t-fa-c))) ; (define t-rca-cn 0) ; (define t-rca ; (+ (* (- n 1) t-or) ; (* (- n 1) t-and) ; (* (+ n 1) t-ha-s))) ; (define t-rca ; (if (>= t-or (+ t-not t-and)) ; (* 2 n (+ t-or t-and)) ; (+ (* (- n 1) t-or) ; (* (+ n 1) t-not) ; (* (+ (* 3 n) 1) t-and))))
LisScheSic
Here the ordering of full-adder doesn't matter since this is just adding pending operations by action-procedure. Then we use (set-signal! c-n 0) to trigger the corresponding part of c-n. Then set-signal! in action-procedure will trigger the others due to propagation.
For defensive programming, we need to check the length of the 3 arg lists.
Kaihao
What is the delay needed to obtain the complete output from an n -bit ripple-carry adder, expressed in terms of the delays for and-gates, or-gates, and inverters?
LisScheSic
I don't know why you have different delay for Dh(B->SUM) and Dh(A->SUM) in "half-adder", so I didn't keep reading your long answer.
I thought about this problem before reading this wiki and my thoughts are same as LinYihai's.
genovia
meteorgan
Annonymous
Added a couple of convenience procedures if someone wants to play with adders and multipliers
LinYihai
the delays of An or Bn are always 0,so the delays of Cn and Sn are only depends on Cn-1-delay. the recursion formula of Cn-delay is
and C0-delay equals 0,so the general formula of Cn-delay is
Sn-delay is
equals