|
|
@ -1,6 +1,4 @@
|
|
|
|
#lang br/quicklang
|
|
|
|
#lang br/quicklang
|
|
|
|
(provide #%module-begin wire
|
|
|
|
|
|
|
|
AND OR LSHIFT RSHIFT NOT)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(module+ reader
|
|
|
|
(module+ reader
|
|
|
|
(provide read-syntax))
|
|
|
|
(provide read-syntax))
|
|
|
@ -8,19 +6,22 @@
|
|
|
|
(define (read-syntax path port)
|
|
|
|
(define (read-syntax path port)
|
|
|
|
(define wire-datums
|
|
|
|
(define wire-datums
|
|
|
|
(for/list ([wire-str (in-lines port)])
|
|
|
|
(for/list ([wire-str (in-lines port)])
|
|
|
|
(format-datum '(wire ~a) wire-str)))
|
|
|
|
(format-datum '(wire ~a) wire-str)))
|
|
|
|
(strip-context
|
|
|
|
(strip-bindings
|
|
|
|
#`(module wires-mod br/demo/wires/main
|
|
|
|
#`(module wires-mod br/demo/wires/main
|
|
|
|
#,@wire-datums)))
|
|
|
|
#,@wire-datums)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(provide #%module-begin)
|
|
|
|
|
|
|
|
|
|
|
|
(define-macro-cases wire
|
|
|
|
(define-macro-cases wire
|
|
|
|
[(wire ARG -> ID) #'(define/display (ID)
|
|
|
|
[(wire ARG -> WIRE) #'(define/display (WIRE)
|
|
|
|
(val ARG))]
|
|
|
|
(val ARG))]
|
|
|
|
[(wire OP ARG -> ID) #'(define/display (ID)
|
|
|
|
[(wire OP ARG -> WIRE) #'(define/display (WIRE)
|
|
|
|
(OP (val ARG)))]
|
|
|
|
(OP (val ARG)))]
|
|
|
|
[(wire ARG1 OP ARG2 -> ID) #'(define/display (ID)
|
|
|
|
[(wire ARG1 OP ARG2 -> WIRE) #'(define/display (WIRE)
|
|
|
|
(OP (val ARG1) (val ARG2)))]
|
|
|
|
(OP (val ARG1) (val ARG2)))]
|
|
|
|
[else #'(void)])
|
|
|
|
[else #'(void)])
|
|
|
|
|
|
|
|
(provide wire)
|
|
|
|
|
|
|
|
|
|
|
|
(define-macro (define/display (ID) BODY)
|
|
|
|
(define-macro (define/display (ID) BODY)
|
|
|
|
#'(begin
|
|
|
|
#'(begin
|
|
|
@ -29,18 +30,19 @@
|
|
|
|
(displayln (format "~a: ~a" 'ID (ID))))))
|
|
|
|
(displayln (format "~a: ~a" 'ID (ID))))))
|
|
|
|
|
|
|
|
|
|
|
|
(define val
|
|
|
|
(define val
|
|
|
|
(let ([wire-cache (make-hash)])
|
|
|
|
(let ([val-cache (make-hash)])
|
|
|
|
(λ (num-or-wire)
|
|
|
|
(lambda (num-or-wire)
|
|
|
|
(if (number? num-or-wire)
|
|
|
|
(if (number? num-or-wire)
|
|
|
|
num-or-wire
|
|
|
|
num-or-wire
|
|
|
|
(hash-ref! wire-cache num-or-wire num-or-wire)))))
|
|
|
|
(hash-ref! val-cache num-or-wire num-or-wire)))))
|
|
|
|
|
|
|
|
|
|
|
|
(define 16bit-max (expt 2 16))
|
|
|
|
(define (mod-16bit x) (modulo x 65535))
|
|
|
|
(define-macro (define-16bit ID+ARGS BODY)
|
|
|
|
(define-macro (define-16bit ID PROC-ID)
|
|
|
|
#'(define ID+ARGS (modulo BODY 16bit-max)))
|
|
|
|
#'(define ID (compose1 mod-16bit PROC-ID)))
|
|
|
|
|
|
|
|
|
|
|
|
(define-16bit (AND x y) (bitwise-and x y))
|
|
|
|
(define-16bit AND bitwise-and)
|
|
|
|
(define-16bit (OR x y) (bitwise-ior x y))
|
|
|
|
(define-16bit OR bitwise-ior)
|
|
|
|
(define-16bit (LSHIFT x y) (arithmetic-shift x y))
|
|
|
|
(define-16bit NOT bitwise-not)
|
|
|
|
(define-16bit (RSHIFT x y) (LSHIFT x (- y)))
|
|
|
|
(define-16bit LSHIFT arithmetic-shift)
|
|
|
|
(define-16bit (NOT arg) (bitwise-not arg))
|
|
|
|
(define (RSHIFT x y) (LSHIFT x (- y)))
|
|
|
|
|
|
|
|
(provide AND OR NOT LSHIFT RSHIFT)
|