use proofman_fields::PrimeField64;
use zisk_common::ComponentPlanBuilder;
use zisk_core::MemDataSection;
use zisk_precomp_dma::{DmaCounterInputGen, DmaManager};
use zisk_precomp_evm::{JumpDestCounterInputGen, JumpDestManager};
use zisk_sm_arith::{ArithCounterInputGen, ArithSM};
use zisk_sm_binary::{BinaryCounter, BinarySM};
use zisk_sm_mem::Mem;
use zisk_sm_mem_common::MemCounters;
use super::state_machines::{
ARITH_POSITION, BINARY_POSITION, DMA_POSITION, JUMP_DEST_POSITION, MEM_POSITION,
};
pub struct BuiltinCounters {
pub mem: (usize, Option<MemCounters>),
pub binary: (usize, BinaryCounter),
pub arith: (usize, ArithCounterInputGen),
pub dma: (usize, DmaCounterInputGen),
pub jump_dest: (usize, JumpDestCounterInputGen),
}
impl BuiltinCounters {
pub(crate) fn build<F: PrimeField64>(
is_asm: bool,
mem_sections: Option<&dyn MemDataSection>,
) -> Self {
let mem = if is_asm {
None
} else {
let mut counter = <Mem<F> as ComponentPlanBuilder<F>>::counter(is_asm);
if let Some(mem_sections) = mem_sections {
counter.init_with_mem_sections(mem_sections);
}
Some(counter)
};
Self {
mem: (MEM_POSITION, mem),
binary: (BINARY_POSITION, <BinarySM<F> as ComponentPlanBuilder<F>>::counter(is_asm)),
arith: (ARITH_POSITION, <ArithSM<F> as ComponentPlanBuilder<F>>::counter(is_asm)),
dma: (DMA_POSITION, <DmaManager<F> as ComponentPlanBuilder<F>>::counter(is_asm)),
jump_dest: (
JUMP_DEST_POSITION,
<JumpDestManager<F> as ComponentPlanBuilder<F>>::counter(is_asm),
),
}
}
}