Updates to circuit simulator (not yet completed)
This commit is contained in:
parent
fa03bf2f78
commit
f8ccc1cc1b
30
3_21.rkt
30
3_21.rkt
|
@ -1,5 +1,7 @@
|
||||||
#lang sicp
|
#lang sicp
|
||||||
|
|
||||||
|
(#%provide empty-queue? make-queue front-queue insert-queue! delete-queue!)
|
||||||
|
|
||||||
(define (front-ptr queue) (car queue))
|
(define (front-ptr queue) (car queue))
|
||||||
(define (rear-ptr queue) (cdr queue))
|
(define (rear-ptr queue) (cdr queue))
|
||||||
(define (set-front-ptr! queue item) (set-car! queue item))
|
(define (set-front-ptr! queue item) (set-car! queue item))
|
||||||
|
@ -36,15 +38,21 @@
|
||||||
(display (front-ptr queue))
|
(display (front-ptr queue))
|
||||||
(newline))
|
(newline))
|
||||||
|
|
||||||
;; EXERCISE 3.21
|
(#%require (only racket/base module+))
|
||||||
(define q1 (make-queue))
|
|
||||||
(print-queue q1)
|
(module+ test
|
||||||
(insert-queue! q1 'a)
|
(#%require rackunit)
|
||||||
(print-queue q1)
|
|
||||||
(insert-queue! q1 'b)
|
(test-begin
|
||||||
(print-queue q1)
|
;; EXERCISE 3.21
|
||||||
(delete-queue! q1)
|
(define q1 (make-queue))
|
||||||
(print-queue q1)
|
(print-queue q1)
|
||||||
(delete-queue! q1)
|
(insert-queue! q1 'a)
|
||||||
(print-queue q1)
|
(print-queue q1)
|
||||||
|
(insert-queue! q1 'b)
|
||||||
|
(print-queue q1)
|
||||||
|
(delete-queue! q1)
|
||||||
|
(print-queue q1)
|
||||||
|
(delete-queue! q1)
|
||||||
|
(print-queue q1)))
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
#lang sicp
|
#lang sicp
|
||||||
|
|
||||||
(#%require "3_21.rkt") ;; for queue
|
(#%require "3_21.rkt") ;; for queue
|
||||||
|
(#%require racket/trace)
|
||||||
|
|
||||||
(define (make-agenda) (list 0))
|
(define (make-agenda) (list 0))
|
||||||
|
|
||||||
(define the-agenda (make-agenda))
|
(define the-agenda (make-agenda))
|
||||||
(define inverter-delay 2)
|
(define inverter-delay 1)
|
||||||
(define and-gate-delay 3)
|
(define and-gate-delay 10)
|
||||||
(define or-gate-delay 5)
|
(define or-gate-delay 100)
|
||||||
|
|
||||||
|
|
||||||
;;;SECTION 3.3.4
|
;;;SECTION 3.3.4
|
||||||
|
@ -134,7 +135,8 @@
|
||||||
(display " ")
|
(display " ")
|
||||||
(display (current-time the-agenda))
|
(display (current-time the-agenda))
|
||||||
(display " New-value = ")
|
(display " New-value = ")
|
||||||
(display (get-signal wire)))))
|
(display (get-signal wire))
|
||||||
|
(newline))))
|
||||||
|
|
||||||
|
|
||||||
;;;Implementing agenda
|
;;;Implementing agenda
|
||||||
|
@ -226,10 +228,6 @@
|
||||||
|
|
||||||
(module+ sample-simulation
|
(module+ sample-simulation
|
||||||
|
|
||||||
(define inverter-delay 2)
|
|
||||||
(define and-gate-delay 3)
|
|
||||||
(define or-gate-delay 5)
|
|
||||||
|
|
||||||
(define input-1 (make-wire))
|
(define input-1 (make-wire))
|
||||||
(define input-2 (make-wire))
|
(define input-2 (make-wire))
|
||||||
(define sum (make-wire))
|
(define sum (make-wire))
|
||||||
|
@ -248,14 +246,19 @@
|
||||||
(module+ test
|
(module+ test
|
||||||
(#%require rackunit)
|
(#%require rackunit)
|
||||||
|
|
||||||
(define (or-test or-gate)
|
(define (or-test or-gate probe?)
|
||||||
(define input-1 (make-wire))
|
(define input-1 (make-wire))
|
||||||
(define input-2 (make-wire))
|
(define input-2 (make-wire))
|
||||||
(define output (make-wire))
|
(define output (make-wire))
|
||||||
(define or-gate-delay 5)
|
|
||||||
|
|
||||||
(or-gate input-1 input-2 output)
|
(or-gate input-1 input-2 output)
|
||||||
|
|
||||||
|
(if probe?
|
||||||
|
(begin
|
||||||
|
(probe 'input-1 input-1)
|
||||||
|
(probe 'input-2 input-2)
|
||||||
|
(probe 'output output)))
|
||||||
|
|
||||||
(set-signal! input-1 0)
|
(set-signal! input-1 0)
|
||||||
(set-signal! input-2 0)
|
(set-signal! input-2 0)
|
||||||
(propagate)
|
(propagate)
|
||||||
|
@ -278,7 +281,7 @@
|
||||||
|
|
||||||
|
|
||||||
(test-case "Or gate 3.28"
|
(test-case "Or gate 3.28"
|
||||||
(or-test or-gate)))
|
(or-test or-gate #f)))
|
||||||
|
|
||||||
;; 3.29 Or gate from and gates
|
;; 3.29 Or gate from and gates
|
||||||
|
|
||||||
|
@ -286,6 +289,8 @@
|
||||||
;; (not (not (a or b)))
|
;; (not (not (a or b)))
|
||||||
;; (not ((not a) and (not b)))
|
;; (not ((not a) and (not b)))
|
||||||
|
|
||||||
|
;; Delay is 2*inverter-delay + and-gate-delay
|
||||||
|
|
||||||
(define (or-from-and-gates a b output)
|
(define (or-from-and-gates a b output)
|
||||||
(let ((c (make-wire))
|
(let ((c (make-wire))
|
||||||
(d (make-wire))
|
(d (make-wire))
|
||||||
|
@ -299,9 +304,14 @@
|
||||||
(module+ test
|
(module+ test
|
||||||
|
|
||||||
(test-case "Or gate from and gates 3.29"
|
(test-case "Or gate from and gates 3.29"
|
||||||
(or-test or-from-and-gates)))
|
(or-test or-from-and-gates #f)))
|
||||||
|
;;)
|
||||||
|
|
||||||
;; 3.30 Ripple adder
|
;; 3.30 Ripple adder
|
||||||
|
;;
|
||||||
|
;; Half-adder delay: max ((and + not), or) + and
|
||||||
|
;; Full-adder delay: 2 * half-adder + or
|
||||||
|
;; Ripple adder delay: n * full-adder = n * (2 * (max((and + not), or) + and) + or)
|
||||||
(define (ripple-carry-adder a b s c)
|
(define (ripple-carry-adder a b s c)
|
||||||
(define (add-full-adder a b s c)
|
(define (add-full-adder a b s c)
|
||||||
(if (and (pair? a)
|
(if (and (pair? a)
|
||||||
|
@ -310,9 +320,9 @@
|
||||||
(let ((ci (make-wire)))
|
(let ((ci (make-wire)))
|
||||||
(full-adder (car a)
|
(full-adder (car a)
|
||||||
(car b)
|
(car b)
|
||||||
c
|
ci
|
||||||
(car s)
|
(car s)
|
||||||
ci)
|
c)
|
||||||
(add-full-adder (cdr a)
|
(add-full-adder (cdr a)
|
||||||
(cdr b)
|
(cdr b)
|
||||||
(cdr s)
|
(cdr s)
|
||||||
|
@ -322,8 +332,65 @@
|
||||||
(length s))
|
(length s))
|
||||||
(add-full-adder a b s c)))
|
(add-full-adder a b s c)))
|
||||||
|
|
||||||
;;(module+ ripple-example
|
(module+ test
|
||||||
;;(define
|
|
||||||
|
(define (make-wire-list values)
|
||||||
|
(cond ((null? values) '())
|
||||||
|
(else
|
||||||
|
(let ((w (make-wire)))
|
||||||
|
(set-signal! w (car values))
|
||||||
|
(cons w (make-wire-list (cdr values)))))))
|
||||||
|
|
||||||
|
(define (make-empty-wire-list length)
|
||||||
|
(define (make-zeroes length)
|
||||||
|
(if (= length 0)
|
||||||
|
'()
|
||||||
|
(cons 0 (make-zeroes (- length 1)))))
|
||||||
|
(make-wire-list (make-zeroes length)))
|
||||||
|
|
||||||
|
(define (get-wire-signals wire-list)
|
||||||
|
(map get-signal wire-list))
|
||||||
|
|
||||||
|
(define (test-ripple-adder a1 a2 sum carry)
|
||||||
|
(let* ((a (make-wire-list a1))
|
||||||
|
(b (make-wire-list a2))
|
||||||
|
(s (make-empty-wire-list (length a1)))
|
||||||
|
(c (make-wire))
|
||||||
|
(adder (ripple-carry-adder a b s c)))
|
||||||
|
(propagate)
|
||||||
|
(check-equal? (get-wire-signals s) sum)
|
||||||
|
(check-equal? (get-signal c) carry)))
|
||||||
|
|
||||||
|
|
||||||
|
(test-case "Ripple carry adder 3.30 (15+0)"
|
||||||
|
(test-ripple-adder
|
||||||
|
'(1 1 1 1)
|
||||||
|
'(0 0 0 0)
|
||||||
|
'(1 1 1 1)
|
||||||
|
0))
|
||||||
|
|
||||||
|
(test-case "Ripple carry adder 3.30 (1+1)"
|
||||||
|
(test-ripple-adder
|
||||||
|
'(1)
|
||||||
|
'(1)
|
||||||
|
'(0)
|
||||||
|
1))
|
||||||
|
|
||||||
|
(test-case "Ripple carry adder 3.30 (3+1)"
|
||||||
|
(test-ripple-adder
|
||||||
|
'(1 1)
|
||||||
|
'(0 1)
|
||||||
|
'(0 0)
|
||||||
|
1))
|
||||||
|
|
||||||
|
(test-case "Ripple carry adder 3.30 (15+1)"
|
||||||
|
(test-ripple-adder
|
||||||
|
'(1 1 1 1)
|
||||||
|
'(0 0 0 1)
|
||||||
|
'(0 0 0 0)
|
||||||
|
1)))
|
||||||
|
|
||||||
|
;;)
|
||||||
|
|
||||||
;; EXERCISE 3.31
|
;; EXERCISE 3.31
|
||||||
;: (define (accept-action-procedure! proc)
|
;: (define (accept-action-procedure! proc)
|
||||||
|
|
Loading…
Reference in New Issue