use starknet_ff::FieldElement as FieldElement252;
use crate::core::fields::m31::BaseField;
use crate::core::vcs::blake2_hash::Blake2sHash;
use crate::core::vcs_lifted::blake2_merkle::Blake2sMerkleHasherGeneric;
use crate::core::vcs_lifted::poseidon252_merkle::Poseidon252MerkleHasher;
use crate::prover::backend::simd::SimdBackend;
use crate::prover::backend::Col;
use crate::prover::vcs_lifted::ops::MerkleOpsLifted;
use super::conversion::base_col_ref_to_simd;
use super::GpuBackend;
impl<const IS_M31_OUTPUT: bool> MerkleOpsLifted<Blake2sMerkleHasherGeneric<IS_M31_OUTPUT>>
for GpuBackend
{
fn build_leaves(columns: &[&Col<Self, BaseField>]) -> Col<Self, Blake2sHash> {
let simd_columns: Vec<&Col<SimdBackend, BaseField>> =
columns.iter().map(|c| base_col_ref_to_simd(*c)).collect();
<SimdBackend as MerkleOpsLifted<Blake2sMerkleHasherGeneric<IS_M31_OUTPUT>>>::build_leaves(
&simd_columns,
)
}
fn build_next_layer(prev_layer: &Col<Self, Blake2sHash>) -> Col<Self, Blake2sHash> {
<SimdBackend as MerkleOpsLifted<Blake2sMerkleHasherGeneric<IS_M31_OUTPUT>>>::build_next_layer(
prev_layer,
)
}
}
impl MerkleOpsLifted<Poseidon252MerkleHasher> for GpuBackend {
fn build_leaves(
columns: &[&Col<Self, BaseField>],
) -> Col<Self, FieldElement252> {
let simd_columns: Vec<&Col<SimdBackend, BaseField>> =
columns.iter().map(|c| base_col_ref_to_simd(*c)).collect();
<SimdBackend as MerkleOpsLifted<Poseidon252MerkleHasher>>::build_leaves(&simd_columns)
}
fn build_next_layer(
prev_layer: &Col<Self, FieldElement252>,
) -> Col<Self, FieldElement252> {
<SimdBackend as MerkleOpsLifted<Poseidon252MerkleHasher>>::build_next_layer(prev_layer)
}
}