source: Deliverables/D4.1/Nibble.ml @ 62

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

Many additions to Bit, Nibble and Byte API, as well as more instructions
added to ASMInterpret execute function.

File size: 2.3 KB
Line 
1(*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*)
2(* FILENAME: Nibble.ml                                                       *)
3(* DESCRIPTION: An ADT implementing nibbles, and common operations on them.  *)
4(* CREATED: 10/09/2010, Dominic Mulligan                                     *)
5(* BUGS:                                                                     *)
6(*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*^*)
7
8open Bit;;
9
10module type NIBBLE =
11sig
12  type bit
13  type nibble
14
15  val from_bits: bit -> bit -> nibble
16  val from_int: int -> nibble option
17
18  val get_bit_at: int -> nibble -> bit option
19  val set_bit_at: int -> bit -> nibble -> nibble option
20
21  val (-&-): nibble -> nibble -> nibble
22  val (-|-): nibble -> nibble -> nibble
23  val (-^-): nibble -> nibble -> nibble
24  val not: nibble -> nibble
25
26  val swap_bits: nibble -> nibble
27
28  val map_bit: (bit -> bit) -> nibble -> nibble
29  val iter_bit: (bit -> string) -> nibble -> string
30  val zip_bit: (bit -> bit -> bit) -> nibble -> nibble -> nibble
31  val pretty: nibble -> string
32end
33
34module NibbleFunctor(Bit: BIT) : NIBBLE with type bit = Bit.bit =
35struct
36  type bit = Bit.bit
37  type nibble = bit * bit
38
39  let from_bits l h = (l, h)
40  let from_int int_val =
41    match int_val with
42      0 -> Some (Bit.from_int 0, Bit.from_int 0)
43    | 1 -> Some (Bit.from_int 0, Bit.from_int 1)
44    | 2 -> Some (Bit.from_int 1, Bit.from_int 0)
45    | 3 -> Some (Bit.from_int 1, Bit.from_int 1)
46    | _ -> None
47
48  let get_bit_at index (l, h) =
49    if index = 0 then
50      Some l
51    else if index = 1 then
52      Some h
53    else
54      None
55
56  let set_bit_at index new_bit (l, h) =
57    if index = 0 then
58      Some (new_bit, h)
59    else if index = 1 then
60      Some (l, new_bit)
61    else
62      None
63
64  let (-&-) (l1,h1) (l2, h2) =
65     (Bit.(-&-) l1 l2, Bit.(-&-) h1 h2)
66  let (-|-) (l1,h1) (l2, h2) =
67     (Bit.(-|-) l1 l2, Bit.(-|-) h1 h2)
68  let (-^-) (l1,h1) (l2, h2) =
69     (Bit.(-^-) l1 l2, Bit.(-^-) h1 h2)
70
71  let not (l, h) = (Bit.not l, Bit.not h)
72
73  let swap_bits (l, h) = (h, l)
74
75  let map_bit f (l, h) = (f l, f h)
76  let iter_bit f (l, h) =
77    let str_l = f l in
78    let str_h = f h in
79      str_l ^ str_h
80  let zip_bit f (l1, h1) (l2, h2) = (f l1 l2, f l2 h2)
81  let pretty = iter_bit Bit.pretty
82end
83
84module Nibble = NibbleFunctor(Bit)
Note: See TracBrowser for help on using the repository browser.