On this page:
define-alu
alu-integer?
alu-bit?
alu-fcn/  c
make-alu
alu-adc
alu-add
alu-not
alu-neg
alu-sbb
alu-sub
alu-shl
alu-shr
alu-sar
alu-rol
alu-ror
alu-rlc
alu-rrc
alu-or
alu-and
alu-xor
alu-bflip
alu-btest
alu-bset
alu-bclr
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

procedure

(alu-bit? v)  boolean?

  v : any/c
A predicate returning #t only for the numbers 0 and 1. Effectively an alias for (or/c 0 1).

procedure

(alu-fcn/c n)  contract?

  n : (or/c 1 2 3)
A contract matching one of three possible ALU operation interfaces:

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.