qsharp-lang 1.14.5-dev → 1.15.1-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.
Files changed (338) hide show
  1. package/dist/browser.d.ts +1 -1
  2. package/dist/compiler/compiler.d.ts +1 -1
  3. package/dist/compiler/compiler.js +6 -1
  4. package/dist/debug-service/debug-service.d.ts +1 -1
  5. package/dist/debug-service/debug-service.js +6 -1
  6. package/dist/katas-content.generated.js +1 -1
  7. package/dist/katas-content.generated.md.js +1 -1
  8. package/dist/samples.generated.js +1 -1
  9. package/dist/shared/circuit.d.ts +86 -30
  10. package/dist/shared/circuit.js +4 -0
  11. package/dist/shared/legacyCircuitUpdate.d.ts +9 -0
  12. package/dist/shared/legacyCircuitUpdate.js +312 -0
  13. package/dist/shared/register.d.ts +3 -5
  14. package/dist/utils.d.ts +9 -0
  15. package/dist/utils.js +41 -0
  16. package/docs/Microsoft.Quantum.Core/Length.md +1 -1
  17. package/docs/Microsoft.Quantum.Core/Repeated.md +1 -1
  18. package/docs/Microsoft.Quantum.Core/index.md +1 -1
  19. package/docs/Std.Arithmetic/AddLE.md +1 -1
  20. package/docs/Std.Arithmetic/ApplyIfEqualL.md +1 -1
  21. package/docs/Std.Arithmetic/ApplyIfEqualLE.md +1 -1
  22. package/docs/Std.Arithmetic/ApplyIfGreaterL.md +1 -1
  23. package/docs/Std.Arithmetic/ApplyIfGreaterLE.md +1 -1
  24. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualL.md +1 -1
  25. package/docs/Std.Arithmetic/ApplyIfGreaterOrEqualLE.md +1 -1
  26. package/docs/Std.Arithmetic/ApplyIfLessL.md +1 -1
  27. package/docs/Std.Arithmetic/ApplyIfLessLE.md +1 -1
  28. package/docs/Std.Arithmetic/ApplyIfLessOrEqualL.md +1 -1
  29. package/docs/Std.Arithmetic/ApplyIfLessOrEqualLE.md +1 -1
  30. package/docs/Std.Arithmetic/FourierTDIncByLE.md +1 -1
  31. package/docs/Std.Arithmetic/IncByI.md +1 -1
  32. package/docs/Std.Arithmetic/IncByIUsingIncByLE.md +1 -1
  33. package/docs/Std.Arithmetic/IncByL.md +1 -1
  34. package/docs/Std.Arithmetic/IncByLE.md +1 -1
  35. package/docs/Std.Arithmetic/IncByLEUsingAddLE.md +1 -1
  36. package/docs/Std.Arithmetic/IncByLUsingIncByLE.md +1 -1
  37. package/docs/Std.Arithmetic/LookAheadDKRSAddLE.md +1 -1
  38. package/docs/Std.Arithmetic/MAJ.md +1 -1
  39. package/docs/Std.Arithmetic/ReflectAboutInteger.md +1 -1
  40. package/docs/Std.Arithmetic/RippleCarryCGAddLE.md +1 -1
  41. package/docs/Std.Arithmetic/RippleCarryCGIncByLE.md +1 -1
  42. package/docs/Std.Arithmetic/RippleCarryTTKIncByLE.md +1 -1
  43. package/docs/Std.Arithmetic/index.md +1 -1
  44. package/docs/Std.Arrays/All.md +1 -1
  45. package/docs/Std.Arrays/Any.md +1 -1
  46. package/docs/Std.Arrays/Chunks.md +1 -1
  47. package/docs/Std.Arrays/CircularlyShifted.md +1 -1
  48. package/docs/Std.Arrays/ColumnAt.md +1 -1
  49. package/docs/Std.Arrays/Count.md +1 -1
  50. package/docs/Std.Arrays/Diagonal.md +1 -1
  51. package/docs/Std.Arrays/DrawMany.md +1 -1
  52. package/docs/Std.Arrays/Enumerated.md +1 -1
  53. package/docs/Std.Arrays/Excluding.md +1 -1
  54. package/docs/Std.Arrays/Filtered.md +1 -1
  55. package/docs/Std.Arrays/FlatMapped.md +1 -1
  56. package/docs/Std.Arrays/Flattened.md +1 -1
  57. package/docs/Std.Arrays/Fold.md +1 -1
  58. package/docs/Std.Arrays/ForEach.md +1 -1
  59. package/docs/Std.Arrays/Head.md +1 -1
  60. package/docs/Std.Arrays/HeadAndRest.md +1 -1
  61. package/docs/Std.Arrays/IndexOf.md +1 -1
  62. package/docs/Std.Arrays/IndexRange.md +1 -1
  63. package/docs/Std.Arrays/Interleaved.md +1 -1
  64. package/docs/Std.Arrays/IsEmpty.md +1 -1
  65. package/docs/Std.Arrays/IsRectangularArray.md +1 -1
  66. package/docs/Std.Arrays/IsSorted.md +1 -1
  67. package/docs/Std.Arrays/IsSquareArray.md +1 -1
  68. package/docs/Std.Arrays/Mapped.md +1 -1
  69. package/docs/Std.Arrays/MappedByIndex.md +1 -1
  70. package/docs/Std.Arrays/MappedOverRange.md +1 -1
  71. package/docs/Std.Arrays/Most.md +1 -1
  72. package/docs/Std.Arrays/MostAndTail.md +1 -1
  73. package/docs/Std.Arrays/Padded.md +1 -1
  74. package/docs/Std.Arrays/Partitioned.md +1 -1
  75. package/docs/Std.Arrays/Rest.md +1 -1
  76. package/docs/Std.Arrays/Reversed.md +1 -1
  77. package/docs/Std.Arrays/SequenceI.md +1 -1
  78. package/docs/Std.Arrays/SequenceL.md +1 -1
  79. package/docs/Std.Arrays/Sorted.md +1 -1
  80. package/docs/Std.Arrays/Subarray.md +1 -1
  81. package/docs/Std.Arrays/Swapped.md +1 -1
  82. package/docs/Std.Arrays/Tail.md +1 -1
  83. package/docs/Std.Arrays/Transposed.md +1 -1
  84. package/docs/Std.Arrays/Unzipped.md +1 -1
  85. package/docs/Std.Arrays/Where.md +1 -1
  86. package/docs/Std.Arrays/Windows.md +1 -1
  87. package/docs/Std.Arrays/Zipped.md +1 -1
  88. package/docs/Std.Arrays/index.md +1 -1
  89. package/docs/Std.Canon/ApplyCNOTChain.md +1 -1
  90. package/docs/Std.Canon/ApplyControlledOnBitString.md +1 -1
  91. package/docs/Std.Canon/ApplyControlledOnInt.md +1 -1
  92. package/docs/Std.Canon/ApplyP.md +1 -1
  93. package/docs/Std.Canon/ApplyPauli.md +1 -1
  94. package/docs/Std.Canon/ApplyPauliFromBitString.md +1 -1
  95. package/docs/Std.Canon/ApplyPauliFromInt.md +1 -1
  96. package/docs/Std.Canon/ApplyQFT.md +1 -1
  97. package/docs/Std.Canon/ApplyToEach.md +1 -1
  98. package/docs/Std.Canon/ApplyToEachA.md +1 -1
  99. package/docs/Std.Canon/ApplyToEachC.md +1 -1
  100. package/docs/Std.Canon/ApplyToEachCA.md +1 -1
  101. package/docs/Std.Canon/ApplyXorInPlace.md +1 -1
  102. package/docs/Std.Canon/ApplyXorInPlaceL.md +1 -1
  103. package/docs/Std.Canon/CX.md +1 -1
  104. package/docs/Std.Canon/CY.md +1 -1
  105. package/docs/Std.Canon/CZ.md +1 -1
  106. package/docs/Std.Canon/Fst.md +1 -1
  107. package/docs/Std.Canon/Relabel.md +1 -1
  108. package/docs/Std.Canon/Snd.md +1 -1
  109. package/docs/Std.Canon/SwapReverseRegister.md +1 -1
  110. package/docs/Std.Canon/index.md +1 -1
  111. package/docs/Std.Convert/BigIntAsBoolArray.md +1 -1
  112. package/docs/Std.Convert/BoolArrayAsBigInt.md +1 -1
  113. package/docs/Std.Convert/BoolArrayAsInt.md +1 -1
  114. package/docs/Std.Convert/BoolArrayAsResultArray.md +1 -1
  115. package/docs/Std.Convert/BoolAsResult.md +1 -1
  116. package/docs/Std.Convert/ComplexAsComplexPolar.md +1 -1
  117. package/docs/Std.Convert/ComplexPolarAsComplex.md +1 -1
  118. package/docs/Std.Convert/DoubleAsStringWithPrecision.md +1 -1
  119. package/docs/Std.Convert/IntAsBigInt.md +1 -1
  120. package/docs/Std.Convert/IntAsBoolArray.md +1 -1
  121. package/docs/Std.Convert/IntAsDouble.md +1 -1
  122. package/docs/Std.Convert/ResultArrayAsBoolArray.md +1 -1
  123. package/docs/Std.Convert/ResultArrayAsInt.md +1 -1
  124. package/docs/Std.Convert/ResultAsBool.md +1 -1
  125. package/docs/Std.Convert/index.md +1 -1
  126. package/docs/Std.Core/Length.md +1 -1
  127. package/docs/Std.Core/Repeated.md +1 -1
  128. package/docs/Std.Core/index.md +1 -1
  129. package/docs/Std.Diagnostics/ApplyIdleNoise.md +1 -1
  130. package/docs/Std.Diagnostics/BitFlipNoise.md +1 -1
  131. package/docs/Std.Diagnostics/CheckAllZero.md +1 -1
  132. package/docs/Std.Diagnostics/CheckOperationsAreEqual.md +1 -1
  133. package/docs/Std.Diagnostics/CheckZero.md +1 -1
  134. package/docs/Std.Diagnostics/ConfigurePauliNoise.md +1 -1
  135. package/docs/Std.Diagnostics/DepolarizingNoise.md +1 -1
  136. package/docs/Std.Diagnostics/DumpMachine.md +1 -1
  137. package/docs/Std.Diagnostics/DumpOperation.md +1 -1
  138. package/docs/Std.Diagnostics/DumpRegister.md +1 -1
  139. package/docs/Std.Diagnostics/Fact.md +1 -1
  140. package/docs/Std.Diagnostics/NoNoise.md +1 -1
  141. package/docs/Std.Diagnostics/PhaseFlipNoise.md +1 -1
  142. package/docs/Std.Diagnostics/StartCountingFunction.md +1 -1
  143. package/docs/Std.Diagnostics/StartCountingOperation.md +1 -1
  144. package/docs/Std.Diagnostics/StartCountingQubits.md +1 -1
  145. package/docs/Std.Diagnostics/StopCountingFunction.md +1 -1
  146. package/docs/Std.Diagnostics/StopCountingOperation.md +1 -1
  147. package/docs/Std.Diagnostics/StopCountingQubits.md +1 -1
  148. package/docs/Std.Diagnostics/index.md +1 -1
  149. package/docs/Std.Intrinsic/AND.md +1 -1
  150. package/docs/Std.Intrinsic/ApplyUnitary.md +1 -1
  151. package/docs/Std.Intrinsic/CCNOT.md +1 -1
  152. package/docs/Std.Intrinsic/CNOT.md +1 -1
  153. package/docs/Std.Intrinsic/Exp.md +1 -1
  154. package/docs/Std.Intrinsic/H.md +1 -1
  155. package/docs/Std.Intrinsic/I.md +1 -1
  156. package/docs/Std.Intrinsic/M.md +1 -1
  157. package/docs/Std.Intrinsic/Measure.md +1 -1
  158. package/docs/Std.Intrinsic/Message.md +1 -1
  159. package/docs/Std.Intrinsic/R.md +1 -1
  160. package/docs/Std.Intrinsic/R1.md +1 -1
  161. package/docs/Std.Intrinsic/R1Frac.md +1 -1
  162. package/docs/Std.Intrinsic/RFrac.md +1 -1
  163. package/docs/Std.Intrinsic/Reset.md +1 -1
  164. package/docs/Std.Intrinsic/ResetAll.md +1 -1
  165. package/docs/Std.Intrinsic/Rx.md +1 -1
  166. package/docs/Std.Intrinsic/Rxx.md +1 -1
  167. package/docs/Std.Intrinsic/Ry.md +1 -1
  168. package/docs/Std.Intrinsic/Ryy.md +1 -1
  169. package/docs/Std.Intrinsic/Rz.md +1 -1
  170. package/docs/Std.Intrinsic/Rzz.md +1 -1
  171. package/docs/Std.Intrinsic/S.md +1 -1
  172. package/docs/Std.Intrinsic/SWAP.md +1 -1
  173. package/docs/Std.Intrinsic/T.md +1 -1
  174. package/docs/Std.Intrinsic/X.md +1 -1
  175. package/docs/Std.Intrinsic/Y.md +1 -1
  176. package/docs/Std.Intrinsic/Z.md +1 -1
  177. package/docs/Std.Intrinsic/index.md +1 -1
  178. package/docs/Std.Logical/Xor.md +1 -1
  179. package/docs/Std.Logical/index.md +1 -1
  180. package/docs/Std.Math/AbsComplex.md +1 -1
  181. package/docs/Std.Math/AbsComplexPolar.md +1 -1
  182. package/docs/Std.Math/AbsD.md +1 -1
  183. package/docs/Std.Math/AbsI.md +1 -1
  184. package/docs/Std.Math/AbsL.md +1 -1
  185. package/docs/Std.Math/AbsSquaredComplex.md +1 -1
  186. package/docs/Std.Math/AbsSquaredComplexPolar.md +1 -1
  187. package/docs/Std.Math/ApproximateFactorial.md +1 -1
  188. package/docs/Std.Math/ArcCos.md +1 -1
  189. package/docs/Std.Math/ArcCosh.md +1 -1
  190. package/docs/Std.Math/ArcSin.md +1 -1
  191. package/docs/Std.Math/ArcSinh.md +1 -1
  192. package/docs/Std.Math/ArcTan.md +1 -1
  193. package/docs/Std.Math/ArcTan2.md +1 -1
  194. package/docs/Std.Math/ArcTanh.md +1 -1
  195. package/docs/Std.Math/ArgComplex.md +1 -1
  196. package/docs/Std.Math/ArgComplexPolar.md +1 -1
  197. package/docs/Std.Math/Binom.md +1 -1
  198. package/docs/Std.Math/BitSizeI.md +1 -1
  199. package/docs/Std.Math/BitSizeL.md +1 -1
  200. package/docs/Std.Math/Ceiling.md +1 -1
  201. package/docs/Std.Math/Complex.md +1 -1
  202. package/docs/Std.Math/ComplexPolar.md +1 -1
  203. package/docs/Std.Math/ContinuedFractionConvergentI.md +1 -1
  204. package/docs/Std.Math/ContinuedFractionConvergentL.md +1 -1
  205. package/docs/Std.Math/Cos.md +1 -1
  206. package/docs/Std.Math/Cosh.md +1 -1
  207. package/docs/Std.Math/DivRemI.md +1 -1
  208. package/docs/Std.Math/DivRemL.md +1 -1
  209. package/docs/Std.Math/DividedByC.md +1 -1
  210. package/docs/Std.Math/DividedByCP.md +1 -1
  211. package/docs/Std.Math/E.md +1 -1
  212. package/docs/Std.Math/ExpModI.md +1 -1
  213. package/docs/Std.Math/ExpModL.md +1 -1
  214. package/docs/Std.Math/ExtendedGreatestCommonDivisorI.md +1 -1
  215. package/docs/Std.Math/ExtendedGreatestCommonDivisorL.md +1 -1
  216. package/docs/Std.Math/FactorialI.md +1 -1
  217. package/docs/Std.Math/FactorialL.md +1 -1
  218. package/docs/Std.Math/Floor.md +1 -1
  219. package/docs/Std.Math/GreatestCommonDivisorI.md +1 -1
  220. package/docs/Std.Math/GreatestCommonDivisorL.md +1 -1
  221. package/docs/Std.Math/HammingWeightI.md +1 -1
  222. package/docs/Std.Math/InverseModI.md +1 -1
  223. package/docs/Std.Math/InverseModL.md +1 -1
  224. package/docs/Std.Math/IsCoprimeI.md +1 -1
  225. package/docs/Std.Math/IsCoprimeL.md +1 -1
  226. package/docs/Std.Math/IsInfinite.md +1 -1
  227. package/docs/Std.Math/IsNaN.md +1 -1
  228. package/docs/Std.Math/LargestFixedPoint.md +1 -1
  229. package/docs/Std.Math/Lg.md +1 -1
  230. package/docs/Std.Math/Log.md +1 -1
  231. package/docs/Std.Math/Log10.md +1 -1
  232. package/docs/Std.Math/LogFactorialD.md +1 -1
  233. package/docs/Std.Math/LogGammaD.md +1 -1
  234. package/docs/Std.Math/LogOf2.md +1 -1
  235. package/docs/Std.Math/Max.md +1 -1
  236. package/docs/Std.Math/MaxD.md +1 -1
  237. package/docs/Std.Math/MaxI.md +1 -1
  238. package/docs/Std.Math/MaxL.md +1 -1
  239. package/docs/Std.Math/Min.md +1 -1
  240. package/docs/Std.Math/MinD.md +1 -1
  241. package/docs/Std.Math/MinI.md +1 -1
  242. package/docs/Std.Math/MinL.md +1 -1
  243. package/docs/Std.Math/MinusC.md +1 -1
  244. package/docs/Std.Math/MinusCP.md +1 -1
  245. package/docs/Std.Math/ModulusI.md +1 -1
  246. package/docs/Std.Math/ModulusL.md +1 -1
  247. package/docs/Std.Math/NegationC.md +1 -1
  248. package/docs/Std.Math/NegationCP.md +1 -1
  249. package/docs/Std.Math/PI.md +1 -1
  250. package/docs/Std.Math/PNorm.md +1 -1
  251. package/docs/Std.Math/PNormalized.md +1 -1
  252. package/docs/Std.Math/PlusC.md +1 -1
  253. package/docs/Std.Math/PlusCP.md +1 -1
  254. package/docs/Std.Math/PowC.md +1 -1
  255. package/docs/Std.Math/PowCP.md +1 -1
  256. package/docs/Std.Math/RealMod.md +1 -1
  257. package/docs/Std.Math/Round.md +1 -1
  258. package/docs/Std.Math/SignD.md +1 -1
  259. package/docs/Std.Math/SignI.md +1 -1
  260. package/docs/Std.Math/SignL.md +1 -1
  261. package/docs/Std.Math/Sin.md +1 -1
  262. package/docs/Std.Math/Sinh.md +1 -1
  263. package/docs/Std.Math/SmallestFixedPoint.md +1 -1
  264. package/docs/Std.Math/Sqrt.md +1 -1
  265. package/docs/Std.Math/SquaredNorm.md +1 -1
  266. package/docs/Std.Math/Tan.md +1 -1
  267. package/docs/Std.Math/Tanh.md +1 -1
  268. package/docs/Std.Math/TimesC.md +1 -1
  269. package/docs/Std.Math/TimesCP.md +1 -1
  270. package/docs/Std.Math/TrailingZeroCountI.md +1 -1
  271. package/docs/Std.Math/TrailingZeroCountL.md +1 -1
  272. package/docs/Std.Math/Truncate.md +1 -1
  273. package/docs/Std.Math/index.md +1 -1
  274. package/docs/Std.Measurement/MResetEachZ.md +1 -1
  275. package/docs/Std.Measurement/MResetX.md +1 -1
  276. package/docs/Std.Measurement/MResetY.md +1 -1
  277. package/docs/Std.Measurement/MResetZ.md +1 -1
  278. package/docs/Std.Measurement/MeasureAllZ.md +1 -1
  279. package/docs/Std.Measurement/MeasureEachZ.md +1 -1
  280. package/docs/Std.Measurement/MeasureInteger.md +1 -1
  281. package/docs/Std.Measurement/index.md +1 -1
  282. package/docs/Std.Random/DrawRandomBool.md +1 -1
  283. package/docs/Std.Random/DrawRandomDouble.md +1 -1
  284. package/docs/Std.Random/DrawRandomInt.md +1 -1
  285. package/docs/Std.Random/index.md +1 -1
  286. package/docs/Std.Range/IsRangeEmpty.md +1 -1
  287. package/docs/Std.Range/RangeEnd.md +1 -1
  288. package/docs/Std.Range/RangeReverse.md +1 -1
  289. package/docs/Std.Range/RangeStart.md +1 -1
  290. package/docs/Std.Range/RangeStep.md +1 -1
  291. package/docs/Std.Range/index.md +1 -1
  292. package/docs/Std.ResourceEstimation/AccountForEstimates.md +1 -1
  293. package/docs/Std.ResourceEstimation/AuxQubitCount.md +1 -1
  294. package/docs/Std.ResourceEstimation/BeginEstimateCaching.md +1 -1
  295. package/docs/Std.ResourceEstimation/BeginRepeatEstimates.md +1 -1
  296. package/docs/Std.ResourceEstimation/CczCount.md +1 -1
  297. package/docs/Std.ResourceEstimation/EndEstimateCaching.md +1 -1
  298. package/docs/Std.ResourceEstimation/EndRepeatEstimates.md +1 -1
  299. package/docs/Std.ResourceEstimation/MeasurementCount.md +1 -1
  300. package/docs/Std.ResourceEstimation/PSSPCLayout.md +1 -1
  301. package/docs/Std.ResourceEstimation/RepeatEstimates.md +1 -1
  302. package/docs/Std.ResourceEstimation/RotationCount.md +1 -1
  303. package/docs/Std.ResourceEstimation/RotationDepth.md +1 -1
  304. package/docs/Std.ResourceEstimation/SingleVariant.md +1 -1
  305. package/docs/Std.ResourceEstimation/TCount.md +1 -1
  306. package/docs/Std.ResourceEstimation/index.md +1 -1
  307. package/docs/Std.StatePreparation/ApproximatelyPreparePureStateCP.md +1 -1
  308. package/docs/Std.StatePreparation/PreparePureStateD.md +1 -1
  309. package/docs/Std.StatePreparation/PrepareUniformSuperposition.md +1 -1
  310. package/docs/Std.StatePreparation/index.md +1 -1
  311. package/docs/Std.TableLookup/Select.md +1 -1
  312. package/docs/Std.TableLookup/index.md +1 -1
  313. package/docs/index.md +1 -1
  314. package/lib/node/qsc_wasm.cjs +2 -2
  315. package/lib/node/qsc_wasm_bg.wasm +0 -0
  316. package/lib/web/qsc_wasm.js +2 -2
  317. package/lib/web/qsc_wasm_bg.wasm +0 -0
  318. package/package.json +1 -1
  319. package/ux/circuit-vis/circuit.ts +11 -0
  320. package/ux/circuit-vis/circuitManipulation.ts +549 -0
  321. package/ux/circuit-vis/constants.ts +7 -0
  322. package/ux/circuit-vis/contextMenu.ts +376 -0
  323. package/ux/circuit-vis/draggable.ts +352 -0
  324. package/ux/circuit-vis/events.ts +818 -0
  325. package/ux/circuit-vis/formatters/gateFormatter.ts +56 -23
  326. package/ux/circuit-vis/formatters/inputFormatter.ts +38 -7
  327. package/ux/circuit-vis/formatters/registerFormatter.ts +12 -30
  328. package/ux/circuit-vis/index.ts +16 -11
  329. package/ux/circuit-vis/metadata.ts +3 -1
  330. package/ux/circuit-vis/panel.ts +333 -0
  331. package/ux/circuit-vis/process.ts +136 -232
  332. package/ux/circuit-vis/sqore.ts +231 -116
  333. package/ux/circuit-vis/utils.ts +269 -1
  334. package/ux/circuit.tsx +71 -37
  335. package/ux/data.ts +4 -2
  336. package/ux/index.ts +1 -1
  337. package/ux/qsharp-circuit.css +260 -4
  338. package/ux/circuit-vis/styles.ts +0 -236
