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,
| 27 | impl 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 | } |