Skip to main content

ab_riscv_interpreter/zkr/
zkr_helpers.rs

1//! Opaque helpers for Zkr extension
2
3use crate::zkr::ZkrSeedPoll;
4use ab_riscv_primitives::prelude::*;
5
6/// Encode a [`ZkrSeedPoll`] into the raw bit layout of the `seed` CSR:
7/// * bits `[31:30]`: `OPST`
8/// * bits `[29:24]`: reserved, always zero
9/// * bits `[23:16]`: custom, always zero (unused by this implementation)
10/// * bits `[15:0]`: `entropy`, valid only when `OPST=ES16`
11#[inline(always)]
12#[doc(hidden)]
13#[cfg_attr(feature = "no-panic", no_panic_const::no_panic)]
14pub const fn encode_seed_poll<Reg>(poll: ZkrSeedPoll) -> Reg::Type
15where
16    Reg: [const] Register,
17{
18    match poll {
19        ZkrSeedPoll::Bist => Reg::Type::from(0b00u8) << 30u8,
20        ZkrSeedPoll::Wait => Reg::Type::from(0b01u8) << 30u8,
21        ZkrSeedPoll::Es16(entropy) => (Reg::Type::from(0b10u8) << 30u8) | Reg::Type::from(entropy),
22        ZkrSeedPoll::Dead => Reg::Type::from(0b11u8) << 30u8,
23    }
24}