use crate::tfhe::bdd_arithmetic::{BitCircuit, BitCircuitInfo, Circuit, GetBitCircuitInfo, Node}; pub(crate) enum AnyBitCircuit { B0(BitCircuit<219, 64>), } impl BitCircuitInfo for AnyBitCircuit { fn info(&self) -> (&[Node], &[usize], usize) { match self { AnyBitCircuit::B0(bit_circuit) => ( bit_circuit.nodes.as_ref(), bit_circuit.levels.as_ref(), bit_circuit.max_inter_state, ), } } } impl GetBitCircuitInfo for Circuit { fn input_size(&self) -> usize { 2 * u32::BITS as usize } fn output_size(&self) -> usize { 1 } fn get_circuit(&self, bit: usize) -> (&[Node], &[usize], usize) { self.0[bit].info() } } pub(crate) static OUTPUT_CIRCUITS: Circuit = Circuit([AnyBitCircuit::B0(BitCircuit::new( [ Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(32, 1, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(0, 0, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(33, 1, 2), Node::new(33, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(1, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(34, 1, 2), Node::new(34, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(2, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(35, 2, 0), Node::new(35, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(3, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(36, 1, 2), Node::new(36, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(4, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(37, 1, 2), Node::new(37, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(5, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(38, 2, 0), Node::new(38, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(6, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(39, 2, 0), Node::new(39, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(7, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(40, 1, 2), Node::new(40, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(8, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(41, 1, 2), Node::new(41, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(9, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(42, 2, 0), Node::new(42, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(10, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(43, 2, 0), Node::new(43, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(11, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(44, 1, 2), Node::new(44, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(12, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(45, 1, 2), Node::new(45, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(13, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(46, 2, 0), Node::new(46, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(14, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(47, 1, 2), Node::new(47, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(15, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(48, 2, 0), Node::new(48, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(16, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(49, 1, 2), Node::new(49, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(17, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(50, 2, 0), Node::new(50, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(18, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(51, 2, 0), Node::new(51, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(19, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(52, 1, 2), Node::new(52, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(20, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(53, 2, 0), Node::new(53, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(21, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(54, 1, 2), Node::new(54, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(22, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(55, 1, 2), Node::new(55, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(23, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(56, 2, 0), Node::new(56, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(24, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(57, 1, 2), Node::new(57, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(25, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(58, 2, 0), Node::new(58, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(26, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(59, 2, 0), Node::new(59, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(27, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(60, 2, 0), Node::new(60, 1, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(28, 2, 3), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(61, 1, 2), Node::new(61, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(29, 3, 2), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(62, 1, 2), Node::new(62, 2, 0), Node::new(0, 0, 0), Node::new(0, 1, 1), Node::new(30, 3, 2), Node::new(63, 2, 1), Node::new(63, 0, 2), Node::new(31, 0, 1), ], [ 0, 3, 6, 10, 13, 17, 20, 24, 27, 31, 34, 38, 41, 45, 48, 52, 55, 59, 62, 66, 69, 73, 76, 80, 83, 87, 90, 94, 97, 101, 104, 108, 111, 115, 118, 122, 125, 129, 132, 136, 139, 143, 146, 150, 153, 157, 160, 164, 167, 171, 174, 178, 181, 185, 188, 192, 195, 199, 202, 206, 209, 213, 216, 218, ], 4, ))]);