zisk-executor 1.1.0-alpha

Execution engine that orchestrates witness generation across ZisK state machines
//! Counters for the built-in SMs.

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,
};

/// Counter slots for the built-in SMs. Each tuple is `(bundle_position, counter)`.
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 {
    /// Builds the slots via static dispatch — no SM bundle required.
    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),
            ),
        }
    }
}