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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
use crate::stdlib::prelude::*;

use super::instance_definitions::{
    builtins_instance_def::BuiltinsInstanceDef, cpu_instance_def::CpuInstanceDef,
    diluted_pool_instance_def::DilutedPoolInstanceDef,
};

#[derive(Debug)]
pub(crate) struct CairoLayout {
    pub(crate) _name: String,
    pub(crate) _cpu_component_step: u32,
    pub(crate) rc_units: u32,
    pub(crate) builtins: BuiltinsInstanceDef,
    pub(crate) _public_memory_fraction: u32,
    pub(crate) _memory_units_per_step: u32,
    pub(crate) diluted_pool_instance_def: Option<DilutedPoolInstanceDef>,
    pub(crate) _n_trace_colums: u32,
    pub(crate) _cpu_instance_def: CpuInstanceDef,
}

impl CairoLayout {
    pub(crate) fn plain_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("plain"),
            _cpu_component_step: 1,
            rc_units: 16,
            builtins: BuiltinsInstanceDef::plain(),
            _public_memory_fraction: 4,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: None,
            _n_trace_colums: 8,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    pub(crate) fn small_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("small"),
            _cpu_component_step: 1,
            rc_units: 16,
            builtins: BuiltinsInstanceDef::small(),
            _public_memory_fraction: 4,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: None,
            _n_trace_colums: 25,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    pub(crate) fn dex_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("dex"),
            _cpu_component_step: 1,
            rc_units: 4,
            builtins: BuiltinsInstanceDef::dex(),
            _public_memory_fraction: 4,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: None,
            _n_trace_colums: 22,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    #[allow(dead_code)]
    pub(crate) fn recursive_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("recursive"),
            _cpu_component_step: 1,
            rc_units: 4,
            builtins: BuiltinsInstanceDef::recursive(),
            _public_memory_fraction: 8,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()),
            _n_trace_colums: 10,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    pub(crate) fn starknet_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("starknet"),
            _cpu_component_step: 1,
            rc_units: 4,
            builtins: BuiltinsInstanceDef::starknet(),
            _public_memory_fraction: 8,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: Some(DilutedPoolInstanceDef::new(2, 4, 16)),
            _n_trace_colums: 10,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    pub(crate) fn starknet_with_keccak_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("starknet_with_keccak"),
            _cpu_component_step: 1,
            rc_units: 4,
            builtins: BuiltinsInstanceDef::starknet_with_keccak(),
            _public_memory_fraction: 8,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()),
            _n_trace_colums: 15,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    pub(crate) fn recursive_large_output_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("recursive_large_output"),
            _cpu_component_step: 1,
            rc_units: 4,
            builtins: BuiltinsInstanceDef::recursive_large_output(),
            _public_memory_fraction: 8,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()),
            _n_trace_colums: 13,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    #[allow(dead_code)]
    pub(crate) fn all_cairo_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("all_cairo"),
            _cpu_component_step: 1,
            rc_units: 4,
            builtins: BuiltinsInstanceDef::all_cairo(),
            _public_memory_fraction: 8,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()),
            _n_trace_colums: 11,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    pub(crate) fn all_solidity_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("all_solidity"),
            _cpu_component_step: 1,
            rc_units: 8,
            builtins: BuiltinsInstanceDef::all_solidity(),
            _public_memory_fraction: 8,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()),
            _n_trace_colums: 27,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }

    pub(crate) fn dynamic_instance() -> CairoLayout {
        CairoLayout {
            _name: String::from("dynamic"),
            _cpu_component_step: 1,
            rc_units: 16,
            builtins: BuiltinsInstanceDef::dynamic(),
            _public_memory_fraction: 8,
            _memory_units_per_step: 8,
            diluted_pool_instance_def: Some(DilutedPoolInstanceDef::default()),
            _n_trace_colums: 73,
            _cpu_instance_def: CpuInstanceDef::default(),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[cfg(target_arch = "wasm32")]
    use wasm_bindgen_test::*;

    #[test]
    #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
    fn get_plain_instance() {
        let layout = CairoLayout::plain_instance();
        let builtins = BuiltinsInstanceDef::plain();
        assert_eq!(&layout._name, "plain");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 16);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 4);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(layout.diluted_pool_instance_def, None);
        assert_eq!(layout._n_trace_colums, 8);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
    fn get_small_instance() {
        let layout = CairoLayout::small_instance();
        let builtins = BuiltinsInstanceDef::small();
        assert_eq!(&layout._name, "small");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 16);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 4);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(layout.diluted_pool_instance_def, None);
        assert_eq!(layout._n_trace_colums, 25);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
    fn get_dex_instance() {
        let layout = CairoLayout::dex_instance();
        let builtins = BuiltinsInstanceDef::dex();
        assert_eq!(&layout._name, "dex");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 4);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 4);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(layout.diluted_pool_instance_def, None);
        assert_eq!(layout._n_trace_colums, 22);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    fn get_recursive_instance() {
        let layout = CairoLayout::recursive_instance();
        let builtins = BuiltinsInstanceDef::recursive();
        assert_eq!(&layout._name, "recursive");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 4);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 8);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(
            layout.diluted_pool_instance_def,
            Some(DilutedPoolInstanceDef::default())
        );
        assert_eq!(layout._n_trace_colums, 10);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    fn get_starknet_instance() {
        let layout = CairoLayout::starknet_instance();
        let builtins = BuiltinsInstanceDef::starknet();
        assert_eq!(&layout._name, "starknet");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 4);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 8);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(
            layout.diluted_pool_instance_def,
            Some(DilutedPoolInstanceDef::new(2, 4, 16))
        );
        assert_eq!(layout._n_trace_colums, 10);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    fn get_starknet_with_keccak_instance() {
        let layout = CairoLayout::starknet_with_keccak_instance();
        let builtins = BuiltinsInstanceDef::starknet_with_keccak();
        assert_eq!(&layout._name, "starknet_with_keccak");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 4);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 8);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(
            layout.diluted_pool_instance_def,
            Some(DilutedPoolInstanceDef::default())
        );
        assert_eq!(layout._n_trace_colums, 15);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    fn get_recursive_large_output_instance() {
        let layout = CairoLayout::recursive_large_output_instance();
        let builtins = BuiltinsInstanceDef::recursive_large_output();
        assert_eq!(&layout._name, "recursive_large_output");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 4);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 8);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(
            layout.diluted_pool_instance_def,
            Some(DilutedPoolInstanceDef::default())
        );
        assert_eq!(layout._n_trace_colums, 13);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    fn get_all_cairo_instance() {
        let layout = CairoLayout::all_cairo_instance();
        let builtins = BuiltinsInstanceDef::all_cairo();
        assert_eq!(&layout._name, "all_cairo");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 4);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 8);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(
            layout.diluted_pool_instance_def,
            Some(DilutedPoolInstanceDef::default())
        );
        assert_eq!(layout._n_trace_colums, 11);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    fn get_all_solidity_instance() {
        let layout = CairoLayout::all_solidity_instance();
        let builtins = BuiltinsInstanceDef::all_solidity();
        assert_eq!(&layout._name, "all_solidity");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 8);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 8);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(
            layout.diluted_pool_instance_def,
            Some(DilutedPoolInstanceDef::default())
        );
        assert_eq!(layout._n_trace_colums, 27);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }

    #[test]
    fn get_dynamic_instance() {
        let layout = CairoLayout::dynamic_instance();
        let builtins = BuiltinsInstanceDef::dynamic();
        assert_eq!(&layout._name, "dynamic");
        assert_eq!(layout._cpu_component_step, 1);
        assert_eq!(layout.rc_units, 16);
        assert_eq!(layout.builtins, builtins);
        assert_eq!(layout._public_memory_fraction, 8);
        assert_eq!(layout._memory_units_per_step, 8);
        assert_eq!(
            layout.diluted_pool_instance_def,
            Some(DilutedPoolInstanceDef::default())
        );
        assert_eq!(layout._n_trace_colums, 73);
        assert_eq!(layout._cpu_instance_def, CpuInstanceDef::default());
    }
}