Skip to main content

sp1_hypercube/ir/
var.rs

1use std::{collections::HashMap, fmt::Display};
2
3use serde::{Deserialize, Serialize};
4use slop_algebra::Field;
5
6/// The underlying values that back the constraint compiler.
7#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
8pub enum IrVar<F> {
9    /// Public inputs.
10    Public(usize),
11    /// Preprocessed inputs.
12    Preprocessed(usize),
13    /// Columns.
14    Main(usize),
15    /// Constants.
16    Constant(F),
17    /// Inputs to function calls.
18    InputArg(usize),
19    /// Outputs to function calls.
20    OutputArg(usize),
21}
22
23impl<F: Field> Display for IrVar<F> {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        match self {
26            IrVar::Public(i) => write!(f, "Public({i})"),
27            IrVar::Preprocessed(i) => write!(f, "Preprocessed({i})"),
28            IrVar::Main(i) => write!(f, "Main({i})"),
29            IrVar::Constant(c) => write!(f, "{c}"),
30            IrVar::InputArg(i) => write!(f, "Input({i})"),
31            IrVar::OutputArg(i) => write!(f, "Output({i})"),
32        }
33    }
34}
35
36impl<F: Field> IrVar<F> {
37    /// Convert to Lean syntax based on context (chip vs operation)
38    pub fn to_lean(&self, is_operation: bool, input_mapping: &HashMap<usize, String>) -> String {
39        match self {
40            IrVar::Main(i) => format!("Main[{i}]"),
41            IrVar::InputArg(i) => {
42                if is_operation {
43                    input_mapping.get(i).map_or(format!("I[{i}]"), std::clone::Clone::clone)
44                } else {
45                    // In chip context, InputArg shouldn't appear
46                    format!("InputArg({i})")
47                }
48            }
49            IrVar::Constant(c) => format!("{c}"),
50            IrVar::Public(i) => format!("Public[{i}]"),
51            IrVar::Preprocessed(i) => format!("Preprocessed[{i}]"),
52            IrVar::OutputArg(i) => format!("Output[{i}]"),
53        }
54    }
55}
56
57/// Function context to keep track of the (number of) inputs and outputs within
58/// a function call.
59pub struct FuncCtx {
60    pub(crate) input_idx: usize,
61    pub(crate) output_idx: usize,
62}
63
64impl FuncCtx {
65    /// Constructs a new [`FuncCtx`].
66    #[must_use]
67    pub fn new() -> Self {
68        Self { input_idx: 0, output_idx: 0 }
69    }
70}
71
72impl Default for FuncCtx {
73    fn default() -> Self {
74        Self::new()
75    }
76}