15 structure Word_Lib: WORD_LIB = |
15 structure Word_Lib: WORD_LIB = |
16 struct |
16 struct |
17 |
17 |
18 fun dest_binT T = |
18 fun dest_binT T = |
19 (case T of |
19 (case T of |
20 Type (@{type_name "Numeral_Type.num0"}, _) => 0 |
20 Type (\<^type_name>\<open>Numeral_Type.num0\<close>, _) => 0 |
21 | Type (@{type_name "Numeral_Type.num1"}, _) => 1 |
21 | Type (\<^type_name>\<open>Numeral_Type.num1\<close>, _) => 1 |
22 | Type (@{type_name "Numeral_Type.bit0"}, [T]) => 2 * dest_binT T |
22 | Type (\<^type_name>\<open>Numeral_Type.bit0\<close>, [T]) => 2 * dest_binT T |
23 | Type (@{type_name "Numeral_Type.bit1"}, [T]) => 1 + 2 * dest_binT T |
23 | Type (\<^type_name>\<open>Numeral_Type.bit1\<close>, [T]) => 1 + 2 * dest_binT T |
24 | _ => raise TYPE ("dest_binT", [T], [])) |
24 | _ => raise TYPE ("dest_binT", [T], [])) |
25 |
25 |
26 fun is_wordT (Type (@{type_name word}, _)) = true |
26 fun is_wordT (Type (\<^type_name>\<open>word\<close>, _)) = true |
27 | is_wordT _ = false |
27 | is_wordT _ = false |
28 |
28 |
29 fun dest_wordT (Type (@{type_name word}, [T])) = dest_binT T |
29 fun dest_wordT (Type (\<^type_name>\<open>word\<close>, [T])) = dest_binT T |
30 | dest_wordT T = raise TYPE ("dest_wordT", [T], []) |
30 | dest_wordT T = raise TYPE ("dest_wordT", [T], []) |
31 |
31 |
32 |
32 |
33 fun mk_bitT i T = |
33 fun mk_bitT i T = |
34 if i = 0 |
34 if i = 0 |
35 then Type (@{type_name "Numeral_Type.bit0"}, [T]) |
35 then Type (\<^type_name>\<open>Numeral_Type.bit0\<close>, [T]) |
36 else Type (@{type_name "Numeral_Type.bit1"}, [T]) |
36 else Type (\<^type_name>\<open>Numeral_Type.bit1\<close>, [T]) |
37 |
37 |
38 fun mk_binT size = |
38 fun mk_binT size = |
39 if size = 0 then @{typ "Numeral_Type.num0"} |
39 if size = 0 then \<^typ>\<open>Numeral_Type.num0\<close> |
40 else if size = 1 then @{typ "Numeral_Type.num1"} |
40 else if size = 1 then \<^typ>\<open>Numeral_Type.num1\<close> |
41 else let val (q, r) = Integer.div_mod size 2 in mk_bitT r (mk_binT q) end |
41 else let val (q, r) = Integer.div_mod size 2 in mk_bitT r (mk_binT q) end |
42 |
42 |
43 fun mk_wordT size = |
43 fun mk_wordT size = |
44 if size >= 0 then Type (@{type_name "word"}, [mk_binT size]) |
44 if size >= 0 then Type (\<^type_name>\<open>word\<close>, [mk_binT size]) |
45 else raise TYPE ("mk_wordT: " ^ string_of_int size, [], []) |
45 else raise TYPE ("mk_wordT: " ^ string_of_int size, [], []) |
46 |
46 |
47 end |
47 end |