public void CollapsePermutationGates() { // unwind input and output addresses until we find an address on a non-permutation gate for (int i = 0; i < WireCount; i++) { InputGateAddress inAddr = FirstGateForWire[i]; while (inAddr != null && inAddr.Gate is PermutationGate) { var pgate = (PermutationGate)inAddr.Gate; var permuteOut = pgate.GetLocalOutputAddress(pgate.Permute(inAddr.Port)); Circuit.OutputConnectionCounterparties.TryGetValue(permuteOut, out inAddr); } FirstGateForWire[i] = inAddr; } for (int i = 0; i < WireCount; i++) { OutputGateAddress outAddr = LastGateForWire[i]; while (outAddr != null && outAddr.Gate is PermutationGate) { var pgate = (PermutationGate)outAddr.Gate; var permuteIn = pgate.GetLocalInputAddress(pgate.Unpermute(outAddr.Port)); Circuit.InputConnectionCounterparties.TryGetValue(permuteIn, out outAddr); } LastGateForWire[i] = outAddr; } Circuit.CollapsePermutationGates(); }
public void CollapsePermutationGates() { foreach (var gate in Gates.ToList()) { if (gate is PermutationGate) { PermutationGate pgate = (PermutationGate)gate; for (int i = 0; i < pgate.Count; i++) { OutputGateAddress inputCounterparty = InputConnectionCounterparties[pgate.GetLocalInputAddress(i)]; InputGateAddress outputCounterparty = OutputConnectionCounterparties[pgate.GetLocalOutputAddress(pgate.Permute(i))]; AddConnection(new GateConnection(inputCounterparty, outputCounterparty)); } RemoveGate(pgate); } } }
public object Clone(out Dictionary <Gate, Gate> mapping) { var clone = new Circuit(); mapping = new Dictionary <Gate, Gate>(); // add all of the gates and connections that I have foreach (var gate in Gates) { var gateClone = gate.Copy() as Gate; clone.Gates.Add(gateClone); mapping.Add(gate, gateClone); } foreach (var input in InputAddrs) { clone.InputAddrs.Add(new InputGateAddress(mapping[input.Gate], input.Port)); } foreach (var output in OutputAddrs) { clone.OutputAddrs.Add(new OutputGateAddress(mapping[output.Gate], output.Port)); } foreach (var oldInputGate in InputConnectionCounterparties.Keys) { var newInputGate = new InputGateAddress(mapping[oldInputGate.Gate], oldInputGate.Port); var oldOutputGate = InputConnectionCounterparties[oldInputGate]; var newOutputGate = new OutputGateAddress(mapping[oldOutputGate.Gate], oldOutputGate.Port); clone.InputConnectionCounterparties[newInputGate] = newOutputGate; clone.OutputConnectionCounterparties[newOutputGate] = newInputGate; } return(clone); }
public object Clone(out Dictionary<Gate, Gate> mapping) { var clone = new Circuit(); mapping = new Dictionary<Gate, Gate>(); // add all of the gates and connections that I have foreach (var gate in Gates) { var gateClone = gate.Copy() as Gate; clone.Gates.Add(gateClone); mapping.Add(gate, gateClone); } foreach (var input in InputAddrs) { clone.InputAddrs.Add(new InputGateAddress(mapping[input.Gate], input.Port)); } foreach (var output in OutputAddrs) { clone.OutputAddrs.Add(new OutputGateAddress(mapping[output.Gate], output.Port)); } foreach (var oldInputGate in InputConnectionCounterparties.Keys) { var newInputGate = new InputGateAddress(mapping[oldInputGate.Gate], oldInputGate.Port); var oldOutputGate = InputConnectionCounterparties[oldInputGate]; var newOutputGate = new OutputGateAddress(mapping[oldOutputGate.Gate], oldOutputGate.Port); clone.InputConnectionCounterparties[newInputGate] = newOutputGate; clone.OutputConnectionCounterparties[newOutputGate] = newInputGate; } return clone; }
public GateConnection(OutputGateAddress from, InputGateAddress to) { FromAddr = from; ToAddr = to; }