/// <summary> /// Transform the given circuit for the given architecture with given mapping. /// </summary> /// <param name="circuit"> The dependency graph of the circuit to transform. </param> /// <param name="architecture"> The architecture to be used. </param> /// <param name="mapping"> The initial mapping to use during transformation. </param> /// <returns> /// A physical circuit which is equivalent to the given logical circuit /// and fits on the given architecture using the given mapping. /// </returns> public PhysicalCircuit Execute(LogicalCircuit circuit, Architecture architecture, Mapping mapping) { LogicalCircuit = circuit; Architecture = architecture; Mapping = mapping; PhysicalCircuit = new PhysicalCircuit(architecture); SetUp(); Execute(); return(PhysicalCircuit); }
/// <summary> /// Execute this naive transformation algorithm. /// </summary> protected override void Execute() { // TODO naive transformation foreach (Gate g in LogicalCircuit.Gates) { if (!g.CanBeExecutedOn(Architecture, Mapping)) { List <int> path = Architecture.GetShortestPath(g.GetQubits()[0], g.GetQubits()[1]); // Is always a cnot gate normally for (int i = path.Count - 1; i >= 1; i--) { AddSwapToCircuit(Mapping.Map[path[i]], Mapping.Map[path[i - 1]]); } } PhysicalCircuit.AddGate(g.Map(Mapping)); } }
/// <summary> /// See <see cref="Architecture.AddSwapGates(PhysicalCircuit, Swap)"/>. /// </summary> public override void AddSwapGates(PhysicalCircuit circuit, Swap swap) { if (HasConnection(swap.Qubit1, swap.Qubit2)) { circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit1)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit2)); circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit1)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit2)); circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2)); } else { circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit1)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit2)); circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit1)); circuit.AddGate(U3.GetHadamardGate(swap.Qubit2)); circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1)); } }
/// <summary> /// Adds the gates needed to execute the given swap on the given circuit. /// </summary> /// <param name="circuit"> The circuit to execute the swap on. </param> /// <param name="swap"> The swap to execute on the circuit. </param> public abstract void AddSwapGates(PhysicalCircuit circuit, Swap swap);
/// <summary> /// See <see cref="Architecture.AddSwapGates(PhysicalCircuit, Swap)"/>. /// </summary> public override void AddSwapGates(PhysicalCircuit circuit, Swap swap) { circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2)); circuit.AddGate(new CNOT(swap.Qubit2, swap.Qubit1)); circuit.AddGate(new CNOT(swap.Qubit1, swap.Qubit2)); }