summaryrefslogtreecommitdiff
path: root/src/gen_lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/gen_lib')
-rw-r--r--src/gen_lib/sail_values.lem8
-rw-r--r--src/gen_lib/sail_values.ml1488
2 files changed, 7 insertions, 1489 deletions
diff --git a/src/gen_lib/sail_values.lem b/src/gen_lib/sail_values.lem
index 4d67cbfc..fce595e0 100644
--- a/src/gen_lib/sail_values.lem
+++ b/src/gen_lib/sail_values.lem
@@ -108,6 +108,12 @@ let showBitU = function
| BU -> "U"
end
+let bitU_char = function
+ | B0 -> #'0'
+ | B1 -> #'1'
+ | BU -> #'?'
+end
+
instance (Show bitU)
let show = showBitU
end
@@ -307,7 +313,7 @@ declare {isabelle} termination_argument hexstring_of_bits = automatic
let show_bitlist bs =
match hexstring_of_bits bs with
| Just s -> toString (#'0' :: #'x' :: s)
- | Nothing -> show bs
+ | Nothing -> toString (#'0' :: #'b' :: map bitU_char bs)
end
(*** List operations *)
diff --git a/src/gen_lib/sail_values.ml b/src/gen_lib/sail_values.ml
deleted file mode 100644
index 213acea1..00000000
--- a/src/gen_lib/sail_values.ml
+++ /dev/null
@@ -1,1488 +0,0 @@
-open Big_int_Z
-open Printf
-
-let trace_writes = ref false
-let tracef = printf
-
-(* only expected to be 0, 1, 2; 2 represents undef *)
-type vbit = Vone | Vzero | Vundef
-type number = Big_int_Z.big_int
-
-type _bool = vbit
-type _string = string
-type _nat = number
-type _int = number
-
-let undef_val = ref Vundef
-
-type value =
- | Vvector of vbit array * int * bool
- | VvectorR of value array * int * bool
- | Vregister of vbit array ref * int * bool * string * (string * (int * int)) list
- | Vbit of vbit (*Mostly for Vundef in place of undefined register place holders*)
-
-exception Sail_exit
-exception Sail_return
-
-let _print s = print_string s
-
-let string_of_bit = function
- | Vone -> "1"
- | Vzero -> "0"
- | Vundef -> "u"
-
-let bit_of_string = function
- | "1" -> Vone
- | "0" -> Vzero
- | "u" -> Vundef
- | _ -> failwith "invalid bit value"
-
-let string_of_bit_array a = Array.fold_left (^) "" (Array.map string_of_bit a)
-
-let string_of_value = function
- | Vvector(bits, start, inc) -> (string_of_int start) ^ (if inc then "inc" else "dec") ^ (string_of_bit_array bits)
- | VvectorR(values, start, inc) -> ""
- | Vregister(bits, start, inc, name, fields) -> "reg" ^ (string_of_int start) ^ (if inc then "inc" else "dec") ^ (string_of_bit_array !bits)
- | Vbit(b) -> string_of_bit b
-
-let to_bool = function
- | Vzero -> false
- | Vone -> true
- | Vundef -> assert false
-
-let is_one i =
- if eq_big_int i unit_big_int
- then Vone
- else Vzero
-
-
-let exit _ = raise Sail_exit
-
-
-let is_one_int i =
- if i = 1 then Vone else Vzero
-
-let get_barray = function
- | Vvector(a,_,_) -> a
- | Vregister(a,_,_,_,_) -> !a
- | _ -> assert false
-
-let get_varray = function
- | VvectorR(a,_,_) -> a
- | _ -> assert false
-
-let get_ord = function
- | Vvector(_,_,o) | Vregister(_,_,o,_,_) | VvectorR(_,_,o) -> o
- | _ -> assert false
-
-let get_start = function
- | Vvector(_,s,o) | Vregister(_,s,o,_,_) | VvectorR(_,s,o) -> s
- | _ -> assert false
-
-let set_start i = function
- | Vvector(a,start,dir) -> Vvector(a,i,dir)
- | Vregister(bits,start,dir,name,regfields) -> Vregister(bits,i,dir,name,regfields)
- | VvectorR(a,start,dir) -> VvectorR(a,i,dir)
- | _ -> assert false
-
-let length_int = function
- | Vvector(array,_,_) -> Array.length array
- | Vregister(array,_,_,_,_) -> Array.length !array
- | VvectorR(array,_,_) -> Array.length array
- | _ -> assert false
-
-let set_start_to_length v = set_start ((length_int v)-1) v (* XXX should take account of direction? *)
-
-let length_big v = big_int_of_int (length_int v)
-let length = length_big
-
-let read_register = function
- | Vregister(a,start,inc,_,_) -> Vvector(!a,start,inc)
- | v -> v
-
-let vector_access_int v n =
- match v with
- | VvectorR(array,start,is_inc) ->
- if is_inc
- then (array.(n-start))
- else (array.(start-n))
- | _ -> assert false
-
-let vector_access_big v n = vector_access_int v (int_of_big_int n)
-
-let vector_access = vector_access_big
-
-let bit_vector_access_int v n = match v with
- | Vvector(array,start,is_inc) ->
- if is_inc
- then array.(n-start)
- else array.(start-n)
- | Vregister(array,start,is_inc,_,_) ->
- if is_inc
- then !array.(n-start)
- else !array.(start-n)
- | _ -> assert false
-
-let bit_vector_access_big v n = bit_vector_access_int v (int_of_big_int n)
-let bit_vector_access = bit_vector_access_big
-
-let vector_subrange_int v n m =
- (*Printf.printf "vector_subrange %s %d %d\n" (string_of_value v) n m;*)
- match v with
- | VvectorR(array,start,is_inc) ->
- let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
- VvectorR(Array.sub array offset length,n,is_inc)
- | Vvector(array,start,is_inc) ->
- let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
- Vvector(Array.sub array offset length,n,is_inc)
- | Vregister(array,start,is_inc,name,fields) ->
- let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
- Vvector(Array.sub !array offset length,n,is_inc)
- | _ -> v
-
-let vector_subrange_big v n m = vector_subrange_int v (int_of_big_int n) (int_of_big_int m)
-let vector_subrange = vector_subrange_big
-
-let get_register_field_vec reg field =
- match reg with
- | Vregister(_,_,_,name,fields) ->
- (match List.assoc field fields with
- | (i,j) ->
- if i = j
- then Vbit Vundef
- else vector_subrange_int reg i j)
- | _ -> Vbit Vundef
-
-let get_register_field_bit reg field =
- match reg with
- | Vregister(_,_,_,name,fields) ->
- (match List.assoc field fields with
- | (i,j) ->
- if i = j
- then bit_vector_access_int reg i
- else Vundef)
- | _ -> Vundef
-
-let set_register register value = match register,value with
- | Vregister(a,_,_,name,_), Vregister(new_v,_,_,_,_) ->
- begin
- if !trace_writes then
- tracef "%s <- %s\n" name (string_of_value value);
- a := !new_v
- end
- | Vregister(a,_,_,name,_), Vvector(new_v,_,_) ->
- begin
- if !trace_writes then
- tracef "%s <- %s\n" name (string_of_value value);
- a := new_v
- end
- | _ -> failwith "set_register of non-register"
-
-let set_vector_subrange_vec_int v n m new_v =
- let walker array length offset new_values =
- begin
- for x = 0 to length-1
- do array.(x+offset) <- new_values.(x)
- done;
- end
- in
- match v, new_v with
- | VvectorR(array,start,is_inc),VvectorR(new_v,_,_) ->
- let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
- walker array length offset new_v
- | _ -> ()
-
-let set_vector_subrange_vec_big v n m new_v =
- set_vector_subrange_vec_int v (int_of_big_int n) (int_of_big_int m) new_v
-let set_vector_subrange_vec = set_vector_subrange_vec_big (* or maybe _int *)
-
-let set_vector_subrange_bit_int v n m new_v =
- let walker array length offset new_values =
- begin
- for x = 0 to length-1
- do array.(x+offset) <- new_values.(x)
- done;
- end
- in
- match v,new_v with
- | Vvector(array,start,is_inc),Vvector(new_v,_,_) ->
- let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
- walker array length offset new_v
- | Vregister(array,start,is_inc,name,fields),Vvector(new_v,_,_) ->
- let (length,offset) = if is_inc then (m-n+1,n-start) else (n-m+1,start-n) in
- walker !array length offset new_v
- | _ -> ()
-
-let set_vector_subrange_bit_big v n m new_v =
- set_vector_subrange_bit_int v (int_of_big_int n) (int_of_big_int m) new_v
-let set_vector_subrange_bit = set_vector_subrange_bit_big
-
-let set_register_bit_int reg n v =
- match reg with
- | Vregister(array,start,inc,name,fields) ->
- begin
- if !trace_writes then
- tracef "%s[%d] <- %s\n" name n (string_of_bit v);
- (!array).(if inc then (n - start) else (start - n)) <- v
- end
- | _ -> failwith "set_register_bit of non-register"
-let set_register_bit_big reg n v = set_register_bit_int reg (int_of_big_int n) v
-let set_register_bit = set_register_bit_big
-
-let set_register_field_v reg field new_v =
- match reg with
- | Vregister(array,start,dir,name,fields) ->
- begin
- if !trace_writes then
- tracef "%s[%s] <- %s\n" name field (string_of_value new_v);
- (match List.assoc field fields with
- | (i,j) ->
- if i = j
- then ()
- else set_vector_subrange_bit_int reg i j new_v)
- end
- | _ -> ()
-
-let set_register_field_bit reg field new_v =
- match reg with
- | Vregister(array,start,dir,name,fields) ->
- begin
- if !trace_writes then
- tracef "%s.%s <- %s\n" name field (string_of_bit new_v);
- (match List.assoc field fields with
- | (i,j) ->
- if i = j
- then !array.(if dir then i - start else start - i) <- new_v
- else ())
- end
- | _ -> ()
-
-let set_two_reg r1 r2 vec =
- let size = length_int r1 in
- let dir = get_ord r1 in
- let start = get_start vec in
- let vsize = length_int vec in
- let r1_v = vector_subrange_int vec start ((if dir then size - start else start - size) - 1) in
- let r2_v = vector_subrange_int vec (if dir then size - start else start - size)
- (if dir then vsize - start else start - vsize) in
- begin set_register r1 r1_v; set_register r2 r2_v end
-
-
-let make_indexed_v entries default start size dir =
- let default_value = match default with
- | None -> Vbit Vundef
- | Some v -> v in
- let array = Array.make size default_value in
- begin
- List.iter (fun (i,v) -> array.(if dir then start - i else i - start) <- v) entries;
- VvectorR(array, start, dir)
- end
-
-let make_indexed_v_big entries default start size dir =
- make_indexed_v entries default (int_of_big_int start) (int_of_big_int size) dir
-
-let make_indexed_bitv entries default start size dir =
- let default_value = match default with
- | None -> Vundef
- | Some v -> v in
- let array = Array.make size default_value in
- begin
- List.iter (fun (i,v) -> array.(if dir then start - i else i - start) <- v) entries;
- Vvector(array, start, dir)
- end
-
-let make_indexed_bitv_big entries default start size dir =
- make_indexed_bitv entries default (int_of_big_int start) (int_of_big_int size) dir
-
-let vector_concat l r =
- match l,r with
- | Vvector(arrayl,start,ord), Vvector(arrayr,_,_) ->
- Vvector(Array.append arrayl arrayr, start, ord)
- | Vvector(arrayl,start,ord), Vregister(arrayr,_,_,_,_) ->
- Vvector(Array.append arrayl !arrayr, start,ord)
- | Vregister(arrayl,start,ord,_,_), Vvector(arrayr,_,_) ->
- Vvector(Array.append !arrayl arrayr, start, ord)
- | Vregister(arrayl,start,ord,_,_), Vregister(arrayr,_,_,_,_) ->
- Vvector(Array.append !arrayl !arrayr,start,ord)
- | VvectorR(arrayl,start,ord),VvectorR(arrayr,_,_) ->
- VvectorR(Array.append arrayl arrayr, start,ord)
- | _ -> Vbit Vundef
-
-let has_undef = function
- | Vvector(array,_,_) ->
- let rec foreach i = (* XXX ideally would use Array.mem but not in ocaml 4.02.3 *)
- if i < Array.length array
- then
- if array.(i) = Vundef then true
- else foreach (i+1)
- else false in
- foreach 0
- | Vregister(array,_,_,_,_) ->
- let array = !array in
- let rec foreach i =
- if i < Array.length array
- then
- if array.(i) = Vundef then true
- else foreach (i+1)
- else false in
- foreach 0
- | _ -> false
-
-let most_significant = function
- | Vvector(array,_,_) -> array.(0)
- | Vregister(array,_,_,_,_) -> !array.(0)
- | _ -> assert false
-
-let _most_significant = most_significant
-
-let bitwise_not_bit = function
- | Vone -> Vzero
- | Vzero -> Vone
- | _ -> Vundef
-
-let bitwise_not = function
- | Vvector(array,s,d)-> Vvector( Array.map bitwise_not_bit array,s,d)
- | Vregister(array,s,d,_,_) -> Vvector( Array.map bitwise_not_bit !array,s,d)
- | _ -> assert false
-
-let bool_to_bit b = if b then Vone else Vzero
-
-let bitwise_binop_bit op (l,r) =
- match l,r with
- | Vundef,_ | _,Vundef -> Vundef (*Do we want to do this or to respect | of One and & of Zero rules?*)
- | Vone,Vone -> bool_to_bit (op true true)
- | Vone,Vzero -> bool_to_bit (op true false)
- | Vzero,Vone -> bool_to_bit (op false true)
- | Vzero,Vzero -> bool_to_bit (op false false)
-
-let bitwise_and_bit = bitwise_binop_bit (&&)
-let bitwise_or_bit = bitwise_binop_bit (||)
-let bitwise_xor_bit = bitwise_binop_bit (<>)
-
-let bitwise_binop op (l,r) =
- let bop l arrayl arrayr =
- let array = Array.make l Vzero in
- begin
- for i = 0 to (l-1) do
- array.(i) <- bitwise_binop_bit op (arrayl.(i), arrayr.(i))
- done;
- array
- end in
- match l,r with
- | Vvector(arrayl, start, dir), Vvector(arrayr,_,_) ->
- Vvector(bop (Array.length arrayl) arrayl arrayr, start,dir)
- | Vvector(arrayl, start, dir), Vregister(arrayr,_,_,_,_) ->
- Vvector(bop (Array.length arrayl) arrayl !arrayr, start, dir)
- | Vregister(arrayl, start,dir,_,_), Vvector(arrayr,_,_) ->
- Vvector(bop (Array.length arrayr) !arrayl arrayr, start,dir)
- | Vregister(arrayl, start, dir, _, _), Vregister(arrayr,_,_,_,_) ->
- Vvector(bop (Array.length !arrayl) !arrayl !arrayr, start,dir)
- | _ -> Vbit Vundef
-
-let bitwise_and = bitwise_binop (&&)
-let bitwise_or = bitwise_binop (||)
-let bitwise_xor = bitwise_binop (<>)
-
-let rec power_int base raiseto =
- if raiseto = 0
- then 1
- else base * (power_int base (raiseto - 1))
-
-let int_of_bit_array array =
- let acc = ref 0 in
- let len = Array.length array in
- begin
- for i = 0 to len - 1 do
- acc := (!acc) lsl 1;
- match array.(i) with
- | Vone -> acc := succ (!acc)
- | _ -> ()
- done;
- !acc
- end
-
-let unsigned_int = function
- | (Vvector(array,_,_) as v) ->
- if has_undef v
- then assert false
- else int_of_bit_array array
- | (Vregister(array,_,_,_,_) as v)->
- let array = !array in
- if has_undef v
- then assert false
- else int_of_bit_array array
- | _ -> assert false
-
-let big_int_of_bit_array array =
- let acc = ref zero_big_int in
- let len = Array.length array in
- begin
- for i = 0 to len - 1 do
- acc := shift_left_big_int !acc 1;
- match array.(i) with
- | Vone -> acc := succ_big_int !acc
- | _ -> ();
- done;
- !acc
- end
-
-let unsigned_big = function
- | (Vvector(array,_,_) as v) ->
- if has_undef v
- then assert false
- else
- big_int_of_bit_array array
- | (Vregister(array,_,_,_,_) as v)->
- let array = !array in
- if has_undef v
- then assert false
- else
- big_int_of_bit_array array
- | _ -> assert false
-
-let unsigned = unsigned_big
-
-let signed_int v =
- match most_significant v with
- | Vone -> -(1 + (unsigned_int (bitwise_not v)))
- | Vzero -> unsigned_int v
- | _ -> assert false
-
-let signed_big v =
- match most_significant v with
- | Vone -> minus_big_int(add_int_big_int 1 (unsigned_big (bitwise_not v)))
- | Vzero -> unsigned_big v
- | _ -> assert false
-
-let signed = signed_big
-
-let to_num_int sign = if sign then signed_int else unsigned_int
-let to_num_big sign = if sign then signed_big else unsigned_big
-let to_num = to_num_big
-
-let two_big_int = big_int_of_int 2
-let max_64u = pred_big_int (power_big two_big_int (big_int_of_int 64))
-let max_64 = pred_big_int (power_big two_big_int (big_int_of_int 63))
-let min_64 = minus_big_int (power_big two_big_int (big_int_of_int 63))
-let max_32u = big_int_of_int 4294967295
-let max_32 = big_int_of_int 2147483647
-let min_32 = big_int_of_int (-2147483648)
-let max_8 = big_int_of_int 127
-let min_8 = big_int_of_int (-128)
-let max_5 = big_int_of_int 31
-
-let get_max_representable_in sign n =
- match (sign, n) with
- | (true, 64) -> max_64
- | (false, 64) -> max_64u
- | (true, 32) -> max_32
- | (false, 32) -> max_32u
- | (true, 8) -> max_8
- | (false, 5) -> max_5
- | (true, _) -> pred_big_int (power_big two_big_int (big_int_of_int (n-1)))
- | (false, _) -> pred_big_int (power_big two_big_int (big_int_of_int n))
-
-let get_min_representable_in sign n =
- match (sign, n) with
- | (false, _) -> zero_big_int
- | (true, 64) -> min_64
- | (true, 32) -> min_32
- | (true, 8) -> min_8
- | (true, _) -> minus_big_int (power_big two_big_int (big_int_of_int (n-1)))
-
-let to_vec_int ord len n =
- let array = Array.make len Vzero in
- let start = if ord then 0 else len-1 in
- let acc = ref n in
- for i = (len - 1) downto 0 do
- if ((!acc) land 1) = 1 then
- array.(i) <- Vone;
- acc := (!acc) asr 1
- done;
- Vvector(array, start, ord)
-
-let to_vec_big ord len n =
- let len = int_of_big_int len in
- let array = Array.make len Vzero in
- let start = if ord then 0 else len-1 in
- if eq_big_int n zero_big_int
- then Vvector(array, start, ord)
- else
- begin
- for i = 0 to len - 1 do
- if ((extract_big_int n (len - 1 - i) 1) == unit_big_int) then
- array.(i) <- Vone
- done;
- Vvector(array, start, ord)
- end
-
-let to_vec_inc_int (len,n) = to_vec_int true len n
-let to_vec_dec_int (len,n) = to_vec_int false len n
-
-let to_vec_inc_big (len,n) = to_vec_big true len n
-let to_vec_dec_big (len,n) = to_vec_big false len n
-
-let to_vec_inc = to_vec_inc_big
-let to_vec_dec = to_vec_dec_big
-
-let to_vec_undef_int ord len =
- let array = Array.make len !undef_val in
- let start = if ord then 0 else len-1 in
- Vvector(array, start, ord)
-
-let to_vec_undef_big ord len =
- let len = int_of_big_int len in
- let array = Array.make len !undef_val in
- let start = if ord then 0 else len-1 in
- Vvector(array, start, ord)
-
-let to_vec_inc_undef_int len = to_vec_undef_int true len
-let to_vec_dec_undef_int len = to_vec_undef_int false len
-
-let to_vec_inc_undef_big len = to_vec_undef_big true len
-let to_vec_dec_undef_big len = to_vec_undef_big false len
-
-let to_vec_inc_undef = to_vec_inc_undef_big
-let to_vec_dec_undef = to_vec_dec_undef_big
-
-let exts_int (len, vec) =
- let barray = get_barray(vec) in
- let vlen = Array.length barray in
- let arr =
- if (vlen < len) then
- (* copy most significant bit into new bits *)
- Array.append (Array.make (len - vlen) barray.(0)) barray
- else
- (* truncate to least significant bits *)
- Array.sub barray (vlen - len) len in
- let inc = get_ord vec in
- Vvector(arr, (if inc then 0 else (len - 1)), inc)
-
-let extz_int (len, vec) =
- let barray = get_barray(vec) in
- let vlen = Array.length barray in
- let arr =
- if (vlen < len) then
- (* fill new bits with zero *)
- Array.append (Array.make (len - vlen) Vzero) barray
- else
- (* truncate to least significant bits *)
- Array.sub barray (vlen - len) len in
- let inc = get_ord vec in
- Vvector(arr, (if inc then 0 else (len - 1)), inc)
-
-let exts_big (len,vec) = exts_int (int_of_big_int len, vec)
-let extz_big (len,vec) = extz_int (int_of_big_int len, vec)
-
-let exts = exts_big
-let extz = extz_big
-
-let arith_op op (l,r) = op l r
-let add_big = arith_op add_big_int
-let add_signed_big = arith_op add_big_int
-let minus_big = arith_op sub_big_int
-let multiply_big = arith_op mult_big_int
-let min_big = arith_op min_big_int
-let max_big = arith_op max_big_int
-(* NB Z.div is what we want because it does truncation towards zero unlike Big_int_Z.div_big_int == Z.ediv *)
-let quot_big = arith_op (Z.div)
-let modulo_big = arith_op (Z.rem)
-
-let power_big = arith_op power_big
-
-let add_int = arith_op (+)
-let add_signed_int = arith_op (+)
-let minus_int = arith_op (-)
-let multiply_int = arith_op ( * )
-let modulo_int = arith_op (mod)
-let quot_int = arith_op (/)
-
-let power_int = arith_op power_int
-
-let add = add_big
-let add_signed = add_signed_big
-let minus = minus_big
-let multiply = multiply_big
-let modulo = modulo_big
-let quot = quot_big
-let power = power_big
-let min_int = min (* the built-in version *)
-let min = min_big (* is overwritten here *)
-let max_int = max (* likewise *)
-let max = max_big
-let abs_int = abs
-let abs_big = abs_big_int
-let abs = abs_big
-
-let arith_op_vec_big op sign size (l,r) =
- let ord = get_ord l in
- let (l',r') = to_num_big sign l, to_num_big sign r in
- let n = arith_op op (l',r') in
- to_vec_big ord (mult_big_int size (length_big l)) n
-
-let add_vec_big = arith_op_vec_big add_big_int false unit_big_int
-let add_vec_signed_big = arith_op_vec_big add_big_int true unit_big_int
-let minus_vec_big = arith_op_vec_big sub_big_int false unit_big_int
-let multiply_vec_big = arith_op_vec_big mult_big_int false two_big_int
-let multiply_vec_signed_big = arith_op_vec_big mult_big_int true two_big_int
-
-let arith_op_vec_int op sign size (l,r) =
- let ord = get_ord l in
- let (l',r') = to_num_int sign l, to_num_int sign r in
- let n = arith_op op (l',r') in
- to_vec_int ord (size * (length_int l)) n
-
-let add_vec_int = arith_op_vec_int (+) false 1
-let add_vec_signed_int = arith_op_vec_int (+) true 1
-let minus_vec_int = arith_op_vec_int (-) false 1
-let multiply_vec_int = arith_op_vec_int ( * ) false 2
-let multiply_vec_signed_int = arith_op_vec_int ( * ) true 2
-
-let add_vec = add_vec_big
-let add_vec_signed = add_vec_signed_big
-let minus_vec = minus_vec_big
-let multiply_vec = multiply_vec_big
-let multiply_vec_signed = multiply_vec_signed_big
-
-
-let arith_op_vec_range_int op sign size (l,r) =
- let ord = get_ord l in
- arith_op_vec_int op sign size (l, to_vec_int ord (length_int l) r)
-
-let add_vec_range_int = arith_op_vec_range_int (+) false 1
-let add_vec_range_signed_int = arith_op_vec_range_int (+) true 1
-let minus_vec_range_int = arith_op_vec_range_int (-) false 1
-let mult_vec_range_int = arith_op_vec_range_int ( * ) false 2
-let mult_vec_range_signed_int = arith_op_vec_range_int ( * ) true 2
-
-let arith_op_vec_range_big op sign size (l,r) =
- let ord = get_ord l in
- arith_op_vec_big op sign size (l, to_vec_big ord (length_big l) r)
-
-let add_vec_range_big = arith_op_vec_range_big add_big_int false unit_big_int
-let add_vec_range_signed_big = arith_op_vec_range_big add_big_int true unit_big_int
-let minus_vec_range_big = arith_op_vec_range_big sub_big_int false unit_big_int
-let mult_vec_range_big = arith_op_vec_range_big mult_big_int false two_big_int
-let mult_vec_range_signed_big = arith_op_vec_range_big mult_big_int true two_big_int
-
-let add_vec_range = add_vec_range_big
-let add_vec_range_signed = add_vec_range_signed_big
-let minus_vec_range = minus_vec_range_big
-let mult_vec_range = mult_vec_range_big
-let mult_vec_range_signed = mult_vec_range_signed_big
-
-let arith_op_range_vec_int op sign size (l,r) =
- let ord = get_ord r in
- arith_op_vec_int op sign size ((to_vec_int ord (length_int r) l), r)
-
-let add_range_vec_int = arith_op_range_vec_int (+) false 1
-let add_range_vec_signed_int = arith_op_range_vec_int (+) true 1
-let minus_range_vec_int = arith_op_range_vec_int (-) false 1
-let mult_range_vec_int = arith_op_range_vec_int ( * ) false 2
-let mult_range_vec_signed_int = arith_op_range_vec_int ( * ) true 2
-
-let arith_op_range_vec_big op sign size (l,r) =
- let ord = get_ord r in
- arith_op_vec_big op sign size ((to_vec_big ord (length_big r) l), r)
-
-let add_range_vec_big = arith_op_range_vec_big add_big_int false unit_big_int
-let add_range_vec_signed_big = arith_op_range_vec_big add_big_int true unit_big_int
-let minus_range_vec_big = arith_op_range_vec_big sub_big_int false unit_big_int
-let mult_range_vec_big = arith_op_range_vec_big mult_big_int false two_big_int
-let mult_range_vec_signed_big = arith_op_range_vec_big mult_big_int true two_big_int
-
-let add_range_vec = add_range_vec_big
-let add_range_vec_signed = add_range_vec_signed_big
-let minus_range_vec = minus_range_vec_big
-let mult_range_vec = mult_range_vec_big
-let mult_range_vec_signed = mult_range_vec_signed_big
-
-
-let arith_op_range_vec_range_int op sign (l,r) = arith_op op (l, to_num_int sign r)
-
-let add_range_vec_range_int = arith_op_range_vec_range_int (+) false
-let add_range_vec_range_signed_int = arith_op_range_vec_range_int (+) true
-let minus_range_vec_range_int = arith_op_range_vec_range_int (-) false
-
-let arith_op_range_vec_range_big op sign (l,r) = arith_op op (l, to_num_big sign r)
-
-let add_range_vec_range_big = arith_op_range_vec_range_big add_big_int false
-let add_range_vec_range_signed_big = arith_op_range_vec_range_big add_big_int true
-let minus_range_vec_range_big = arith_op_range_vec_range_big sub_big_int false
-
-let add_range_vec_range = add_range_vec_range_big
-let add_range_vec_range_signed = add_range_vec_range_signed_big
-let minus_range_vec_range = minus_range_vec_range_big
-
-let arith_op_vec_range_range_int op sign (l,r) = arith_op op (to_num_int sign l,r)
-
-let add_vec_range_range_int = arith_op_vec_range_range_int (+) false
-let add_vec_range_range_signed_int = arith_op_vec_range_range_int (+) true
-let minus_vec_range_range_int = arith_op_vec_range_range_int (-) false
-
-let arith_op_vec_range_range_big op sign (l,r) = arith_op op (to_num_big sign l,r)
-
-let add_vec_range_range_big = arith_op_vec_range_range_big add_big_int false
-let add_vec_range_range_signed_big = arith_op_vec_range_range_big add_big_int true
-let minus_vec_range_range_big = arith_op_vec_range_range_big sub_big_int false
-
-let add_vec_range_range = add_vec_range_range_big
-let add_vec_range_range_signed = add_vec_range_range_signed_big
-let minus_vec_range_range = minus_vec_range_range_big
-
-
-let arith_op_vec_vec_range_int op sign (l,r) =
- let (l',r') = (to_num_int sign l,to_num_int sign r) in
- arith_op op (l',r')
-
-let add_vec_vec_range_int = arith_op_vec_vec_range_int (+) false
-let add_vec_vec_range_signed_int = arith_op_vec_vec_range_int (+) true
-
-let arith_op_vec_vec_range_big op sign (l,r) =
- let (l',r') = (to_num_big sign l,to_num_big sign r) in
- arith_op op (l',r')
-
-let add_vec_vec_range_big = arith_op_vec_vec_range_big add_big_int false
-let add_vec_vec_range_signed_big = arith_op_vec_vec_range_big add_big_int true
-
-let add_vec_vec_range = add_vec_vec_range_big
-let add_vec_vec_range_signed = add_vec_vec_range_signed_big
-
-let arith_op_vec_bit_int op sign (l,r) =
- let ord = get_ord l in
- let l' = to_num_int sign l in
- let n = arith_op op (l', match r with | Vone -> 1 | _ -> 0) in
- to_vec_int ord (length_int l) n
-
-let add_vec_bit_int = arith_op_vec_bit_int (+) false
-let add_vec_bit_signed_int = arith_op_vec_bit_int (+) true
-let minus_vec_bit_int = arith_op_vec_bit_int (-) true
-
-let arith_op_vec_bit_big op sign (l,r) =
- let ord = get_ord l in
- let l' = to_num_big sign l in
- let n = arith_op op (l', match r with | Vone -> unit_big_int | _ -> zero_big_int) in
- to_vec_big ord (length_big l) n
-
-let add_vec_bit_big = arith_op_vec_bit_big add_big_int false
-let add_vec_bit_signed_big = arith_op_vec_bit_big add_big_int true
-let minus_vec_bit_big = arith_op_vec_bit_big sub_big_int true
-
-let add_vec_bit = add_vec_bit_big
-let add_vec_bit_signed = add_vec_bit_signed_big
-let minus_vec_bit = minus_vec_bit_big
-
-
-let rec arith_op_overflow_vec_int op sign size (l,r) =
- let ord = get_ord l in
- let len = length_int l in
- let act_size = len * size in
- let (l_sign,r_sign) = (to_num_int sign l,to_num_int sign r) in
- let (l_unsign,r_unsign) = (to_num_int false l,to_num_int false r) in
- let n = arith_op op (l_sign,r_sign) in
- let n_unsign = arith_op op (l_unsign,r_unsign) in
- let correct_size_num = to_vec_int ord act_size n in
- let one_more_size_u = to_vec_int ord (act_size +1) n_unsign in
- let overflow = if (n <= (int_of_big_int (get_max_representable_in sign len))) &&
- (n >= (int_of_big_int (get_min_representable_in sign len)))
- then Vzero
- else Vone in
- let c_out = most_significant one_more_size_u in
- (correct_size_num,overflow,c_out)
-
-let add_overflow_vec_int = arith_op_overflow_vec_int (+) false 1
-let add_overflow_vec_signed_int = arith_op_overflow_vec_int (+) true 1
-let minus_overflow_vec_int = arith_op_overflow_vec_int (-) false 1
-let minus_overflow_vec_signed_int = arith_op_overflow_vec_int (-) true 1
-let mult_overflow_vec_int = arith_op_overflow_vec_int ( * ) false 2
-let mult_overflow_vec_signed_int = arith_op_overflow_vec_int ( * ) true 2
-
-let rec arith_op_overflow_vec_big op sign size (l,r) =
- let ord = get_ord l in
- let len = length_big l in
- let act_size = mult_big_int len size in
- let (l_sign,r_sign) = (to_num_big sign l,to_num_big sign r) in
- let (l_unsign,r_unsign) = (to_num_big false l,to_num_big false r) in
- let n = arith_op op (l_sign,r_sign) in
- let n_unsign = arith_op op (l_unsign,r_unsign) in
- let correct_size_num = to_vec_big ord act_size n in
- let one_more_size_u = to_vec_big ord (succ_big_int act_size) n_unsign in
- let overflow = if (le_big_int n (get_max_representable_in sign (int_of_big_int len))) &&
- (ge_big_int n (get_min_representable_in sign (int_of_big_int len)))
- then Vzero
- else Vone in
- let c_out = most_significant one_more_size_u in
- (correct_size_num,overflow,c_out)
-
-let add_overflow_vec_big = arith_op_overflow_vec_big add_big_int false unit_big_int
-let add_overflow_vec_signed_big = arith_op_overflow_vec_big add_big_int true unit_big_int
-let minus_overflow_vec_big = arith_op_overflow_vec_big sub_big_int false unit_big_int
-let minus_overflow_vec_signed_big = arith_op_overflow_vec_big sub_big_int true unit_big_int
-let mult_overflow_vec_big = arith_op_overflow_vec_big mult_big_int false two_big_int
-let mult_overflow_vec_signed_big = arith_op_overflow_vec_big mult_big_int true two_big_int
-
-let add_overflow_vec = add_overflow_vec_big
-let add_overflow_vec_signed = add_overflow_vec_signed_big
-let minus_overflow_vec = minus_overflow_vec_big
-let minus_overflow_vec_signed = minus_overflow_vec_signed_big
-let mult_overflow_vec = mult_overflow_vec_big
-let mult_overflow_vec_signed = mult_overflow_vec_signed_big
-
-let rec arith_op_overflow_vec_bit_int op sign (l,r_bit) =
- let ord = get_ord l in
- let act_size = length_int l in
- let l' = to_num_int sign l in
- let l_u = to_num_int false l in
- let (n,nu,changed) = match r_bit with
- | Vone -> (arith_op op (l',1), arith_op op (l_u,1), true)
- | Vzero -> (l',l_u,false)
- | _ -> assert false
- in
- let correct_size_num = to_vec_int ord act_size n in
- let one_larger = to_vec_int ord (1+ act_size) nu in
- let overflow =
- if changed
- then if (n <= (int_of_big_int (get_max_representable_in sign act_size))) &&
- (n >= (int_of_big_int (get_min_representable_in sign act_size)))
- then Vzero
- else Vone
- else Vone in
- (correct_size_num,overflow,most_significant one_larger)
-
-let add_overflow_vec_bit_signed_int = arith_op_overflow_vec_bit_int (+) true
-let minus_overflow_vec_bit_int = arith_op_overflow_vec_bit_int (-) false
-let minus_overflow_vec_bit_signed_int = arith_op_overflow_vec_bit_int (-) true
-
-let rec arith_op_overflow_vec_bit_big op sign (l,r_bit) =
- let ord = get_ord l in
- let act_size = length_big l in
- let l' = to_num_big sign l in
- let l_u = to_num_big false l in
- let (n,nu,changed) = match r_bit with
- | Vone -> (arith_op op (l',unit_big_int), arith_op op (l_u,unit_big_int), true)
- | Vzero -> (l',l_u,false)
- | _ -> assert false
- in
- let correct_size_num = to_vec_big ord act_size n in
- let one_larger = to_vec_big ord (succ_big_int act_size) nu in
- let overflow =
- if changed
- then if (le_big_int n (get_max_representable_in sign (int_of_big_int act_size))) &&
- (ge_big_int n (get_min_representable_in sign (int_of_big_int act_size)))
- then Vzero
- else Vone
- else Vone in
- (correct_size_num,overflow,most_significant one_larger)
-
-let add_overflow_vec_bit_signed_big = arith_op_overflow_vec_bit_big add_big_int true
-let minus_overflow_vec_bit_big = arith_op_overflow_vec_bit_big sub_big_int false
-let minus_overflow_vec_bit_signed_big = arith_op_overflow_vec_bit_big sub_big_int true
-
-let add_overflow_vec_bit_signed = add_overflow_vec_bit_signed_big
-let minus_overflow_vec_bit = minus_overflow_vec_bit_big
-let minus_overflow_vec_bit_signed = minus_overflow_vec_bit_signed_big
-
-let shift_op_vec_int op (l,r) =
- match l with
- | Vvector(_,start,ord) | Vregister(_,start,ord,_,_) ->
- let array = match l with | Vvector(array,_,_) -> array | Vregister(array,_,_,_,_) -> !array | _ -> assert false in
- let len = Array.length array in
- (match op with
- | "<<" ->
- if (r <= len) then
- let left = Array.sub array r (len - r) in
- let right = Array.make r Vzero in
- let result = Array.append left right in
- Vvector(result, start, ord)
- else
- Vvector(Array.make len Vzero, start, ord)
- | ">>" ->
- if (r <= len) then
- let left = Array.make r Vzero in
- let right = Array.sub array 0 (len - r) in
- let result = Array.append left right in
- Vvector(result, start, ord)
- else
- Vvector(Array.make len Vzero, start, ord)
- | "<<<" ->
- let rmod = r mod len in
- let left = Array.sub array rmod (len - rmod) in
- let right = Array.sub array 0 rmod in
- let result = Array.append left right in
- Vvector(result, start, ord)
- | _ -> assert false)
- | _ -> assert false
-
-let shift_op_vec_big op (l,r) = shift_op_vec_int op (l, int_of_big_int r)
-let bitwise_leftshift_big = shift_op_vec_big "<<"
-let bitwise_rightshift_big = shift_op_vec_big ">>"
-let bitwise_rotate_big = shift_op_vec_big "<<<"
-
-let bitwise_leftshift = bitwise_leftshift_big
-let bitwise_rightshift = bitwise_rightshift_big
-let bitwise_rotate = bitwise_rotate_big
-
-let rec arith_op_no0_big op (l,r) =
- if eq_big_int r zero_big_int
- then None
- else Some (op l r)
-
-let modulo_no0_big = arith_op_no0_big (Z.rem)
-let quot_no0_big = arith_op_no0_big (Z.div)
-
-let rec arith_op_no0_int op (l,r) =
- if r = 0
- then None
- else Some (op l r)
-
-let rec arith_op_vec_no0_int op sign size (l,r) =
- let ord = get_ord l in
- let act_size = ((length_int l) * size) in
- let (l',r') = (to_num_int sign l,to_num_int sign r) in
- let n = arith_op_no0_int op (l',r') in
- let representable,n' =
- match n with
- | Some n' ->
- ((n' <= (int_of_big_int (get_max_representable_in sign act_size))) &&
- (n' >= (int_of_big_int (get_min_representable_in sign act_size)))), n'
- | _ -> false,0 in
- if representable
- then to_vec_int ord act_size n'
- else
- match l with
- | Vvector(_, start, _) | Vregister(_, start, _, _, _) ->
- Vvector((Array.make act_size Vundef), start, ord)
- | _ -> assert false
-
-let mod_vec_int = arith_op_vec_no0_int (mod) false 1
-let quot_vec_int = arith_op_vec_no0_int (/) false 1
-let quot_vec_signed_int = arith_op_vec_no0_int (/) true 1
-
-let rec arith_op_vec_no0_big op sign size (l,r) =
- let ord = get_ord l in
- let act_size = int_of_big_int (mult_int_big_int (length_int l) size) in
- let (l',r') = (to_num_big sign l,to_num_big sign r) in
- let n = arith_op_no0_big op (l',r') in
- let representable,n' =
- match n with
- | Some n' ->
- ((le_big_int n' (get_max_representable_in sign act_size)) &&
- (ge_big_int n' (get_min_representable_in sign act_size))), n'
- | _ -> false,zero_big_int in
- if representable
- then to_vec_big ord (big_int_of_int act_size) n'
- else
- match l with
- | Vvector(_, start, _) | Vregister(_, start, _, _, _) ->
- Vvector((Array.make act_size Vundef), start, ord)
- | _ -> assert false
-
-let mod_vec_big = arith_op_vec_no0_big (Z.rem) false unit_big_int
-let quot_vec_big = arith_op_vec_no0_big (Z.div) false unit_big_int
-let quot_vec_signed_big = arith_op_vec_no0_big (Z.div) true unit_big_int
-
-let mod_vec = mod_vec_big
-let quot_vec = quot_vec_big
-let quot_vec_signed = quot_vec_signed_big
-
-let arith_op_overflow_no0_vec_int op sign size (l,r) =
- let ord = get_ord l in
- let rep_size = (length_int r) * size in
- let act_size = (length_int l) * size in
- let (l',r') = ((to_num_int sign l),(to_num_int sign r)) in
- let (l_u,r_u) = (to_num_int false l,to_num_int false r) in
- let n = arith_op_no0_int op (l',r') in
- let n_u = arith_op_no0_int op (l_u,r_u) in
- let representable,n',n_u' =
- match n, n_u with
- | Some n',Some n_u' ->
- ((n' <= (int_of_big_int (get_max_representable_in sign rep_size))) &&
- (n' >= (int_of_big_int (get_min_representable_in sign rep_size))), n', n_u')
- | _ -> true,0,0 in
- let (correct_size_num,one_more) =
- if representable then
- (to_vec_int ord act_size n',to_vec_int ord (1+act_size) n_u')
- else match l with
- | Vvector(_, start, _) | Vregister(_, start, _, _, _) ->
- Vvector((Array.make act_size Vundef), start, ord),
- Vvector((Array.make (act_size + 1) Vundef), start, ord)
- | _ -> assert false in
- let overflow = if representable then Vzero else Vone in
- (correct_size_num,overflow,most_significant one_more)
-
-let quot_overflow_vec_int = arith_op_overflow_no0_vec_int (/) false 1
-let quot_overflow_vec_signed_int = arith_op_overflow_no0_vec_int (/) true 1
-
-let arith_op_overflow_no0_vec_big op sign size (l,r) =
- let ord = get_ord l in
- let rep_size = mult_big_int (length_big r) size in
- let act_size = mult_big_int (length_big l) size in
- let (l',r') = ((to_num_big sign l),(to_num_big sign r)) in
- let (l_u,r_u) = (to_num_big false l,to_num_big false r) in
- let n = arith_op_no0_big op (l',r') in
- let n_u = arith_op_no0_big op (l_u,r_u) in
- let representable,n',n_u' =
- match n, n_u with
- | Some n',Some n_u' ->
- ((le_big_int n' (get_max_representable_in sign (int_of_big_int rep_size))) &&
- (ge_big_int n' (get_min_representable_in sign (int_of_big_int rep_size))), n', n_u')
- | _ -> true,zero_big_int,zero_big_int in
- let (correct_size_num,one_more) =
- if representable then
- (to_vec_big ord act_size n',to_vec_big ord (succ_big_int act_size) n_u')
- else match l with
- | Vvector(_, start, _) | Vregister(_, start, _, _, _) ->
- Vvector((Array.make (int_of_big_int act_size) Vundef), start, ord),
- Vvector((Array.make ((int_of_big_int act_size) + 1) Vundef), start, ord)
- | _ -> assert false in
- let overflow = if representable then Vzero else Vone in
- (correct_size_num,overflow,most_significant one_more)
-
-let quot_overflow_vec_big = arith_op_overflow_no0_vec_big (Z.div) false unit_big_int
-let quot_overflow_vec_signed_big = arith_op_overflow_no0_vec_big (Z.div) true unit_big_int
-
-let quot_overflow_vec = quot_overflow_vec_big
-let quot_overflow_vec_signed = quot_overflow_vec_signed_big
-
-
-let arith_op_vec_range_no0_int op sign size (l,r) =
- let ord = get_ord l in
- arith_op_vec_no0_int op sign size (l,(to_vec_int ord (length_int l) r))
-
-let mod_vec_range_int = arith_op_vec_range_no0_int (mod) false 1
-
-let arith_op_vec_range_no0_big op sign size (l,r) =
- let ord = get_ord l in
- arith_op_vec_no0_big op sign size (l,(to_vec_big ord (length_big l) r))
-
-let mod_vec_range_big = arith_op_vec_range_no0_big (Z.rem) false unit_big_int
-
-let mod_vec_range = mod_vec_range_big
-
-(* XXX Need to have a default top level direction reference I think*)
-let duplicate_int (bit,length) =
- Vvector((Array.make length bit), (length-1), false)
-
-let duplicate_big (bit,length) =
- duplicate_int (bit, int_of_big_int length)
-
-let duplicate = duplicate_big
-
-let duplicate_bits_big (bits, x) =
- let len = (length_int bits) * (int_of_big_int x) in
- let is_inc = get_ord bits in
- let bits_arr = get_barray bits in
- let arr = Array.concat (Array.to_list(Array.make (int_of_big_int x) bits_arr)) in
- Vvector(arr, (if is_inc then 0 else (len - 1)), is_inc)
-
-let duplicate_bits = duplicate_bits_big
-
-let compare_op op (l,r) =
- if (op l r)
- then Vone
- else Vzero
-
-let lt_big = compare_op lt_big_int
-let gt_big = compare_op gt_big_int
-let lteq_big = compare_op le_big_int
-let gteq_big = compare_op ge_big_int
-let lt_int : (int* int) -> vbit = compare_op (<)
-let gt_int : (int * int) -> vbit = compare_op (>)
-let lteq_int : (int * int) -> vbit = compare_op (<=)
-let gteq_int : (int*int) -> vbit = compare_op (>=)
-
-let lt = lt_big
-let gt = gt_big
-let lteq = lteq_big
-let gteq = gteq_big
-
-let compare_op_vec_int op sign (l,r) =
- let (l',r') = (to_num_int sign l, to_num_int sign r) in
- compare_op op (l',r')
-
-let lt_vec_int = compare_op_vec_int (<) true
-let gt_vec_int = compare_op_vec_int (>) true
-let lteq_vec_int = compare_op_vec_int (<=) true
-let gteq_vec_int = compare_op_vec_int (>=) true
-let lt_vec_signed_int = compare_op_vec_int (<) true
-let gt_vec_signed_int = compare_op_vec_int (>) true
-let lteq_vec_signed_int = compare_op_vec_int (<=) true
-let gteq_vec_signed_int = compare_op_vec_int (>=) true
-let lt_vec_unsigned_int = compare_op_vec_int (<) false
-let gt_vec_unsigned_int = compare_op_vec_int (>) false
-let lteq_vec_unsigned_int = compare_op_vec_int (<=) false
-let gteq_vec_unsigned_int = compare_op_vec_int (>=) false
-
-let compare_op_vec_big op sign (l,r) =
- let (l',r') = (to_num_big sign l, to_num_big sign r) in
- compare_op op (l',r')
-
-let lt_vec_big = compare_op_vec_big lt_big_int true
-let gt_vec_big = compare_op_vec_big gt_big_int true
-let lteq_vec_big = compare_op_vec_big le_big_int true
-let gteq_vec_big = compare_op_vec_big ge_big_int true
-let lt_vec_signed_big = compare_op_vec_big lt_big_int true
-let gt_vec_signed_big = compare_op_vec_big gt_big_int true
-let lteq_vec_signed_big = compare_op_vec_big le_big_int true
-let gteq_vec_signed_big = compare_op_vec_big ge_big_int true
-let lt_vec_unsigned_big = compare_op_vec_big lt_big_int false
-let gt_vec_unsigned_big = compare_op_vec_big gt_big_int false
-let lteq_vec_unsigned_big = compare_op_vec_big le_big_int false
-let gteq_vec_unsigned_big = compare_op_vec_big ge_big_int false
-
-let lt_vec = lt_vec_big
-let gt_vec = gt_vec_big
-let lteq_vec = lteq_vec_big
-let gteq_vec = gteq_vec_big
-let lt_vec_signed = lt_vec_signed_big
-let gt_vec_signed = gt_vec_signed_big
-let lteq_vec_signed = lteq_vec_signed_big
-let gteq_vec_signed = gteq_vec_signed_big
-let lt_vec_unsigned = lt_vec_unsigned_big
-let gt_vec_unsigned = gt_vec_unsigned_big
-let lteq_vec_unsigned = lteq_vec_unsigned_big
-let gteq_vec_unsigned = gteq_vec_unsigned_big
-
-let compare_op_vec_range_int op sign (l,r) =
- compare_op op ((to_num_int sign l),r)
-
-let lt_vec_range_int = compare_op_vec_range_int (<) true
-let gt_vec_range_int = compare_op_vec_range_int (>) true
-let lteq_vec_range_int = compare_op_vec_range_int (<=) true
-let gteq_vec_range_int = compare_op_vec_range_int (>=) true
-
-let compare_op_vec_range_big op sign (l,r) =
- compare_op op ((to_num_big sign l),r)
-
-let lt_vec_range_big = compare_op_vec_range_big lt_big_int true
-let gt_vec_range_big = compare_op_vec_range_big gt_big_int true
-let lteq_vec_range_big = compare_op_vec_range_big le_big_int true
-let gteq_vec_range_big = compare_op_vec_range_big ge_big_int true
-
-let lt_vec_range = lt_vec_range_big
-let gt_vec_range = gt_vec_range_big
-let lteq_vec_range = lteq_vec_range_big
-let gteq_vec_range = gteq_vec_range_big
-
-let compare_op_range_vec_int op sign (l,r) =
- compare_op op (l, (to_num_int sign r))
-
-let lt_range_vec_int = compare_op_range_vec_int (<) true
-let gt_range_vec_int = compare_op_range_vec_int (>) true
-let lteq_range_vec_int = compare_op_range_vec_int (<=) true
-let gteq_range_vec_int = compare_op_range_vec_int (>=) true
-
-let compare_op_range_vec_big op sign (l,r) =
- compare_op op (l, (to_num_big sign r))
-
-let lt_range_vec_big = compare_op_range_vec_big lt_big_int true
-let gt_range_vec_big = compare_op_range_vec_big gt_big_int true
-let lteq_range_vec_big = compare_op_range_vec_big le_big_int true
-let gteq_range_vec_big = compare_op_range_vec_big ge_big_int true
-
-let lt_range_vec = lt_range_vec_big
-let gt_range_vec = gt_range_vec_big
-let lteq_range_vec = lteq_range_vec_big
-let gteq_range_vec = gteq_range_vec_big
-
-let eq (l,r) = if l = r then Vone else Vzero
-let eq_vec_vec (l,r) = eq (to_num_big true l, to_num_big true r)
-let eq_vec (l,r) = eq_vec_vec(l,r)
-let eq_vec_range (l,r) = eq (to_num_big false l,r)
-let eq_range_vec (l,r) = eq (l, to_num_big false r)
-let eq_range = eq
-let eq_bit = bitwise_binop_bit (=)
-
-let neq (l,r) = bitwise_not_bit (eq (l,r))
-let neq_vec (l,r) = bitwise_not_bit (eq_vec_vec(l,r))
-let neq_vec_range (l,r) = bitwise_not_bit (eq_vec_range (l,r))
-let neq_bit (l,r) = bitwise_not_bit (eq_bit(l,r))
-let neq_range = neq
-
-let mask (n,v) =
- let n' = int_of_big_int n in
- match v with
- | Vvector (bits,start,dir) ->
- let current_size = Array.length bits in
- let to_drop = (current_size - n') in
- let bits' = Array.sub bits to_drop n' in
- Vvector (bits',(if dir then 0 else n'-1), dir)
- | Vregister (bits,start,dir,name,fields) ->
- let current_size = Array.length !bits in
- let to_drop = (current_size - n') in
- let bits' = Array.sub !bits to_drop n' in
- Vvector (bits',(if dir then 0 else n'-1), dir)
- | VvectorR _ -> failwith "mask not implemented for VregisterR"
- | Vbit _ -> failwith "mask called for bit"
-
-let slice_raw (v, i, j) =
- let i' = int_of_big_int i in
- let j' = int_of_big_int j in
- match v with
- | Vvector (bs, start, is_inc) ->
- let bits = Array.sub bs i' (j'-i'+1) in
- let len = Array.length bits in
- Vvector (bits, (if is_inc then 0 else len - 1), is_inc)
- | _ -> failwith "slice_raw only implemented for VVector"
-let _slice_raw = slice_raw
-
-(* enough literal big ints to account for most literals found in specs *)
-(* for i = 0 to 257 do Printf.printf "let bi%d = big_int_of_int %d\n" i i done;; *)
-let bi0 = zero_big_int
-let bi1 = unit_big_int
-let bi2 = big_int_of_int 2
-let bi3 = big_int_of_int 3
-let bi4 = big_int_of_int 4
-let bi5 = big_int_of_int 5
-let bi6 = big_int_of_int 6
-let bi7 = big_int_of_int 7
-let bi8 = big_int_of_int 8
-let bi9 = big_int_of_int 9
-let bi10 = big_int_of_int 10
-let bi11 = big_int_of_int 11
-let bi12 = big_int_of_int 12
-let bi13 = big_int_of_int 13
-let bi14 = big_int_of_int 14
-let bi15 = big_int_of_int 15
-let bi16 = big_int_of_int 16
-let bi17 = big_int_of_int 17
-let bi18 = big_int_of_int 18
-let bi19 = big_int_of_int 19
-let bi20 = big_int_of_int 20
-let bi21 = big_int_of_int 21
-let bi22 = big_int_of_int 22
-let bi23 = big_int_of_int 23
-let bi24 = big_int_of_int 24
-let bi25 = big_int_of_int 25
-let bi26 = big_int_of_int 26
-let bi27 = big_int_of_int 27
-let bi28 = big_int_of_int 28
-let bi29 = big_int_of_int 29
-let bi30 = big_int_of_int 30
-let bi31 = big_int_of_int 31
-let bi32 = big_int_of_int 32
-let bi33 = big_int_of_int 33
-let bi34 = big_int_of_int 34
-let bi35 = big_int_of_int 35
-let bi36 = big_int_of_int 36
-let bi37 = big_int_of_int 37
-let bi38 = big_int_of_int 38
-let bi39 = big_int_of_int 39
-let bi40 = big_int_of_int 40
-let bi41 = big_int_of_int 41
-let bi42 = big_int_of_int 42
-let bi43 = big_int_of_int 43
-let bi44 = big_int_of_int 44
-let bi45 = big_int_of_int 45
-let bi46 = big_int_of_int 46
-let bi47 = big_int_of_int 47
-let bi48 = big_int_of_int 48
-let bi49 = big_int_of_int 49
-let bi50 = big_int_of_int 50
-let bi51 = big_int_of_int 51
-let bi52 = big_int_of_int 52
-let bi53 = big_int_of_int 53
-let bi54 = big_int_of_int 54
-let bi55 = big_int_of_int 55
-let bi56 = big_int_of_int 56
-let bi57 = big_int_of_int 57
-let bi58 = big_int_of_int 58
-let bi59 = big_int_of_int 59
-let bi60 = big_int_of_int 60
-let bi61 = big_int_of_int 61
-let bi62 = big_int_of_int 62
-let bi63 = big_int_of_int 63
-let bi64 = big_int_of_int 64
-let bi65 = big_int_of_int 65
-let bi66 = big_int_of_int 66
-let bi67 = big_int_of_int 67
-let bi68 = big_int_of_int 68
-let bi69 = big_int_of_int 69
-let bi70 = big_int_of_int 70
-let bi71 = big_int_of_int 71
-let bi72 = big_int_of_int 72
-let bi73 = big_int_of_int 73
-let bi74 = big_int_of_int 74
-let bi75 = big_int_of_int 75
-let bi76 = big_int_of_int 76
-let bi77 = big_int_of_int 77
-let bi78 = big_int_of_int 78
-let bi79 = big_int_of_int 79
-let bi80 = big_int_of_int 80
-let bi81 = big_int_of_int 81
-let bi82 = big_int_of_int 82
-let bi83 = big_int_of_int 83
-let bi84 = big_int_of_int 84
-let bi85 = big_int_of_int 85
-let bi86 = big_int_of_int 86
-let bi87 = big_int_of_int 87
-let bi88 = big_int_of_int 88
-let bi89 = big_int_of_int 89
-let bi90 = big_int_of_int 90
-let bi91 = big_int_of_int 91
-let bi92 = big_int_of_int 92
-let bi93 = big_int_of_int 93
-let bi94 = big_int_of_int 94
-let bi95 = big_int_of_int 95
-let bi96 = big_int_of_int 96
-let bi97 = big_int_of_int 97
-let bi98 = big_int_of_int 98
-let bi99 = big_int_of_int 99
-let bi100 = big_int_of_int 100
-let bi101 = big_int_of_int 101
-let bi102 = big_int_of_int 102
-let bi103 = big_int_of_int 103
-let bi104 = big_int_of_int 104
-let bi105 = big_int_of_int 105
-let bi106 = big_int_of_int 106
-let bi107 = big_int_of_int 107
-let bi108 = big_int_of_int 108
-let bi109 = big_int_of_int 109
-let bi110 = big_int_of_int 110
-let bi111 = big_int_of_int 111
-let bi112 = big_int_of_int 112
-let bi113 = big_int_of_int 113
-let bi114 = big_int_of_int 114
-let bi115 = big_int_of_int 115
-let bi116 = big_int_of_int 116
-let bi117 = big_int_of_int 117
-let bi118 = big_int_of_int 118
-let bi119 = big_int_of_int 119
-let bi120 = big_int_of_int 120
-let bi121 = big_int_of_int 121
-let bi122 = big_int_of_int 122
-let bi123 = big_int_of_int 123
-let bi124 = big_int_of_int 124
-let bi125 = big_int_of_int 125
-let bi126 = big_int_of_int 126
-let bi127 = big_int_of_int 127
-let bi128 = big_int_of_int 128
-let bi129 = big_int_of_int 129
-let bi130 = big_int_of_int 130
-let bi131 = big_int_of_int 131
-let bi132 = big_int_of_int 132
-let bi133 = big_int_of_int 133
-let bi134 = big_int_of_int 134
-let bi135 = big_int_of_int 135
-let bi136 = big_int_of_int 136
-let bi137 = big_int_of_int 137
-let bi138 = big_int_of_int 138
-let bi139 = big_int_of_int 139
-let bi140 = big_int_of_int 140
-let bi141 = big_int_of_int 141
-let bi142 = big_int_of_int 142
-let bi143 = big_int_of_int 143
-let bi144 = big_int_of_int 144
-let bi145 = big_int_of_int 145
-let bi146 = big_int_of_int 146
-let bi147 = big_int_of_int 147
-let bi148 = big_int_of_int 148
-let bi149 = big_int_of_int 149
-let bi150 = big_int_of_int 150
-let bi151 = big_int_of_int 151
-let bi152 = big_int_of_int 152
-let bi153 = big_int_of_int 153
-let bi154 = big_int_of_int 154
-let bi155 = big_int_of_int 155
-let bi156 = big_int_of_int 156
-let bi157 = big_int_of_int 157
-let bi158 = big_int_of_int 158
-let bi159 = big_int_of_int 159
-let bi160 = big_int_of_int 160
-let bi161 = big_int_of_int 161
-let bi162 = big_int_of_int 162
-let bi163 = big_int_of_int 163
-let bi164 = big_int_of_int 164
-let bi165 = big_int_of_int 165
-let bi166 = big_int_of_int 166
-let bi167 = big_int_of_int 167
-let bi168 = big_int_of_int 168
-let bi169 = big_int_of_int 169
-let bi170 = big_int_of_int 170
-let bi171 = big_int_of_int 171
-let bi172 = big_int_of_int 172
-let bi173 = big_int_of_int 173
-let bi174 = big_int_of_int 174
-let bi175 = big_int_of_int 175
-let bi176 = big_int_of_int 176
-let bi177 = big_int_of_int 177
-let bi178 = big_int_of_int 178
-let bi179 = big_int_of_int 179
-let bi180 = big_int_of_int 180
-let bi181 = big_int_of_int 181
-let bi182 = big_int_of_int 182
-let bi183 = big_int_of_int 183
-let bi184 = big_int_of_int 184
-let bi185 = big_int_of_int 185
-let bi186 = big_int_of_int 186
-let bi187 = big_int_of_int 187
-let bi188 = big_int_of_int 188
-let bi189 = big_int_of_int 189
-let bi190 = big_int_of_int 190
-let bi191 = big_int_of_int 191
-let bi192 = big_int_of_int 192
-let bi193 = big_int_of_int 193
-let bi194 = big_int_of_int 194
-let bi195 = big_int_of_int 195
-let bi196 = big_int_of_int 196
-let bi197 = big_int_of_int 197
-let bi198 = big_int_of_int 198
-let bi199 = big_int_of_int 199
-let bi200 = big_int_of_int 200
-let bi201 = big_int_of_int 201
-let bi202 = big_int_of_int 202
-let bi203 = big_int_of_int 203
-let bi204 = big_int_of_int 204
-let bi205 = big_int_of_int 205
-let bi206 = big_int_of_int 206
-let bi207 = big_int_of_int 207
-let bi208 = big_int_of_int 208
-let bi209 = big_int_of_int 209
-let bi210 = big_int_of_int 210
-let bi211 = big_int_of_int 211
-let bi212 = big_int_of_int 212
-let bi213 = big_int_of_int 213
-let bi214 = big_int_of_int 214
-let bi215 = big_int_of_int 215
-let bi216 = big_int_of_int 216
-let bi217 = big_int_of_int 217
-let bi218 = big_int_of_int 218
-let bi219 = big_int_of_int 219
-let bi220 = big_int_of_int 220
-let bi221 = big_int_of_int 221
-let bi222 = big_int_of_int 222
-let bi223 = big_int_of_int 223
-let bi224 = big_int_of_int 224
-let bi225 = big_int_of_int 225
-let bi226 = big_int_of_int 226
-let bi227 = big_int_of_int 227
-let bi228 = big_int_of_int 228
-let bi229 = big_int_of_int 229
-let bi230 = big_int_of_int 230
-let bi231 = big_int_of_int 231
-let bi232 = big_int_of_int 232
-let bi233 = big_int_of_int 233
-let bi234 = big_int_of_int 234
-let bi235 = big_int_of_int 235
-let bi236 = big_int_of_int 236
-let bi237 = big_int_of_int 237
-let bi238 = big_int_of_int 238
-let bi239 = big_int_of_int 239
-let bi240 = big_int_of_int 240
-let bi241 = big_int_of_int 241
-let bi242 = big_int_of_int 242
-let bi243 = big_int_of_int 243
-let bi244 = big_int_of_int 244
-let bi245 = big_int_of_int 245
-let bi246 = big_int_of_int 246
-let bi247 = big_int_of_int 247
-let bi248 = big_int_of_int 248
-let bi249 = big_int_of_int 249
-let bi250 = big_int_of_int 250
-let bi251 = big_int_of_int 251
-let bi252 = big_int_of_int 252
-let bi253 = big_int_of_int 253
-let bi254 = big_int_of_int 254
-let bi255 = big_int_of_int 255
-let bi256 = big_int_of_int 256
-let bi257 = big_int_of_int 257