qsharp-lang 1.23.1-dev → 1.23.2-dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.ts +1 -1
- package/dist/katas-content.generated.js +1 -1
- package/dist/katas-content.generated.md.js +1 -1
- package/dist/main.d.ts +1 -0
- package/dist/samples.generated.js +1 -1
- package/docs/Microsoft.Quantum.Core/IsRangeEmpty.md +1 -1
- package/docs/Microsoft.Quantum.Core/Length.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeEnd.md +1 -1
- package/docs/Microsoft.Quantum.Core/RangeStart.md +1 -1
- package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
- package/docs/Microsoft.Quantum.Core/index.md +1 -1
- package/docs/Std.Arithmetic/AddLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
- package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
- package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByI.md +1 -1
- package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByL.md +1 -1
- package/docs/Std.Arithmetic/IncByLE.md +1 -1
- package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
- package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
- package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
- package/docs/Std.Arithmetic/MAJ.md +1 -1
- package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
- package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
- package/docs/Std.Arithmetic/index.md +1 -1
- package/docs/Std.Arrays/All.md +1 -1
- package/docs/Std.Arrays/Any.md +1 -1
- package/docs/Std.Arrays/Chunks.md +1 -1
- package/docs/Std.Arrays/CircularlyShifted.md +1 -1
- package/docs/Std.Arrays/ColumnAt.md +1 -1
- package/docs/Std.Arrays/Count.md +1 -1
- package/docs/Std.Arrays/Diagonal.md +1 -1
- package/docs/Std.Arrays/DrawMany.md +1 -1
- package/docs/Std.Arrays/Enumerated.md +1 -1
- package/docs/Std.Arrays/Excluding.md +1 -1
- package/docs/Std.Arrays/Filtered.md +1 -1
- package/docs/Std.Arrays/FlatMapped.md +1 -1
- package/docs/Std.Arrays/Flattened.md +1 -1
- package/docs/Std.Arrays/Fold.md +1 -1
- package/docs/Std.Arrays/ForEach.md +1 -1
- package/docs/Std.Arrays/Head.md +1 -1
- package/docs/Std.Arrays/HeadAndRest.md +1 -1
- package/docs/Std.Arrays/IndexOf.md +1 -1
- package/docs/Std.Arrays/IndexRange.md +1 -1
- package/docs/Std.Arrays/Interleaved.md +1 -1
- package/docs/Std.Arrays/IsEmpty.md +1 -1
- package/docs/Std.Arrays/IsRectangularArray.md +1 -1
- package/docs/Std.Arrays/IsSorted.md +1 -1
- package/docs/Std.Arrays/IsSquareArray.md +1 -1
- package/docs/Std.Arrays/Mapped.md +1 -1
- package/docs/Std.Arrays/MappedByIndex.md +1 -1
- package/docs/Std.Arrays/MappedOverRange.md +1 -1
- package/docs/Std.Arrays/Most.md +1 -1
- package/docs/Std.Arrays/MostAndTail.md +1 -1
- package/docs/Std.Arrays/Padded.md +1 -1
- package/docs/Std.Arrays/Partitioned.md +1 -1
- package/docs/Std.Arrays/Rest.md +1 -1
- package/docs/Std.Arrays/Reversed.md +1 -1
- package/docs/Std.Arrays/SequenceI.md +1 -1
- package/docs/Std.Arrays/SequenceL.md +1 -1
- package/docs/Std.Arrays/Sorted.md +1 -1
- package/docs/Std.Arrays/Subarray.md +1 -1
- package/docs/Std.Arrays/Swapped.md +1 -1
- package/docs/Std.Arrays/Tail.md +1 -1
- package/docs/Std.Arrays/Transposed.md +1 -1
- package/docs/Std.Arrays/Unzipped.md +1 -1
- package/docs/Std.Arrays/Where.md +1 -1
- package/docs/Std.Arrays/Windows.md +1 -1
- package/docs/Std.Arrays/Zipped.md +1 -1
- package/docs/Std.Arrays/index.md +1 -1
- package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
- package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
- package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
- package/docs/Std.Canon/ApplyOperationPowerA.md +1 -1
- package/docs/Std.Canon/ApplyOperationPowerCA.md +1 -1
- package/docs/Std.Canon/ApplyP.md +1 -1
- package/docs/Std.Canon/ApplyPauli.md +1 -1
- package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
- package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
- package/docs/Std.Canon/ApplyQFT.md +1 -1
- package/docs/Std.Canon/ApplyQPE.md +1 -1
- package/docs/Std.Canon/ApplyToEach.md +1 -1
- package/docs/Std.Canon/ApplyToEachA.md +1 -1
- package/docs/Std.Canon/ApplyToEachC.md +1 -1
- package/docs/Std.Canon/ApplyToEachCA.md +1 -1
- package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
- package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
- package/docs/Std.Canon/CX.md +1 -1
- package/docs/Std.Canon/CY.md +1 -1
- package/docs/Std.Canon/CZ.md +1 -1
- package/docs/Std.Canon/Fst.md +1 -1
- package/docs/Std.Canon/MapPauliAxis.md +1 -1
- package/docs/Std.Canon/Relabel.md +1 -1
- package/docs/Std.Canon/Snd.md +1 -1
- package/docs/Std.Canon/SwapReverseRegister.md +1 -1
- package/docs/Std.Canon/index.md +1 -1
- package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
- package/docs/Std.Convert/BigIntAsInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
- package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
- package/docs/Std.Convert/BoolAsResult.md +1 -1
- package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
- package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
- package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
- package/docs/Std.Convert/IntAsBigInt.md +1 -1
- package/docs/Std.Convert/IntAsBoolArray.md +1 -1
- package/docs/Std.Convert/IntAsDouble.md +1 -1
- package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
- package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
- package/docs/Std.Convert/ResultAsBool.md +1 -1
- package/docs/Std.Convert/index.md +1 -1
- package/docs/Std.Core/Complex.md +1 -1
- package/docs/Std.Core/Length.md +1 -1
- package/docs/Std.Core/Repeated.md +1 -1
- package/docs/Std.Core/index.md +1 -1
- package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
- package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
- package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
- package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
- package/docs/Std.Diagnostics/CheckZero.md +1 -1
- package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
- package/docs/Std.Diagnostics/ConfigureQubitLoss.md +1 -1
- package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
- package/docs/Std.Diagnostics/DumpMachine.md +1 -1
- package/docs/Std.Diagnostics/DumpOperation.md +1 -1
- package/docs/Std.Diagnostics/DumpRegister.md +1 -1
- package/docs/Std.Diagnostics/Fact.md +1 -1
- package/docs/Std.Diagnostics/NoNoise.md +1 -1
- package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
- package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
- package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
- package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
- package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
- package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
- package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
- package/docs/Std.Diagnostics/index.md +1 -1
- package/docs/Std.Intrinsic/AND.md +1 -1
- package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
- package/docs/Std.Intrinsic/CCNOT.md +1 -1
- package/docs/Std.Intrinsic/CNOT.md +1 -1
- package/docs/Std.Intrinsic/Exp.md +1 -1
- package/docs/Std.Intrinsic/H.md +1 -1
- package/docs/Std.Intrinsic/I.md +1 -1
- package/docs/Std.Intrinsic/M.md +1 -1
- package/docs/Std.Intrinsic/Measure.md +1 -1
- package/docs/Std.Intrinsic/Message.md +1 -1
- package/docs/Std.Intrinsic/R.md +1 -1
- package/docs/Std.Intrinsic/R1.md +1 -1
- package/docs/Std.Intrinsic/R1Frac.md +1 -1
- package/docs/Std.Intrinsic/RFrac.md +1 -1
- package/docs/Std.Intrinsic/Reset.md +1 -1
- package/docs/Std.Intrinsic/ResetAll.md +1 -1
- package/docs/Std.Intrinsic/Rx.md +1 -1
- package/docs/Std.Intrinsic/Rxx.md +1 -1
- package/docs/Std.Intrinsic/Ry.md +1 -1
- package/docs/Std.Intrinsic/Ryy.md +1 -1
- package/docs/Std.Intrinsic/Rz.md +1 -1
- package/docs/Std.Intrinsic/Rzz.md +1 -1
- package/docs/Std.Intrinsic/S.md +1 -1
- package/docs/Std.Intrinsic/SWAP.md +1 -1
- package/docs/Std.Intrinsic/SX.md +1 -1
- package/docs/Std.Intrinsic/T.md +1 -1
- package/docs/Std.Intrinsic/X.md +1 -1
- package/docs/Std.Intrinsic/Y.md +1 -1
- package/docs/Std.Intrinsic/Z.md +1 -1
- package/docs/Std.Intrinsic/index.md +1 -1
- package/docs/Std.Logical/Xor.md +1 -1
- package/docs/Std.Logical/index.md +1 -1
- package/docs/Std.Math/AbsComplex.md +1 -1
- package/docs/Std.Math/AbsComplexPolar.md +1 -1
- package/docs/Std.Math/AbsD.md +1 -1
- package/docs/Std.Math/AbsI.md +1 -1
- package/docs/Std.Math/AbsL.md +1 -1
- package/docs/Std.Math/AbsSquaredComplex.md +1 -1
- package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
- package/docs/Std.Math/ApproximateFactorial.md +1 -1
- package/docs/Std.Math/ArcCos.md +4 -3
- package/docs/Std.Math/ArcCosh.md +4 -4
- package/docs/Std.Math/ArcSin.md +4 -3
- package/docs/Std.Math/ArcSinh.md +4 -4
- package/docs/Std.Math/ArcTan.md +4 -3
- package/docs/Std.Math/ArcTan2.md +4 -3
- package/docs/Std.Math/ArcTanh.md +4 -4
- package/docs/Std.Math/ArgComplex.md +1 -1
- package/docs/Std.Math/ArgComplexPolar.md +1 -1
- package/docs/Std.Math/Binom.md +1 -1
- package/docs/Std.Math/BitSizeI.md +1 -1
- package/docs/Std.Math/BitSizeL.md +1 -1
- package/docs/Std.Math/Ceiling.md +1 -1
- package/docs/Std.Math/Complex.md +1 -1
- package/docs/Std.Math/ComplexPolar.md +1 -1
- package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
- package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
- package/docs/Std.Math/Cos.md +4 -3
- package/docs/Std.Math/Cosh.md +4 -4
- package/docs/Std.Math/DivRemI.md +1 -1
- package/docs/Std.Math/DivRemL.md +1 -1
- package/docs/Std.Math/DividedByC.md +1 -1
- package/docs/Std.Math/DividedByCP.md +1 -1
- package/docs/Std.Math/E.md +1 -1
- package/docs/Std.Math/ExpModI.md +1 -1
- package/docs/Std.Math/ExpModL.md +1 -1
- package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
- package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
- package/docs/Std.Math/FactorialI.md +1 -1
- package/docs/Std.Math/FactorialL.md +1 -1
- package/docs/Std.Math/Floor.md +1 -1
- package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
- package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
- package/docs/Std.Math/HammingWeightI.md +1 -1
- package/docs/Std.Math/InverseModI.md +1 -1
- package/docs/Std.Math/InverseModL.md +1 -1
- package/docs/Std.Math/IsCoprimeI.md +1 -1
- package/docs/Std.Math/IsCoprimeL.md +1 -1
- package/docs/Std.Math/IsInfinite.md +1 -1
- package/docs/Std.Math/IsNaN.md +1 -1
- package/docs/Std.Math/LargestFixedPoint.md +1 -1
- package/docs/Std.Math/Lg.md +1 -1
- package/docs/Std.Math/Log.md +1 -1
- package/docs/Std.Math/Log10.md +1 -1
- package/docs/Std.Math/LogFactorialD.md +1 -1
- package/docs/Std.Math/LogGammaD.md +1 -1
- package/docs/Std.Math/LogOf2.md +1 -1
- package/docs/Std.Math/Max.md +1 -1
- package/docs/Std.Math/MaxD.md +1 -1
- package/docs/Std.Math/MaxI.md +1 -1
- package/docs/Std.Math/MaxL.md +1 -1
- package/docs/Std.Math/Min.md +1 -1
- package/docs/Std.Math/MinD.md +1 -1
- package/docs/Std.Math/MinI.md +1 -1
- package/docs/Std.Math/MinL.md +1 -1
- package/docs/Std.Math/MinusC.md +1 -1
- package/docs/Std.Math/MinusCP.md +1 -1
- package/docs/Std.Math/ModulusI.md +1 -1
- package/docs/Std.Math/ModulusL.md +1 -1
- package/docs/Std.Math/NegationC.md +1 -1
- package/docs/Std.Math/NegationCP.md +1 -1
- package/docs/Std.Math/PI.md +1 -1
- package/docs/Std.Math/PNorm.md +1 -1
- package/docs/Std.Math/PNormalized.md +1 -1
- package/docs/Std.Math/PlusC.md +1 -1
- package/docs/Std.Math/PlusCP.md +1 -1
- package/docs/Std.Math/PowC.md +1 -1
- package/docs/Std.Math/PowCP.md +1 -1
- package/docs/Std.Math/RealMod.md +1 -1
- package/docs/Std.Math/Round.md +1 -1
- package/docs/Std.Math/RoundHalfAwayFromZero.md +1 -1
- package/docs/Std.Math/SignD.md +1 -1
- package/docs/Std.Math/SignI.md +1 -1
- package/docs/Std.Math/SignL.md +1 -1
- package/docs/Std.Math/Sin.md +4 -3
- package/docs/Std.Math/Sinh.md +4 -4
- package/docs/Std.Math/SmallestFixedPoint.md +1 -1
- package/docs/Std.Math/Sqrt.md +1 -1
- package/docs/Std.Math/SquaredNorm.md +1 -1
- package/docs/Std.Math/Tan.md +4 -3
- package/docs/Std.Math/Tanh.md +4 -4
- package/docs/Std.Math/TimesC.md +1 -1
- package/docs/Std.Math/TimesCP.md +1 -1
- package/docs/Std.Math/TrailingZeroCountI.md +1 -1
- package/docs/Std.Math/TrailingZeroCountL.md +1 -1
- package/docs/Std.Math/Truncate.md +1 -1
- package/docs/Std.Math/index.md +14 -14
- package/docs/Std.Measurement/IsLossResult.md +1 -1
- package/docs/Std.Measurement/MResetEachZ.md +1 -1
- package/docs/Std.Measurement/MResetX.md +1 -1
- package/docs/Std.Measurement/MResetY.md +1 -1
- package/docs/Std.Measurement/MResetZ.md +1 -1
- package/docs/Std.Measurement/MResetZChecked.md +1 -1
- package/docs/Std.Measurement/MeasureAllZ.md +1 -1
- package/docs/Std.Measurement/MeasureEachZ.md +1 -1
- package/docs/Std.Measurement/MeasureInteger.md +1 -1
- package/docs/Std.Measurement/index.md +1 -1
- package/docs/Std.Random/DrawRandomBool.md +1 -1
- package/docs/Std.Random/DrawRandomDouble.md +1 -1
- package/docs/Std.Random/DrawRandomInt.md +1 -1
- package/docs/Std.Random/index.md +1 -1
- package/docs/Std.Range/IsRangeEmpty.md +1 -1
- package/docs/Std.Range/RangeEnd.md +1 -1
- package/docs/Std.Range/RangeReverse.md +1 -1
- package/docs/Std.Range/RangeStart.md +1 -1
- package/docs/Std.Range/RangeStep.md +1 -1
- package/docs/Std.Range/index.md +1 -1
- package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
- package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
- package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/CczCount.md +1 -1
- package/docs/Std.ResourceEstimation/EnableMemoryComputeArchitecture.md +1 -1
- package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
- package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/LeastFrequentlyUsed.md +1 -1
- package/docs/Std.ResourceEstimation/LeastRecentlyUsed.md +1 -1
- package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
- package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
- package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
- package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
- package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
- package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
- package/docs/Std.ResourceEstimation/TCount.md +1 -1
- package/docs/Std.ResourceEstimation/index.md +1 -1
- package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
- package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
- package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
- package/docs/Std.StatePreparation/index.md +1 -1
- package/docs/Std.TableLookup/Select.md +1 -1
- package/docs/Std.TableLookup/index.md +1 -1
- package/docs/index.md +4 -4
- package/lib/nodejs/qsc_wasm.cjs +2 -2
- package/lib/nodejs/qsc_wasm.d.cts +23 -1
- package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
- package/lib/web/qsc_wasm.d.ts +23 -1
- package/lib/web/qsc_wasm.js +2 -2
- package/lib/web/qsc_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/ux/circuit-vis/constants.ts +16 -13
- package/ux/circuit-vis/draggable.ts +4 -1
- package/ux/circuit-vis/formatters/gateFormatter.ts +97 -102
- package/ux/circuit-vis/formatters/inputFormatter.ts +116 -14
- package/ux/circuit-vis/gateRenderData.ts +4 -0
- package/ux/circuit-vis/panel.ts +4 -2
- package/ux/circuit-vis/process.ts +98 -28
- package/ux/circuit-vis/sqore.ts +159 -71
- package/ux/circuit-vis/utils.ts +58 -19
- package/ux/circuit.tsx +1 -1
- package/ux/estimatesPanel.tsx +1 -1
- package/ux/output_data.md +1 -1
- package/ux/qsharp-circuit.css +20 -14
- package/ux/qsharp-ux.css +84 -27
- package/ux/scatterChart.tsx +1 -1
|
@@ -9,9 +9,11 @@ import {
|
|
|
9
9
|
argsFontSize,
|
|
10
10
|
controlBtnRadius,
|
|
11
11
|
controlBtnOffset,
|
|
12
|
-
|
|
12
|
+
groupPaddingX,
|
|
13
13
|
classicalRegHeight,
|
|
14
|
-
|
|
14
|
+
groupTopPadding,
|
|
15
|
+
labelPaddingX,
|
|
16
|
+
groupLabelPaddingY,
|
|
15
17
|
} from "../constants.js";
|
|
16
18
|
import {
|
|
17
19
|
createSvgElement,
|
|
@@ -36,12 +38,9 @@ import { mathChars } from "../utils.js";
|
|
|
36
38
|
*
|
|
37
39
|
* @returns SVG representation of operations.
|
|
38
40
|
*/
|
|
39
|
-
const formatGates = (
|
|
40
|
-
renderData: GateRenderData[][],
|
|
41
|
-
nestedDepth = 0,
|
|
42
|
-
): SVGElement => {
|
|
41
|
+
const formatGates = (renderData: GateRenderData[][]): SVGElement => {
|
|
43
42
|
const formattedGates: SVGElement[] = renderData
|
|
44
|
-
.map((col) => col.map((renderData) => formatGate(renderData
|
|
43
|
+
.map((col) => col.map((renderData) => formatGate(renderData)))
|
|
45
44
|
.flat();
|
|
46
45
|
return group(formattedGates);
|
|
47
46
|
};
|
|
@@ -50,46 +49,33 @@ const formatGates = (
|
|
|
50
49
|
* Takes in an operation's rendering data and formats it into SVG.
|
|
51
50
|
*
|
|
52
51
|
* @param renderData The rendering data of the gate.
|
|
53
|
-
* @param nestedDepth Depth of nested operations (used in classically controlled and grouped operations).
|
|
54
52
|
*
|
|
55
53
|
* @returns SVG representation of gate.
|
|
56
54
|
*/
|
|
57
|
-
const formatGate = (
|
|
58
|
-
renderData: GateRenderData,
|
|
59
|
-
nestedDepth = 0,
|
|
60
|
-
): SVGElement => {
|
|
55
|
+
const formatGate = (renderData: GateRenderData): SVGElement => {
|
|
61
56
|
const { type, x, controlsY, targetsY, label, displayArgs, width } =
|
|
62
57
|
renderData;
|
|
63
58
|
switch (type) {
|
|
64
59
|
case GateType.Measure:
|
|
65
|
-
return _createGate(
|
|
66
|
-
[_measure(x, controlsY[0], controlsY)],
|
|
67
|
-
renderData,
|
|
68
|
-
nestedDepth,
|
|
69
|
-
);
|
|
60
|
+
return _createGate([_measure(x, controlsY[0], controlsY)], renderData);
|
|
70
61
|
case GateType.Unitary:
|
|
71
62
|
return _createGate(
|
|
72
63
|
[_unitary(label, x, targetsY as number[][], width, displayArgs)],
|
|
73
64
|
renderData,
|
|
74
|
-
nestedDepth,
|
|
75
65
|
);
|
|
76
66
|
case GateType.X:
|
|
77
|
-
return _createGate([_x(renderData)], renderData
|
|
67
|
+
return _createGate([_x(renderData)], renderData);
|
|
78
68
|
case GateType.Ket:
|
|
79
|
-
return _createGate([_ket(label, renderData)], renderData
|
|
69
|
+
return _createGate([_ket(label, renderData)], renderData);
|
|
80
70
|
case GateType.Swap:
|
|
81
71
|
return controlsY.length > 0
|
|
82
|
-
? _controlledGate(renderData
|
|
83
|
-
: _createGate(
|
|
84
|
-
[_swap(renderData, nestedDepth)],
|
|
85
|
-
renderData,
|
|
86
|
-
nestedDepth,
|
|
87
|
-
);
|
|
72
|
+
? _controlledGate(renderData)
|
|
73
|
+
: _createGate([_swap(renderData)], renderData);
|
|
88
74
|
case GateType.Cnot:
|
|
89
75
|
case GateType.ControlledUnitary:
|
|
90
|
-
return _controlledGate(renderData
|
|
76
|
+
return _controlledGate(renderData);
|
|
91
77
|
case GateType.Group:
|
|
92
|
-
return _groupedOperations(renderData
|
|
78
|
+
return _groupedOperations(renderData);
|
|
93
79
|
case GateType.ClassicalControlled:
|
|
94
80
|
return _classicalControlled(renderData);
|
|
95
81
|
default:
|
|
@@ -109,7 +95,6 @@ const formatGate = (
|
|
|
109
95
|
const _createGate = (
|
|
110
96
|
svgElems: SVGElement[],
|
|
111
97
|
renderData: GateRenderData,
|
|
112
|
-
nestedDepth: number,
|
|
113
98
|
): SVGElement => {
|
|
114
99
|
const { dataAttributes } = renderData || {};
|
|
115
100
|
const attributes: { [attr: string]: string } = { class: "gate" };
|
|
@@ -117,13 +102,11 @@ const _createGate = (
|
|
|
117
102
|
([attr, val]) => (attributes[`data-${attr}`] = val),
|
|
118
103
|
);
|
|
119
104
|
|
|
120
|
-
const zoomBtn: SVGElement | null = _zoomButton(renderData, nestedDepth);
|
|
121
|
-
if (zoomBtn != null) svgElems = svgElems.concat([zoomBtn]);
|
|
122
|
-
|
|
123
|
-
const gateElem = group(svgElems, attributes);
|
|
124
|
-
|
|
125
105
|
// If there's a source location, wrap the gate in an SVG <a> element to make it clickable
|
|
126
|
-
|
|
106
|
+
//
|
|
107
|
+
// `GateType.Group` corresponds to an *expanded* group, which will contain clickable gates
|
|
108
|
+
// so therefore should not itself be clickable
|
|
109
|
+
if (renderData.link && renderData.type !== GateType.Group) {
|
|
127
110
|
const linkElem = createSvgElement("a", {
|
|
128
111
|
href: renderData.link.href,
|
|
129
112
|
class: "qs-circuit-source-link",
|
|
@@ -134,12 +117,20 @@ const _createGate = (
|
|
|
134
117
|
titleElem.textContent = renderData.link.title;
|
|
135
118
|
linkElem.appendChild(titleElem);
|
|
136
119
|
|
|
137
|
-
// Add the gate as
|
|
138
|
-
|
|
139
|
-
|
|
120
|
+
// Add the gate elements as children of the link
|
|
121
|
+
for (const e of svgElems) {
|
|
122
|
+
linkElem.appendChild(e);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
svgElems = [linkElem];
|
|
140
126
|
}
|
|
141
127
|
|
|
142
|
-
|
|
128
|
+
// Zoom button comes last so it's on top of the <a> element if both are present
|
|
129
|
+
// This allows clicking the zoom button without triggering the link
|
|
130
|
+
const zoomBtn: SVGElement | null = _zoomButton(renderData);
|
|
131
|
+
if (zoomBtn != null) svgElems = svgElems.concat([zoomBtn]);
|
|
132
|
+
|
|
133
|
+
return group(svgElems, attributes);
|
|
143
134
|
};
|
|
144
135
|
|
|
145
136
|
/**
|
|
@@ -151,16 +142,10 @@ const _createGate = (
|
|
|
151
142
|
*
|
|
152
143
|
* @returns SVG element for expand/collapse button if needed, or null otherwise.
|
|
153
144
|
*/
|
|
154
|
-
const _zoomButton = (
|
|
155
|
-
renderData: GateRenderData,
|
|
156
|
-
nestedDepth: number,
|
|
157
|
-
): SVGElement | null => {
|
|
145
|
+
const _zoomButton = (renderData: GateRenderData): SVGElement | null => {
|
|
158
146
|
if (renderData == undefined) return null;
|
|
159
147
|
|
|
160
|
-
const [gateBoundingBoxX, gateBoundingBoxY] = _gateBoundingBox(
|
|
161
|
-
renderData,
|
|
162
|
-
nestedDepth,
|
|
163
|
-
);
|
|
148
|
+
const [gateBoundingBoxX, gateBoundingBoxY] = _gateBoundingBox(renderData);
|
|
164
149
|
let { dataAttributes } = renderData;
|
|
165
150
|
dataAttributes = dataAttributes || {};
|
|
166
151
|
|
|
@@ -194,45 +179,39 @@ const _zoomButton = (
|
|
|
194
179
|
* may itself be a group of operations.
|
|
195
180
|
*
|
|
196
181
|
* @param renderData Operation render data.
|
|
197
|
-
* @param nestedDepth Depth of nested operations.
|
|
198
182
|
*
|
|
199
183
|
* @returns [x, y, width, height]
|
|
200
184
|
*/
|
|
201
185
|
const _gateBoundingBox = (
|
|
202
186
|
renderData: GateRenderData,
|
|
203
|
-
nestedDepth: number,
|
|
204
187
|
): [number, number, number, number] => {
|
|
205
|
-
const {
|
|
206
|
-
x: xFromRenderData,
|
|
207
|
-
width: widthFromRenderData,
|
|
208
|
-
type,
|
|
209
|
-
targetsY,
|
|
210
|
-
} = renderData;
|
|
188
|
+
const { x: centerX, width, targetsY, topPadding, bottomPadding } = renderData;
|
|
211
189
|
|
|
190
|
+
const x = centerX - width / 2;
|
|
212
191
|
const ys = targetsY?.flatMap((y) => y as number[]) || [];
|
|
213
192
|
const maxY = Math.max(...ys);
|
|
214
193
|
const minY = Math.min(...ys);
|
|
215
194
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
195
|
+
// Here, we want to expand the bounding box to include the whole dashed
|
|
196
|
+
// box around the group, which will be sized according to the nested depth.
|
|
197
|
+
//
|
|
198
|
+
// Example of a grouped operation:
|
|
199
|
+
//
|
|
200
|
+
// y -> ┌╌╌╌╌╌╌╌┐
|
|
201
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
202
|
+
// ╎╎ ╎╎
|
|
203
|
+
// ╎╎ ┌─┐ ╎╎
|
|
204
|
+
// minY -> ───┼┼─│ │─┼┼──
|
|
205
|
+
// ╎╎ │X│ ╎╎
|
|
206
|
+
// maxY -> ───┼┼─│ │─┼┼──
|
|
207
|
+
// ╎╎ └╥┘ ╎╎
|
|
208
|
+
// ╎╎ ╚══╪╪══
|
|
209
|
+
// ╎╎ ╎╎
|
|
210
|
+
// ╎└╌╌╌╌╌┘╎
|
|
211
|
+
// y + height -> └╌╌╌╌╌╌╌┘
|
|
212
|
+
//
|
|
213
|
+
const y = minY - gateHeight / 2 - topPadding;
|
|
214
|
+
const height = maxY - minY + gateHeight + bottomPadding + topPadding;
|
|
236
215
|
|
|
237
216
|
return [x, y, width, height];
|
|
238
217
|
};
|
|
@@ -393,9 +372,12 @@ const _unitaryBox = (
|
|
|
393
372
|
}
|
|
394
373
|
uBox.setAttribute("data-wire-ys", JSON.stringify(wireYs));
|
|
395
374
|
uBox.setAttribute("data-width", `${width}`);
|
|
396
|
-
|
|
397
|
-
const labelText =
|
|
398
|
-
|
|
375
|
+
|
|
376
|
+
const labelText = _labelText(
|
|
377
|
+
label,
|
|
378
|
+
x,
|
|
379
|
+
y + height / 2 - (displayArgs == null ? 0 : 7),
|
|
380
|
+
);
|
|
399
381
|
|
|
400
382
|
const elems = [uBox, labelText];
|
|
401
383
|
if (displayArgs != null) {
|
|
@@ -414,18 +396,15 @@ const _unitaryBox = (
|
|
|
414
396
|
* Creates the SVG for a SWAP gate on y coords given by `renderData`.
|
|
415
397
|
*
|
|
416
398
|
* @param renderData - The render data containing information about the gate, including position and targets.
|
|
417
|
-
* @param nestedDepth - The depth of nested operations (used for adjusting padding and positioning).
|
|
418
399
|
*
|
|
419
400
|
* @returns SVG representation of SWAP gate.
|
|
420
401
|
*/
|
|
421
|
-
const _swap = (renderData: GateRenderData
|
|
402
|
+
const _swap = (renderData: GateRenderData): SVGElement => {
|
|
422
403
|
const { x: centerX, targetsY } = renderData;
|
|
423
404
|
|
|
424
405
|
// Get SVGs of crosses
|
|
425
|
-
const [boundingBoxX, boundingBoxY, width, height] =
|
|
426
|
-
renderData
|
|
427
|
-
nestedDepth,
|
|
428
|
-
);
|
|
406
|
+
const [boundingBoxX, boundingBoxY, width, height] =
|
|
407
|
+
_gateBoundingBox(renderData);
|
|
429
408
|
const ys = targetsY?.flatMap((y) => y as number[]) || [];
|
|
430
409
|
const bg: SVGElement = box(
|
|
431
410
|
boundingBoxX,
|
|
@@ -508,10 +487,7 @@ const _cross = (x: number, y: number): SVGElement => {
|
|
|
508
487
|
*
|
|
509
488
|
* @returns SVG representation of controlled gate.
|
|
510
489
|
*/
|
|
511
|
-
const _controlledGate = (
|
|
512
|
-
renderData: GateRenderData,
|
|
513
|
-
nestedDepth: number,
|
|
514
|
-
): SVGElement => {
|
|
490
|
+
const _controlledGate = (renderData: GateRenderData): SVGElement => {
|
|
515
491
|
const targetGateSvgs: SVGElement[] = [];
|
|
516
492
|
const { type, x, controlsY, label, displayArgs, width } = renderData;
|
|
517
493
|
let { targetsY } = renderData;
|
|
@@ -545,12 +521,11 @@ const _controlledGate = (
|
|
|
545
521
|
// Create control lines
|
|
546
522
|
const maxY: number = Math.max(...controlsY, ...(targetsY as number[]));
|
|
547
523
|
const minY: number = Math.min(...controlsY, ...(targetsY as number[]));
|
|
548
|
-
const vertLine: SVGElement = line(x, minY, x, maxY);
|
|
524
|
+
const vertLine: SVGElement = line(x, minY, x, maxY, "control-line");
|
|
549
525
|
vertLine.style.pointerEvents = "none";
|
|
550
526
|
const svg: SVGElement = _createGate(
|
|
551
527
|
[vertLine, ...controlledDotsSvg, ...targetGateSvgs],
|
|
552
528
|
renderData,
|
|
553
|
-
nestedDepth,
|
|
554
529
|
);
|
|
555
530
|
return svg;
|
|
556
531
|
};
|
|
@@ -583,19 +558,24 @@ const _oplus = (x: number, y: number, wireYs: number[]): SVGElement => {
|
|
|
583
558
|
*
|
|
584
559
|
* @returns SVG representation of gate.
|
|
585
560
|
*/
|
|
586
|
-
const _groupedOperations = (
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
): SVGElement => {
|
|
590
|
-
const { children } = renderData;
|
|
591
|
-
const [x, y, w, h] = _gateBoundingBox(renderData, nestedDepth);
|
|
561
|
+
const _groupedOperations = (renderData: GateRenderData): SVGElement => {
|
|
562
|
+
const { children, label } = renderData;
|
|
563
|
+
const [x, y, w, h] = _gateBoundingBox(renderData);
|
|
592
564
|
|
|
593
565
|
// Draw dashed box around children gates
|
|
594
566
|
const box: SVGElement = dashedBox(x, y, w, h, "gate-unitary");
|
|
595
567
|
const elems: SVGElement[] = [box];
|
|
596
|
-
if (children != null)
|
|
597
|
-
|
|
598
|
-
|
|
568
|
+
if (children != null) elems.push(formatGates(children as GateRenderData[][]));
|
|
569
|
+
|
|
570
|
+
const labelText = _labelText(
|
|
571
|
+
label,
|
|
572
|
+
x + labelPaddingX,
|
|
573
|
+
y + groupTopPadding / 2 + groupLabelPaddingY,
|
|
574
|
+
);
|
|
575
|
+
labelText.classList.add("qs-group-label");
|
|
576
|
+
elems.push(labelText);
|
|
577
|
+
|
|
578
|
+
return _createGate(elems, renderData);
|
|
599
579
|
};
|
|
600
580
|
|
|
601
581
|
/**
|
|
@@ -608,7 +588,7 @@ const _groupedOperations = (
|
|
|
608
588
|
*/
|
|
609
589
|
const _classicalControlled = (
|
|
610
590
|
renderData: GateRenderData,
|
|
611
|
-
padding: number =
|
|
591
|
+
padding: number = groupPaddingX,
|
|
612
592
|
): SVGElement => {
|
|
613
593
|
const { controlsY, dataAttributes } = renderData;
|
|
614
594
|
const targetsY: number[] = renderData.targetsY as number[];
|
|
@@ -658,8 +638,8 @@ const _classicalControlled = (
|
|
|
658
638
|
"classical-line",
|
|
659
639
|
);
|
|
660
640
|
|
|
661
|
-
width = width - controlBtnOffset + (padding -
|
|
662
|
-
x +=
|
|
641
|
+
width = width - controlBtnOffset + (padding - groupPaddingX) * 2;
|
|
642
|
+
x += groupPaddingX - padding;
|
|
663
643
|
const y: number = targetsY[0] - gateHeight / 2 - padding;
|
|
664
644
|
const height: number = targetsY[1] - targetsY[0] + gateHeight + padding * 2;
|
|
665
645
|
|
|
@@ -699,4 +679,19 @@ const _controlCircle = (
|
|
|
699
679
|
class: "classically-controlled-btn",
|
|
700
680
|
});
|
|
701
681
|
|
|
682
|
+
/**
|
|
683
|
+
* Generates the SVG representation of the label text for a gate or grouped operation.
|
|
684
|
+
*
|
|
685
|
+
* @param label Label text.
|
|
686
|
+
* @param x x coord.
|
|
687
|
+
* @param y y coord.
|
|
688
|
+
*
|
|
689
|
+
* @returns SVG representation of label text.
|
|
690
|
+
*/
|
|
691
|
+
function _labelText(label: string, x: number, y: number): SVGTextElement {
|
|
692
|
+
const labelText = text(label, x, y, labelFontSize);
|
|
693
|
+
_style_gate_text(labelText);
|
|
694
|
+
return labelText;
|
|
695
|
+
}
|
|
696
|
+
|
|
702
697
|
export { formatGates, formatGate };
|
|
@@ -6,8 +6,11 @@ import { RegisterType, RegisterMap, RegisterRenderData } from "../register.js";
|
|
|
6
6
|
import {
|
|
7
7
|
leftPadding,
|
|
8
8
|
startY,
|
|
9
|
-
registerHeight,
|
|
10
9
|
classicalRegHeight,
|
|
10
|
+
groupTopPadding,
|
|
11
|
+
groupBottomPadding,
|
|
12
|
+
gateHeight,
|
|
13
|
+
gatePadding,
|
|
11
14
|
} from "../constants.js";
|
|
12
15
|
import { createSvgElement, group, text } from "./formatUtils.js";
|
|
13
16
|
import { mathChars } from "../utils.js";
|
|
@@ -23,46 +26,145 @@ import { mathChars } from "../utils.js";
|
|
|
23
26
|
*/
|
|
24
27
|
const formatInputs = (
|
|
25
28
|
qubits: Qubit[],
|
|
29
|
+
rowHeights: {
|
|
30
|
+
[qubitIndex: number]: {
|
|
31
|
+
heightAboveWire: number;
|
|
32
|
+
heightBelowWire: number;
|
|
33
|
+
};
|
|
34
|
+
},
|
|
26
35
|
renderLocations?: (s: SourceLocation[]) => { title: string; href: string },
|
|
27
|
-
): {
|
|
28
|
-
const
|
|
36
|
+
): { qubitLabels: SVGElement; registers: RegisterMap; svgHeight: number } => {
|
|
37
|
+
const qubitLabels: SVGElement[] = [];
|
|
29
38
|
const registers: RegisterMap = {};
|
|
30
39
|
|
|
31
40
|
let currY: number = startY;
|
|
41
|
+
|
|
42
|
+
// currY -> ┌╌╌╌╌╌╌╌┐
|
|
43
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
44
|
+
// ╎╎ ╎╎
|
|
45
|
+
// ╎╎ ┌─┐ ╎╎
|
|
46
|
+
// ───┼┼─│X│─┼┼──
|
|
47
|
+
// ╎╎ └╥┘ ╎╎
|
|
48
|
+
// ╎╎ ╚══╪╪══
|
|
49
|
+
// ╎╎ ╎╎
|
|
50
|
+
// ╎└╌╌╌╌╌┘╎
|
|
51
|
+
// └╌╌╌╌╌╌╌┘
|
|
52
|
+
|
|
32
53
|
qubits.forEach(({ id, numResults, declarations }, wireIndex) => {
|
|
54
|
+
const { heightAboveWire, heightBelowWire } = rowHeights[wireIndex] || {
|
|
55
|
+
heightAboveWire: 0,
|
|
56
|
+
heightBelowWire: 0,
|
|
57
|
+
};
|
|
58
|
+
currY += heightAboveWire * groupTopPadding;
|
|
59
|
+
|
|
60
|
+
// ┌╌╌╌╌╌╌╌┐
|
|
61
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
62
|
+
// currY -> ╎╎ ╎╎
|
|
63
|
+
// ╎╎ ┌─┐ ╎╎
|
|
64
|
+
// ───┼┼─│X│─┼┼──
|
|
65
|
+
// ╎╎ └╥┘ ╎╎
|
|
66
|
+
// ╎╎ ╚══╪╪══
|
|
67
|
+
// ╎╎ ╎╎
|
|
68
|
+
// ╎└╌╌╌╌╌┘╎
|
|
69
|
+
// └╌╌╌╌╌╌╌┘
|
|
70
|
+
|
|
71
|
+
currY += gatePadding + gateHeight / 2;
|
|
72
|
+
|
|
73
|
+
// ┌╌╌╌╌╌╌╌┐
|
|
74
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
75
|
+
// ╎╎ ╎╎
|
|
76
|
+
// ╎╎ ┌─┐ ╎╎
|
|
77
|
+
// currY -> ───┼┼─│X│─┼┼──
|
|
78
|
+
// ╎╎ └╥┘ ╎╎
|
|
79
|
+
// ╎╎ ╚══╪╪══
|
|
80
|
+
// ╎╎ ╎╎
|
|
81
|
+
// ╎└╌╌╌╌╌┘╎
|
|
82
|
+
// └╌╌╌╌╌╌╌┘
|
|
83
|
+
|
|
33
84
|
const link: { link?: { href: string; title: string } } = {};
|
|
34
85
|
if (renderLocations && declarations && declarations.length > 0) {
|
|
35
86
|
link.link = renderLocations(declarations);
|
|
36
87
|
}
|
|
37
88
|
|
|
38
89
|
// Add qubit wire to list of qubit wires
|
|
39
|
-
|
|
90
|
+
qubitLabels.push(qubitInput(currY, wireIndex, id.toString(), link.link));
|
|
40
91
|
|
|
41
92
|
// Create qubit register
|
|
42
|
-
registers[id] = {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
93
|
+
registers[id] = {
|
|
94
|
+
type: RegisterType.Qubit,
|
|
95
|
+
y: currY,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
currY += gateHeight / 2;
|
|
99
|
+
|
|
100
|
+
// ┌╌╌╌╌╌╌╌┐
|
|
101
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
102
|
+
// ╎╎ ╎╎
|
|
103
|
+
// ╎╎ ┌─┐ ╎╎
|
|
104
|
+
// ───┼┼─│X│─┼┼──
|
|
105
|
+
// currY -> ╎╎ └╥┘ ╎╎
|
|
106
|
+
// ╎╎ ╚══╪╪══
|
|
107
|
+
// ╎╎ ╎╎
|
|
108
|
+
// ╎└╌╌╌╌╌┘╎
|
|
109
|
+
// └╌╌╌╌╌╌╌┘
|
|
49
110
|
|
|
50
111
|
// Increment current height by classical register height for attached classical registers
|
|
51
|
-
currY += classicalRegHeight;
|
|
52
112
|
|
|
53
113
|
// Add classical wires
|
|
54
114
|
registers[id].children = Array.from(Array(numResults), () => {
|
|
115
|
+
currY += classicalRegHeight;
|
|
116
|
+
|
|
117
|
+
// ┌╌╌╌╌╌╌╌┐
|
|
118
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
119
|
+
// ╎╎ ╎╎
|
|
120
|
+
// ╎╎ ┌─┐ ╎╎
|
|
121
|
+
// ───┼┼─│X│─┼┼──
|
|
122
|
+
// ╎╎ └╥┘ ╎╎
|
|
123
|
+
// currY -> ╎╎ ╚══╪╪══
|
|
124
|
+
// ╎╎ ╎╎
|
|
125
|
+
// ╎└╌╌╌╌╌┘╎
|
|
126
|
+
// └╌╌╌╌╌╌╌┘
|
|
127
|
+
|
|
55
128
|
const clsReg: RegisterRenderData = {
|
|
56
129
|
type: RegisterType.Classical,
|
|
57
130
|
y: currY,
|
|
58
131
|
};
|
|
59
|
-
currY += classicalRegHeight;
|
|
60
132
|
return clsReg;
|
|
61
133
|
});
|
|
134
|
+
|
|
135
|
+
currY += gatePadding;
|
|
136
|
+
|
|
137
|
+
// ┌╌╌╌╌╌╌╌┐
|
|
138
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
139
|
+
// ╎╎ ╎╎
|
|
140
|
+
// ╎╎ ┌─┐ ╎╎
|
|
141
|
+
// ───┼┼─│X│─┼┼──
|
|
142
|
+
// ╎╎ └╥┘ ╎╎
|
|
143
|
+
// ╎╎ ╚══╪╪══
|
|
144
|
+
// currY -> ╎╎ ╎╎
|
|
145
|
+
// ╎└╌╌╌╌╌┘╎
|
|
146
|
+
// └╌╌╌╌╌╌╌┘
|
|
147
|
+
|
|
148
|
+
currY += heightBelowWire * groupBottomPadding;
|
|
149
|
+
|
|
150
|
+
// ┌╌╌╌╌╌╌╌┐
|
|
151
|
+
// ╎┌╌╌╌╌╌┐╎
|
|
152
|
+
// ╎╎ ╎╎
|
|
153
|
+
// ╎╎ ┌─┐ ╎╎
|
|
154
|
+
// ───┼┼─│X│─┼┼──
|
|
155
|
+
// ╎╎ └╥┘ ╎╎
|
|
156
|
+
// ╎╎ ║ ╎╎
|
|
157
|
+
// ╎╎ ╚══╪╪══
|
|
158
|
+
// ╎└╌╌╌╌╌┘╎
|
|
159
|
+
// └╌╌╌╌╌╌╌┘
|
|
160
|
+
// currY ->
|
|
62
161
|
});
|
|
63
162
|
|
|
163
|
+
// Additional padding at the very bottom
|
|
164
|
+
currY += classicalRegHeight;
|
|
165
|
+
|
|
64
166
|
return {
|
|
65
|
-
|
|
167
|
+
qubitLabels: group(qubitLabels, { class: "qubit-input-states" }),
|
|
66
168
|
registers,
|
|
67
169
|
svgHeight: currY,
|
|
68
170
|
};
|
|
@@ -53,6 +53,10 @@ export interface GateRenderData {
|
|
|
53
53
|
width: number;
|
|
54
54
|
/** Children operations as part of group. */
|
|
55
55
|
children?: GateRenderData[][] | GateRenderData[][][];
|
|
56
|
+
/** Vertical space from the top of this gate to the top of the topmost contained gate. 0 for non-groups. */
|
|
57
|
+
topPadding: number;
|
|
58
|
+
/** Vertical space from the bottom of this gate to the bottom of the bottommost contained gate. 0 for non-groups. */
|
|
59
|
+
bottomPadding: number;
|
|
56
60
|
/** Custom data attributes to attach to gate element. */
|
|
57
61
|
dataAttributes?: DataAttributes;
|
|
58
62
|
/** Link href and title for clickable gate. */
|
package/ux/circuit-vis/panel.ts
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./constants.js";
|
|
11
11
|
import { formatGate } from "./formatters/gateFormatter.js";
|
|
12
12
|
import { GateType, GateRenderData } from "./gateRenderData.js";
|
|
13
|
-
import {
|
|
13
|
+
import { getMinGateWidth } from "./utils.js";
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Create a panel for the circuit visualization.
|
|
@@ -253,6 +253,8 @@ const toRenderData = (
|
|
|
253
253
|
targetsY: [target],
|
|
254
254
|
label: "",
|
|
255
255
|
width: -1,
|
|
256
|
+
topPadding: 0,
|
|
257
|
+
bottomPadding: 0,
|
|
256
258
|
};
|
|
257
259
|
|
|
258
260
|
if (operation === undefined) return renderData;
|
|
@@ -294,7 +296,7 @@ const toRenderData = (
|
|
|
294
296
|
if (operation.args !== undefined && operation.args.length > 0)
|
|
295
297
|
renderData.displayArgs = operation.args[0];
|
|
296
298
|
|
|
297
|
-
renderData.width =
|
|
299
|
+
renderData.width = getMinGateWidth(renderData);
|
|
298
300
|
renderData.x = x + 1 + renderData.width / 2; // offset by 1 for left padding
|
|
299
301
|
|
|
300
302
|
return renderData;
|