9.2
7 Arithmetic-Logic Unit
| (require ledum/define/alu) | package: ledum-definers |
A simple module for defining N-bit ALUs.
syntax
(define-alu maybe-provide id bits)
maybe-provide =
| #:provide
id : identifier?
bits : exact-positive-integer?
Uses make-alu to generate ALU of bits width and
binds all the procedures returned to identifiers prefixed with
id. For example an id of my-alu binds identifiers
like my-alu-adc.
If #:provide keyword is present, all the ALU procedures are automatically provided.
procedure
(alu-integer? v) → boolean?
v : any/c
Alias for exact-nonnegative-integer?.
A contract matching one of three possible ALU operation interfaces:
1 - (-> alu-integer? (values alu-integer? alu-bit? alu-bit? alu-bit?))
2 - (-> alu-integer? alu-integer? (values alu-integer? alu-bit? alu-bit? alu-bit?))
3 - (-> alu-integer? alu-integer? alu-bit? (values alu-integer? alu-bit? alu-bit? alu-bit?))
procedure
(make-alu n) →
(alu-fcn/c 3) (alu-fcn/c 2) (alu-fcn/c 1) (alu-fcn/c 1) (alu-fcn/c 3) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 3) (alu-fcn/c 3) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) (alu-fcn/c 2) n : exact-positive-integer?
Creates procedures representing n-bit ALU operations. The
procedures created are as follows:
procedure
(alu-adc a b ci) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? ci : alu-bit? Addition with carry. The returned values are:
result,
carry flag,
zero flag,
sign flag.
All the generated procedures for ALU use the same result values convention.
procedure
(alu-add a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Addition.
procedure
(alu-not a) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? Bit negation of all bits of the input.
procedure
(alu-neg a) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? Integer negation of the input.
procedure
(alu-sbb a b ci) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer b : alu-integer? ci : alu-bit? Subtract with borrow.
procedure
(alu-sub a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Subtraction.
procedure
(alu-shl a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Bit shift left.
procedure
(alu-shr a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Bit shift right.
procedure
(alu-sar a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Arithmetic shift right (shift the highest bit in as required).
procedure
(alu-rol a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Rotate left.
procedure
(alu-ror a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Rotate right.
procedure
(alu-rlc a b ci) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? ci : alu-bit? Rotate left through carry.
procedure
(alu-rrc a b ci) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? ci : alu-bit? Rotate right through carry.
procedure
(alu-or a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Bitwise OR.
procedure
(alu-and a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Bitwise AND.
procedure
(alu-xor a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Bitwise XOR.
procedure
(alu-bflip a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Flip b’th bit in a.
procedure
(alu-btest a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Test b’th bit in a. Effectively alu-and of (arithmetic-shift 1 b), the result should be discarded and only the flags used.
procedure
(alu-bset a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Set b’th bit in a.
procedure
(alu-bclr a b) →
alu-integer? alu-bit? alu-bit? alu-bit? a : alu-integer? b : alu-integer? Clear b’th bit in a.