Source code for zisk/state-machines/binary/src/binary.rs
1//! The `BinarySM` module implements the Binary State Machine,
2//! coordinating sub-state machines to handle various binary operations seamlessly.
3//!
4//! Key components of this module include:
5//! - The `BinarySM` struct, encapsulating the basic and extension state machines along with their
6//! table counterparts.
7//! - `ComponentBuilder` trait implementations for creating counters, planners, and input collectors
8//! specific to binary operations.
9
10use std::sync::Arc;
11
12use crate::{
13 BinaryAddInstance, BinaryAddSM, BinaryBasicInstance, BinaryBasicSM, BinaryCounter,
14 BinaryExtensionInstance, BinaryExtensionSM, BinaryPlanner,
15};
16use fields::PrimeField64;
17use pil_std_lib::Std;
18use zisk_common::{BusDeviceMetrics, ComponentBuilder, Instance, InstanceCtx, Planner};
19use zisk_pil::{BinaryAddTrace, BinaryExtensionTrace, BinaryTrace};
20
21/// The `BinarySM` struct represents the Binary State Machine,
22/// managing basic, extension and specific add binary operations.
23#[allow(dead_code)]
24pub struct BinarySM<F: PrimeField64> {
25 /// Binary Basic state machine
26 binary_basic_sm: Arc<BinaryBasicSM<F>>,
27
28 /// Binary Extension state machine
29 binary_extension_sm: Arc<BinaryExtensionSM<F>>,
30
31 /// Binary Add state machine (optimal only for addition)
32 binary_add_sm: Arc<BinaryAddSM<F>>,
33}
34
35impl<F: PrimeField64> BinarySM<F> {
36 /// Creates a new instance of the `BinarySM` state machine.
37 ///
38 /// # Arguments
39 /// * `std` - PIL2 standard library utilities.
40 ///
41 /// # Returns
42 /// An `Arc`-wrapped instance of `BinarySM`.
43 pub fn new(std: Arc<Std<F>>) -> Arc<Self> {
44 let binary_basic_sm = BinaryBasicSM::new(std.clone());
45
46 let binary_extension_sm = BinaryExtensionSM::new(std.clone());
47
48 let binary_add_sm = BinaryAddSM::new(std);
49
50 Arc::new(Self { binary_basic_sm, binary_extension_sm, binary_add_sm })
51 }
52
53 pub fn build_binary_counter(&self) -> BinaryCounter {
54 BinaryCounter::new()
55 }
56}
57
58impl<F: PrimeField64> ComponentBuilder<F> for BinarySM<F> {
59 /// Builds and returns a new counter for monitoring binary operations.
60 ///
61 /// # Returns
62 /// A boxed implementation of `RegularCounters` configured for binary and extension binary
63 /// operations.
64 fn build_counter(&self) -> Option<Box<dyn BusDeviceMetrics>> {
65 Some(Box::new(BinaryCounter::new()))
66 }
67
68 /// Builds a planner to plan binary-related instances.
69 ///
70 /// # Returns
71 /// A boxed implementation of `RegularPlanner`.
72 fn build_planner(&self) -> Box<dyn Planner> {
73 Box::new(BinaryPlanner::<F>::new())
74 }
75
76 /// Builds an instance for binary operations.
77 ///
78 /// # Arguments
79 /// * `ictx` - The instance context.
80 ///
81 /// # Returns
82 /// A boxed implementation of `Instance` for binary operations.
83 fn build_instance(&self, ictx: InstanceCtx) -> Box<dyn Instance<F>> {
84 match ictx.plan.air_id {
85 BinaryTrace::<F>::AIR_ID => {
86 Box::new(BinaryBasicInstance::new(self.binary_basic_sm.clone(), ictx))
87 }
88 BinaryExtensionTrace::<F>::AIR_ID => {
89 Box::new(BinaryExtensionInstance::new(self.binary_extension_sm.clone(), ictx))
90 }
91 BinaryAddTrace::<F>::AIR_ID => {
92 Box::new(BinaryAddInstance::new(self.binary_add_sm.clone(), ictx))
93 }
94 _ => panic!("BinarySM::get_instance() Unsupported air_id: {:?}", ictx.plan.air_id),
95 }
96 }
97}