From 514ffa7a68d29772f1898aa402e6ce8caabcb80a Mon Sep 17 00:00:00 2001 From: marque Date: Fri, 14 Jun 2024 14:30:17 +0200 Subject: [PATCH 1/2] fixed indentation in extensions codegen --- QuIDE/CodeHelpers/CodeGenerator.cs | 249 +++++++++++++++-------------- 1 file changed, 128 insertions(+), 121 deletions(-) diff --git a/QuIDE/CodeHelpers/CodeGenerator.cs b/QuIDE/CodeHelpers/CodeGenerator.cs index e64eeff..0b04bef 100644 --- a/QuIDE/CodeHelpers/CodeGenerator.cs +++ b/QuIDE/CodeHelpers/CodeGenerator.cs @@ -1,5 +1,4 @@ -#region - + using QuIDE.QuantumModel; using QuIDE.QuantumModel.Gates; using QuIDE.QuantumParser; @@ -10,8 +9,6 @@ using System.Numerics; using System.Text; -#endregion - namespace QuIDE.CodeHelpers; public class CodeGenerator @@ -25,8 +22,8 @@ private string GenerateCompositeExtensions(ComputerModel model, Dictionary + /// Executed once for every step. + /// + /// + /// gates in step + /// step idx + /// + /// private string GenerateStepCode(ComputerModel model, StepModel step, int column, string indent) { var builder = new StringBuilder(); @@ -180,77 +185,9 @@ private string GenerateStepCode(ComputerModel model, StepModel step, int column, return builder.ToString(); } - private string GenerateGateCode(ComputerModel model, Gate gate, int column, string indent, string defaultRegName = null) { - string AppendControlTarget(string begin, Gate g) - { - if (g.Control.HasValue) - { - var namedC = "control: "; - var namedT = "target: "; - if (g.Name != GateName.CNot) - { - namedC = ""; - namedT = ""; - } - - if (g.Control.Value.Register == g.Target.Register) - return - $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{namedT}{g.Target.Offset}, {namedC}{g.Control.Value.Offset});"; - return - $"comp.{begin}{namedT}{GetRegName(g.Target.Register, defaultRegName)}[{g.Target.Offset}], {namedC}{GetRegName(g.Control.Value.Register, defaultRegName)}[{g.Control.Value.Offset}]);"; - } - - return $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{g.Target.Offset});"; - } - - string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRefModel[] controls) - { - if (controls.All(x => x.Register == g.Target.Register) && - (g.Control == null || g.Control.Value.Register == g.Target.Register)) - { - var format = new StringBuilder(GetRegName(g.Target.Register, defaultRegName)).Append('.') - .Append(begin); - format.Append(g.Target.Offset); - - if (g.Control.HasValue) format.Append(", ").Append(g.Control.Value.Offset); - - for (var i = 0; i < controls.Length; i++) format.Append(", ").Append(controls[i].Offset); - - format.Append(");"); - format.Append("\t\t// ").Append(beginComment).Append(", ... ...)"); - return format.ToString(); - } - else - { - var format = new StringBuilder("comp.").Append(begin); - format.Append(GetRegName(g.Target.Register, defaultRegName)) - .Append('[') - .Append(g.Target.Offset) - .Append(']'); - - if (g.Control.HasValue) - format.Append(", ") - .Append(GetRegName(g.Control.Value.Register, defaultRegName)) - .Append('[') - .Append(g.Control.Value.Offset) - .Append(']'); - - foreach (var rrm in controls) - format.Append(", ") - .Append(GetRegName(rrm.Register, defaultRegName)) - .Append('[') - .Append(rrm.Offset) - .Append(']'); - - format.Append(");"); - format.Append("\t\t// ").Append(beginComment).Append(", ... ...)"); - return format.ToString(); - } - } - switch (gate.Name) { case GateName.Hadamard: @@ -341,26 +278,26 @@ string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRef } } + { + var builder = new StringBuilder(); + var i = m.Begin; + while (i <= m.End) { - var builder = new StringBuilder(); - var i = m.Begin; - while (i <= m.End) + var regRef = model.GetRefFromOffset(i); + if (i + regRef.Register.Qubits.Count < m.End + 2) { - var regRef = model.GetRefFromOffset(i); - if (i + regRef.Register.Qubits.Count < m.End + 2) - { - builder.Append($"{regRef.Register.Name}.Measure();\n"); - i += regRef.Register.Qubits.Count; - } - else - { - builder.Append($"{regRef.Register.Name}.Measure({regRef.Offset});\n"); - i++; - } + builder.Append($"{regRef.Register.Name}.Measure();\n"); + i += regRef.Register.Qubits.Count; + } + else + { + builder.Append($"{regRef.Register.Name}.Measure({regRef.Offset});\n"); + i++; } - - return builder.ToString(); } + + return builder.ToString(); + } case GateName.Unitary: var u = gate as UnitaryGate; var uMatrixName = "unitary_" + column + "_" + u.Target.OffsetToRoot; @@ -375,9 +312,76 @@ string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRef default: return string.Empty; } + + string AppendControlTarget(string begin, Gate g) + { + if (g.Control.HasValue) + { + var namedC = "control: "; + var namedT = "target: "; + if (g.Name == GateName.CNot) + return g.Control.Value.Register == g.Target.Register + ? $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{namedT}{g.Target.Offset}, {namedC}{g.Control.Value.Offset});" + : $"comp.{begin}{namedT}{GetRegName(g.Target.Register, defaultRegName)}[{g.Target.Offset}], {namedC}{GetRegName(g.Control.Value.Register, defaultRegName)}[{g.Control.Value.Offset}]);"; + namedC = ""; + namedT = ""; + + return g.Control.Value.Register == g.Target.Register + ? $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{namedT}{g.Target.Offset}, {namedC}{g.Control.Value.Offset});" + : $"comp.{begin}{namedT}{GetRegName(g.Target.Register, defaultRegName)}[{g.Target.Offset}], {namedC}{GetRegName(g.Control.Value.Register, defaultRegName)}[{g.Control.Value.Offset}]);"; + } + + return $"{GetRegName(g.Target.Register, defaultRegName)}.{begin}{g.Target.Offset});"; + } + + string AppendMoreControls(string begin, string beginComment, Gate g, RegisterRefModel[] controls) + { + if (controls.All(x => x.Register == g.Target.Register) && + (g.Control == null || g.Control.Value.Register == g.Target.Register)) + { + var format = new StringBuilder(GetRegName(g.Target.Register, defaultRegName)).Append('.') + .Append(begin); + format.Append(g.Target.Offset); + + if (g.Control.HasValue) format.Append(", ").Append(g.Control.Value.Offset); + + foreach (var control in controls) + format.Append(", ").Append(control.Offset); + + format.Append(");"); + format.Append("\t\t// ").Append(beginComment).Append(", ... ...)"); + return format.ToString(); + } + else + { + var format = new StringBuilder("comp.").Append(begin); + format.Append(GetRegName(g.Target.Register, defaultRegName)) + .Append('[') + .Append(g.Target.Offset) + .Append(']'); + + if (g.Control.HasValue) + format.Append(", ") + .Append(GetRegName(g.Control.Value.Register, defaultRegName)) + .Append('[') + .Append(g.Control.Value.Offset) + .Append(']'); + + foreach (var rrm in controls) + format.Append(", ") + .Append(GetRegName(rrm.Register, defaultRegName)) + .Append('[') + .Append(rrm.Offset) + .Append(']'); + + format.Append(");"); + format.Append("\t\t// ").Append(beginComment).Append(", ... ...)"); + return format.ToString(); + } + } } - private string GenerateMatrixDefinition(string varName, Complex[,] matrix, string indent) + private static string GenerateMatrixDefinition(string varName, Complex[,] matrix, string indent) { var builder = new StringBuilder(); @@ -402,31 +406,6 @@ private string GenerateMatrixDefinition(string varName, Complex[,] matrix, strin private string GenerateParametricGateCode(ParametricGate cg, string defaultRegName = null) { - string AppendPar(object x) - { - var builder = new StringBuilder(); - - if (x is RegisterPartModel rm) - { - builder.Append(GetRegName(rm.Register, defaultRegName)); - if (rm.Register == null || rm.Width != rm.Register.Qubits.Count) - { - builder.Append('[').Append(rm.Offset).Append(", "); - builder.Append(rm.Width).Append(']'); - } - } - else if (x is RegisterRefModel rrm) - { - builder.Append(GetRegName(rrm.Register, defaultRegName)).Append('[').Append(rrm.Offset).Append(']'); - } - else - { - builder.Append(x); - } - - return builder.ToString(); - } - var sb = new StringBuilder("comp.").Append(cg.FunctionName).Append('('); var infos = cg.Method.GetParameters(); @@ -454,6 +433,34 @@ string AppendPar(object x) sb.Append(");"); return sb.ToString(); + + string AppendPar(object x) + { + var builder = new StringBuilder(); + + switch (x) + { + case RegisterPartModel rm: + { + builder.Append(GetRegName(rm.Register, defaultRegName)); + if (rm.Register == null || rm.Width != rm.Register.Qubits.Count) + { + builder.Append('[').Append(rm.Offset).Append(", "); + builder.Append(rm.Width).Append(']'); + } + + break; + } + case RegisterRefModel rrm: + builder.Append(GetRegName(rrm.Register, defaultRegName)).Append('[').Append(rrm.Offset).Append(']'); + break; + default: + builder.Append(x); + break; + } + + return builder.ToString(); + } } private string GenerateCompositeGateCode(CompositeGate cg, string defaultRegName = null) From 77ddb07e411dcc5c9670b4720a9fc1f631ea5e13 Mon Sep 17 00:00:00 2001 From: marque Date: Sat, 15 Jun 2024 13:25:59 +0200 Subject: [PATCH 2/2] updated pkgs and alleviated app crash on windows when creating mcx gate --- QuIDE/QuIDE.csproj | 16 ++++++++-------- QuIDE/Views/Controls/CircuitGrid.axaml.cs | 13 ++++++++++++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/QuIDE/QuIDE.csproj b/QuIDE/QuIDE.csproj index 39e0c9e..9f36886 100644 --- a/QuIDE/QuIDE.csproj +++ b/QuIDE/QuIDE.csproj @@ -32,20 +32,20 @@ - + - - + + - - + + - - - + + + diff --git a/QuIDE/Views/Controls/CircuitGrid.axaml.cs b/QuIDE/Views/Controls/CircuitGrid.axaml.cs index 4f77e72..c83e537 100644 --- a/QuIDE/Views/Controls/CircuitGrid.axaml.cs +++ b/QuIDE/Views/Controls/CircuitGrid.axaml.cs @@ -1,11 +1,13 @@ #region using System; +using System.Runtime.InteropServices; using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Shapes; using Avalonia.Input; using Avalonia.Media; +using QuIDE.CodeHelpers; using QuIDE.QuantumModel; using QuIDE.ViewModels; using QuIDE.ViewModels.Controls; @@ -93,7 +95,16 @@ private void GateButton_MouseDown(object sender, PointerPressedEventArgs e) var dragData = new DataObject(); dragData.Set(typeof(Tuple).ToString(), data); - DragDrop.DoDragDrop(e, dragData, DragDropEffects.Link); + try + { + DragDrop.DoDragDrop(e, dragData,DragDropEffects.Link); + } + catch (COMException exception) + { + var msg = exception.Message; + Console.WriteLine(exception); + // SimpleDialogHandler.ShowSimpleMessage(msg); + } } private void ctrlPoint_Drop(object sender, PointerEventArgs pointerEventArgs)