From 808e66d06021e850a9287e70a89e3df46aafdf7f Mon Sep 17 00:00:00 2001 From: Edwin Navarro Date: Fri, 3 Sep 2021 03:19:10 -0700 Subject: [PATCH] Fix measure with condition display in mpl and latex drawers (#6822) * Fix measure with condition display in mpl and latex drawers * Remove exceptions import * Adjust indicator spacing for measure and condition * Add measure arrow * Fix ref images * Fix arrow * Fix refs * Fix measure cregbundle creg and condition value displays * Lint * Clean up condition display * Fix some condition displays * Add latex and mpl tests * Fix mpl tests * Lint * Adjust user_ax test * Switch text and latex drawers to hex conditionals * Release note * Final merge * Change hex display Co-authored-by: Luciano Bello --- qiskit/visualization/latex.py | 44 ++-- qiskit/visualization/matplotlib.py | 2 + qiskit/visualization/text.py | 9 +- ...ay-measure-condition-139ddbb8c7ae4071.yaml | 17 ++ .../circuit/references/measure_cond_false.png | Bin 0 -> 22096 bytes .../circuit/references/measure_cond_true.png | Bin 0 -> 17014 bytes test/ipynb/mpl/circuit/references/user_ax.png | Bin 16739 -> 24204 bytes .../circuit/test_circuit_matplotlib_drawer.py | 17 +- .../references/test_latex_4597.tex | 2 +- .../test_latex_boolean_negation.tex | 26 -- .../references/test_latex_conditional.tex | 2 +- .../references/test_latex_meas_cond_false.tex | 16 ++ .../references/test_latex_meas_cond_true.tex | 14 ++ .../references/test_latex_meas_condition.tex | 2 +- .../references/test_latex_teleport.tex | 2 +- .../visualization/test_circuit_latex.py | 18 ++ .../visualization/test_circuit_text_drawer.py | 230 +++++++++--------- 17 files changed, 229 insertions(+), 172 deletions(-) create mode 100644 releasenotes/notes/fix-display-measure-condition-139ddbb8c7ae4071.yaml create mode 100644 test/ipynb/mpl/circuit/references/measure_cond_false.png create mode 100644 test/ipynb/mpl/circuit/references/measure_cond_true.png delete mode 100644 test/python/visualization/references/test_latex_boolean_negation.tex create mode 100644 test/python/visualization/references/test_latex_meas_cond_false.tex create mode 100644 test/python/visualization/references/test_latex_meas_cond_true.tex diff --git a/qiskit/visualization/latex.py b/qiskit/visualization/latex.py index cb735fd4e7a0..91cd0003d018 100644 --- a/qiskit/visualization/latex.py +++ b/qiskit/visualization/latex.py @@ -22,7 +22,6 @@ from qiskit.circuit.library.standard_gates import SwapGate, XGate, ZGate, RZZGate, U1Gate, PhaseGate from qiskit.circuit.measure import Measure from qiskit.visualization.qcstyle import load_style -from qiskit.visualization import exceptions from qiskit.circuit.tools.pi_check import pi_check from .utils import get_gate_ctrl_text, get_param_str, generate_latex_label @@ -394,6 +393,10 @@ def _build_latex_array(self): for node in layer: op = node.op num_cols_op = 1 + wire_list = [self.img_regs[qarg] for qarg in node.qargs] + if op.condition: + self._add_condition(op, wire_list, column) + if isinstance(op, Measure): self._build_measure(node, column) @@ -404,15 +407,11 @@ def _build_latex_array(self): gate_text, _, _ = get_gate_ctrl_text(op, "latex", style=self._style) gate_text += get_param_str(op, "latex", ndigits=4) gate_text = generate_latex_label(gate_text) - wire_list = [self.img_regs[qarg] for qarg in node.qargs] if node.cargs: cwire_list = [self.img_regs[carg] for carg in node.cargs] else: cwire_list = [] - if op.condition: - self._add_condition(op, wire_list, column) - if len(wire_list) == 1 and not node.cargs: self._latex[wire_list[0]][column] = "\\gate{%s}" % gate_text @@ -531,10 +530,8 @@ def _build_symmetric_gate(self, op, gate_text, wire_list, col): def _build_measure(self, node, col): """Build a meter and the lines to the creg""" - if node.op.condition: - raise exceptions.VisualizationError("If controlled measures currently not supported.") - wire1 = self.img_regs[node.qargs[0]] + self._latex[wire1][col] = "\\meter" if self.cregbundle: wire2 = len(self.qubit_list) cregindex = self.img_regs[node.cargs[0]] - wire2 @@ -544,17 +541,15 @@ def _build_measure(self, node, col): wire2 += 1 else: break - else: - wire2 = self.img_regs[node.cargs[0]] - - self._latex[wire1][col] = "\\meter" - if self.cregbundle: - self._latex[wire2][col] = "\\dstick{_{_{%s}}} \\cw \\cwx[-%s]" % ( + cond_offset = 1.5 if node.op.condition else 0.0 + self._latex[wire2][col] = "\\dstick{_{_{\\hspace{%sem}%s}}} \\cw \\ar @{<=} [-%s,0]" % ( + cond_offset, str(cregindex), str(wire2 - wire1), ) else: - self._latex[wire2][col] = "\\control \\cw \\cwx[-" + str(wire2 - wire1) + "]" + wire2 = self.img_regs[node.cargs[0]] + self._latex[wire2][col] = "\\cw \\ar @{<=} [-" + str(wire2 - wire1) + ",0]" def _build_barrier(self, node, col): """Build a partial or full barrier if plot_barriers set""" @@ -612,18 +607,29 @@ def _add_condition(self, op, wire_list, col): cwire += 1 gap = cwire - max(wire_list) + meas_offset = -0.3 if isinstance(op, Measure) else 0.0 if self.cregbundle: - # Print the condition value at the bottom - self._latex[cwire][col] = "\\dstick{_{_{=%s}}} \\cw \\cwx[-%s]" % ( - str(op.condition[1]), + # Print the condition value at the bottom and put bullet on creg line + self._latex[cwire][col] = "\\control \\cw^(%s){^{\\mathtt{%s}}} \\cwx[-%s]" % ( + meas_offset, + str(hex(op.condition[1])), str(gap), ) else: # Add the open and closed buttons to indicate the condition value - for i in range(creg_size): + for i in range(creg_size - 1): control = "\\control" if if_value[i] == "1" else "\\controlo" self._latex[cwire + i][col] = f"{control} \\cw \\cwx[-" + str(gap) + "]" gap = 1 + # Add (hex condition value) below the last cwire + control = "\\control" if if_value[creg_size - 1] == "1" else "\\controlo" + self._latex[creg_size + cwire - 1][col] = ( + f"{control}" + " \\cw^(%s){^{\\mathtt{%s}}} \\cwx[-%s]" + ) % ( + meas_offset, + str(hex(op.condition[1])), + str(gap), + ) def _truncate_float(self, matchobj, ndigits=4): """Truncate long floats.""" diff --git a/qiskit/visualization/matplotlib.py b/qiskit/visualization/matplotlib.py index 306d00c19912..8d7e842e8e71 100644 --- a/qiskit/visualization/matplotlib.py +++ b/qiskit/visualization/matplotlib.py @@ -903,6 +903,8 @@ def _condition(self, node, cond_xy): v_ind += 1 clbit_b = min(xy_plot, key=lambda xy: xy[1]) xpos, ypos = clbit_b + if isinstance(node.op, Measure): + xpos += 0.3 self._ax.text( xpos, ypos - 0.3 * HIG, diff --git a/qiskit/visualization/text.py b/qiskit/visualization/text.py index 156dfd028ec0..778c7a0ca602 100644 --- a/qiskit/visualization/text.py +++ b/qiskit/visualization/text.py @@ -890,11 +890,6 @@ def draw_wires(self, wires): return lines - @staticmethod - def label_for_conditional(node): - """Creates the label for a conditional instruction.""" - return "= %s" % node.op.condition[1] - @staticmethod def special_label(node): """Some instructions have special labels""" @@ -1384,7 +1379,7 @@ def set_cl_multibox(self, creg, val, top_connect="┴"): label = f"{bit_reg.name}_{bit_index} {label_bool}" self.set_clbit(creg, BoxOnClWire(label=label, top_connect=top_connect)) else: - label = "= %s" % val + label = "%s" % str(hex(val)) self.set_clbit(creg[0], BoxOnClWire(label=label, top_connect=top_connect)) else: if isinstance(creg, Clbit): @@ -1410,7 +1405,7 @@ def set_cond_bullets(self, val, clbits): for i, bit in enumerate(clbits): bot_connect = " " if bit == clbits[-1]: - bot_connect = "=%s" % str(int(val, 2)) + bot_connect = "%s" % str(hex(int(val, 2))) if vlist[i] == "1": self.set_clbit(bit, ClBullet(top_connect="║", bot_connect=bot_connect)) elif vlist[i] == "0": diff --git a/releasenotes/notes/fix-display-measure-condition-139ddbb8c7ae4071.yaml b/releasenotes/notes/fix-display-measure-condition-139ddbb8c7ae4071.yaml new file mode 100644 index 000000000000..3e2e8bba3eda --- /dev/null +++ b/releasenotes/notes/fix-display-measure-condition-139ddbb8c7ae4071.yaml @@ -0,0 +1,17 @@ +--- +fixes: + - | + Fixed an issue with the :func:`~qiskit.visualization.circuit_drawer` + function and :meth:`~qiskit.circuit.QuantumCircuit.draw` method of + :class:`~qiskit.circuit.QuantumCircuit`. When displaying a ``measure`` + instruction containing a classical ``condition`` using the ``mpl`` or + ``latex`` options, the ``condition`` information would sometimes + overwrite the ``measure`` display. +fixes: + - | + Fixed an issue with the :func:`~qiskit.visualization.circuit_drawer` + function and :meth:`~qiskit.circuit.QuantumCircuit.draw` method of + :class:`~qiskit.circuit.QuantumCircuit`. The ``mpl`` drawer used hex + notation to display the ``condition`` value, whereas the ``text`` and + ``latex`` drawers used decimal notation. Now all three drawers use + hex notation. diff --git a/test/ipynb/mpl/circuit/references/measure_cond_false.png b/test/ipynb/mpl/circuit/references/measure_cond_false.png new file mode 100644 index 0000000000000000000000000000000000000000..93218f3ff9246060e7736d76f36687787ec7a26e GIT binary patch literal 22096 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¨SIR(T(BP%;sIsd8d($1vLz*tWY1Kv=xl5 z!eRkbsDS4CN8*Y5AZBzSBAfy(D;||CXSiT7pOucgRX=GC{18EzmPIkb7#UdlZ0oLJ91Vv?$P66<+Y}T6RcFdh)2t70%SdiEb-^Q&`}X*Z-fV&A zzK4ZVIxIVQz^aMMAk*d4O9oiiHZ^sYyKiTc$URTtj9QbWkqU%yhc(SC+RI zoq3dj$DWJZ59hQZXRZ|YF;8c+)`E9=d@}1tB9%8ZaEWQD6-N0vlJ)26si@4*_W@Scg{?I|@6_e!vLv^A~*0So%AC20g)KS69l$=HmbOqaew?#ajgelg~q*=G9Upjp`2+vhr$To)GB zft_50qh0^n|BBDoYGqgjgbk8Ncr-IdO){RMBCvMulDLDGIL!;2dDpD2K1-30`(8VH zBDe7bcN%rj=ihyEI&tZC%Y>6uUQEvv=h~Zd({*aIKx2C3gkM18Ssid13Y{YQP+mq# z(*R~@%6HpJHuK}qW>!UR(>2PVkvCXQFld$`Y7|UXdS1v{KU6WvBkD!L@3MCencYvs&UueUk|bj>_y?u(bNw z^HfK_1)%qgZ-UeoHF##aE@?{>$}7|%4k00647)rm=V_&yIxvadZs1eH9(CN+tF`kpc8=7 z_TyTRXd>+M##pg!q8PWoHJK7MkSjzAGVTLp6x~_Qch8S0M%-P8MIriQ&o`!nw=aTf z=)S$y0gCby{pQBTj`bnWT%@omD=Q1zj=TXybhXDMj*XG=^VZ;>!k8KA&7HHaj(a7( z@%HZVPpAhSuKkMz53o@;%_EtVmxXWZT~j*sOz#pux|bg_*Q;(n(EtKV0X8@oN*otx z+7AvMKGBjCB%TQxe~9U0?y3~Gf>}Wou95)G4xwO8jfR(bH{Qa2=rP{K4|%8>8~?m{ zHf4Oag;C$xr|%$@=wtl~V%kv~>Z_pSEp$MnOsB;wD&jf2_*DkfopB+1at| zjJX+=%L!k17hDKIQhE6aUT^!;dUeuORs$n|-l@ljt6u969Wvb9-N8;tg2yb}KT*$9 zF}nhKFjy)-D)v@+jEs!ffKwfzykt|LR(ZH8&E@yu;U>!lf4<_e z;@F@(tEi}`o@+2L-E~CCQ4rmm4057SVI$m7Lr}?!2H)B}1a!DizK#3ZY(+ME*M{v# z#r|Fiw;th&bf!j5B=|Zp9sv@28~1^?vD+C|ndH2A^QOCW>a>@ujEsy5G|xh#`g7iI z-wHDqpvGSUucZjIHtQ?mT3A5Y-2YC+1A1I1$QAnfluC?;!tIpkM|A6wz898zD{6fKfV&QYG%v-b6u2UcxtEuM~STqWFLeCVLknM1Vw zN^;k0o9jE&QR6j#(KkIDhOLW{!B8R!z48h%Q2if|a&wNuUo4(0>Z zjD(%8g!?`#AOc$e6hnNQo_rI`=8_RPIe7+@65?o}2>**;kHLnjoG3kcQ7~OGP8^$z z=u}ct^-n(`eoO}-)KyY$#mvUyXkA@hEBu8R8zm#7WL^r^C;TzGfFYppCWE$a^!)i$ z<;#Ph(&C}(s#kcpgL&0+nAY0b8q_&fHa2OHqJRJ@o0_J#wzdM}xNk!?d}e=VQew5= zzBzQO6v&nuR05p}k20u|b@9CMEB%6muQfGUpjs1ce#$tR0p|Wq#6ckUCO!&ch5W}VsE6qJ-j^Z8nwqDqu^ignA~iuIvAdhRVVzyp!9 z=*&h~`dN;Hv!h{EFKMMfVeKa$>?9 zjKs*B&mJZS%3W9WF42rO`NVpSufD^m@^P!*M$?#eNvC+oU_@J*fK~r(pT5nRtlWa( z-F0xYo++f)iG@y-=qr~mdz6bWvA&jAmpgZB_VA0@Pc;SL9Z4fR(qrT2krLuv&z(gn zK(CEN`U@8_a?7{s=7~jC1DQb4bh@lp_W5b~cvpKx7>bD}P}Lio+pAlPLl!Zu8cH!+ zbervdH1j-$B z$EYM-gEf}`bUzdD9Kz)RF(X_aJybr>kwV5Q6cTey29tCboN#z9Wt5?Aw8#9xE$RtV3D`TF&`zCPVF#W)Q$ zwGe2K1(rR$;hjg~cP?#m8JK0TDWL5qi*gjuR3CkG$-`kuTFmwCW1<4j-~61g_BV1s zSva2lkDeLA$0H*%5wR1b1~pJw5m_9}X+nVlYJ7AouHs^%e0)K_xxXyjgkHQgk94L= ziZ6)eY8hDf(ct|2d=T+z#>d7U5$*g^tpViBN zKE&O%zC!nH$5mJ-h8~+K_c1zP@^H`o85@y;r}ebTN7sGuQS0fNjNDcd4vuqCkrm%* z$v|u5D&P0qaqiDR6a7ZY`>^b@PUYE$CyDAoh@6m94@B{?vJIzO9gjiX>ClpZ( zUZzIu89z6^nRQgbc6I2sERm{u zdu~0r$-4bZ!~U`YP>GU6x5)_gu|wnxu_3Xs^GdqpAo$O*XbJ(W#uO8(z6n@#7Q8Kd zRdX=?gLyke`QF_WG~dUfw!T9$^*OI(;mK{sS%IwxX@a7X96;TAm-T*IVdb4%SqNAY zroU6&&Y1nWv@}LUArYO1`}>1OnEBSPWbk=FChNvIfr#)hrib&RCzhS%F$ zHU}+TYeIm`hKt9Vq0oG&$81hL<6L|y*XQU?`o}zYy3sS#)X7KaUsMV+Z$+5IzK@GT z$R0NpRo{tlxDAa_w=8P0%yd9c0IC`dIBooT0yj(=3y?Mi#O9D8AHvIx&8?{v76uIF z!j1FBG@)^1WuGw?HIxcw7E7wZ{BzdVVp_vQ?7FlijjD29`8gQ%+WdtlLqkImgJ~Mf zPqoRW7?9r68ye(b1DM1A>x_K|8G)|UlP3Pw7eIOf3kqGNKX6v1y)T(X?nC^sv)8*V zv-FDdFhYRu5NNs-dEvqZEKZKx=`dArhTLI;s$I3URkpPfha7i8QQ+mz5GznL15!^} z*p_D`EAKvW0l15{?awz0JB7viHfH^VPlDEi*|64h)1=}=omC9o7A4=;bmbaWw47iv zITQ}#(&L=MNpd(730K4nf1TpZe-I{j+;+O?{ z033qKVsA1>yR4hso1Z^_Mgl82dc`V$qm@9J8=stH0ptlPZ8`u>I&n7ww4KzAjg5Pg zLy!1;nKB^$()mebdwqdt>BHFA^B5ufZ!V&!_2KF145S-Cqhebv2HmE;Sz>>7sVf3S zUaTJ^D-QW0q=>^iaI6-C-($0}1>y>Z5a0%POC8E6+|okmevF0^ADx$tL2(4%2{YYV zZPsuk(o3|b>h9+PQ$t3hm!DmXp#lM#*j2eAKqFM zvM1vU3%Laa{Nv-}wQX&x$7#9Mq6E=;`s^r_qkVlmNdTEt%e0vK_XO-Mh{_k`pQFRZDBp6Q4whc_rMKYb7>ANpJXrN$y zu`(cN_&|I^e?Q@+u+XNXLUn~O{GcyycLDAfO?NZp0Z?EfK!PPV`I6vEa7xUU&_!B$o;R74nm)+f3$SMYJ2kaHr zTV;%&F~6qbgl)GhGn&yaR6i02dQ(qi9(c?TTIowra?a=sJAy3FKUE%^sh07JPa9WV zU!Q%~-SzvI*Kr)E6#_vG)H7)Hxxfa}fm|R68$1?${c}pj=3SXMSK?5nwV*Y}qR{#} zQC{FcG#`Q1Yw@(6-W5(xIdEOgTa({4dR0TSCE{4)qxpKlPrva2wgN&N9 zt7{hMuLw{zZi>zTHlEbt4Al?n54QHX3JBXw`kPO*06x=uY&;P__o|hbmqU&u^2U>U z&YqmZZ>eF0Yz=gbN7kGmq(x<_t#PIKvX_IA;a=bt5!STpsk6E#H#bC+RM1YHl4hvp z=vdUsW6<*MnN-2vvXRcOZ~SFjOA-!SD`uMEC#gr)#JIt%X@yu34detM@^)`Kh(Q83 zS`%ael^GQGNKjU2PMvx@z(BiRF&*>d$rE9hmGp1^7m^Su-W*9*7%iSg-KVhlp|wrL zY~E}wb$pK0l3J`Ih}PPZR9A|Kh;Ui?AqAILPaMtXZCxGQaVp%4@|*^Upze3BwBgJx zN<1a^j~_qiZansCiWYh{aPHEjY=9YTtgMfqXCk>JB-sd=hK^jrA#e_gs;U8lo<4mV z1P90=YQSAXoCm0y)nC7!((^hXcRd*Hkz@sfqDpV|3DO$fo;qg#GQRj@o-Y!Y0?DKT zTB&7znP#p59WW28@=ar?(};2v=eG0?5yt)fIrhas)Jg@$w+m^>H?;jX{(;H7V#)yN z@OLP%#A)H)di(!2lOg!VU*gRJH;k>geSKup9P7f zrpSiNV39;1y!3l>b8h?G&cJwQ~4n^1ron%Xym4>MEfBn}@H z<-0f+Nz;3FJ2;u+*{sLrI4x|i@QocXm?VL4Wir*~+Nq1}?OcSUpWgMt#1ZG|S}FDF z=FNk%16CT!z$8|!uf)d2>U?_Y4aBk{#|`K$L^Uun0c*Ei*RsX;ckIR1`|S}e0KpSi zU7b-OavBebYYTy&a1zT6d?^s{T>;#t?V8Bf+7|M$YtKoZtZBp%?~6#>LEe&bef9K(np(U~LB z$WHp1ftwPUMt!<5IxI>$Ry2CthUM9CF`X_c|MNeUT*+Pa=-qzZ_35<>0SF_1YakgG zZ6=gUC>kz5y=nDy&Z4@6Jm)=m@n&BfBj@BL`g(M+1`QLM+aYG(MW$WNr2uA^Ce%vJx)A;2%d+Y{faIjuCs@#Afv z;~?rG2_*e?*m4dK+XrP#8X+%`zHWzP{D5uEQF%R4N2Py z%Z}m-1zP9maD0%C&k$~XC?bV&t}oO+v~sl=4G}7*v!_nQQ=WEW-C2tjb{xBPSy43m zqw&?c;^?F@pFOoZjduq6h4l;u#fh5}QTqDaN=&b0$$xte&xhOF)ksS{`TMRnBSB-! zghq)gBqMx++>3x^>%Egv1s|JEjJ+e=pn#Wv_3jC&_lJ`692?kzKmR-hBsok~9au=X zu9z1k3U&UX7&pxW*z!i7wDk00^vcNhclhf(AX3!hfBVyGfLouKJQ?e%0PE{;yf~?=$#(`5e)^j6hto;t;@-N2<(o8! zF73Rp6a5JCyB;h}>dM7iWf@kKi;8YMJJ$8>)*;m6aG2@<=|v7)z5E^zQVw1Q3!2++ zwV`}_z74|vITHIjs#t2^d611$hkQe4+4`XFJmyO`GRagD4Q4n7RO13M&pwzXVU}ia z`}Gpgv;bJE5T>yB`p0RIPCMa#)E644o$!ZLT{klb5iq3TU9`Qip|vin0eot7JIs0vp^1)*tE(N*oq@>I)#c4M--19kXil0CJw+fB=q>72n8c@7 z!O@vjNmIBCYGY>0+723?S)r9IR0$XvVlsp9FCuBjF)IH=l3k8qC*^?Ai3}1&LAKBu z4;Kde5<1Xyz^y?gP+s7Xs0M~6LIfHv%nSM@1TV~gBuaLok<>?PiY#PLSpWzcwuYLu z0p-ouTiD-IgoJ9_pI7g%w94|ZUASZx1g0DpXSU*pb?h~OkbeMGBrqRUz-)(*L6UX(<~KTCde0qO3m$)f z_)IVvpb9}66(~JOp{dy4UBD(oV#5HzEArbAdkJSM+gYkVMEeNBx2Q|Qu)yGBo5Nj^ zoDcH#Ww+Y~kMfFN_0#-0Bz@13TRJj(M!D+7H?UF8AFlep|L4Qs!9AN;Q9nr`p>V(c z@EH9UuF8E&c*D#P)iH5JMJn~Bm4b>#m1OWx(jRf2nOt z$w|GC-9y3bxXmHtrRnS*Va(Zc$Xp(Wn$4LYm?Cj)pAoiLirEU%p8YL_Km5 zar^r&Fmfd0e(&Dzzz-y%%)uZc&K3356|10Vs@^OGI2kl_tn#IEPx;2v_mK2Pv@g&x z>z6BnI>bHqN|E7*B~F?<~7IT_)F#hgqq_xXpku40FjuHYR>S5SQmrz;$&T%M5G_DN; z1Hze;=()O2nZ7(+V)vizuO*HY?MnGj&W15JuMJfM<;LlF52ZTB5G~gHGZdn}8Jzwx zx?~91l2$MbaUkZaf_Rq+0&!_s8Dg}pPPa+%nKZRS%ujg=@f*KC=Y{le2E=5rOhBpN z3nIut0}94<54Io0!28JfBSBHp3TBx#0_ zS+-wmb1Ty$LNeX7nydwnR5Xm=K25qsdX3*p@SqZnhhEc09!mGRZ~b5_G?ri%Ma0}$ z^4;LQEa9OC(q?8AaS1t`x8NL`NoY%kHtVtP}$7qEVMZ78vLVHeWwBS%;kEW*y=?822RAWrZl!^ z9vH|;Dj!_QXUdTN;$r@T{{gsz`g+>cA5GS+0xk))CI~_#HmhWzSn6iQH|VG@np^+k z(xrWMTt_Bjf%rpM3rW;4Wx%&Zh7G~)#W@=o7{tocn!`*B&~)^HS};kG`MDZ627fH{<8D0p ze3C{7g_5j)RFOWk_Ek8ijDXgS>C}(}^v=x9tpHYGxI+ru6pqyzZ+AIE3x09`q429zoUt<}cFmTjytvO3Y%1u72V9`9) z&rN8E73-rr`p?WxMQ}Ddf%7Lp&PiGYBn{B5m<@+WPIyEJMFKDo&I>?8PH%MI31YT7rU-eAbdf>vp5jMIA9m%Fg=50v_Om#z|5$D z^d<*V1w<;$+foDWVjO&nv(!S zPV6(ig;@h=1R;X&(FuBOiHMpmEROl&NqP&@#pPur#VbRt!!!+Wvkiz5grNo8A>!0| zK^_2WyAOj$`oSZVrXV}HY>tN`c~@aI3vsI8cWELAD%D%t+F}NcjUOJa!0(T1R3QvZ|3+|K4?6QVcVC6n>K{GI>A!nfN7*?NVTTJaAk@WsXb%A%z8`*pN))eO}#*Q*%!{Ax~h2OEu&tJ zM^Y-q3EX7CntxNytNJRs)0vn(CH4tbVW@Hzb6{_O_fIIK(<7V22d2= ze9#)&k_V$m0gwv#5u`c4I9DDemU8w=f+4BtHj+E;`4-*hOOh-|hK$d71PhDCSSd`5g92 z9Ox_#Mo>LOoVy1eg3cl6ww+^s=(hOr0!G`C;Z{hjq6bTnCsw2oB<{SFTn^*tj6vYY zdL&$U6nH2cI(m0D3s}Z`JDbenp789vUm+uR({(0@)%$*OA_&a}OC#PAL^&(88B+@(TqFCL6C{oe$8I9icrERTl74nsCsF-9z}O2sc3lK`s%7mKh$L>L z-zm7(IZKXe1nuO0htM&c*`S3?s7S62yMdcYC;H+eOt0;2k$BQXfz~VWnoVDzlQ1GW z?kzD~?xi(xH!%=rsHih<`{`IX*RF3}w#1MBnOikyMWe2U07qbih?3*EGs+;STEX?# z(4F*5AD$ui56ePhK$JnNzh6i^t)zo96=w<>9%GwKc zZ;^N8D4Md7yXdhWh3qO4<%QL~J0FUu;5wy1@^>{3rYd z2fzSD(Zx4l<%C2;WWa)h@UJ0~=ms?m=GVwjHb+6{ko#-!ZAV4^(_vI4>wo7&+kY&< z_kZ`Re&-Xj5IF_3wss^tHaAeBi6mno!G>6J9XNem5I3{7R!M1Kn}F-y)-iqn60cVX zA^G4snC@&WZb75-?T>?q66j*gOiZRoKkhBa05=5JXH}9D%|VVD{&wHyUoj>~Qm8@f zL%;NeGDs%Ec4L1qO@p`&sXMTD8kKCdUe{+E(>2QK7}HBFO;2TKNlvh_duwNg;W+2 zp+gSpfL_oEe8V8H;{Ym}O=KJE(RVg0B;Ukg?N=_+t464HGhD6)bfilkj}ZO9XD{|Y zyQgYj}!jQ%ECrWIrotNkN~P$4CNuz#PzaemN1#A8s!5^~SWwVr16 zTLQ#lZBjNz(Q@nk$pnUl0!UA(F6;B?w)(3O z$dpFr2mwfHq{qCfGJ@6vCtP%VeDZ}K<}~1A>aIh+Ce-n^GGIZBn;#Q0hmj&&kv)#M zf}G`jXHos??Qm=iNM@IjK37^3dXWGOdfuH zcNUxcFD7L11l)e-CDt1wBJl0tG!(&?&;LqczEz!xhH)F!r(HNdcB^? z-+ z=BfdjA#zHR$L^};T=%ChE*Be4igchVjYd2+gH-!UY{a#tsOHs!&!MAxamtYAiV$-x z5;!Hg^!*wP{G|+_VK>(k`*RH?U{dq8POL(lcn&h*2lN1&94TPI4okSayldX-@5bS; zRWelI=JNV|qZZ=>RpS-??7z_?NV$c$pnptTGE2i%h$LJ|_5xd`PGM#_1R&20FoHu! zgb}UwPtT+-w*t0xU)Za%MPQ?H!cbBh?F%(UF;C(U&x7DSoL|_ z{RP5-Fcl63lu24WQ%xBt-<%c4zdDFyAfXrjqXV2EqLn7G4MXWLDK-Nf8Gsj@wR2rD z)>40nh{?LY3L0;4Oz`N6pnYDg{D5|-@OuRm-Jovg~%FDX*1LQeUZC-re$Sf=n4IDKcAQ!HUSpoR2xYSV60XyGtUST9iY*m1|B|s8Ifz{l7-~aQKgtF1ZPH z&)MJf5VCwEa0o*k#xLB2vo(;TGUjl{P{S_r)@E7k>bo(W27ZE<$90Q++j{wg5$|++ z4i7RT%-*qr4h?9%6DEI^XZ}aLk_T;5TVLOXjK6@OEYli#;Vxj`AJBJX_5C;?DT?wn zR*=BmGVmN=LzgYD?ZYV)SowCs`;d-oM(ut%kfkNDl318{uE_&01CBeeN*K+{&*vKQ z*v=V8PI<8GEvPj%1TnEN06E}jW()Rp7@RB8;8I@uJdabS;Cn)|S_lwStz0q`t04^J z74lp4cW;SUE=VBb!puB8%^eJrZ$}&#*pa4)B+nr=NGby2nF$XHIS;|uI2C5|3Soi( z>7L+*eWtn8unl8EW{_mZ;z~DuA*$ozDsl?QawOv0hMCLN!vv=q#NSBtcnnDcxVGvU z#U?nG?6$+ypU@Ez?Y;-&0hUq0lP`xMCm>SH`^-K|R}$O)zd-RP8pI$b-{|u6X(IR~ zh9k>hDd;2)1477wE;R$5lnNY*lTCGwE8_@*n-UCKF&0o)gzU!1`Vx_N2 zd4+fh?2Pz}qbkY}EbI}za9cp2gXp$4t4+%L7kdvi%(+5PI|bedP@^9(z;o=FGB{;D zw1-f4F4#c$5Y7_(@Hae*O!xe=V+ttY_%Cd%>%34$j;&T-c11k0qQ_p z5jF{%2Fb4(dhQm&^HnZl_=b8R!Vh2gdqYDA9`BSe2Zwca?qcD1v~2hy77#x{^diKW z47hmf+)T#%WQhKngZwX}sMrN*-fVb6H?yWHe&6s)fNS8;u@{ITrwvIAfg6V`e2~l( z;1#O524%jM`S1jgAs{A1kwGLd;BLq^_xAP!L&jJW1kHE29~GXS(yc6UZX>3}Z>7NLt|SB6hgcji?e;hywA#7O-OcL? z(diI)DqH+^5oDcCm?D;O2mn2u4a|NpMVi?AV6F(3%3~OBMBorGV=9CI=~C3XZ>1f%jT11&GbT!jje^07?rdGBJ7of@kDK2CDdj zu#^GEx58Ol$cS}196F%`(<`u<3J`@4PSituM=pGSA`I_ZK@Dj+sR9}mEcyZLomk!hDwlR155{WLAsg=Qq-EBdf~|a9*ze^Xswvui|4&a0FeJJf5OiW*02B9A204gd2>wjx|XdeguxhX^xkUN#3ng&PX zA$1XX=VtNkY<5lDY-Z4lFMpj#`Plz|vibj6QTRXX-~IQg6t>oU{`l7P2oB*yNlPj` Kz}i+>nPV}V! literal 0 HcmV?d00001 diff --git a/test/ipynb/mpl/circuit/references/measure_cond_true.png b/test/ipynb/mpl/circuit/references/measure_cond_true.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef542b563f059fa81752655c905dc1795f36412 GIT binary patch literal 17014 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≺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 literal 16739 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 W1$lY>0sIdSP%^jVBy(;U`27!*O5nQy diff --git a/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py b/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py index f98e1f3ae726..387ec16a8bd9 100644 --- a/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py +++ b/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py @@ -625,8 +625,9 @@ def test_user_ax_subplot(self): fig = plt.figure(1, figsize=(6, 4)) fig.patch.set_facecolor("white") - fig.add_subplot(1, 2, 1) + ax1 = fig.add_subplot(1, 2, 1) ax2 = fig.add_subplot(1, 2, 2) + ax1.plot([1, 2, 3]) circuit = QuantumCircuit(4) circuit.h(0) @@ -646,6 +647,20 @@ def test_figwidth(self): circuit.x(2) self.circuit_drawer(circuit, style={"figwidth": 5}, filename="figwidth.png") + def test_measures_with_conditions(self): + """Test that a measure containing a condition displays""" + qr = QuantumRegister(2, "qr") + cr1 = ClassicalRegister(2, "cr1") + cr2 = ClassicalRegister(2, "cr2") + circuit = QuantumCircuit(qr, cr1, cr2) + circuit.h(0) + circuit.h(1) + circuit.measure(0, cr1[1]) + circuit.measure(1, cr2[0]).c_if(cr1, 1) + circuit.h(0).c_if(cr2, 3) + self.circuit_drawer(circuit, cregbundle=False, filename="measure_cond_false.png") + self.circuit_drawer(circuit, cregbundle=True, filename="measure_cond_true.png") + if __name__ == "__main__": unittest.main(verbosity=1) diff --git a/test/python/visualization/references/test_latex_4597.tex b/test/python/visualization/references/test_latex_4597.tex index 30123e3e0e11..dde9f822044f 100644 --- a/test/python/visualization/references/test_latex_4597.tex +++ b/test/python/visualization/references/test_latex_4597.tex @@ -9,6 +9,6 @@ \nghost{ {q}_{0} : } & \lstick{ {q}_{0} : } & \qw & \qw & \qw & \qw\\ \nghost{ {q}_{1} : } & \lstick{ {q}_{1} : } & \qw & \qw & \qw & \qw\\ \nghost{ {q}_{2} : } & \lstick{ {q}_{2} : } & \qw & \gate{\mathrm{X}} & \qw & \qw\\ - \nghost{c:} & \lstick{c:} & \lstick{/_{_{3}}} \cw & \dstick{_{_{=2}}} \cw \cwx[-1] & \cw & \cw\\ + \nghost{c:} & \lstick{c:} & \lstick{/_{_{3}}} \cw & \control \cw^(0.0){^{\mathtt{0x2}}} \cwx[-1] & \cw & \cw\\ \\ }} \end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_boolean_negation.tex b/test/python/visualization/references/test_latex_boolean_negation.tex deleted file mode 100644 index 89418a663973..000000000000 --- a/test/python/visualization/references/test_latex_boolean_negation.tex +++ /dev/null @@ -1,26 +0,0 @@ -% \documentclass[preview]{standalone} -% If the image is too large to fit on this documentclass use -\documentclass[draft]{beamer} -% img_width = 4, img_depth = 3 -\usepackage[size=custom,height=10,width=10,scale=0.7]{beamerposter} -% instead and customize the height and width (in cm) to fit. -% Large images may run out of memory quickly. -% To fix this use the LuaLaTeX compiler, which dynamically -% allocates memory. -\usepackage[braket, qm]{qcircuit} -\usepackage{amsmath} -\pdfmapfile{+sansmathaccent.map} -% \usepackage[landscape]{geometry} -% Comment out the above line if using the beamer documentclass. -\begin{document} - -\begin{equation*} - \Qcircuit @C=1.0em @R=1.0em @!R { - \lstick{ {q}_{0} : } & \multigate{3}{\texttt{$\neg$x\,\&\,(y\,|\,z)}}_<<<{0} & \qw & \qw\\ - \lstick{ {q}_{1} : } & \ghost{\texttt{$\neg$x\,\&\,(y\,|\,z)}}_<<<{1} & \qw & \qw\\ - \lstick{ {q}_{2} : } & \ghost{\texttt{$\neg$x\,\&\,(y\,|\,z)}}_<<<{2} & \qw & \qw\\ - \lstick{ {q}_{3} : } & \ghost{\texttt{$\neg$x\,\&\,(y\,|\,z)}}_<<<{3} & \qw & \qw\\ - } -\end{equation*} - -\end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_conditional.tex b/test/python/visualization/references/test_latex_conditional.tex index 7572e8f9faee..512081d4306e 100644 --- a/test/python/visualization/references/test_latex_conditional.tex +++ b/test/python/visualization/references/test_latex_conditional.tex @@ -8,6 +8,6 @@ \Qcircuit @C=1.0em @R=0.2em @!R { \\ \nghost{ {q}_{0} : } & \lstick{ {q}_{0} : } & \gate{\mathrm{H}} & \meter & \qw & \gate{\mathrm{H}} & \qw & \qw\\ \nghost{ {q}_{1} : } & \lstick{ {q}_{1} : } & \gate{\mathrm{H}} & \qw & \meter & \qw & \qw & \qw\\ - \nghost{c:} & \lstick{c:} & \lstick{/_{_{2}}} \cw & \dstick{_{_{0}}} \cw \cwx[-2] & \dstick{_{_{1}}} \cw \cwx[-1] & \dstick{_{_{=2}}} \cw \cwx[-2] & \cw & \cw\\ + \nghost{c:} & \lstick{c:} & \lstick{/_{_{2}}} \cw & \dstick{_{_{\hspace{0.0em}0}}} \cw \ar @{<=} [-2,0] & \dstick{_{_{\hspace{0.0em}1}}} \cw \ar @{<=} [-1,0] & \control \cw^(0.0){^{\mathtt{0x2}}} \cwx[-2] & \cw & \cw\\ \\ }} \end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_meas_cond_false.tex b/test/python/visualization/references/test_latex_meas_cond_false.tex new file mode 100644 index 000000000000..3cd7139b4359 --- /dev/null +++ b/test/python/visualization/references/test_latex_meas_cond_false.tex @@ -0,0 +1,16 @@ +\documentclass[border=2px]{standalone} + +\usepackage[braket, qm]{qcircuit} +\usepackage{graphicx} + +\begin{document} +\scalebox{1.0}{ +\Qcircuit @C=1.0em @R=0.2em @!R { \\ + \nghost{ {qr}_{0} : } & \lstick{ {qr}_{0} : } & \gate{\mathrm{H}} & \meter & \qw & \gate{\mathrm{H}} & \qw & \qw\\ + \nghost{ {qr}_{1} : } & \lstick{ {qr}_{1} : } & \gate{\mathrm{H}} & \qw & \meter & \qw & \qw & \qw\\ + \nghost{cr1_{0}:} & \lstick{cr1_{0}:} & \cw & \cw & \control \cw \cwx[-1] & \cw & \cw & \cw\\ + \nghost{cr1_{1}:} & \lstick{cr1_{1}:} & \cw & \cw \ar @{<=} [-3,0] & \controlo \cw^(-0.3){^{\mathtt{0x1}}} \cwx[-1] & \cw & \cw & \cw\\ + \nghost{cr2_{0}:} & \lstick{cr2_{0}:} & \cw & \cw & \cw \ar @{<=} [-3,0] & \control \cw \cwx[-4] & \cw & \cw\\ + \nghost{cr2_{1}:} & \lstick{cr2_{1}:} & \cw & \cw & \cw & \control \cw^(0.0){^{\mathtt{0x3}}} \cwx[-1] & \cw & \cw\\ +\\ }} +\end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_meas_cond_true.tex b/test/python/visualization/references/test_latex_meas_cond_true.tex new file mode 100644 index 000000000000..0f6fe247caac --- /dev/null +++ b/test/python/visualization/references/test_latex_meas_cond_true.tex @@ -0,0 +1,14 @@ +\documentclass[border=2px]{standalone} + +\usepackage[braket, qm]{qcircuit} +\usepackage{graphicx} + +\begin{document} +\scalebox{1.0}{ +\Qcircuit @C=1.0em @R=0.2em @!R { \\ + \nghost{ {qr}_{0} : } & \lstick{ {qr}_{0} : } & \gate{\mathrm{H}} & \meter & \qw & \gate{\mathrm{H}} & \qw & \qw\\ + \nghost{ {qr}_{1} : } & \lstick{ {qr}_{1} : } & \gate{\mathrm{H}} & \qw & \meter & \qw & \qw & \qw\\ + \nghost{cr1:} & \lstick{cr1:} & \lstick{/_{_{2}}} \cw & \dstick{_{_{\hspace{0.0em}1}}} \cw \ar @{<=} [-2,0] & \control \cw^(-0.3){^{\mathtt{0x1}}} \cwx[-1] & \cw & \cw & \cw\\ + \nghost{cr2:} & \lstick{cr2:} & \lstick{/_{_{2}}} \cw & \cw & \dstick{_{_{\hspace{1.5em}0}}} \cw \ar @{<=} [-2,0] & \control \cw^(0.0){^{\mathtt{0x3}}} \cwx[-3] & \cw & \cw\\ +\\ }} +\end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_meas_condition.tex b/test/python/visualization/references/test_latex_meas_condition.tex index 6a70d7b64413..52261f6e5bb1 100644 --- a/test/python/visualization/references/test_latex_meas_condition.tex +++ b/test/python/visualization/references/test_latex_meas_condition.tex @@ -8,6 +8,6 @@ \Qcircuit @C=1.0em @R=0.2em @!R { \\ \nghost{ {qr}_{0} : } & \lstick{ {qr}_{0} : } & \gate{\mathrm{H}} & \meter & \qw & \qw & \qw\\ \nghost{ {qr}_{1} : } & \lstick{ {qr}_{1} : } & \qw & \qw & \gate{\mathrm{H}} & \qw & \qw\\ - \nghost{cr:} & \lstick{cr:} & \lstick{/_{_{2}}} \cw & \dstick{_{_{0}}} \cw \cwx[-2] & \dstick{_{_{=1}}} \cw \cwx[-1] & \cw & \cw\\ + \nghost{cr:} & \lstick{cr:} & \lstick{/_{_{2}}} \cw & \dstick{_{_{\hspace{0.0em}0}}} \cw \ar @{<=} [-2,0] & \control \cw^(0.0){^{\mathtt{0x1}}} \cwx[-1] & \cw & \cw\\ \\ }} \end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_teleport.tex b/test/python/visualization/references/test_latex_teleport.tex index 2401d2b1b094..a4629781695e 100644 --- a/test/python/visualization/references/test_latex_teleport.tex +++ b/test/python/visualization/references/test_latex_teleport.tex @@ -9,6 +9,6 @@ \nghost{ {q}_{0} : } & \lstick{ {q}_{0} : } & \gate{\mathrm{U}\,(\mathrm{0.3,0.2,0.1})} & \qw \barrier[0em]{2} & \qw & \ctrl{1} & \gate{\mathrm{H}} & \meter & \qw & \qw & \qw & \qw & \qw\\ \nghost{ {q}_{1} : } & \lstick{ {q}_{1} : } & \gate{\mathrm{H}} & \ctrl{1} & \qw & \targ & \meter & \qw & \qw & \qw & \qw & \qw & \qw\\ \nghost{ {q}_{2} : } & \lstick{ {q}_{2} : } & \qw & \targ & \qw & \qw & \qw & \qw & \gate{\mathrm{Z}} & \gate{\mathrm{X}} & \meter & \qw & \qw\\ - \nghost{c:} & \lstick{c:} & \lstick{/_{_{3}}} \cw & \cw & \cw & \cw & \dstick{_{_{1}}} \cw \cwx[-2] & \dstick{_{_{0}}} \cw \cwx[-3] & \dstick{_{_{=1}}} \cw \cwx[-1] & \dstick{_{_{=2}}} \cw \cwx[-1] & \dstick{_{_{2}}} \cw \cwx[-1] & \cw & \cw\\ + \nghost{c:} & \lstick{c:} & \lstick{/_{_{3}}} \cw & \cw & \cw & \cw & \dstick{_{_{\hspace{0.0em}1}}} \cw \ar @{<=} [-2,0] & \dstick{_{_{\hspace{0.0em}0}}} \cw \ar @{<=} [-3,0] & \control \cw^(0.0){^{\mathtt{0x1}}} \cwx[-1] & \control \cw^(0.0){^{\mathtt{0x2}}} \cwx[-1] & \dstick{_{_{\hspace{0.0em}2}}} \cw \ar @{<=} [-1,0] & \cw & \cw\\ \\ }} \end{document} \ No newline at end of file diff --git a/test/python/visualization/test_circuit_latex.py b/test/python/visualization/test_circuit_latex.py index 57be6c468784..c96913777485 100644 --- a/test/python/visualization/test_circuit_latex.py +++ b/test/python/visualization/test_circuit_latex.py @@ -548,6 +548,24 @@ def test_inst_with_cbits(self): self.assertEqualToReference(filename) + def test_measures_with_conditions(self): + """Test that a measure containing a condition displays""" + filename1 = self._get_resource_path("test_latex_meas_cond_false.tex") + filename2 = self._get_resource_path("test_latex_meas_cond_true.tex") + qr = QuantumRegister(2, "qr") + cr1 = ClassicalRegister(2, "cr1") + cr2 = ClassicalRegister(2, "cr2") + circuit = QuantumCircuit(qr, cr1, cr2) + circuit.h(0) + circuit.h(1) + circuit.measure(0, cr1[1]) + circuit.measure(1, cr2[0]).c_if(cr1, 1) + circuit.h(0).c_if(cr2, 3) + circuit_drawer(circuit, cregbundle=False, filename=filename1, output="latex_source") + circuit_drawer(circuit, cregbundle=True, filename=filename2, output="latex_source") + self.assertEqualToReference(filename1) + self.assertEqualToReference(filename2) + if __name__ == "__main__": unittest.main(verbosity=2) diff --git a/test/python/visualization/test_circuit_text_drawer.py b/test/python/visualization/test_circuit_text_drawer.py index a786c540525b..9d187c214925 100644 --- a/test/python/visualization/test_circuit_text_drawer.py +++ b/test/python/visualization/test_circuit_text_drawer.py @@ -1405,7 +1405,7 @@ def test_control_gate_label_with_cond_1_low(self): " └──╥───┘", " ║ ", " c_0: 0 ═══■════", - " =1 ", + " 0x1 ", ] ) @@ -1430,7 +1430,7 @@ def test_control_gate_label_with_cond_1_low_cregbundle(self): "q_1: |0>┤ my h ├", " └──╥───┘", " ┌──╨──┐ ", - " c: 0 1/╡ = 1 ╞═", + " c: 0 1/╡ 0x1 ╞═", " └─────┘ ", ] ) @@ -1457,7 +1457,7 @@ def test_control_gate_label_with_cond_1_med(self): "q_1: |0>┤ my h ├", " └──╥───┘", " c_0: 0 ═══■════", - " =1 ", + " 0x1 ", ] ) @@ -1481,7 +1481,7 @@ def test_control_gate_label_with_cond_1_med_cregbundle(self): "q_1: |0>┤ my h ├", " └──╥───┘", " ┌──╨──┐ ", - " c: 0 1/╡ = 1 ╞═", + " c: 0 1/╡ 0x1 ╞═", " └─────┘ ", ] ) @@ -1509,7 +1509,7 @@ def test_control_gate_label_with_cond_1_high(self): "q_1: |0>┤ my h ├", " └──╥───┘", " c_0: 0 ═══■════", - " =1 ", + " 0x1 ", ] ) @@ -1532,7 +1532,7 @@ def test_control_gate_label_with_cond_1_high_cregbundle(self): " ┌──┴───┐", "q_1: |0>┤ my h ├", " ├──╨──┬┘", - " c: 0 1/╡ = 1 ╞═", + " c: 0 1/╡ 0x1 ╞═", " └─────┘ ", ] ) @@ -1560,7 +1560,7 @@ def test_control_gate_label_with_cond_2_med(self): " my ch ", " ║ ", " c_0: 0 ═══■════", - " =1 ", + " 0x1 ", ] ) @@ -1584,7 +1584,7 @@ def test_control_gate_label_with_cond_2_med_cregbundle(self): "q_1: |0>───■────", " my ch ", " ┌──╨──┐ ", - " c: 0 1/╡ = 1 ╞═", + " c: 0 1/╡ 0x1 ╞═", " └─────┘ ", ] ) @@ -1614,7 +1614,7 @@ def test_control_gate_label_with_cond_2_low(self): " my ch ", " ║ ", " c_0: 0 ═══■════", - " =1 ", + " 0x1 ", ] ) @@ -1639,7 +1639,7 @@ def test_control_gate_label_with_cond_2_low_cregbundle(self): "q_1: |0>───■────", " my ch ", " ┌──╨──┐ ", - " c: 0 1/╡ = 1 ╞═", + " c: 0 1/╡ 0x1 ╞═", " └─────┘ ", ] ) @@ -1746,10 +1746,10 @@ def test_text_conditional_1(self): " └─╥─┘└─╥─┘", " ║ ║ ", "c0_0: 0 ══■════╬══", - " =1 ║ ", + " 0x1 ║ ", " ║ ", "c1_0: 0 ═══════■══", - " =1 ", + " 0x1 ", ] ) @@ -1773,10 +1773,10 @@ def test_text_conditional_1_bundle(self): "q_0: |0>─┤ X ├──┤ X ├─", " └─╥─┘ └─╥─┘ ", " ┌──╨──┐ ║ ", - "c0: 0 1/╡ = 1 ╞═══╬═══", + "c0: 0 1/╡ 0x1 ╞═══╬═══", " └─────┘ ║ ", " ┌──╨──┐", - "c1: 0 1/═══════╡ = 1 ╞", + "c1: 0 1/═══════╡ 0x1 ╞", " └─────┘", ] ) @@ -1815,7 +1815,7 @@ def test_text_conditional_reverse_bits_true(self): " cr_1: 0 ═══════════╩════════■══", " ║ ", " cr_0: 0 ════════════════════o══", - " =2 ", + " 0x2 ", ] ) @@ -1849,7 +1849,7 @@ def test_text_conditional_reverse_bits_false(self): " cr_0: 0 ═══════╬════o══", " ║ ║ ", " cr_1: 0 ═══════╩════■══", - " =2 ", + " 0x2 ", "cr2_0: 0 ═══════════════", " ", ] @@ -1910,12 +1910,12 @@ def test_text_conditional_1(self): "q_0: |0>┤ X ├┤ X ├", " └─╥─┘└─╥─┘", "c0_0: 0 ══■════╬══", - " =1 ║ ", + " 0x1 ║ ", + " ║ ", "c1_0: 0 ═══════■══", - " =1 ", + " 0x1 ", ] ) - circuit = QuantumCircuit.from_qasm_str(qasm_string) self.assertEqual( str(_text_circuit_drawer(circuit, vertical_compression="medium")), expected @@ -1938,9 +1938,9 @@ def test_text_conditional_1_bundle(self): "q_0: |0>─┤ X ├──┤ X ├─", " └─╥─┘ └─╥─┘ ", " ┌──╨──┐ ║ ", - "c0: 0 1/╡ = 1 ╞═══╬═══", + "c0: 0 1/╡ 0x1 ╞═══╬═══", " └─────┘┌──╨──┐", - "c1: 0 1/═══════╡ = 1 ╞", + "c1: 0 1/═══════╡ 0x1 ╞", " └─────┘", ] ) @@ -1975,7 +1975,7 @@ def test_text_measure_with_spaces(self): " c_1: 0 ═╩═══o══", " ║ ", " c_2: 0 ═════o══", - " =1 ", + " 0x1 ", ] ) circuit = QuantumCircuit.from_qasm_str(qasm_string) @@ -2003,7 +2003,7 @@ def test_text_measure_with_spaces_bundle(self): "q_1: |0>─╫──┤ X ├─", " ║ └─╥─┘ ", " ║ ┌──╨──┐", - " c: 0 3/═╩═╡ = 1 ╞", + " c: 0 3/═╩═╡ 0x1 ╞", " 1 └─────┘", ] ) @@ -2033,9 +2033,9 @@ def test_text_conditional_1_cregbundle(self): " ┌───┐ ┌───┐ ", "q_0: |0>─┤ X ├──┤ X ├─", " ┌┴─╨─┴┐ └─╥─┘ ", - "c0: 0 1/╡ = 1 ╞═══╬═══", + "c0: 0 1/╡ 0x1 ╞═══╬═══", " └─────┘┌──╨──┐", - "c1: 0 1/═══════╡ = 1 ╞", + "c1: 0 1/═══════╡ 0x1 ╞", " └─────┘", ] ) @@ -2060,9 +2060,9 @@ def test_text_conditional_1(self): "q_0: |0>┤ X ├┤ X ├", " └─╥─┘└─╥─┘", "c0_0: 0 ══■════╬══", - " =1 ║ ", + " 0x1 ║ ", "c1_0: 0 ═══════■══", - " =1 ", + " 0x1 ", ] ) @@ -2085,9 +2085,9 @@ def test_text_conditional_2_cregbundle(self): " ┌───┐ ┌───┐ ", "q_0: |0>─┤ X ├──┤ X ├─", " ┌┴─╨─┴┐ └─╥─┘ ", - "c0: 0 2/╡ = 2 ╞═══╬═══", + "c0: 0 2/╡ 0x2 ╞═══╬═══", " └─────┘┌──╨──┐", - "c1: 0 2/═══════╡ = 2 ╞", + "c1: 0 2/═══════╡ 0x2 ╞", " └─────┘", ] ) @@ -2113,11 +2113,11 @@ def test_text_conditional_2(self): "c0_0: 0 ══o════╬══", " ║ ║ ", "c0_1: 0 ══■════╬══", - " =2 ║ ", + " 0x2 ║ ", "c1_0: 0 ═══════o══", " ║ ", "c1_1: 0 ═══════■══", - " =2 ", + " 0x2 ", ] ) circuit = QuantumCircuit.from_qasm_str(qasm_string) @@ -2139,9 +2139,9 @@ def test_text_conditional_3_cregbundle(self): " ┌───┐ ┌───┐ ", "q_0: |0>─┤ X ├──┤ X ├─", " ┌┴─╨─┴┐ └─╥─┘ ", - "c0: 0 3/╡ = 3 ╞═══╬═══", + "c0: 0 3/╡ 0x3 ╞═══╬═══", " └─────┘┌──╨──┐", - "c1: 0 3/═══════╡ = 3 ╞", + "c1: 0 3/═══════╡ 0x3 ╞", " └─────┘", ] ) @@ -2169,13 +2169,13 @@ def test_text_conditional_3(self): "c0_1: 0 ══■════╬══", " ║ ║ ", "c0_2: 0 ══o════╬══", - " =3 ║ ", + " 0x3 ║ ", "c1_0: 0 ═══════■══", " ║ ", "c1_1: 0 ═══════■══", " ║ ", "c1_2: 0 ═══════o══", - " =3 ", + " 0x3 ", ] ) circuit = QuantumCircuit.from_qasm_str(qasm_string) @@ -2204,7 +2204,7 @@ def test_text_conditional_4(self): "c0_2: 0 ══■════╬══", " ║ ║ ", "c0_3: 0 ══o════╬══", - " =4 ║ ", + " 0x4 ║ ", "c1_0: 0 ═══════o══", " ║ ", "c1_1: 0 ═══════o══", @@ -2212,7 +2212,7 @@ def test_text_conditional_4(self): "c1_2: 0 ═══════■══", " ║ ", "c1_3: 0 ═══════o══", - " =4 ", + " 0x4 ", ] ) circuit = QuantumCircuit.from_qasm_str(qasm_string) @@ -2243,7 +2243,7 @@ def test_text_conditional_5(self): "c0_3: 0 ══o════╬══", " ║ ║ ", "c0_4: 0 ══o════╬══", - " =5 ║ ", + " 0x5 ║ ", "c1_0: 0 ═══════■══", " ║ ", "c1_1: 0 ═══════o══", @@ -2253,7 +2253,7 @@ def test_text_conditional_5(self): "c1_3: 0 ═══════o══", " ║ ", "c1_4: 0 ═══════o══", - " =5 ", + " 0x5 ", ] ) circuit = QuantumCircuit.from_qasm_str(qasm_string) @@ -2273,7 +2273,7 @@ def test_text_conditional_cz_no_space_cregbundle(self): " │ ", "qr_1: |0>───■───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2289,13 +2289,13 @@ def test_text_conditional_cz_no_space(self): expected = "\n".join( [ - " ", - "qr_0: |0>─■──", - " │ ", - "qr_1: |0>─■──", - " ║ ", - " cr_0: 0 ═■══", - " =1 ", + " ", + "qr_0: |0>──■──", + " │ ", + "qr_1: |0>──■──", + " ║ ", + " cr_0: 0 ══■══", + " 0x1 ", ] ) @@ -2317,7 +2317,7 @@ def test_text_conditional_cz_cregbundle(self): " ║ ", "qr_2: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2333,15 +2333,15 @@ def test_text_conditional_cz(self): expected = "\n".join( [ - " ", - "qr_0: |0>─■──", - " │ ", - "qr_1: |0>─■──", - " ║ ", - "qr_2: |0>─╫──", - " ║ ", - " cr_0: 0 ═■══", - " =1 ", + " ", + "qr_0: |0>──■──", + " │ ", + "qr_1: |0>──■──", + " ║ ", + "qr_2: |0>──╫──", + " ║ ", + " cr_0: 0 ══■══", + " 0x1 ", ] ) @@ -2363,7 +2363,7 @@ def test_text_conditional_cx_ct_cregbundle(self): " └─╥─┘ ", "qr_2: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2387,7 +2387,7 @@ def test_text_conditional_cx_ct(self): "qr_2: |0>──╫──", " ║ ", " cr_0: 0 ══■══", - " =1 ", + " 0x1 ", ] ) @@ -2409,7 +2409,7 @@ def test_text_conditional_cx_tc_cregbundle(self): " ║ ", "qr_2: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2433,7 +2433,7 @@ def test_text_conditional_cx_tc(self): "qr_2: |0>──╫──", " ║ ", " cr_0: 0 ══■══", - " =1 ", + " 0x1 ", ] ) @@ -2455,7 +2455,7 @@ def test_text_conditional_cu3_ct_cregbundle(self): " └────────╥────────┘", "qr_2: |0>─────────╫─────────", " ┌──╨──┐ ", - " cr: 0 1/══════╡ = 1 ╞══════", + " cr: 0 1/══════╡ 0x1 ╞══════", " └─────┘ ", ] ) @@ -2479,7 +2479,7 @@ def test_text_conditional_cu3_ct(self): "qr_2: |0>─────────╫─────────", " ║ ", " cr_0: 0 ═════════■═════════", - " =1 ", + " 0x1 ", ] ) @@ -2501,7 +2501,7 @@ def test_text_conditional_cu3_tc_cregbundle(self): " ║ ", "qr_2: |0>─────────╫─────────", " ┌──╨──┐ ", - " cr: 0 1/══════╡ = 1 ╞══════", + " cr: 0 1/══════╡ 0x1 ╞══════", " └─────┘ ", ] ) @@ -2525,7 +2525,7 @@ def test_text_conditional_cu3_tc(self): "qr_2: |0>─────────╫─────────", " ║ ", " cr_0: 0 ═════════■═════════", - " =1 ", + " 0x1 ", ] ) @@ -2549,7 +2549,7 @@ def test_text_conditional_ccx_cregbundle(self): " └─╥─┘ ", "qr_3: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2575,7 +2575,7 @@ def test_text_conditional_ccx(self): "qr_3: |0>──╫──", " ║ ", " cr_0: 0 ══■══", - " =1 ", + " 0x1 ", ] ) @@ -2597,7 +2597,7 @@ def test_text_conditional_ccx_no_space_cregbundle(self): " ┌─┴─┐ ", "qr_2: |0>─┤ X ├─", " ┌┴─╨─┴┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2621,7 +2621,7 @@ def test_text_conditional_ccx_no_space(self): "qr_2: |0>┤ X ├", " └─╥─┘", " cr_0: 0 ══■══", - " =1 ", + " 0x1 ", ] ) @@ -2641,7 +2641,7 @@ def test_text_conditional_h_cregbundle(self): " └─╥─┘ ", "qr_1: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2663,7 +2663,7 @@ def test_text_conditional_h(self): "qr_1: |0>──╫──", " ║ ", " cr_0: 0 ══■══", - " =1 ", + " 0x1 ", ] ) @@ -2685,7 +2685,7 @@ def test_text_conditional_swap_cregbundle(self): " ║ ", "qr_2: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2701,15 +2701,15 @@ def test_text_conditional_swap(self): expected = "\n".join( [ - " ", - "qr_0: |0>─X──", - " │ ", - "qr_1: |0>─X──", - " ║ ", - "qr_2: |0>─╫──", - " ║ ", - " cr_0: 0 ═■══", - " =1 ", + " ", + "qr_0: |0>──X──", + " │ ", + "qr_1: |0>──X──", + " ║ ", + "qr_2: |0>──╫──", + " ║ ", + " cr_0: 0 ══■══", + " 0x1 ", ] ) @@ -2733,7 +2733,7 @@ def test_text_conditional_cswap_cregbundle(self): " ║ ", "qr_3: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2749,17 +2749,17 @@ def test_text_conditional_cswap(self): expected = "\n".join( [ - " ", - "qr_0: |0>─■──", - " │ ", - "qr_1: |0>─X──", - " │ ", - "qr_2: |0>─X──", - " ║ ", - "qr_3: |0>─╫──", - " ║ ", - " cr_0: 0 ═■══", - " =1 ", + " ", + "qr_0: |0>──■──", + " │ ", + "qr_1: |0>──X──", + " │ ", + "qr_2: |0>──X──", + " ║ ", + "qr_3: |0>──╫──", + " ║ ", + " cr_0: 0 ══■══", + " 0x1 ", ] ) @@ -2780,7 +2780,7 @@ def test_conditional_reset_cregbundle(self): " ║ ", "qr_1: |0>───╫───", " ┌──╨──┐", - " cr: 0 1/╡ = 1 ╞", + " cr: 0 1/╡ 0x1 ╞", " └─────┘", ] ) @@ -2803,7 +2803,7 @@ def test_conditional_reset(self): "qr_1: |0>──╫──", " ║ ", " cr_0: 0 ══■══", - " =1 ", + " 0x1 ", ] ) @@ -2827,7 +2827,7 @@ def test_conditional_multiplexer_cregbundle(self): " └──────╥───────┘", "qr_2: |0>───────╫────────", " ┌──╨──┐ ", - " cr: 0 1/════╡ = 1 ╞═════", + " cr: 0 1/════╡ 0x1 ╞═════", " └─────┘ ", ] ) @@ -2853,9 +2853,9 @@ def test_conditional_multiplexer(self): "qr_2: |0>───────╫────────", " ║ ", " cr_0: 0 ═══════■════════", - " =1 ", + " 0x1 ", " ┌──╨──┐ ", - " cr_0: 0 ════╡ = 1 ╞═════", + " cr_0: 0 ════╡ 0x1 ╞═════", " └─────┘ ", ] ) @@ -2878,7 +2878,7 @@ def test_text_conditional_measure_cregbundle(self): " └───┘└╥┘ ┌───┐ ", "qr_1: |0>──────╫──┤ H ├─", " ║ ┌┴─╨─┴┐", - " cr: 0 2/══════╩═╡ = 1 ╞", + " cr: 0 2/══════╩═╡ 0x1 ╞", " 0 └─────┘", ] ) @@ -2904,7 +2904,7 @@ def test_text_conditional_measure(self): " cr_0: 0 ══════╩═══■══", " ║ ", " cr_1: 0 ══════════o══", - " =1 ", + " 0x1 ", ] ) @@ -2927,9 +2927,9 @@ def test_text_bit_conditional(self): "qr_1: |0>──╫──┤ H ├", " ║ └─╥─┘", " cr_0: 0 ══■════╬══", - " =1 ║ ", + " 0x1 ║ ", " cr_1: 0 ═══════o══", - " =0 ", + " 0x0 ", ] ) @@ -2981,7 +2981,7 @@ def test_text_conditional_reverse_bits_1(self): " cr_1: 0 ══════╬═══o══", " ║ ║ ", " cr_0: 0 ══════╩═══■══", - " =1 ", + " 0x1 ", ] ) @@ -3013,7 +3013,7 @@ def test_text_conditional_reverse_bits_2(self): " cr_1: 0 ══■════o════■════■══", " ║ ║ ║ ║ ", " cr_0: 0 ══o════■════o════■══", - " =6 =1 =2 =3 ", + " 0x6 0x1 0x2 0x3 ", ] ) @@ -3825,17 +3825,17 @@ def test_cccz_conditional(self): """Closed-Open controlled Z (with conditional)""" expected = "\n".join( [ - " ", - "q_0: |0>─■──", - " │ ", - "q_1: |0>─o──", - " │ ", - "q_2: |0>─■──", - " │ ", - "q_3: |0>─■──", - " ║ ", - " c_0: 0 ═■══", - " =1 ", + " ", + "q_0: |0>──■──", + " │ ", + "q_1: |0>──o──", + " │ ", + "q_2: |0>──■──", + " │ ", + "q_3: |0>──■──", + " ║ ", + " c_0: 0 ══■══", + " 0x1 ", ] ) qr = QuantumRegister(4, "q")