2008. 8. 14.

연습문제 3.30

(define (ripple-carry-adder lista listb lists c)
  (let ((lc '()))
    (define (inner-ripple la lb ls ck)
      (if (null? la)
          'ok
          (begin
            (let ((cout (make-wire)))
              (full-adder (car la) (car lb) ck (car ls) cout)
              (append cout lc)                   
              (inner-ripple (cdr la) (cdr lb) (cdr ls)) cout))))
    (inner-ripple lista listb lists c)))

뒤쳐지는 시간을 논리곱, 논리합, 인버터 시간으로 표현하면..
inner-ripple은 모두 n번 호출되므로 full-adder 역시 n번 호출된다.
full-adder는 2개의 half-adder와 하나의 논리합으로 구성되어있다.
half-adder는 두개의 논리곱, 하나의 논리합, 하나의 인버터로 구성되어 있다.

따라서 full-adder는 네개의 논리곱, 세개의 논리합, 하나의 인버터 만큼 시간지연이 발생한다.
그러므로 ripple-carry-adder는 총 4n 논리곱 + 3n 논리합 + n인버터 지연시간이 필요하게된다.

댓글 없음:

댓글 쓰기