arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-schemes/src/tfhe/bdd_arithmetic/bdd_2w_to_1w.rs
poulpy-schemes/src/tfhe/bdd_arithmetic/bdd_2w_to_1w.rsRaw
  1use itertools::Itertools;
  2use poulpy_core::layouts::prepared::GGSWPreparedToRef;
  3use poulpy_hal::layouts::{Backend, DataMut, DataRef, Module, Scratch};
  4
  5use crate::tfhe::bdd_arithmetic::{
  6    ExecuteBDDCircuit, FheUintBlocks, FheUintBlocksPrepared, GetBitCircuitInfo, UnsignedInteger, circuits,
  7};
  8
  9impl<T: UnsignedInteger, BE: Backend> ExecuteBDDCircuit2WTo1W<T, BE> for Module<BE> where Self: Sized + ExecuteBDDCircuit<T, BE> {}
 10
 11pub trait ExecuteBDDCircuit2WTo1W<T: UnsignedInteger, BE: Backend>
 12where
 13    Self: Sized + ExecuteBDDCircuit<T, BE>,
 14{
 15    /// Operations Z x Z -> Z
 16    fn execute_bdd_circuit_2w_to_1w<R, C, A, B>(
 17        &self,
 18        out: &mut FheUintBlocks<R, T>,
 19        circuit: &C,
 20        a: &FheUintBlocksPrepared<A, T, BE>,
 21        b: &FheUintBlocksPrepared<B, T, BE>,
 22        scratch: &mut Scratch<BE>,
 23    ) where
 24        C: GetBitCircuitInfo<T>,
 25        R: DataMut,
 26        A: DataRef,
 27        B: DataRef,
 28    {
 29        assert_eq!(out.blocks.len(), T::WORD_SIZE);
 30        assert_eq!(b.blocks.len(), T::WORD_SIZE);
 31        assert_eq!(b.blocks.len(), T::WORD_SIZE);
 32
 33        // Collects inputs into a single array
 34        let inputs: Vec<&dyn GGSWPreparedToRef<BE>> = a
 35            .blocks
 36            .iter()
 37            .map(|x| x as &dyn GGSWPreparedToRef<BE>)
 38            .chain(b.blocks.iter().map(|x| x as &dyn GGSWPreparedToRef<BE>))
 39            .collect_vec();
 40
 41        // Evaluates out[i] = circuit[i](a, b)
 42        self.execute_bdd_circuit(&mut out.blocks, &inputs, circuit, scratch);
 43    }
 44}
 45
 46#[macro_export]
 47macro_rules! define_bdd_2w_to_1w_trait {
 48    ($(#[$meta:meta])* $vis:vis $trait_name:ident, $method_name:ident) => {
 49        $(#[$meta])*
 50        $vis trait $trait_name<T: UnsignedInteger, BE: Backend> {
 51            fn $method_name<A, M, B>(
 52                &mut self,
 53                module: &M,
 54                a: &FheUintBlocksPrepared<A, T, BE>,
 55                b: &FheUintBlocksPrepared<B, T, BE>,
 56                scratch: &mut Scratch<BE>,
 57            ) where
 58                M: ExecuteBDDCircuit2WTo1W<T, BE>,
 59                A: DataRef,
 60                B: DataRef;
 61        }
 62    };
 63}
 64
 65#[macro_export]
 66macro_rules! impl_bdd_2w_to_1w_trait {
 67    ($trait_name:ident, $method_name:ident, $ty:ty, $n:literal, $circuit_ty:ty, $output_circuits:path) => {
 68        impl<D: DataMut, BE: Backend> $trait_name<$ty, BE> for FheUintBlocks<D, $ty> {
 69            fn $method_name<A, M, B>(
 70                &mut self,
 71                module: &M,
 72                a: &FheUintBlocksPrepared<A, $ty, BE>,
 73                b: &FheUintBlocksPrepared<B, $ty, BE>,
 74                scratch: &mut Scratch<BE>,
 75            ) where
 76                M: ExecuteBDDCircuit2WTo1W<$ty, BE>,
 77                A: DataRef,
 78                B: DataRef,
 79            {
 80                module.execute_bdd_circuit_2w_to_1w(self, &$output_circuits, a, b, scratch)
 81            }
 82        }
 83    };
 84}
 85
 86define_bdd_2w_to_1w_trait!(pub Add, add);
 87define_bdd_2w_to_1w_trait!(pub Sub, sub);
 88define_bdd_2w_to_1w_trait!(pub Sll, sll);
 89define_bdd_2w_to_1w_trait!(pub Sra, sra);
 90define_bdd_2w_to_1w_trait!(pub Srl, srl);
 91define_bdd_2w_to_1w_trait!(pub Slt, slt);
 92define_bdd_2w_to_1w_trait!(pub Sltu, sltu);
 93define_bdd_2w_to_1w_trait!(pub Or, or);
 94define_bdd_2w_to_1w_trait!(pub And, and);
 95define_bdd_2w_to_1w_trait!(pub Xor, xor);
 96
 97impl_bdd_2w_to_1w_trait!(
 98    Add,
 99    add,
100    u32,
101    32,
102    circuits::u32::add_codegen::AnyBitCircuit,
103    circuits::u32::add_codegen::OUTPUT_CIRCUITS
104);
105
106impl_bdd_2w_to_1w_trait!(
107    Sub,
108    sub,
109    u32,
110    32,
111    circuits::u32::sub_codegen::AnyBitCircuit,
112    circuits::u32::sub_codegen::OUTPUT_CIRCUITS
113);
114
115impl_bdd_2w_to_1w_trait!(
116    Sll,
117    sll,
118    u32,
119    32,
120    circuits::u32::sll_codegen::AnyBitCircuit,
121    circuits::u32::sll_codegen::OUTPUT_CIRCUITS
122);
123
124impl_bdd_2w_to_1w_trait!(
125    Sra,
126    sra,
127    u32,
128    32,
129    circuits::u32::sra_codegen::AnyBitCircuit,
130    circuits::u32::sra_codegen::OUTPUT_CIRCUITS
131);
132
133impl_bdd_2w_to_1w_trait!(
134    Srl,
135    srl,
136    u32,
137    32,
138    circuits::u32::srl_codegen::AnyBitCircuit,
139    circuits::u32::srl_codegen::OUTPUT_CIRCUITS
140);
141
142impl_bdd_2w_to_1w_trait!(
143    Slt,
144    slt,
145    u32,
146    1,
147    circuits::u32::slt_codegen::AnyBitCircuit,
148    circuits::u32::slt_codegen::OUTPUT_CIRCUITS
149);
150
151impl_bdd_2w_to_1w_trait!(
152    Sltu,
153    sltu,
154    u32,
155    1,
156    circuits::u32::sltu_codegen::AnyBitCircuit,
157    circuits::u32::sltu_codegen::OUTPUT_CIRCUITS
158);
159
160impl_bdd_2w_to_1w_trait!(
161    And,
162    and,
163    u32,
164    32,
165    circuits::u32::and_codegen::AnyBitCircuit,
166    circuits::u32::and_codegen::OUTPUT_CIRCUITS
167);
168
169impl_bdd_2w_to_1w_trait!(
170    Or,
171    or,
172    u32,
173    32,
174    circuits::u32::or_codegen::AnyBitCircuit,
175    circuits::u32::or_codegen::OUTPUT_CIRCUITS
176);
177
178impl_bdd_2w_to_1w_trait!(
179    Xor,
180    xor,
181    u32,
182    32,
183    circuits::u32::xor_codegen::AnyBitCircuit,
184    circuits::u32::xor_codegen::OUTPUT_CIRCUITS
185);