Skip to main content

kimchi_napi/wrappers/
feature_flags.rs

1use kimchi::circuits::{
2    constraints::FeatureFlags,
3    lookup::lookups::{LookupFeatures, LookupPatterns},
4};
5use napi_derive::napi;
6
7#[napi(object, js_name = "WasmFeatureFlags")]
8#[derive(Clone, Copy, Debug, Default)]
9pub struct NapiFeatureFlags {
10    #[napi(js_name = "range_check0")]
11    pub range_check0: bool,
12    #[napi(js_name = "range_check1")]
13    pub range_check1: bool,
14    #[napi(js_name = "foreign_field_add")]
15    pub foreign_field_add: bool,
16    #[napi(js_name = "foreign_field_mul")]
17    pub foreign_field_mul: bool,
18    pub xor: bool,
19    pub rot: bool,
20    pub lookup: bool,
21    #[napi(js_name = "runtime_tables")]
22    pub runtime_tables: bool,
23}
24
25impl From<FeatureFlags> for NapiFeatureFlags {
26    fn from(value: FeatureFlags) -> Self {
27        let LookupPatterns {
28            xor,
29            lookup,
30            range_check,
31            foreign_field_mul,
32        } = value.lookup_features.patterns;
33
34        Self {
35            range_check0: value.range_check0,
36            range_check1: value.range_check1,
37            foreign_field_add: value.foreign_field_add,
38            foreign_field_mul: value.foreign_field_mul,
39            xor: value.xor,
40            rot: value.rot,
41            lookup: lookup || range_check || foreign_field_mul || xor,
42            runtime_tables: value.lookup_features.uses_runtime_tables,
43        }
44    }
45}
46
47impl From<NapiFeatureFlags> for FeatureFlags {
48    fn from(value: NapiFeatureFlags) -> Self {
49        FeatureFlags {
50            range_check0: value.range_check0,
51            range_check1: value.range_check1,
52            foreign_field_add: value.foreign_field_add,
53            foreign_field_mul: value.foreign_field_mul,
54            xor: value.xor,
55            rot: value.rot,
56            lookup_features: LookupFeatures {
57                patterns: LookupPatterns {
58                    xor: value.lookup && value.xor,
59                    lookup: value.lookup,
60                    range_check: value.lookup && (value.range_check0 || value.range_check1),
61                    foreign_field_mul: value.lookup && value.foreign_field_mul,
62                },
63                joint_lookup_used: value.lookup,
64                uses_runtime_tables: value.runtime_tables,
65            },
66        }
67    }
68}