forked from 0xPolygonZero/zk_evm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.rs
More file actions
130 lines (115 loc) · 4.15 KB
/
cli.rs
File metadata and controls
130 lines (115 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//! CLI arguments for constructing a [`CircuitConfig`], which can be used to
//! construct table circuits.
use std::fmt::Display;
use clap::{Args, ValueEnum};
use super::{
circuit::{Circuit, CircuitConfig, CircuitSize},
ProverStateManager, TableLoadStrategy,
};
/// The help heading for the circuit arguments.
///
/// This groups the circuit arguments together in the help message.
const HEADING: &str = "Table circuit sizes";
/// The clap value name for the circuit argument.
const VALUE_NAME: &str = "CIRCUIT_BIT_RANGE";
/// Get the description for the circuit argument.
///
/// Displayed in the help message.
fn circuit_arg_desc(circuit_name: &str) -> String {
format!("The min/max size for the {circuit_name} table circuit.")
}
/// Specifies whether to persist the processed circuits.
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum CircuitPersistence {
/// Do not persist the processed circuits.
None,
/// Persist the processed circuits to disk.
Disk,
}
impl CircuitPersistence {
pub const fn with_load_strategy(
self,
load_strategy: TableLoadStrategy,
) -> super::CircuitPersistence {
match self {
CircuitPersistence::None => super::CircuitPersistence::None,
CircuitPersistence::Disk => super::CircuitPersistence::Disk(load_strategy),
}
}
}
impl Display for CircuitPersistence {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
CircuitPersistence::None => write!(f, "none"),
CircuitPersistence::Disk => write!(f, "disk"),
}
}
}
/// Macro for generating the [`CliCircuitConfig`] struct.
macro_rules! gen_prover_state_config {
($($name:ident: $circuit:expr),*) => {
#[derive(Args, Debug)]
pub struct CliProverStateConfig {
#[arg(long, help_heading = HEADING, default_value_t = CircuitPersistence::Disk)]
pub persistence: CircuitPersistence,
#[arg(long, help_heading = HEADING, default_value_t = TableLoadStrategy::OnDemand)]
pub load_strategy: TableLoadStrategy,
/// Run with a low-security but fast STARK configuration. Enable this only for testing.
#[arg(long)]
pub use_test_config: bool,
$(
#[arg(
long,
value_name = VALUE_NAME,
help_heading = HEADING,
env = $circuit.as_env_key(),
help = circuit_arg_desc($circuit.as_str()),
)]
pub $name: Option<CircuitSize>,
)*
}
};
}
gen_prover_state_config!(
arithmetic: Circuit::Arithmetic,
byte_packing: Circuit::BytePacking,
cpu: Circuit::Cpu,
keccak: Circuit::Keccak,
keccak_sponge: Circuit::KeccakSponge,
logic: Circuit::Logic,
memory: Circuit::Memory,
mem_before: Circuit::MemoryBefore,
mem_after: Circuit::MemoryAfter
);
impl CliProverStateConfig {
pub fn into_circuit_config(self) -> CircuitConfig {
let mut config = CircuitConfig::default();
[
(Circuit::Arithmetic, self.arithmetic),
(Circuit::BytePacking, self.byte_packing),
(Circuit::Cpu, self.cpu),
(Circuit::Keccak, self.keccak),
(Circuit::KeccakSponge, self.keccak_sponge),
(Circuit::Logic, self.logic),
(Circuit::Memory, self.memory),
(Circuit::MemoryBefore, self.mem_before),
(Circuit::MemoryAfter, self.mem_after),
]
.into_iter()
.filter_map(|(circuit, range)| range.map(|range| (circuit, range)))
.for_each(|(circuit, range)| config.set_circuit_size(circuit, range));
config.use_test_config = self.use_test_config;
config
}
pub fn into_prover_state_manager(self) -> ProverStateManager {
ProverStateManager {
persistence: self.persistence.with_load_strategy(self.load_strategy),
circuit_config: self.into_circuit_config(),
}
}
}
impl From<CliProverStateConfig> for ProverStateManager {
fn from(config: CliProverStateConfig) -> Self {
config.into_prover_state_manager()
}
}