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 #[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}