source: Deliverables/D4.1/Word11.ml @ 86

Last change on this file since 86 was 86, checked in by mulligan, 10 years ago

Adding bit vector file.

File size: 3.6 KB
Line 
1(*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*)
2(* FILENAME:    Word11.ml                                                    *)
3(* DESCRIPTION: An ADT implementing 11 bit words, and common operations      *)
4(*              on them.                                                     *)
5(* CREATED:     17/09/2010, Dominic Mulligan                                 *)
6(* BUGS:                                                                     *)
7(*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*)
8
9open Bit;;
10open Byte;;
11
12module type WORD11 =
13sig
14  type bit
15  type byte
16  type word11 = private (bit * bit * bit * byte)
17
18  val get_bit_at: int -> word11 -> bit option
19  val set_bit_at: int -> bit -> word11 -> word11 option
20
21  val (-&-): word11 -> word11 -> word11
22  val (-|-): word11 -> word11 -> word11
23  val (-^-): word11 -> word11 -> word11
24(*
25  val rotate_right: word11 -> word11
26  val rotate_left: word11 -> word11
27  val shift_right: word11 -> word11
28  val shift_left: word11 -> word11
29*)
30  val not: word11 -> word11
31
32  val map_bit: (bit -> bit) -> word11 -> word11
33  val iter_bit: (bit -> string) -> word11 -> string
34  val zip_bit: (bit -> bit -> bit) -> word11 -> word11 -> word11
35
36  val zero: word11
37
38  val half_add: word11 -> word11 -> (word11 * bit)
39  val full_add: (word11 * bit) -> word11 -> (word11 * bit)
40
41  val to_string: word11 -> string
42end;;
43
44module Word11Functor(Bit: BIT)
45                    (Byte: BYTE
46                       with type bit = Bit.bit): WORD11
47  with type bit  = Bit.bit
48  and  type byte = Byte.byte =
49struct
50  type bit    = Bit.bit
51  type byte   = Byte.byte
52  type word11 = bit * bit * bit * byte
53
54  let get_bit_at index (b1,b2,b3,b) =
55    if index < 8 then
56      Byte.get_bit_at index b
57    else
58      match index with
59        8 -> Some b3
60      | 9 -> Some b2
61      | 10 -> Some b1
62      | _ -> None
63  let set_bit_at index new_val (b1,b2,b3,b) =
64    if index < 8 then
65      let nib = Byte.set_bit_at index new_val b in
66        match nib with
67          Some nib -> Some (b1, b2, b3, nib)
68        | None -> None
69    else
70      match index with
71        8 -> Some (b3, b2, new_val, b)
72      | 9 -> Some (b3, new_val, b1, b)
73      | 10 -> Some (new_val, b2, b1, b)
74      | _ -> None
75
76  let (-&-) (l1, l2, l3, l) (r1, r2, r3, r) =
77    (Bit.(-&-) l1 r1, Bit.(-&-) l2 r2, Bit.(-&-) l3 r3, Byte.(-&-) l r)
78  let (-|-) (l1, l2, l3, l) (r1, r2, r3, r) =
79    (Bit.(-|-) l1 r1, Bit.(-|-) l2 r2, Bit.(-|-) l3 r3, Byte.(-|-) l r)
80  let (-^-) (l1, l2, l3, l) (r1, r2, r3, r) =
81    (Bit.(-^-) l1 r1, Bit.(-^-) l2 r2, Bit.(-^-) l3 r3, Byte.(-^-) l r)
82  let not (b1, b2, b3, b) = (Bit.not b1, Bit.not b2, Bit.not b3, Byte.not b)
83
84  let map_bit f (b1, b2, b3, b) =
85    (f b1, f b2, f b3, Byte.map_bit f b)
86  let iter_bit f (b1, b2, b3, b) =
87    let n_bits = f b1 ^ f b2 ^ f b3 in
88    let n_byte = Byte.iter_bit f b in
89      n_bits ^ n_byte
90  let zip_bit f (l1, l2, l3, l) (r1, r2, r3, r) =
91    (f l1 r1, f l2 r2, f l3 r3, Byte.zip_bit f l r)
92
93  let zero = (Bit.zero, Bit.zero, Bit.zero, Byte.zero)
94
95  let to_string = iter_bit Bit.to_string
96
97  let half_add (l1, l2, l3, l) (r1, r2, r3, r) =
98    let (n, c) = Byte.half_add l r in
99    let (n3, c3) = Bit.full_add (l3, c) r3 in
100    let (n2, c2) = Bit.full_add (l2, c3) r2 in
101    let (n1, c1) = Bit.full_add (l1, c2) r1 in
102      ((n1, n2, n3, n), c1)
103  let full_add ((l1, l2, l3, l), c) (r1, r2, r3, r) =
104    let (n, c) = Byte.full_add (l, c) r in
105    let (n3, c3) = Bit.full_add (l3, c) r3 in
106    let (n2, c2) = Bit.full_add (l2, c3) r2 in
107    let (n1, c1) = Bit.full_add (l1, c2) r1 in
108      ((n1, n2, n3, n), c1) 
109  let to_string = iter_bit Bit.to_string
110end;;
111
112module Word11 = Word11Functor(Bit) (Byte);;
Note: See TracBrowser for help on using the repository browser.