MCPcopy Create free account
hub / github.com/PolyhedraZK/ExpanderCompilerCollection / query

Method query

expander_compiler/src/layering/wire.rs:29–100  ·  view source on GitHub ↗

given a parent layer layout, this function query the layout of a sub circuit

(
        &self,
        layer_layout_pool: &mut Pool<LayerLayout>,
        circuits: &HashMap<usize, IrContext<'_, C>>,
        vs: &[usize], // variables to query (in parent layer)
        f: F,    

Source from the content-addressed store, hash-verified

27impl LayoutQuery {
28 // given a parent layer layout, this function query the layout of a sub circuit
29 fn query<F, C: Config>(
30 &self,
31 layer_layout_pool: &mut Pool<LayerLayout>,
32 circuits: &HashMap<usize, IrContext<'_, C>>,
33 vs: &[usize], // variables to query (in parent layer)
34 f: F, // f(i) = id of i-th variable in the sub circuit
35 cid: usize, // target circuit id
36 lid: usize, // target layer id
37 ) -> SubLayout
38 where
39 F: Fn(usize) -> usize,
40 {
41 if vs.is_empty() {
42 let subl = LayerLayout {
43 circuit_id: cid,
44 layer: lid,
45 size: 1,
46 inner: LayerLayoutInner::Dense {
47 placement: vec![EMPTY],
48 },
49 };
50 let id = layer_layout_pool.add(&subl);
51 return SubLayout {
52 id,
53 offset: 0,
54 insn_id: EMPTY,
55 };
56 }
57 let mut ps = vec![0; vs.len()];
58 let mut l: usize = 1 << 62;
59 let mut r: usize = 0;
60 for (i, x) in vs.iter().enumerate() {
61 ps[i] = if let Some(x) = self.var_pos.get(x) {
62 *x
63 } else {
64 EMPTY
65 };
66 if ps[i] != EMPTY {
67 l = l.min(ps[i]);
68 r = r.max(ps[i]);
69 }
70 }
71 let mut xor = if l <= r { l ^ r } else { 0 };
72 xor |= xor >> 1;
73 xor |= xor >> 2;
74 xor |= xor >> 4;
75 xor |= xor >> 8;
76 xor |= xor >> 16;
77 xor |= xor >> 32;
78 xor ^= xor >> 1;
79 let n = if xor == 0 { 1 } else { xor << 1 };
80 let offset = if l <= r { l & !(n - 1) } else { 0 };
81 let mut placement = vec![EMPTY; n];
82 for i in 0..vs.len() {
83 if ps[i] != EMPTY {
84 placement[ps[i] - offset] = f(i);
85 }
86 }

Callers 1

connect_wiresMethod · 0.45

Calls 7

subs_mapFunction · 0.85
iterMethod · 0.80
is_emptyMethod · 0.45
addMethod · 0.45
getMethod · 0.45
lenMethod · 0.45
mapMethod · 0.45

Tested by

no test coverage detected