@@ -129,27 +129,49 @@ const _moveY = (
129
129
movingControl : boolean ,
130
130
) : void => {
131
131
// Check if the source operation already has a target or control on the target wire
132
- let registers : Register [ ] ;
132
+ let targets : Register [ ] ;
133
133
switch ( sourceOperation . kind ) {
134
134
case "unitary" :
135
- registers = [
136
- ...sourceOperation . targets ,
137
- ...( sourceOperation . controls || [ ] ) ,
138
- ] ;
135
+ case "ket" :
136
+ targets = sourceOperation . targets ;
139
137
break ;
140
138
case "measurement" :
141
- registers = [ ...sourceOperation . qubits , ...sourceOperation . results ] ;
139
+ targets = sourceOperation . qubits ;
140
+ break ;
141
+ }
142
+
143
+ let controls : Register [ ] ;
144
+ switch ( sourceOperation . kind ) {
145
+ case "unitary" :
146
+ controls = sourceOperation . controls || [ ] ;
142
147
break ;
148
+ case "measurement" :
143
149
case "ket" :
144
- registers = sourceOperation . targets ;
150
+ controls = [ ] ;
145
151
break ;
146
152
}
147
153
148
- if ( registers . find ( ( target ) => target . qubit === targetWire ) ) {
149
- // If the target or control already exists, don't move the target/control
154
+ let likeRegisters : Register [ ] ;
155
+ let unlikeRegisters : Register [ ] ;
156
+ if ( movingControl ) {
157
+ likeRegisters = controls ;
158
+ unlikeRegisters = targets ;
159
+ } else {
160
+ likeRegisters = targets ;
161
+ unlikeRegisters = controls ;
162
+ }
163
+
164
+ // If a similar register already exists, don't move the gate
165
+ if ( likeRegisters . find ( ( reg ) => reg . qubit === targetWire ) ) {
150
166
return ;
151
167
}
152
168
169
+ // If a different kind of register already exists, swap the control and target
170
+ if ( unlikeRegisters . find ( ( reg ) => reg . qubit === targetWire ) ) {
171
+ const index = unlikeRegisters . findIndex ( ( reg ) => reg . qubit === targetWire ) ;
172
+ unlikeRegisters [ index ] . qubit = sourceWire ;
173
+ }
174
+
153
175
switch ( sourceOperation . kind ) {
154
176
case "unitary" :
155
177
if ( movingControl ) {
0 commit comments