source: Deliverables/D4.1/BitVectors.ml @ 88

Last change on this file since 88 was 88, checked in by mulligan, 9 years ago

int_of_vect implemented.

File size: 2.3 KB
Line 
1type bit = bool
2type 'a vect = bit list
3type nibble = [`Four] vect
4type byte7 = [`Seven] vect
5type byte = [`Eight] vect
6type word = [`Sixteen] vect
7type word11 = [`Eleven] vect
8
9let mk_nibble b1 b2 b3 b4 = [b1; b2; b3; b4]
10let from_nibble =
11 function
12    [b1; b2; b3; b4] -> b1,b2,b3,b4
13  | _ -> assert false
14let mk_byte n1 n2 = n1 @ n2
15let from_byte =
16 function
17    b1::b2::b3::b4::r -> [b1;b2;b3;b4],r
18  | _ -> assert false
19let mk_byte7 b1 b2 b3 n1 = b1::b2::b3::n1
20let from_byte7 =
21 function
22    b1::b2::b3::r -> b1,b2,b3,r
23  | _ -> assert false
24let mk_word = mk_byte
25let from_word =
26 function
27    b1::b2::b3::b4::b5::b6::b7::b8::r -> [b1;b2;b3;b4;b5;b6;b7;b8],r
28  | _ -> assert false
29let mk_word11 = mk_byte7
30let from_word11 = from_byte7
31
32let to_bits l = l
33
34let get_bit index l =
35  try
36    Some (List.nth index l)
37  with (Failure _ | Invalid_argument _) -> None
38
39let set_bit l index new_val =
40  try
41    let rec aux index l = 
42      match index, l with
43        _, [] -> raise (Invalid_argument "")
44      | 0,_::tl -> new_val::tl
45      | n,hd::tl -> hd::(aux (n-1) tl) in
46     Some (List.rev (aux index (List.rev l)))
47  with Invalid_argument "" -> None
48
49let (-&-) l1 l2 = List.map2 (fun b1 b2 -> b1 & b2) l1 l2
50let (-|-) l1 l2 = List.map2 (fun b1 b2 -> b1 || b2) l1 l2
51let xor b1 b2 = b1 <> b2
52let (-^-) l1 l2 = List.map2 xor l1 l2
53let not l1 = List.map (not) l1
54
55let iter_bits f v = String.concat "" (List.map f v)
56let map_bits = List.map
57let map2_bits = List.map2
58
59let string_of_vect l =
60 String.concat "" (List.map (function false -> "0" | true -> "1") l)
61
62let full_add l r c = List.fold_right2 (fun b1 b2 (c,r) -> b1 & b2 || c & (b1 || b2),xor (xor b1 b2) c::r) l r (c,[])
63let half_add l r = full_add l r false
64
65let rec split_last =
66  function
67    [] -> assert false
68  | [he] -> he,[]
69  | he::tl ->
70      let l,res = split_last tl in
71        l,he::res
72
73let shift_left =
74  function
75    [] -> assert false
76  | _::tl -> tl @ [false]
77let shift_right l = false :: snd (split_last l)
78let rotate_left =
79  function
80    [] -> assert false
81  | he::tl -> tl @ [he]
82let rotate_right l =
83  let he,tl = split_last l in
84    he::tl
85
86let int_of_vect v =
87  let rec aux pow v =
88    match v with
89      [] -> 0
90    | hd::tl ->
91        if hd = true then
92          pow + (aux (pow * 2) tl)
93        else
94          aux (pow * 2) tl
95  in
96    aux 1 (List.rev v)
Note: See TracBrowser for help on using the repository browser.