@@ -0,0 +1,333 @@
1
+ // Copyright (c) Microsoft Corporation.
2
+ // Licensed under the MIT license.
3
+
4
+ import { Ket, Measurement, Operation, Unitary } from "./circuit";
5
+ import {
6
+ gateHeight,
7
+ horizontalGap,
8
+ minGateWidth,
9
+ verticalGap,
10
+ } from "./constants";
11
+ import { formatGate } from "./formatters/gateFormatter";
12
+ import { GateType, Metadata } from "./metadata";
13
+ import { getGateWidth } from "./utils";
14
+
15
+ /**
16
+ * Create a panel for the circuit visualization.
17
+ * @param container HTML element for rendering visualization into
18
+ */
19
+ const createPanel = (container: HTMLElement): void => {
20
+ if (container.querySelector(".panel") == null) {
21
+ const circuit = container.querySelector("svg[id]");
22
+ if (circuit == null) {
23
+ throw new Error("No circuit found in the container");
24
+ }
25
+
26
+ const wrapper = _elem("div", "");
27
+ wrapper.style.display = "block";
28
+ wrapper.style.overflow = "auto";
29
+ wrapper.style.width = "100%";
30
+ wrapper.appendChild(_qubitLineControl());
31
+ container.appendChild(wrapper);
32
+ wrapper.appendChild(circuit);
33
+
34
+ const panelElem = _panel();
35
+ container.prepend(panelElem);
36
+ container.style.display = "flex";
37
+ container.style.height = "80vh";
38
+ container.style.width = "95vw";
39
+ }
40
+ };
41
+
42
+ const _qubitLineControl = (): HTMLElement => {
43
+ const qubitLineControlElem = _elem("div", "qubit-line-control");
44
+ _children(qubitLineControlElem, [
45
+ _title("Add/Remove Qubit Lines:"),
46
+ _addQubitLineControl(),
47
+ _removeQubitLineControl(),
48
+ ]);
49
+ return qubitLineControlElem;
50
+ };
51
+
52
+ const _addQubitLineControl = (): HTMLElement => {
53
+ const addQubitLineControlElem = _elem("button", "add-qubit-line");
54
+ addQubitLineControlElem.textContent = "+";
55
+ return addQubitLineControlElem;
56
+ };
57
+
58
+ const _removeQubitLineControl = (): HTMLElement => {
59
+ const removeQubitLineControlElem = _elem("button", "remove-qubit-line");
60
+ removeQubitLineControlElem.textContent = "-";
61
+ return removeQubitLineControlElem;
62
+ };
63
+
64
+ /**
65
+ * Function to produce panel element
66
+ * @param context Context object to manage extension state
67
+ * @returns HTML element for panel
68
+ */
69
+ const _panel = (): HTMLElement => {
70
+ const panelElem = _elem("div");
71
+ panelElem.className = "panel";
72
+ _children(panelElem, [_createToolbox()]);
73
+ return panelElem;
74
+ };
75
+
76
+ /**
77
+ * Function to produce toolbox element
78
+ * @param context Context object to manage extension state
79
+ * @returns HTML element for toolbox
80
+ */
81
+ const _createToolbox = (): HTMLElement => {
82
+ // Generate gate elements in a 3xN grid
83
+ let prefixX = 0;
84
+ let prefixY = 0;
85
+ const gateElems = Object.keys(toolboxGateDictionary).map((key, index) => {
86
+ const { width: gateWidth } = toMetadata(toolboxGateDictionary[key], 0, 0);
87
+
88
+ // Increment prefixX for every gate, and reset after 2 gates (2 columns)
89
+ if (index % 2 === 0 && index !== 0) {
90
+ prefixX = 0;
91
+ prefixY += gateHeight + verticalGap;
92
+ }
93
+
94
+ const gateElem = _gate(
95
+ toolboxGateDictionary,
96
+ key.toString(),
97
+ prefixX,
98
+ prefixY,
99
+ );
100
+ prefixX += gateWidth + horizontalGap;
101
+ return gateElem;
102
+ });
103
+
104
+ // Generate svg container to store gate elements
105
+ const svgElem = document.createElementNS("http://www.w3.org/2000/svg", "svg");
106
+ svgElem.classList.add("toolbox-panel-svg");
107
+ _childrenSvg(svgElem, gateElems);
108
+
109
+ // Generate toolbox panel
110
+ const toolboxElem = _elem("div", "toolbox-panel");
111
+ _children(toolboxElem, [_title("Toolbox")]);
112
+ toolboxElem.appendChild(svgElem);
113
+
114
+ return toolboxElem;
115
+ };
116
+
117
+ /**
118
+ * Factory function to produce HTML element
119
+ * @param tag Tag name
120
+ * @param className Class name
121
+ * @returns HTML element
122
+ */
123
+ const _elem = (tag: string, className?: string): HTMLElement => {
124
+ const _elem = document.createElement(tag);
125
+ if (className) {
126
+ _elem.className = className;
127
+ }
128
+ return _elem;
129
+ };
130
+
131
+ /**
132
+ * Append all child elements to a parent HTML element
133
+ * @param parentElem Parent HTML element
134
+ * @param childElems Array of HTML child elements
135
+ * @returns Parent HTML element with all children appended
136
+ */
137
+ const _children = (
138
+ parentElem: HTMLElement,
139
+ childElems: HTMLElement[],
140
+ ): HTMLElement => {
141
+ childElems.map((elem) => parentElem.appendChild(elem));
142
+ return parentElem;
143
+ };
144
+
145
+ /**
146
+ * Append all child elements to a parent SVG element
147
+ * @param parentElem Parent SVG element
148
+ * @param childElems Array of SVG child elements
149
+ * @returns Parent SVG element with all children appended
150
+ */
151
+ const _childrenSvg = (
152
+ parentElem: SVGElement,
153
+ childElems: SVGElement[],
154
+ ): SVGElement => {
155
+ childElems.map((elem) => parentElem.appendChild(elem));
156
+ return parentElem;
157
+ };
158
+
159
+ /**
160
+ * Function to produce title element
161
+ * @param text Text
162
+ * @returns Title element
163
+ */
164
+ const _title = (text: string): HTMLElement => {
165
+ const titleElem = _elem("h2");
166
+ titleElem.className = "title";
167
+ titleElem.textContent = text;
168
+ return titleElem;
169
+ };
170
+
171
+ /**
172
+ * Wrapper to generate metadata based on _opToMetadata with mock registers and limited support
173
+ * @param operation Operation object
174
+ * @param x x coordinate at starting point from the left
175
+ * @param y y coordinate at starting point from the top
176
+ * @returns Metadata object
177
+ */
178
+ const toMetadata = (
179
+ operation: Operation | undefined,
180
+ x: number,
181
+ y: number,
182
+ ): Metadata => {
183
+ const target = y + 1 + gateHeight / 2; // offset by 1 for top padding
184
+ const metadata: Metadata = {
185
+ type: GateType.Invalid,
186
+ x: x + 1 + minGateWidth / 2, // offset by 1 for left padding
187
+ controlsY: [],
188
+ targetsY: [target],
189
+ label: "",
190
+ width: -1,
191
+ };
192
+
193
+ if (operation === undefined) return metadata;
194
+
195
+ switch (operation.kind) {
196
+ case "unitary": {
197
+ const { gate, controls } = operation;
198
+
199
+ if (gate === "SWAP") {
200
+ metadata.type = GateType.Swap;
201
+ } else if (controls && controls.length > 0) {
202
+ metadata.type =
203
+ gate === "X" ? GateType.Cnot : GateType.ControlledUnitary;
204
+ metadata.label = gate;
205
+ if (gate !== "X") {
206
+ metadata.targetsY = [[target]];
207
+ }
208
+ } else if (gate === "X") {
209
+ metadata.type = GateType.X;
210
+ metadata.label = gate;
211
+ } else {
212
+ metadata.type = GateType.Unitary;
213
+ metadata.label = gate;
214
+ metadata.targetsY = [[target]];
215
+ }
216
+ break;
217
+ }
218
+ case "measurement":
219
+ metadata.type = GateType.Measure;
220
+ metadata.controlsY = [target];
221
+ break;
222
+ case "ket":
223
+ metadata.type = GateType.Ket;
224
+ metadata.label = operation.gate;
225
+ metadata.targetsY = [[target]];
226
+ break;
227
+ }
228
+
229
+ if (operation.args !== undefined && operation.args.length > 0)
230
+ metadata.displayArgs = operation.args[0];
231
+
232
+ metadata.width = getGateWidth(metadata);
233
+ metadata.x = x + 1 + metadata.width / 2; // offset by 1 for left padding
234
+
235
+ return metadata;
236
+ };
237
+
238
+ /**
239
+ * Generate an SVG gate element for the Toolbox panel based on the type of gate.
240
+ * This function retrieves the operation metadata from the gate dictionary,
241
+ * formats the gate, and returns the corresponding SVG element.
242
+ *
243
+ * @param gateDictionary - The dictionary containing gate operations.
244
+ * @param type - The type of gate. Example: 'H' or 'X'.
245
+ * @param x - The x coordinate at the starting point from the left.
246
+ * @param y - The y coordinate at the starting point from the top.
247
+ * @returns The generated SVG element representing the gate.
248
+ * @throws Will throw an error if the gate type is not available in the dictionary.
249
+ */
250
+ const _gate = (
251
+ gateDictionary: GateDictionary,
252
+ type: string,
253
+ x: number,
254
+ y: number,
255
+ ): SVGElement => {
256
+ const gate = gateDictionary[type];
257
+ if (gate == null) throw new Error(`Gate ${type} not available`);
258
+ const metadata = toMetadata(gate, x, y);
259
+ metadata.dataAttributes = { type: type };
260
+ const gateElem = formatGate(metadata).cloneNode(true) as SVGElement;
261
+ gateElem.setAttribute("toolbox-item", "true");
262
+
263
+ return gateElem;
264
+ };
265
+
266
+ /**
267
+ * Interface for gate dictionary
268
+ */
269
+ interface GateDictionary {
270
+ [index: string]: Operation;
271
+ }
272
+
273
+ /**
274
+ * Function to create a unitary operation
275
+ *
276
+ * @param gate - The name of the gate
277
+ * @returns Unitary operation object
278
+ */
279
+ const _makeUnitary = (gate: string): Unitary => {
280
+ return {
281
+ kind: "unitary",
282
+ gate: gate,
283
+ targets: [{ qubit: 0 }],
284
+ };
285
+ };
286
+
287
+ /**
288
+ * Function to create a measurement operation
289
+ *
290
+ * @param gate - The name of the gate
291
+ * @returns Unitary operation object
292
+ */
293
+ const _makeMeasurement = (gate: string): Measurement => {
294
+ return {
295
+ kind: "measurement",
296
+ gate: gate,
297
+ qubits: [{ qubit: 0 }],
298
+ results: [{ qubit: 0, result: 0 }],
299
+ };
300
+ };
301
+
302
+ const _makeKet = (gate: string): Ket => {
303
+ return {
304
+ kind: "ket",
305
+ gate: gate,
306
+ targets: [{ qubit: 0 }],
307
+ };
308
+ };
309
+
310
+ /**
311
+ * Object for default gate dictionary
312
+ */
313
+ const toolboxGateDictionary: GateDictionary = {
314
+ RX: _makeUnitary("Rx"),
315
+ X: _makeUnitary("X"),
316
+ RY: _makeUnitary("Ry"),
317
+ Y: _makeUnitary("Y"),
318
+ RZ: _makeUnitary("Rz"),
319
+ Z: _makeUnitary("Z"),
320
+ S: _makeUnitary("S"),
321
+ T: _makeUnitary("T"),
322
+ H: _makeUnitary("H"),
323
+ SX: _makeUnitary("SX"),
324
+ Reset: _makeKet("0"),
325
+ ResetOne: _makeKet("1"),
326
+ Measure: _makeMeasurement("Measure"),
327
+ };
328
+
329
+ toolboxGateDictionary["RX"].params = [{ name: "theta", type: "Double" }];
330
+ toolboxGateDictionary["RY"].params = [{ name: "theta", type: "Double" }];
331
+ toolboxGateDictionary["RZ"].params = [{ name: "theta", type: "Double" }];
332
+
333
+ export { createPanel, toolboxGateDictionary, toMetadata };