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

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

Fixed physical interface file. Refactoring ASMInterface.

File size: 3.2 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
9type sizes = [ `Four | `Seven | `Eight | `Eleven | `Sixteen ]
10
11let mk_nibble b1 b2 b3 b4 = [b1; b2; b3; b4]
12let from_nibble =
13 function
14    [b1; b2; b3; b4] -> b1,b2,b3,b4
15  | _ -> assert false
16let mk_byte n1 n2 = n1 @ n2
17let from_byte =
18 function
19    b1::b2::b3::b4::r -> [b1;b2;b3;b4],r
20  | _ -> assert false
21let mk_byte7 b1 b2 b3 n1 = b1::b2::b3::n1
22let from_byte7 =
23 function
24    b1::b2::b3::r -> b1,b2,b3,r
25  | _ -> assert false
26let mk_word = mk_byte
27let from_word =
28 function
29    b1::b2::b3::b4::b5::b6::b7::b8::r -> [b1;b2;b3;b4;b5;b6;b7;b8],r
30  | _ -> assert false
31let mk_word11 = mk_byte7
32let from_word11 = from_byte7
33
34let to_bits l = l
35
36let get_bit index l =
37  try
38    Some (List.nth index l)
39  with (Failure _ | Invalid_argument _) -> None
40
41let set_bit l index new_val =
42  try
43    let rec aux index l = 
44      match index, l with
45        _, [] -> raise (Invalid_argument "")
46      | 0,_::tl -> new_val::tl
47      | n,hd::tl -> hd::(aux (n-1) tl) in
48     Some (List.rev (aux index (List.rev l)))
49  with Invalid_argument "" -> None
50
51let (-&-) l1 l2 = List.map2 (fun b1 b2 -> b1 & b2) l1 l2
52let (-|-) l1 l2 = List.map2 (fun b1 b2 -> b1 || b2) l1 l2
53let xor b1 b2 = b1 <> b2
54let (-^-) l1 l2 = List.map2 xor l1 l2
55let not l1 = List.map (not) l1
56
57let iter_bits f v = String.concat "" (List.map f v)
58let map_bits = List.map
59let map2_bits = List.map2
60
61let string_of_vect l =
62 String.concat "" (List.map (function false -> "0" | true -> "1") l)
63
64let 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,[])
65let half_add l r = full_add l r false
66
67let rec split_last =
68  function
69    [] -> assert false
70  | [he] -> he,[]
71  | he::tl ->
72      let l,res = split_last tl in
73        l,he::res
74
75let shift_left =
76  function
77    [] -> assert false
78  | _::tl -> tl @ [false]
79let shift_right l = false :: snd (split_last l)
80let rotate_left =
81  function
82    [] -> assert false
83  | he::tl -> tl @ [he]
84let rotate_right l =
85  let he,tl = split_last l in
86    he::tl
87
88let int_of_vect v =
89  let rec aux pow v =
90    match v with
91      [] -> 0
92    | hd::tl ->
93        if hd = true then
94          pow + (aux (pow * 2) tl)
95        else
96          aux (pow * 2) tl
97  in
98    aux 1 (List.rev v)
99
100let size_lookup =
101  function
102    `Four -> 4
103  | `Seven -> 7
104  | `Eight -> 8
105  | `Eleven -> 11
106  | `Sixteen -> 16
107
108let rec pow v p =
109  if p = 0 then
110    1
111  else
112    v * (pow v (p - 1))
113
114let divide_with_remainder x y = (x / y, x mod y)
115
116let rec aux i =
117  if i < 0 then
118    raise (Invalid_argument "Negative index")
119  else
120    let (d, r) = divide_with_remainder i 2 in
121      if (d, r) = (0, 0) then
122        []
123      else if r = 0 then
124        false :: aux d
125      else
126        true :: aux d
127
128let rec pad i l =
129  match i with
130    0 -> l
131  | n -> false :: (pad (i - 1) l)
132
133let vect_of_int i size =
134  let big_list = List.rev (aux i) in
135    if List.length big_list > (size_lookup size) then
136      raise (Invalid_argument "Size not big enough")
137    else
138      let diff = (size_lookup size) - (List.length big_list) in
139        pad diff big_list
140   
141let zero size = pad (size_lookup size) []
Note: See TracBrowser for help on using the repository browser.