//only for GUI public void InsertQubitAbove(int registerIndex, int row) { if (_currentStep != 0) { return; } SelectedItems = null; RegisterModel reg = _registers[registerIndex]; reg.InsertQubit(row + 1); int offset = row + 1; int i = 0; for (; i < registerIndex; i++) { _registers[i].IncrementOffset(); } i++; for (; i < _registers.Count; i++) { offset += _registers[i].Qubits.Count; } foreach (StepModel step in Steps) { int gatesNum = reg.Qubits.Count - row - 2; for (int j = offset; j < gatesNum + offset;) { int prevEnd = step.Gates[j].End; step.Gates[j].IncrementRow(reg, row); j = prevEnd + 1; } if (offset > 0 && step.Gates[offset - 1].End >= offset) { //multiqubit gate step.Gates.Insert(offset, step.Gates[offset - 1]); } else { step.Gates.Insert(offset, new EmptyGate(new RegisterRefModel() { Register = reg, Offset = row + 1 })); } } }