1use std::{collections::HashMap, fmt::Display};
2
3use serde::{Deserialize, Serialize};
4use slop_algebra::Field;
5
6#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
8pub enum IrVar<F> {
9 Public(usize),
11 Preprocessed(usize),
13 Main(usize),
15 Constant(F),
17 InputArg(usize),
19 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 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 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
57pub struct FuncCtx {
60 pub(crate) input_idx: usize,
61 pub(crate) output_idx: usize,
62}
63
64impl FuncCtx {
65 #[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}