;; Die ersten drei Zeilen dieser Datei wurden von DrRacket eingefügt. Sie enthalten Metadaten ;; über die Sprachebene dieser Datei in einer Form, die DrRacket verarbeiten kann. #reader(lib "DMdA-assignments-reader.ss" "deinprogramm")((modname circuit) (read-case-sensitive #f) (teachpacks ()) (deinprogramm-settings #(#f write repeating-decimal #t #t none explicit #f ()))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Der Schaltkreissimulator: ; Benutze zur Implementierung Warteschlangen und veränderbare Listen: (require "queue.rkt") (require "mlist.rkt") ; Ein Signal ist entweder 0 oder 1 (define signal (signature (one-of 0 1))) ; Um von dem konkreten Format der Aktionen zu abstrahieren (Aktionen sind ; Prozeduren ohne Argumente), führen wir eine Signatur hierfür ein, ; die wir in den folgenden Prozeduresignaturen benutzen: (define action (signature ( -> unspecific))) ; Globale Werte: Gatterverzögerungen (define inverter-delay 2) (define and-gate-delay 3) (define or-gate-delay 5) ; Implementierung der Basisgatter: (: inverter (wire wire -> unspecific)) (define inverter (lambda (input output) (add-action! input (lambda () (letrec ((new-value (logical-not (get-signal input)))) (after-delay inverter-delay (lambda () (set-signal! output new-value)))))))) (: logical-not (signal -> signal)) (define logical-not (lambda (s) (cond ((= s 0) 1) ((= s 1) 0)))) (: and-gate (wire wire wire -> unspecific)) (define and-gate (lambda (a1 a2 output) (letrec ((and-action-procedure (lambda () (letrec ((new-value (logical-and (get-signal a1) (get-signal a2)))) (after-delay and-gate-delay (lambda () (set-signal! output new-value))))))) (begin (add-action! a1 and-action-procedure) (add-action! a2 and-action-procedure))))) (: logical-and (signal signal -> signal)) (define logical-and (lambda (s1 s2) (if (and (= s1 1) (= s2 1)) 1 0))) (: or-gate (wire wire wire -> unspecific)) (define or-gate (lambda (a1 a2 output) (letrec ((or-action-procedure (lambda () (letrec ((new-value (logical-or (get-signal a1) (get-signal a2)))) (after-delay or-gate-delay (lambda () (set-signal! output new-value))))))) (begin (add-action! a1 or-action-procedure) (add-action! a2 or-action-procedure))))) (: logical-or (signal signal -> signal)) (define logical-or (lambda (s1 s2) (if (or (= s1 1) (= s2 1)) 1 0)))