|
@@ -1,5 +1,3 @@
|
1
|
|
-use std::collections::HashMap;
|
2
|
|
-
|
3
|
1
|
use crate::{gate::Gate, gate_type::GateType};
|
4
|
2
|
|
5
|
3
|
|
|
@@ -82,10 +80,12 @@ impl Circuit {
|
82
|
80
|
|
83
|
81
|
|
84
|
82
|
fn create_n_bit_comparator_gates(n: usize) -> Vec<Gate>{
|
85
|
|
- let mut indices = HashMap::<String, usize>::new();
|
|
83
|
+ let mut indices: Vec<usize> = vec![0; n];
|
86
|
84
|
let mut all_gates: Vec<Gate> = vec!();
|
87
|
85
|
let mut and_gate_indices: Vec<usize> = vec!();
|
88
|
86
|
|
|
87
|
+
|
|
88
|
+
|
89
|
89
|
rec_n_bit_comperator_gates(0, n, &mut all_gates, &mut and_gate_indices, &mut indices, );
|
90
|
90
|
|
91
|
91
|
// the OR spanning all ANDs
|
|
@@ -96,7 +96,7 @@ fn create_n_bit_comparator_gates(n: usize) -> Vec<Gate>{
|
96
|
96
|
return all_gates;
|
97
|
97
|
}
|
98
|
98
|
|
99
|
|
-fn rec_n_bit_comperator_gates(curr: usize, max: usize, all_gates: &mut Vec<Gate>, and_gate_incides: &mut Vec<usize>, indices: &mut HashMap<String, usize>){
|
|
99
|
+fn rec_n_bit_comperator_gates(curr: usize, max: usize, all_gates: &mut Vec<Gate>, and_gate_incides: &mut Vec<usize>, indices: &mut Vec<usize>){
|
100
|
100
|
// Incrementing gate index
|
101
|
101
|
let a_curr_gt_b_curr_gate_index = all_gates.len();
|
102
|
102
|
|
|
@@ -111,27 +111,20 @@ fn rec_n_bit_comperator_gates(curr: usize, max: usize, all_gates: &mut Vec<Gate>
|
111
|
111
|
let mut this_recursion_gate_indices: Vec<usize> = vec!(a_curr_gt_b_curr_gate_index);
|
112
|
112
|
|
113
|
113
|
for i in 0..curr {
|
114
|
|
- // A_i
|
115
|
|
- let a_i = format!("A{}", max-1-i);
|
116
|
|
- //B_i
|
117
|
|
- let b_i = format!("B{}", max-1-i);
|
118
|
|
-
|
119
|
|
- // A_i=B_i
|
120
|
|
- let a_i_eq_b_i = format!("{} = {}", a_i, b_i);
|
121
|
|
- // The curr-1'th equality gate is the only one that doesn't exist yet
|
|
114
|
+ let key = max-1-i;
|
122
|
115
|
if i == curr-1 {
|
123
|
116
|
// Gate(A_current > B_current)
|
124
|
117
|
let a_i_eq_b_i_gate = Gate::new(GateType::Equal, vec!(), vec!(i, i+max));
|
125
|
118
|
let a_curr_gt_b_curr_gate_index = all_gates.len();
|
126
|
|
- indices.insert(a_i_eq_b_i.clone(), a_curr_gt_b_curr_gate_index);
|
|
119
|
+ indices[key] = a_curr_gt_b_curr_gate_index;
|
127
|
120
|
all_gates.push(a_i_eq_b_i_gate);
|
128
|
121
|
}
|
129
|
|
- let eq_gate_index = indices.get(&a_i_eq_b_i).unwrap();
|
|
122
|
+ let eq_gate_index = indices[key];
|
130
|
123
|
|
131
|
|
- //print!("&& ({}) ", a_i_eq_b_i);
|
|
124
|
+ //print!("&& ({}) ", format!("{} = {}", format!("A{}", key), format!("B{}", key)));
|
132
|
125
|
|
133
|
126
|
// Index of this equality gate
|
134
|
|
- this_recursion_gate_indices.push(*eq_gate_index);
|
|
127
|
+ this_recursion_gate_indices.push(eq_gate_index);
|
135
|
128
|
}
|
136
|
129
|
|
137
|
130
|
let and_curr_index = all_gates.len();
|