Source code for zisk/state-machines/mem/src/mem_align_write_byte_instance.rs

 1use crate::{mem_align_byte_sm::MemAlignByteSM, MemAlignCollector};
 2use mem_common::MemAlignCheckPoint;
 3
 4use crate::mem_align_byte_sm::{MemAlignWriteByteTraceRowType, MemAlignWriteByteTraceType};
 5use fields::PrimeField64;
 6use proofman_common::{AirInstance, ProofCtx, ProofmanResult, SetupCtx};
 7use std::{collections::HashMap, sync::Arc};
 8use zisk_common::{
 9    BusDevice, CheckPoint, ChunkId, Instance, InstanceCtx, InstanceType, PayloadType,
10};
11 12pub struct MemAlignWriteByteInstance<F: PrimeField64> { 13 /// Instance context 14 ictx: InstanceCtx, 15 16 /// Checkpoint data for this memory align instance. 17 checkpoint: HashMap<ChunkId, MemAlignCheckPoint>, 18 19 mem_align_byte_sm: Arc<MemAlignByteSM<F>>,
20}
21
22impl<F: PrimeField64> MemAlignWriteByteInstance<F> { 23 pub fn new(mem_align_sm: Arc<MemAlignByteSM<F>>, mut ictx: InstanceCtx) -> Self { 24 let meta = ictx.plan.meta.take().expect("Expected metadata in ictx.plan.meta"); 25 26 let checkpoint = *meta 27 .downcast::<HashMap<ChunkId, MemAlignCheckPoint>>() 28 .expect("Failed to downcast ictx.plan.meta to expected type"); 29 30 Self { ictx, checkpoint, mem_align_byte_sm: mem_align_sm }
31 }
32 33 pub fn build_mem_align_write_byte_collector(&self, chunk_id: ChunkId) -> MemAlignCollector { 34 MemAlignCollector::new(&self.checkpoint[&chunk_id])
35 }
36}
37 38impl<F: PrimeField64> Instance<F> for MemAlignWriteByteInstance<F> { 39 fn compute_witness( 40 &self, 41 _pctx: &ProofCtx<F>, 42 _sctx: &SetupCtx<F>, 43 collectors: Vec<(usize, Box<dyn BusDevice<PayloadType>>)>, 44 trace_buffer: Vec<F>, 45 ) -> ProofmanResult<Option<AirInstance<F>>> { 46 let mut total_rows = 0; 47 let inputs: Vec<_> = collectors 48 .into_iter() 49 .map(|(_, collector)| { 50 let collector = collector.as_any().downcast::<MemAlignCollector>().unwrap(); 51 52 total_rows += collector.count(); 53 54 collector.inputs 55 }) 56 .collect(); 57 Ok(Some( 58 self.mem_align_byte_sm 59 .compute_witness::<MemAlignWriteByteTraceType<F>, MemAlignWriteByteTraceRowType<F>>( 60 &inputs, 61 total_rows as usize, 62 trace_buffer, 63 )?, 64 )) 65 } 66 67 fn check_point(&self) -> &CheckPoint { 68 &self.ictx.plan.check_point 69 } 70 71 fn instance_type(&self) -> InstanceType { 72 InstanceType::Instance 73 } 74 75 fn as_any(&self) -> &dyn std::any::Any { 76 self 77 } 78 79 /// Builds an input collector for the instance. 80 /// 81 /// # Arguments 82 /// * `chunk_id` - The chunk ID associated with the input collector. 83 /// 84 /// # Returns 85 /// An `Option` containing the input collector for the instance. 86 fn build_inputs_collector(&self, chunk_id: ChunkId) -> Option<Box<dyn BusDevice<PayloadType>>> { 87 Some(Box::new(MemAlignCollector::new(&self.checkpoint[&chunk_id]))) 88 }
89}