Source file is_one_hot.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
open Base
open Hardcaml
module Make (Comb : Comb.S) = struct
open Comb
type nonrec t =
{ no_bit_set : t
; one_bit_set : t
; many_bits_set : t
}
let create vec =
let any_bit_set, many_bits_set =
List.fold (bits_msb vec) ~init:(gnd, gnd) ~f:(fun (any_bit_set, overflow) bit ->
any_bit_set |: bit, overflow |: (any_bit_set &: bit))
in
let no_bit_set = ~:any_bit_set in
let one_bit_set = any_bit_set &: ~:many_bits_set in
{ no_bit_set; one_bit_set; many_bits_set }
;;
end