qsharp-lang 1.22.3-dev → 1.22.5-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/compiler/common.d.ts +16 -3
- package/dist/compiler/compiler.d.ts +3 -3
- package/dist/compiler/compiler.js +2 -2
- package/dist/data-structures/circuit.d.ts +13 -0
- 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 +1 -1
- package/docs/Std.Math/ArcCosh.md +1 -1
- package/docs/Std.Math/ArcSin.md +1 -1
- package/docs/Std.Math/ArcSinh.md +1 -1
- package/docs/Std.Math/ArcTan.md +1 -1
- package/docs/Std.Math/ArcTan2.md +1 -1
- package/docs/Std.Math/ArcTanh.md +1 -1
- 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 +1 -1
- package/docs/Std.Math/Cosh.md +1 -1
- 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 +1 -1
- package/docs/Std.Math/Sinh.md +1 -1
- 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 +1 -1
- package/docs/Std.Math/Tanh.md +1 -1
- 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 +1 -1
- 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 +1 -1
- package/lib/nodejs/qsc_wasm.cjs +85 -85
- package/lib/nodejs/qsc_wasm.d.cts +8 -1
- package/lib/nodejs/qsc_wasm_bg.wasm +0 -0
- package/lib/web/qsc_wasm.d.ts +8 -1
- package/lib/web/qsc_wasm.js +78 -78
- package/lib/web/qsc_wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/ux/atoms/controls.ts +216 -0
- package/ux/atoms/index.css +226 -0
- package/ux/atoms/index.ts +192 -0
- package/ux/atoms/layout.ts +730 -0
- package/ux/atoms/utils.ts +32 -0
- package/ux/chem/index.tsx +191 -0
- package/ux/chem/style.css +83 -0
- package/ux/circuit-vis/circuit.ts +1 -0
- package/ux/circuit-vis/events.ts +1 -5
- package/ux/circuit-vis/formatters/gateFormatter.ts +67 -28
- package/ux/circuit-vis/formatters/inputFormatter.ts +28 -5
- package/ux/circuit-vis/gateRenderData.ts +2 -0
- package/ux/circuit-vis/index.ts +4 -7
- package/ux/circuit-vis/process.ts +28 -5
- package/ux/circuit-vis/sqore.ts +31 -22
- package/ux/circuit.tsx +40 -6
- package/ux/histogram.tsx +81 -18
- package/ux/index.ts +2 -0
- package/ux/qsharp-circuit.css +29 -1
- package/ux/qsharp-ux.css +8 -3
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
|
|
4
|
+
// **** Helper functions for rendering SVG elements ****
|
|
5
|
+
|
|
6
|
+
type StringMap = Record<string, string>;
|
|
7
|
+
|
|
8
|
+
export function createSvgElements(...tags: string[]): SVGElement[] {
|
|
9
|
+
return tags.map((tag) =>
|
|
10
|
+
document.createElementNS("http://www.w3.org/2000/svg", tag),
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function setAttributes(el: SVGElement, attrs: StringMap) {
|
|
15
|
+
for (const key in attrs) el.setAttribute(key, attrs[key]);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function appendChildren(parent: Element, children: Element[]) {
|
|
19
|
+
children.forEach((child) => parent.appendChild(child));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function addChildWithClass(
|
|
23
|
+
parent: HTMLElement,
|
|
24
|
+
childTag: string,
|
|
25
|
+
className: string,
|
|
26
|
+
): HTMLElement {
|
|
27
|
+
const parentDoc = parent.ownerDocument;
|
|
28
|
+
const child = parentDoc.createElement(childTag);
|
|
29
|
+
child.classList.add(className);
|
|
30
|
+
parent.appendChild(child);
|
|
31
|
+
return child;
|
|
32
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
|
|
4
|
+
import { useRef, useEffect, useState } from "preact/hooks";
|
|
5
|
+
import { createViewer, GLViewer } from "3dmol";
|
|
6
|
+
|
|
7
|
+
import "./style.css";
|
|
8
|
+
|
|
9
|
+
const themeAttribute = "data-vscode-theme-kind";
|
|
10
|
+
|
|
11
|
+
export function MoleculeViewer(props: {
|
|
12
|
+
moleculeData: string;
|
|
13
|
+
cubeData: { [key: string]: string };
|
|
14
|
+
isoValue?: number;
|
|
15
|
+
}) {
|
|
16
|
+
// Holds reference to the viewer div and 3Dmol viewer object.
|
|
17
|
+
const viewerRef = useRef<HTMLDivElement>(null);
|
|
18
|
+
const viewer = useRef<GLViewer | null>(null);
|
|
19
|
+
const activeCubeData = useRef([] as any[]);
|
|
20
|
+
|
|
21
|
+
const [viewStyle, setViewStyle] = useState("Sphere");
|
|
22
|
+
const [isoval, setIsoval] = useState(props.isoValue || 0.02);
|
|
23
|
+
const [cubeKey, setCubeKey] = useState(Object.keys(props.cubeData)[0] || "");
|
|
24
|
+
|
|
25
|
+
// Runs after the DOM has been created. Create the 3Dmol viewer and adds the model.
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (props.moleculeData && viewerRef.current) {
|
|
28
|
+
const molViewer =
|
|
29
|
+
viewer.current ??
|
|
30
|
+
createViewer(viewerRef.current, {
|
|
31
|
+
backgroundColor: getComputedStyle(document.body).getPropertyValue(
|
|
32
|
+
"--vscode-editor-background",
|
|
33
|
+
),
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
molViewer.clear(); // If the model is being replaced, clear the old one. Perhaps should get and update instead?
|
|
37
|
+
molViewer.addModel(props.moleculeData.trim(), "xyz", {
|
|
38
|
+
assignBonds: true,
|
|
39
|
+
});
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.error("Error adding model:", error);
|
|
42
|
+
}
|
|
43
|
+
viewer.current = molViewer;
|
|
44
|
+
viewer.current.zoomTo();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Respond to theme changes
|
|
48
|
+
const callback = (mutations: MutationRecord[]) => {
|
|
49
|
+
for (const mutation of mutations) {
|
|
50
|
+
if (mutation.attributeName === themeAttribute) {
|
|
51
|
+
const newBackgroundColor = getComputedStyle(
|
|
52
|
+
document.body,
|
|
53
|
+
).getPropertyValue("--vscode-editor-background");
|
|
54
|
+
if (viewer.current) {
|
|
55
|
+
viewer.current.setBackgroundColor(newBackgroundColor, 1.0);
|
|
56
|
+
viewer.current.render();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const observer = new MutationObserver(callback);
|
|
62
|
+
observer.observe(document.body, { attributeFilter: [themeAttribute] });
|
|
63
|
+
}, [props.moleculeData]);
|
|
64
|
+
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
const currViewer = viewer.current;
|
|
67
|
+
if (!currViewer) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (cubeKey && props.cubeData[cubeKey]) {
|
|
72
|
+
activeCubeData.current.forEach((voldata) => {
|
|
73
|
+
currViewer.removeShape(voldata);
|
|
74
|
+
});
|
|
75
|
+
activeCubeData.current = [];
|
|
76
|
+
const cubeData = props.cubeData[cubeKey];
|
|
77
|
+
activeCubeData.current.push(
|
|
78
|
+
currViewer.addVolumetricData(cubeData.trim(), "cube", {
|
|
79
|
+
isoval,
|
|
80
|
+
opacity: 1,
|
|
81
|
+
color: "red",
|
|
82
|
+
}),
|
|
83
|
+
);
|
|
84
|
+
activeCubeData.current.push(
|
|
85
|
+
currViewer.addVolumetricData(cubeData.trim(), "cube", {
|
|
86
|
+
isoval: -1 * isoval,
|
|
87
|
+
opacity: 1,
|
|
88
|
+
color: "green",
|
|
89
|
+
}),
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (viewStyle === "Sphere") {
|
|
94
|
+
currViewer.setStyle({}, { sphere: { scale: 0.3 }, stick: {} });
|
|
95
|
+
} else if (viewStyle === "Stick") {
|
|
96
|
+
currViewer.setStyle({}, { stick: { radius: 0.2 } });
|
|
97
|
+
} else if (viewStyle === "Line") {
|
|
98
|
+
currViewer.setStyle({}, { line: { linewidth: 5.0 } });
|
|
99
|
+
}
|
|
100
|
+
currViewer.render();
|
|
101
|
+
|
|
102
|
+
// Sometimes keys are added later. If that's the case, change the cubeKey to the first available.
|
|
103
|
+
if (!cubeKey && Object.keys(props.cubeData).length > 0) {
|
|
104
|
+
setCubeKey(Object.keys(props.cubeData)[0]);
|
|
105
|
+
}
|
|
106
|
+
}, [viewStyle, isoval, cubeKey, props.moleculeData, props.cubeData]);
|
|
107
|
+
|
|
108
|
+
// React to changes in the initial isovalue prop, just in case the widget updates state in parts.
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
setIsoval(props.isoValue || 0.02);
|
|
111
|
+
}, [props.isoValue]);
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<div id="viewer-container">
|
|
115
|
+
<div
|
|
116
|
+
id="viewer"
|
|
117
|
+
ref={viewerRef}
|
|
118
|
+
style="width: 640px; height: 480px;"
|
|
119
|
+
></div>
|
|
120
|
+
|
|
121
|
+
<div id="view-dropdown-container" class="view-option">
|
|
122
|
+
<label for="viewSelector">Visualization Style:</label>
|
|
123
|
+
<select
|
|
124
|
+
id="viewSelector"
|
|
125
|
+
onChange={(e) => {
|
|
126
|
+
const style = (e.target as HTMLSelectElement).value;
|
|
127
|
+
setViewStyle(style);
|
|
128
|
+
}}
|
|
129
|
+
>
|
|
130
|
+
<option value="Sphere">Sphere</option>
|
|
131
|
+
<option value="Stick">Stick</option>
|
|
132
|
+
<option value="Line">Line</option>
|
|
133
|
+
</select>
|
|
134
|
+
</div>
|
|
135
|
+
{cubeKey ? (
|
|
136
|
+
<>
|
|
137
|
+
<div id="cube-dropdown-container" class="view-option">
|
|
138
|
+
<label for="cubeSelector">Cube selection:</label>
|
|
139
|
+
<select
|
|
140
|
+
id="cubeSelector"
|
|
141
|
+
onChange={(e) => {
|
|
142
|
+
const key = (e.target as HTMLSelectElement).value;
|
|
143
|
+
setCubeKey(key);
|
|
144
|
+
}}
|
|
145
|
+
>
|
|
146
|
+
{Object.keys(props.cubeData).map((key) => (
|
|
147
|
+
<option value={key} selected={key === cubeKey}>
|
|
148
|
+
{key}
|
|
149
|
+
</option>
|
|
150
|
+
))}
|
|
151
|
+
</select>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
<div id="isoval-slider-container" class="view-option">
|
|
155
|
+
<label for="isovalSlider">Adjust isovalue:</label>
|
|
156
|
+
<input
|
|
157
|
+
type="range"
|
|
158
|
+
id="isovalSlider"
|
|
159
|
+
min="0.005"
|
|
160
|
+
max="0.1"
|
|
161
|
+
step="0.005"
|
|
162
|
+
value={isoval}
|
|
163
|
+
onInput={(e) => {
|
|
164
|
+
const new_isoval = parseFloat(
|
|
165
|
+
(e.target as HTMLInputElement).value,
|
|
166
|
+
);
|
|
167
|
+
setIsoval(new_isoval);
|
|
168
|
+
}}
|
|
169
|
+
/>
|
|
170
|
+
<input
|
|
171
|
+
type="number"
|
|
172
|
+
id="isovalInput"
|
|
173
|
+
min="0.005"
|
|
174
|
+
max="0.1"
|
|
175
|
+
step="0.001"
|
|
176
|
+
value={isoval}
|
|
177
|
+
onInput={(e) => {
|
|
178
|
+
const new_isoval = parseFloat(
|
|
179
|
+
(e.target as HTMLInputElement).value,
|
|
180
|
+
);
|
|
181
|
+
if (!isNaN(new_isoval)) {
|
|
182
|
+
setIsoval(new_isoval);
|
|
183
|
+
}
|
|
184
|
+
}}
|
|
185
|
+
/>
|
|
186
|
+
</div>
|
|
187
|
+
</>
|
|
188
|
+
) : null}
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#viewer {
|
|
2
|
+
width: 100%;
|
|
3
|
+
height: 100%;
|
|
4
|
+
margin: 0;
|
|
5
|
+
overflow: hidden;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
#viewer-container {
|
|
9
|
+
width: 100%;
|
|
10
|
+
height: 100%;
|
|
11
|
+
margin: 0;
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
/* border: 1px solid gray; */
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
#viewer {
|
|
17
|
+
width: 100%;
|
|
18
|
+
height: 100%;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
#view-dropdown-container {
|
|
22
|
+
position: absolute;
|
|
23
|
+
top: 10px; /* distance from bottom */
|
|
24
|
+
left: 10px; /* distance from right */
|
|
25
|
+
height: 20px;
|
|
26
|
+
padding: 10px;
|
|
27
|
+
border-radius: 4px;
|
|
28
|
+
z-index: 10;
|
|
29
|
+
font-family: system-ui;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#viewSelector {
|
|
33
|
+
padding-left: 4px;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.view-option {
|
|
37
|
+
display: flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
gap: 8px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.view-option label {
|
|
43
|
+
margin-right: 0;
|
|
44
|
+
white-space: nowrap;
|
|
45
|
+
min-width: 120px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.view-option select,
|
|
49
|
+
.view-option input[type="range"] {
|
|
50
|
+
color: var(--vscode-editor-foreground);
|
|
51
|
+
background-color: var(--vscode-editor-background);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#cube-dropdown-container {
|
|
55
|
+
position: absolute;
|
|
56
|
+
top: 40px; /* distance from bottom */
|
|
57
|
+
left: 10px; /* distance from right */
|
|
58
|
+
padding: 10px;
|
|
59
|
+
height: 20px;
|
|
60
|
+
border-radius: 4px;
|
|
61
|
+
z-index: 10;
|
|
62
|
+
font-family: system-ui;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#isoval-slider-container {
|
|
66
|
+
position: absolute;
|
|
67
|
+
top: 70px; /* distance from bottom */
|
|
68
|
+
left: 10px; /* distance from right */
|
|
69
|
+
padding: 10px;
|
|
70
|
+
height: 40px;
|
|
71
|
+
border-radius: 4px;
|
|
72
|
+
z-index: 10;
|
|
73
|
+
font-family: system-ui;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#isovalSlider {
|
|
77
|
+
width: 100px;
|
|
78
|
+
outline: none;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#isovalInput {
|
|
82
|
+
width: 64px;
|
|
83
|
+
}
|
package/ux/circuit-vis/events.ts
CHANGED
|
@@ -170,11 +170,7 @@ class CircuitEvents {
|
|
|
170
170
|
this.selectedOperation.controls != null &&
|
|
171
171
|
this.selectedWire != null
|
|
172
172
|
) {
|
|
173
|
-
|
|
174
|
-
(control) => control.qubit === this.selectedWire,
|
|
175
|
-
);
|
|
176
|
-
if (controlIndex !== -1)
|
|
177
|
-
this.selectedOperation.controls.splice(controlIndex, 1);
|
|
173
|
+
removeControl(this, this.selectedOperation, this.selectedWire);
|
|
178
174
|
} else {
|
|
179
175
|
// Otherwise, remove the selectedOperation
|
|
180
176
|
removeOperation(this, selectedLocation);
|
|
@@ -119,7 +119,27 @@ const _createGate = (
|
|
|
119
119
|
|
|
120
120
|
const zoomBtn: SVGElement | null = _zoomButton(renderData, nestedDepth);
|
|
121
121
|
if (zoomBtn != null) svgElems = svgElems.concat([zoomBtn]);
|
|
122
|
-
|
|
122
|
+
|
|
123
|
+
const gateElem = group(svgElems, attributes);
|
|
124
|
+
|
|
125
|
+
// If there's a source location, wrap the gate in an SVG <a> element to make it clickable
|
|
126
|
+
if (renderData.link) {
|
|
127
|
+
const linkElem = createSvgElement("a", {
|
|
128
|
+
href: renderData.link.href,
|
|
129
|
+
class: "qs-circuit-source-link",
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Add title as a child <title> element for accessibility and hover tooltip
|
|
133
|
+
const titleElem = createSvgElement("title");
|
|
134
|
+
titleElem.textContent = renderData.link.title;
|
|
135
|
+
linkElem.appendChild(titleElem);
|
|
136
|
+
|
|
137
|
+
// Add the gate as a child of the link
|
|
138
|
+
linkElem.appendChild(gateElem);
|
|
139
|
+
return linkElem;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return gateElem;
|
|
123
143
|
};
|
|
124
144
|
|
|
125
145
|
/**
|
|
@@ -137,14 +157,17 @@ const _zoomButton = (
|
|
|
137
157
|
): SVGElement | null => {
|
|
138
158
|
if (renderData == undefined) return null;
|
|
139
159
|
|
|
140
|
-
const [
|
|
160
|
+
const [gateBoundingBoxX, gateBoundingBoxY] = _gateBoundingBox(
|
|
161
|
+
renderData,
|
|
162
|
+
nestedDepth,
|
|
163
|
+
);
|
|
141
164
|
let { dataAttributes } = renderData;
|
|
142
165
|
dataAttributes = dataAttributes || {};
|
|
143
166
|
|
|
144
|
-
const expanded = "expanded"
|
|
167
|
+
const expanded = dataAttributes["expanded"] == "true";
|
|
145
168
|
|
|
146
|
-
const x =
|
|
147
|
-
const y =
|
|
169
|
+
const x = gateBoundingBoxX + 2;
|
|
170
|
+
const y = gateBoundingBoxY + 2;
|
|
148
171
|
const circleBorder: SVGElement = circle(x, y, 10);
|
|
149
172
|
|
|
150
173
|
if (expanded) {
|
|
@@ -167,45 +190,51 @@ const _zoomButton = (
|
|
|
167
190
|
};
|
|
168
191
|
|
|
169
192
|
/**
|
|
170
|
-
* Calculate
|
|
193
|
+
* Calculate the bounding box for a given operation, which
|
|
194
|
+
* may itself be a group of operations.
|
|
171
195
|
*
|
|
172
196
|
* @param renderData Operation render data.
|
|
173
197
|
* @param nestedDepth Depth of nested operations.
|
|
174
198
|
*
|
|
175
|
-
* @returns
|
|
199
|
+
* @returns [x, y, width, height]
|
|
176
200
|
*/
|
|
177
|
-
const
|
|
201
|
+
const _gateBoundingBox = (
|
|
178
202
|
renderData: GateRenderData,
|
|
179
203
|
nestedDepth: number,
|
|
180
204
|
): [number, number, number, number] => {
|
|
181
|
-
const {
|
|
205
|
+
const {
|
|
206
|
+
x: xFromRenderData,
|
|
207
|
+
width: widthFromRenderData,
|
|
208
|
+
type,
|
|
209
|
+
targetsY,
|
|
210
|
+
} = renderData;
|
|
182
211
|
|
|
183
212
|
const ys = targetsY?.flatMap((y) => y as number[]) || [];
|
|
184
213
|
const maxY = Math.max(...ys);
|
|
185
214
|
const minY = Math.min(...ys);
|
|
186
215
|
|
|
187
|
-
let
|
|
216
|
+
let x: number, y: number, width: number, height: number;
|
|
188
217
|
|
|
189
218
|
switch (type) {
|
|
190
219
|
case GateType.Group: {
|
|
191
220
|
const padding = groupBoxPadding - nestedDepth * nestedGroupPadding;
|
|
192
221
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
222
|
+
x = xFromRenderData - 2 * padding;
|
|
223
|
+
y = minY - gateHeight / 2 - padding;
|
|
224
|
+
width = widthFromRenderData + 2 * padding;
|
|
225
|
+
height = maxY - minY + gateHeight + 2 * padding;
|
|
197
226
|
|
|
198
|
-
return [
|
|
227
|
+
return [x, y, width, height];
|
|
199
228
|
}
|
|
200
229
|
|
|
201
230
|
default:
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
231
|
+
x = xFromRenderData - widthFromRenderData / 2;
|
|
232
|
+
y = minY - gateHeight / 2;
|
|
233
|
+
width = widthFromRenderData;
|
|
234
|
+
height = maxY - minY + gateHeight;
|
|
206
235
|
}
|
|
207
236
|
|
|
208
|
-
return [
|
|
237
|
+
return [x, y, width, height];
|
|
209
238
|
};
|
|
210
239
|
|
|
211
240
|
/**
|
|
@@ -236,6 +265,7 @@ const _measure = (x: number, y: number, wireYs: number[]): SVGElement => {
|
|
|
236
265
|
y + 8,
|
|
237
266
|
x + width - 8,
|
|
238
267
|
y - height / 2 + 8,
|
|
268
|
+
"qs-line-measure",
|
|
239
269
|
);
|
|
240
270
|
meter.style.pointerEvents = "none";
|
|
241
271
|
mBox.setAttribute("data-wire-ys", JSON.stringify(wireYs));
|
|
@@ -376,6 +406,7 @@ const _unitaryBox = (
|
|
|
376
406
|
argButton.setAttribute("class", "arg-button");
|
|
377
407
|
elems.push(argButton);
|
|
378
408
|
}
|
|
409
|
+
|
|
379
410
|
return group(elems);
|
|
380
411
|
};
|
|
381
412
|
|
|
@@ -388,15 +419,23 @@ const _unitaryBox = (
|
|
|
388
419
|
* @returns SVG representation of SWAP gate.
|
|
389
420
|
*/
|
|
390
421
|
const _swap = (renderData: GateRenderData, nestedDepth: number): SVGElement => {
|
|
391
|
-
const { x, targetsY } = renderData;
|
|
422
|
+
const { x: centerX, targetsY } = renderData;
|
|
392
423
|
|
|
393
424
|
// Get SVGs of crosses
|
|
394
|
-
const [
|
|
425
|
+
const [boundingBoxX, boundingBoxY, width, height] = _gateBoundingBox(
|
|
426
|
+
renderData,
|
|
427
|
+
nestedDepth,
|
|
428
|
+
);
|
|
395
429
|
const ys = targetsY?.flatMap((y) => y as number[]) || [];
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
430
|
+
const bg: SVGElement = box(
|
|
431
|
+
boundingBoxX,
|
|
432
|
+
boundingBoxY,
|
|
433
|
+
width,
|
|
434
|
+
height,
|
|
435
|
+
"gate-swap",
|
|
436
|
+
);
|
|
437
|
+
const crosses: SVGElement[] = ys.map((y) => _cross(centerX, y));
|
|
438
|
+
const vertLine: SVGElement = line(centerX, ys[0], centerX, ys[1]);
|
|
400
439
|
vertLine.style.pointerEvents = "none";
|
|
401
440
|
return group([bg, ...crosses, vertLine]);
|
|
402
441
|
};
|
|
@@ -549,10 +588,10 @@ const _groupedOperations = (
|
|
|
549
588
|
nestedDepth: number,
|
|
550
589
|
): SVGElement => {
|
|
551
590
|
const { children } = renderData;
|
|
552
|
-
const [
|
|
591
|
+
const [x, y, w, h] = _gateBoundingBox(renderData, nestedDepth);
|
|
553
592
|
|
|
554
593
|
// Draw dashed box around children gates
|
|
555
|
-
const box: SVGElement = dashedBox(
|
|
594
|
+
const box: SVGElement = dashedBox(x, y, w, h, "gate-unitary");
|
|
556
595
|
const elems: SVGElement[] = [box];
|
|
557
596
|
if (children != null)
|
|
558
597
|
elems.push(formatGates(children as GateRenderData[][], nestedDepth + 1));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT license.
|
|
3
3
|
|
|
4
|
-
import { Qubit } from "../circuit.js";
|
|
4
|
+
import { Qubit, SourceLocation } from "../circuit.js";
|
|
5
5
|
import { RegisterType, RegisterMap, RegisterRenderData } from "../register.js";
|
|
6
6
|
import {
|
|
7
7
|
leftPadding,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
registerHeight,
|
|
10
10
|
classicalRegHeight,
|
|
11
11
|
} from "../constants.js";
|
|
12
|
-
import { group, text } from "./formatUtils.js";
|
|
12
|
+
import { createSvgElement, group, text } from "./formatUtils.js";
|
|
13
13
|
import { mathChars } from "../utils.js";
|
|
14
14
|
|
|
15
15
|
/**
|
|
@@ -23,14 +23,20 @@ import { mathChars } from "../utils.js";
|
|
|
23
23
|
*/
|
|
24
24
|
const formatInputs = (
|
|
25
25
|
qubits: Qubit[],
|
|
26
|
+
renderLocations?: (s: SourceLocation[]) => { title: string; href: string },
|
|
26
27
|
): { qubitWires: SVGElement; registers: RegisterMap; svgHeight: number } => {
|
|
27
28
|
const qubitWires: SVGElement[] = [];
|
|
28
29
|
const registers: RegisterMap = {};
|
|
29
30
|
|
|
30
31
|
let currY: number = startY;
|
|
31
|
-
qubits.forEach(({ id, numResults }, wireIndex) => {
|
|
32
|
+
qubits.forEach(({ id, numResults, declarations }, wireIndex) => {
|
|
33
|
+
const link: { link?: { href: string; title: string } } = {};
|
|
34
|
+
if (renderLocations && declarations && declarations.length > 0) {
|
|
35
|
+
link.link = renderLocations(declarations);
|
|
36
|
+
}
|
|
37
|
+
|
|
32
38
|
// Add qubit wire to list of qubit wires
|
|
33
|
-
qubitWires.push(qubitInput(currY, wireIndex, id.toString()));
|
|
39
|
+
qubitWires.push(qubitInput(currY, wireIndex, id.toString(), link.link));
|
|
34
40
|
|
|
35
41
|
// Create qubit register
|
|
36
42
|
registers[id] = { type: RegisterType.Qubit, y: currY };
|
|
@@ -73,6 +79,7 @@ const qubitInput = (
|
|
|
73
79
|
y: number,
|
|
74
80
|
wireIndex: number,
|
|
75
81
|
subscript?: string,
|
|
82
|
+
link?: { href: string; title: string },
|
|
76
83
|
): SVGElement => {
|
|
77
84
|
const el: SVGElement = text("", leftPadding, y, 16);
|
|
78
85
|
|
|
@@ -85,7 +92,23 @@ const qubitInput = (
|
|
|
85
92
|
el.setAttribute("text-anchor", "start");
|
|
86
93
|
el.setAttribute("dominant-baseline", "middle");
|
|
87
94
|
el.setAttribute("data-wire", wireIndex.toString());
|
|
88
|
-
el.classList.add("qs-maintext");
|
|
95
|
+
el.classList.add("qs-maintext", "qs-qubit-label");
|
|
96
|
+
|
|
97
|
+
if (link) {
|
|
98
|
+
const linkElem = createSvgElement("a", {
|
|
99
|
+
href: link.href,
|
|
100
|
+
class: "qs-circuit-source-link",
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Add title as a child <title> element for accessibility and hover tooltip
|
|
104
|
+
const titleElem = createSvgElement("title");
|
|
105
|
+
titleElem.textContent = link.title;
|
|
106
|
+
linkElem.appendChild(titleElem);
|
|
107
|
+
|
|
108
|
+
// Add the gate as a child of the link
|
|
109
|
+
linkElem.appendChild(el);
|
|
110
|
+
return linkElem;
|
|
111
|
+
}
|
|
89
112
|
return el;
|
|
90
113
|
};
|
|
91
114
|
|
|
@@ -55,4 +55,6 @@ export interface GateRenderData {
|
|
|
55
55
|
children?: GateRenderData[][] | GateRenderData[][][];
|
|
56
56
|
/** Custom data attributes to attach to gate element. */
|
|
57
57
|
dataAttributes?: DataAttributes;
|
|
58
|
+
/** Link href and title for clickable gate. */
|
|
59
|
+
link?: { href: string; title: string };
|
|
58
60
|
}
|
package/ux/circuit-vis/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT license.
|
|
3
3
|
|
|
4
|
-
import { Sqore } from "./sqore.js";
|
|
4
|
+
import { DrawOptions, Sqore } from "./sqore.js";
|
|
5
5
|
import { CircuitGroup } from "./circuit.js";
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -17,13 +17,10 @@ import { CircuitGroup } from "./circuit.js";
|
|
|
17
17
|
export const draw = (
|
|
18
18
|
circuitGroup: CircuitGroup,
|
|
19
19
|
container: HTMLElement,
|
|
20
|
-
|
|
21
|
-
isEditable = false,
|
|
22
|
-
editCallback?: (circuitGroup: CircuitGroup) => void,
|
|
23
|
-
runCallback?: () => void,
|
|
20
|
+
options: DrawOptions = {},
|
|
24
21
|
): void => {
|
|
25
|
-
const sqore = new Sqore(circuitGroup,
|
|
26
|
-
sqore.draw(container
|
|
22
|
+
const sqore = new Sqore(circuitGroup, options);
|
|
23
|
+
sqore.draw(container);
|
|
27
24
|
};
|
|
28
25
|
|
|
29
26
|
// Export types
|