(&mut self)
| 100 | |
| 101 | impl<'a, C: Config, I: InputType> CompileContext<'a, C, I> { |
| 102 | pub fn compile(&mut self) { |
| 103 | // 1. do a toposort of the circuits |
| 104 | self.dfs_topo_sort(0); |
| 105 | |
| 106 | // 2. compute min and max layers for each circuit |
| 107 | for id in self.order.clone() { |
| 108 | self.compute_min_max_layers(id); |
| 109 | } |
| 110 | |
| 111 | // 3. prepare layer layout contexts |
| 112 | for id in self.order.clone() { |
| 113 | self.prepare_layer_layout_context(id); |
| 114 | } |
| 115 | |
| 116 | // 4. solve layer layout for root circuit (it also recursively solves all required sub-circuits) |
| 117 | let mut layout_ids = Vec::with_capacity(self.circuits[&0].output_layer + 1); |
| 118 | for i in 0..=self.circuits[&0].output_layer { |
| 119 | layout_ids.push(self.solve_layer_layout(&LayerReq { |
| 120 | circuit_id: 0, |
| 121 | layer: i, |
| 122 | })); |
| 123 | } |
| 124 | self.layout_ids = layout_ids; |
| 125 | if !self.opts.allow_input_reorder { |
| 126 | let layout_vec = |
| 127 | merge_layouts(vec![], (0..self.circuits[&0].lcs[0].vars.len()).collect()); |
| 128 | let id = self.layer_layout_pool.add(&LayerLayout { |
| 129 | circuit_id: 0, |
| 130 | layer: 0, |
| 131 | size: layout_vec.len(), |
| 132 | inner: super::layer_layout::LayerLayoutInner::Dense { |
| 133 | placement: layout_vec, |
| 134 | }, |
| 135 | }); |
| 136 | self.layout_ids[0] = id; |
| 137 | } |
| 138 | |
| 139 | // 5. generate wires |
| 140 | let layers = self.connect_wires(&self.layout_ids.clone()); |
| 141 | self.layers = layers; |
| 142 | |
| 143 | // 6. record the input order (used to generate witness) |
| 144 | self.input_order = self.record_input_order(); |
| 145 | } |
| 146 | |
| 147 | fn dfs_topo_sort(&mut self, id: usize) { |
| 148 | if self.circuits.contains_key(&id) { |
no test coverage detected