o1vm/cli/
cannon.rs

1use crate::cannon::*;
2use clap::{arg, Parser, Subcommand};
3
4#[derive(Parser, Debug, Clone)]
5pub struct MipsVmConfigurationArgs {
6    #[arg(
7        long,
8        value_name = "FILE",
9        default_value = "state.json",
10        help = "initial state file"
11    )]
12    input: String,
13
14    #[arg(
15        long,
16        value_name = "FILE",
17        default_value = "out.json",
18        help = "output state file"
19    )]
20    output: String,
21
22    #[arg(long, value_name = "FILE", help = "metadata file")]
23    meta: Option<String>,
24
25    #[arg(
26        long = "proof-at",
27        short = 'p',
28        long,
29        value_name = "FREQ",
30        default_value = "never"
31    )]
32    proof_at: StepFrequency,
33
34    #[arg(
35        long = "proof-fmt",
36        value_name = "FORMAT",
37        default_value = "proof-%d.json"
38    )]
39    proof_fmt: String,
40
41    #[arg(
42        long = "snapshot-fmt",
43        value_name = "FORMAT",
44        default_value = "state-%d.json"
45    )]
46    snapshot_fmt: String,
47
48    #[arg(long = "stop-at", value_name = "FREQ", default_value = "never")]
49    stop_at: StepFrequency,
50
51    #[arg(long = "info-at", value_name = "FREQ", default_value = "never")]
52    info_at: StepFrequency,
53
54    #[arg(long = "pprof.cpu", action = clap::ArgAction::SetTrue)]
55    pprof_cpu: bool,
56
57    #[arg(
58        long = "snapshot-state-at",
59        value_name = "FREQ",
60        default_value = "never"
61    )]
62    snapshot_state_at: StepFrequency,
63
64    #[arg(
65        long = "halt-address",
66        value_name = "ADDR",
67        help = "halt address (in hexadecimal). Jumping to this address will halt the program."
68    )]
69    halt_address: Option<String>,
70
71    #[arg(name = "host", value_name = "HOST", help = "host program specification <host program> [host program arguments]", num_args = 1.., last = true)]
72    host: Vec<String>,
73}
74
75impl From<MipsVmConfigurationArgs> for VmConfiguration {
76    fn from(cfg: MipsVmConfigurationArgs) -> Self {
77        VmConfiguration {
78            input_state_file: cfg.input,
79            output_state_file: cfg.output,
80            metadata_file: cfg.meta,
81            proof_at: cfg.proof_at,
82            stop_at: cfg.stop_at,
83            snapshot_state_at: cfg.snapshot_state_at,
84            info_at: cfg.info_at,
85            proof_fmt: cfg.proof_fmt,
86            snapshot_fmt: cfg.snapshot_fmt,
87            pprof_cpu: cfg.pprof_cpu,
88            halt_address: cfg.halt_address.map(|s| {
89                u32::from_str_radix(s.trim_start_matches("0x"), 16)
90                    .expect("Failed to parse halt address as hex")
91            }),
92            host: if cfg.host.is_empty() {
93                None
94            } else {
95                Some(HostProgram {
96                    name: cfg.host[0].to_string(),
97                    arguments: cfg.host[1..].to_vec(),
98                })
99            },
100        }
101    }
102}
103
104#[derive(Parser, Debug, Clone)]
105pub struct RunArgs {
106    #[arg(long = "preimage-db-dir", value_name = "PREIMAGE_DB_DIR")]
107    pub preimage_db_dir: Option<String>,
108    #[arg(long = "srs-filepath", value_name = "SRS_CACHE")]
109    pub srs_cache: Option<String>,
110    // it's important that vm_cfg is last in order to properly parse the host field
111    #[command(flatten)]
112    pub vm_cfg: MipsVmConfigurationArgs,
113}
114
115#[derive(Parser, Debug, Clone)]
116pub struct GenStateJsonArgs {
117    #[arg(short = 'i', long, value_name = "FILE", help = "input ELF file")]
118    pub input: String,
119    #[arg(
120        short = 'o',
121        long,
122        value_name = "FILE",
123        default_value = "state.json",
124        help = "output state.json file"
125    )]
126    pub output: String,
127}
128
129#[derive(Subcommand, Clone, Debug)]
130pub enum Cannon {
131    Run(RunArgs),
132    #[command(name = "test-optimism-preimage-read")]
133    TestPreimageRead(RunArgs),
134    #[command(name = "gen-state-json")]
135    GenStateJson(GenStateJsonArgs),
136}