From c07c2cc986992bbeb1c67eab0a2b8ba19e421a92 Mon Sep 17 00:00:00 2001 From: Edwin Navarro Date: Fri, 26 Nov 2021 13:42:42 -0800 Subject: [PATCH] Fix single clbit display in condition for all 3 circuit drawers (#7285) * Get mpl and utils conditions working * Almost on text drawer * Finish text drawer * Cleanup * Finish latex and fix tests * Working on measure with condition in utils * Lint * More lint * Finish 7248 and 7284 plus measure issues * Add mpl tests * Fix mpl tests * Add latex and text tests and bug fixes * Lint and update image * Reno and fix image * Image * Fix measure with registerless bit Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- qiskit/visualization/latex.py | 200 +++++++++--------- qiskit/visualization/matplotlib.py | 89 ++++---- qiskit/visualization/text.py | 85 ++++---- qiskit/visualization/utils.py | 76 +++++-- ...ures-circuit-drawers-cc502c9cb7f90e2b.yaml | 25 +++ .../references/bit_conditional_bundle.png | Bin 15266 -> 15562 bytes .../references/bit_conditional_no_bundle.png | Bin 15773 -> 14162 bytes .../references/measure_cond_bits_false.png | Bin 0 -> 18759 bytes .../references/measure_cond_bits_right.png | Bin 0 -> 14548 bytes .../references/measure_cond_bits_true.png | Bin 0 -> 14811 bytes .../circuit/test_circuit_matplotlib_drawer.py | 28 ++- .../references/test_latex_cif_single_bit.tex | 4 +- .../test_latex_cif_single_bit_bundle.tex | 2 +- .../test_latex_meas_cond_bits_false.tex | 20 ++ .../test_latex_meas_cond_bits_true.tex | 17 ++ .../visualization/test_circuit_latex.py | 18 +- .../visualization/test_circuit_text_drawer.py | 83 +++++++- 17 files changed, 434 insertions(+), 213 deletions(-) create mode 100644 releasenotes/notes/fix-bit-failures-circuit-drawers-cc502c9cb7f90e2b.yaml create mode 100644 test/ipynb/mpl/circuit/references/measure_cond_bits_false.png create mode 100644 test/ipynb/mpl/circuit/references/measure_cond_bits_right.png create mode 100644 test/ipynb/mpl/circuit/references/measure_cond_bits_true.png create mode 100644 test/python/visualization/references/test_latex_meas_cond_bits_false.tex create mode 100644 test/python/visualization/references/test_latex_meas_cond_bits_true.tex diff --git a/qiskit/visualization/latex.py b/qiskit/visualization/latex.py index bdefc21b44e5..654b472d617f 100644 --- a/qiskit/visualization/latex.py +++ b/qiskit/visualization/latex.py @@ -23,7 +23,13 @@ from qiskit.circuit.measure import Measure from qiskit.visualization.qcstyle import load_style from qiskit.circuit.tools.pi_check import pi_check -from .utils import get_gate_ctrl_text, get_param_str, get_bit_label, generate_latex_label +from .utils import ( + get_gate_ctrl_text, + get_param_str, + get_bit_label, + generate_latex_label, + get_condition_label, +) class QCircuitImage: @@ -78,15 +84,12 @@ def __init__( # image scaling self.scale = 1.0 if scale is None else scale - # Map of qregs to sizes - self.qregs = {} - # Map of cregs to sizes self.cregs = {} # List of qubits and cbits in order of appearance in code and image # May also include ClassicalRegisters if cregbundle=True - self.ordered_bits = [] + self._ordered_bits = [] # Map from registers to the list they appear in the image self.img_regs = {} @@ -121,19 +124,19 @@ def __init__( self.plot_barriers = plot_barriers ################################# - self.qubit_list = qubits - self.clbit_list = clbits - self.ordered_bits = qubits + clbits + self._qubits = qubits + self._clbits = clbits + self._ordered_bits = qubits + clbits self.cregs = {reg: reg.size for reg in cregs} - self.bit_locations = { + self._bit_locations = { bit: {"register": register, "index": index} for register in cregs + qregs for index, bit in enumerate(register) } for index, bit in list(enumerate(qubits)) + list(enumerate(clbits)): - if bit not in self.bit_locations: - self.bit_locations[bit] = {"register": None, "index": index} + if bit not in self._bit_locations: + self._bit_locations[bit] = {"register": None, "index": index} self.cregbundle = cregbundle # If there is any custom instruction that uses clasiscal bits @@ -143,8 +146,8 @@ def __init__( if node.op.name not in {"measure"} and node.cargs: self.cregbundle = False - self.cregs_bits = [self.bit_locations[bit]["register"] for bit in clbits] - self.img_regs = {bit: ind for ind, bit in enumerate(self.ordered_bits)} + self.cregs_bits = [self._bit_locations[bit]["register"] for bit in clbits] + self.img_regs = {bit: ind for ind, bit in enumerate(self._ordered_bits)} num_reg_bits = sum(reg.size for reg in self.cregs) if self.cregbundle: @@ -210,7 +213,7 @@ def _initialize_latex_array(self): self.wire_separation = 1.0 self._latex = [ [ - "\\cw" if isinstance(self.ordered_bits[j], Clbit) else "\\qw" + "\\cw" if isinstance(self._ordered_bits[j], Clbit) else "\\qw" for _ in range(self.img_depth + 1) ] for j in range(self.img_width) @@ -218,9 +221,9 @@ def _initialize_latex_array(self): self._latex.append([" "] * (self.img_depth + 1)) # quantum register - for ii, reg in enumerate(self.qubit_list): - register = self.bit_locations[reg]["register"] - index = self.bit_locations[reg]["index"] + for ii, reg in enumerate(self._qubits): + register = self._bit_locations[reg]["register"] + index = self._bit_locations[reg]["index"] qubit_label = get_bit_label("latex", register, index, qubit=True, layout=self.layout) qubit_label += " : " if self.initial_state: @@ -230,10 +233,10 @@ def _initialize_latex_array(self): # classical register offset = 0 - if self.clbit_list: - for ii in range(len(self.qubit_list), self.img_width): - register = self.bit_locations[self.ordered_bits[ii + offset]]["register"] - index = self.bit_locations[self.ordered_bits[ii + offset]]["index"] + if self._clbits: + for ii in range(len(self._qubits), self.img_width): + register = self._bit_locations[self._ordered_bits[ii + offset]]["register"] + index = self._bit_locations[self._ordered_bits[ii + offset]]["index"] clbit_label = get_bit_label( "latex", register, index, qubit=False, cregbundle=self.cregbundle ) @@ -328,9 +331,9 @@ def _get_image_depth(self): sum_column_widths = sum(1 + v / 3 for v in max_column_widths) max_reg_name = 3 - for reg in self.ordered_bits: - if self.bit_locations[reg]["register"] is not None: - max_reg_name = max(max_reg_name, len(self.bit_locations[reg]["register"].name)) + for reg in self._ordered_bits: + if self._bit_locations[reg]["register"] is not None: + max_reg_name = max(max_reg_name, len(self._bit_locations[reg]["register"].name)) sum_column_widths += 5 + max_reg_name / 3 # could be a fraction so ceil @@ -420,7 +423,7 @@ def _build_latex_array(self): def _build_multi_gate(self, op, gate_text, wire_list, cwire_list, col): """Add a multiple wire gate to the _latex list""" - cwire_start = len(self.qubit_list) + cwire_start = len(self._qubits) num_cols_op = 1 if isinstance(op, (SwapGate, RZZGate)): num_cols_op = self._build_symmetric_gate(op, gate_text, wire_list, col) @@ -524,19 +527,31 @@ def _build_measure(self, node, col): """Build a meter and the lines to the creg""" 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 - for creg_size in self.cregs.values(): - if cregindex >= creg_size: - cregindex -= creg_size + wire2 = len(self._qubits) + prev_reg = None + idx_str = "" + cond_offset = 1.5 if node.op.condition else 0.0 + for i, reg in enumerate(self.cregs_bits): + # if it's a registerless bit + if reg is None: + if self._clbits[i] == node.cargs[0]: + break wire2 += 1 - else: + continue + # if it's a whole register or a bit in a register + if reg == self._bit_locations[node.cargs[0]]["register"]: + idx_str = str(self._bit_locations[node.cargs[0]]["index"]) break - cond_offset = 1.5 if node.op.condition else 0.0 + if self.cregbundle and prev_reg and prev_reg == reg: + continue + wire2 += 1 + prev_reg = reg + self._latex[wire2][col] = "\\dstick{_{_{\\hspace{%sem}%s}}} \\cw \\ar @{<=} [-%s,0]" % ( cond_offset, - str(cregindex), + idx_str, str(wire2 - wire1), ) else: @@ -553,11 +568,11 @@ def _build_barrier(self, node, col): if index - 1 == last: last = index else: - pos = self.img_regs[self.qubit_list[first]] + pos = self.img_regs[self._qubits[first]] self._latex[pos][col - 1] += " \\barrier[0em]{" + str(last - first) + "}" self._latex[pos][col] = "\\qw" first = last = index - pos = self.img_regs[self.qubit_list[first]] + pos = self.img_regs[self._qubits[first]] self._latex[pos][col - 1] += " \\barrier[0em]{" + str(last - first) + "}" self._latex[pos][col] = "\\qw" @@ -581,77 +596,70 @@ def _add_controls(self, wire_list, ctrlqargs, ctrl_state, col): def _add_condition(self, op, wire_list, col): """Add a condition to the _latex list""" - # if_value - a bit string for the condition # cwire - the wire number for the first wire for the condition register # or if cregbundle, wire number of the condition register itself # gap - the number of wires from cwire to the bottom gate qubit + label, clbit_mask, val_list = get_condition_label( + op.condition, self._clbits, self._bit_locations, self.cregbundle + ) + if not self.reverse_bits: + val_list = val_list[::-1] cond_is_bit = isinstance(op.condition[0], Clbit) - if cond_is_bit: - cond_reg = self.bit_locations[op.condition[0]]["register"] - if_value = op.condition[1] + cond_reg = ( + op.condition[0] if not cond_is_bit else self._bit_locations[op.condition[0]]["register"] + ) + # if cregbundle, add 1 to cwire for each register and each registerless bit, until + # the condition bit/register is found. If not cregbundle, add 1 to cwire for every + # bit until condition found. + cwire = len(self._qubits) + if self.cregbundle: + prev_reg = None + for i, reg in enumerate(self.cregs_bits): + # if it's a registerless bit + if reg is None: + if self._clbits[i] == op.condition[0]: + break + cwire += 1 + continue + # if it's a whole register or a bit in a register + if reg == cond_reg: + break + if self.cregbundle and prev_reg and prev_reg == reg: + continue + cwire += 1 + prev_reg = reg else: - cond_reg = op.condition[0] - creg_size = self.cregs[cond_reg] - if_value = format(op.condition[1], "b").zfill(creg_size) - if not self.reverse_bits: - if_value = if_value[::-1] - - cwire = len(self.qubit_list) - iter_cregs = iter(list(self.cregs)) if self.cregbundle else iter(self.cregs_bits) - for creg in iter_cregs: - if creg == cond_reg: - break - cwire += 1 + for bit in clbit_mask: + if bit == "1": + break + 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 and put bullet on creg line - if cond_is_bit: - ctrl_bit = ( - str(cond_reg.name) + "_" + str(self.bit_locations[op.condition[0]]["index"]) - ) - label = "T" if if_value is True else "F" - self._latex[cwire][col] = "\\control \\cw^(%s){^{\\mathtt{%s=%s}}} \\cwx[-%s]" % ( - meas_offset, - ctrl_bit, - label, - str(gap), - ) - else: - self._latex[cwire][col] = "\\control \\cw^(%s){^{\\mathtt{%s}}} \\cwx[-%s]" % ( - meas_offset, - str(hex(op.condition[1])), - str(gap), - ) + # Print the condition value at the bottom and put bullet on creg line + if cond_is_bit or self.cregbundle: + control = "\\control" if op.condition[1] else "\\controlo" + self._latex[cwire][col] = f"{control}" + " \\cw^(%s){^{\\mathtt{%s}}} \\cwx[-%s]" % ( + meas_offset, + label, + str(gap), + ) else: - # Add the open and closed buttons to indicate the condition value - if cond_is_bit: - extra_gap = list(cond_reg).index(op.condition[0]) - gap += extra_gap - control = "\\control" if if_value is True else "\\controlo" - self._latex[cwire + extra_gap][col] = ( - f"{control}" + " \\cw^(%s){^{\\mathtt{%s}}} \\cwx[-%s]" - ) % ( - meas_offset, - str(hex(op.condition[1])), - str(gap), - ) - else: - 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), - ) + creg_size = op.condition[0].size + for i in range(creg_size - 1): + control = "\\control" if val_list[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 val_list[creg_size - 1] == "1" else "\\controlo" + self._latex[creg_size + cwire - 1][col] = ( + f"{control}" + " \\cw^(%s){^{\\mathtt{%s}}} \\cwx[-%s]" + ) % ( + meas_offset, + label, + 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 f4cb3a3b4f65..a8305b1bf444 100644 --- a/qiskit/visualization/matplotlib.py +++ b/qiskit/visualization/matplotlib.py @@ -27,7 +27,7 @@ except ImportError: HAS_PYLATEX = False -from qiskit.circuit import ControlledGate, Clbit +from qiskit.circuit import ControlledGate from qiskit.circuit import Measure from qiskit.circuit.library.standard_gates import ( SwapGate, @@ -43,6 +43,7 @@ get_gate_ctrl_text, get_param_str, get_bit_label, + get_condition_label, matplotlib_close_if_inline, ) from qiskit.circuit.tools.pi_check import pi_check @@ -114,10 +115,10 @@ def __init__( if bit not in self._bit_locations: self._bit_locations[bit] = {"register": None, "index": index} - self._qubit = qubits - self._clbit = clbits - self._qubit_dict = {} - self._clbit_dict = {} + self._qubits = qubits + self._clbits = clbits + self._qubits_dict = {} + self._clbits_dict = {} self._nodes = nodes self._scale = 1.0 if scale is None else scale @@ -270,7 +271,7 @@ def draw(self, filename=None, verbose=False): ``visualization.circuit_drawer`` and from ``QuantumCircuit.draw`` through circuit_drawer. """ # All information for the drawing is first loaded into self._data for the gates and into - # self._qubit_dict and self._clbit_dict for the qubits, clbits, and wires, + # self._qubits_dict and self._clbits_dict for the qubits, clbits, and wires, # followed by the coordinates for each gate. # get layer widths @@ -460,7 +461,7 @@ def _fix_double_script(bit_label): return bit_label # quantum register - for ii, reg in enumerate(self._qubit): + for ii, reg in enumerate(self._qubits): register = self._bit_locations[reg]["register"] index = self._bit_locations[reg]["index"] qubit_label = get_bit_label("mpl", register, index, qubit=True, layout=self._layout) @@ -470,7 +471,7 @@ def _fix_double_script(bit_label): if text_width > longest_bit_label_width: longest_bit_label_width = text_width pos = -ii - self._qubit_dict[ii] = { + self._qubits_dict[ii] = { "y": pos, "bit_label": qubit_label, "index": index, @@ -479,11 +480,11 @@ def _fix_double_script(bit_label): n_lines += 1 # classical register - if self._clbit: + if self._clbits: prev_creg = None idx = 0 - pos = y_off = -len(self._qubit) + 1 - for ii, reg in enumerate(self._clbit): + pos = y_off = -len(self._qubits) + 1 + for ii, reg in enumerate(self._clbits): register = self._bit_locations[reg]["register"] index = self._bit_locations[reg]["index"] if register is None or not self._cregbundle or prev_creg != register: @@ -503,7 +504,7 @@ def _fix_double_script(bit_label): if text_width > longest_bit_label_width: longest_bit_label_width = text_width pos = y_off - idx - self._clbit_dict[ii] = { + self._clbits_dict[ii] = { "y": pos, "bit_label": clbit_label, "index": index, @@ -516,9 +517,9 @@ def _get_coords(self, n_lines): """Load all the coordinate info needed to place the gates on the drawing""" # create the anchor arrays - for key, qubit in self._qubit_dict.items(): + for key, qubit in self._qubits_dict.items(): self._q_anchors[key] = Anchor(reg_num=n_lines, yind=qubit["y"], fold=self._fold) - for key, clbit in self._clbit_dict.items(): + for key, clbit in self._clbits_dict.items(): self._c_anchors[key] = Anchor(reg_num=n_lines, yind=clbit["y"], fold=self._fold) # get all the necessary coordinates for placing gates on the wires @@ -530,7 +531,7 @@ def _get_coords(self, n_lines): # get qubit index q_indxs = [] for qarg in node.qargs: - for index, reg in self._qubit_dict.items(): + for index, reg in self._qubits_dict.items(): if ( reg["register"] == self._bit_locations[qarg]["register"] and reg["index"] == self._bit_locations[qarg]["index"] @@ -541,7 +542,7 @@ def _get_coords(self, n_lines): # get clbit index c_indxs = [] for carg in node.cargs: - for index, reg in self._clbit_dict.items(): + for index, reg in self._clbits_dict.items(): if ( reg["register"] == self._bit_locations[carg]["register"] and reg["index"] == self._bit_locations[carg]["index"] @@ -575,7 +576,7 @@ def _get_coords(self, n_lines): barrier_offset = -1 if all(nd.op._directive for nd in layer) else 0 prev_anc = this_anc + layer_width + barrier_offset - 1 - anchors = [self._q_anchors[ii].get_index() for ii in self._qubit_dict] + anchors = [self._q_anchors[ii].get_index() for ii in self._qubits_dict] return max(anchors) if anchors else 0 def _get_text_width(self, text, fontsize, param=False): @@ -621,7 +622,7 @@ def _draw_regs_wires(self, num_folds, xmax, n_lines, max_anc): for fold_num in range(num_folds + 1): # quantum registers - for qubit in self._qubit_dict.values(): + for qubit in self._qubits_dict.values(): qubit_label = qubit["bit_label"] y = qubit["y"] - fold_num * (n_lines + 1) self._ax.text( @@ -640,7 +641,7 @@ def _draw_regs_wires(self, num_folds, xmax, n_lines, max_anc): # classical registers this_clbit_dict = {} - for clbit in self._clbit_dict.values(): + for clbit in self._clbits_dict.values(): clbit_label = clbit["bit_label"] clbit_reg = clbit["register"] y = clbit["y"] - fold_num * (n_lines + 1) @@ -754,7 +755,7 @@ def _draw_ops(self, verbose=False): if op.condition: cond_xy = [ self._c_anchors[ii].plot_coord(this_anc, layer_width, self._x_offset) - for ii in self._clbit_dict + for ii in self._clbits_dict ] self._condition(node, cond_xy) @@ -836,37 +837,19 @@ def _get_colors(self, node): def _condition(self, node, cond_xy): """Add a conditional to a gate""" - cond_is_bit = bool(isinstance(node.op.condition[0], Clbit)) - mask = 0 - qubit_b = min(self._data[node]["q_xy"], key=lambda xy: xy[1]) - if cond_is_bit: - for index, cbit in enumerate(self._clbit): - if cbit == node.op.condition[0]: - mask = 1 << index - break - else: - for index, cbit in enumerate(self._clbit): - if self._bit_locations[cbit]["register"] == node.op.condition[0]: - mask |= 1 << index - val = node.op.condition[1] - - # cbit list to consider - fmt_c = f"{{:0{len(cond_xy)}b}}" - cmask = list(fmt_c.format(mask))[::-1] - - # value - fmt_v = f"{{:0{cmask.count('1')}b}}" - vlist = list(fmt_v.format(val)) + label, clbit_mask, val_list = get_condition_label( + node.op.condition, self._clbits, self._bit_locations, self._cregbundle + ) if not self._reverse_bits: - vlist = vlist[::-1] + val_list = val_list[::-1] - # plot conditionals + # plot the conditionals v_ind = 0 xy_plot = [] - for xy, m in zip(cond_xy, cmask): + for xy, m in zip(cond_xy, clbit_mask): if m == "1": if xy not in xy_plot: - if vlist[v_ind] == "1" or self._cregbundle: + if node.op.condition[1] != 0 and (val_list[v_ind] == "1" or self._cregbundle): fc = self._style["lc"] else: fc = self._style["bg"] @@ -881,14 +864,12 @@ def _condition(self, node, cond_xy): self._ax.add_patch(box) xy_plot.append(xy) v_ind += 1 + + qubit_b = min(self._data[node]["q_xy"], key=lambda xy: xy[1]) clbit_b = min(xy_plot, key=lambda xy: xy[1]) + + # display the label at the bottom of the lowest conditional and draw the double line xpos, ypos = clbit_b - if cond_is_bit and self._cregbundle: - cond_reg = self._bit_locations[node.op.condition[0]]["register"] - ctrl_bit = self._bit_locations[node.op.condition[0]]["index"] - label = f"{cond_reg.name}_{ctrl_bit}={hex(val)}" - else: - label = hex(val) if isinstance(node.op, Measure): xpos += 0.3 self._ax.text( @@ -908,7 +889,9 @@ def _measure(self, node): """Draw the measure symbol and the line to the clbit""" qx, qy = self._data[node]["q_xy"][0] cx, cy = self._data[node]["c_xy"][0] - cid = self._clbit_dict[self._data[node]["c_indxs"][0]]["index"] + clbit_idx = self._clbits_dict[self._data[node]["c_indxs"][0]] + cid = clbit_idx["index"] + creg = clbit_idx["register"] # draw gate box self._gate(node) @@ -951,7 +934,7 @@ def _measure(self, node): ) self._ax.add_artist(arrowhead) # target - if self._cregbundle: + if self._cregbundle and creg is not None: self._ax.text( cx + 0.25, cy + 0.1, diff --git a/qiskit/visualization/text.py b/qiskit/visualization/text.py index c082924ca099..6eecdf9730bf 100644 --- a/qiskit/visualization/text.py +++ b/qiskit/visualization/text.py @@ -24,7 +24,12 @@ from qiskit.circuit import Measure from qiskit.circuit.library.standard_gates import IGate, RZZGate, SwapGate, SXGate, SXdgGate from qiskit.circuit.tools.pi_check import pi_check -from qiskit.visualization.utils import get_gate_ctrl_text, get_param_str, get_bit_label +from qiskit.visualization.utils import ( + get_gate_ctrl_text, + get_param_str, + get_bit_label, + get_condition_label, +) from .exceptions import VisualizationError @@ -1001,8 +1006,7 @@ def _node_to_gate(self, node, layer): if op.condition is not None: # conditional - op_cond = op.condition - layer.set_cl_multibox(op_cond[0], op_cond[1], top_connect="╨") + layer.set_cl_multibox(op.condition, top_connect="╨") conditional = True # add in a gate that operates over multiple qubits @@ -1016,7 +1020,7 @@ def add_connected_gate(node, gates, layer, current_cons): if isinstance(op, Measure): gate = MeasureFrom() layer.set_qubit(node.qargs[0], gate) - if self.cregbundle: + if self.cregbundle and self.bit_locations[node.cargs[0]]["register"] is not None: layer.set_clbit( node.cargs[0], MeasureTo(str(self.bit_locations[node.cargs[0]]["index"])), @@ -1147,6 +1151,7 @@ def __init__(self, qubits, clbits, reverse_bits=False, cregbundle=False, cregs=N cregs = [] if cregs is None else cregs self.qubits = qubits + self.clbits_raw = clbits # list of clbits ignoring cregbundle change below self._clbit_locations = { bit: {"register": register, "index": index} @@ -1163,8 +1168,11 @@ def __init__(self, qubits, clbits, reverse_bits=False, cregbundle=False, cregs=N for bit in clbits: if previous_creg and previous_creg == self._clbit_locations[bit]["register"]: continue - previous_creg = self._clbit_locations[bit]["register"] - self.clbits.append(previous_creg) + if self._clbit_locations[bit]["register"] is None: + self.clbits.append(bit) + else: + previous_creg = self._clbit_locations[bit]["register"] + self.clbits.append(previous_creg) else: self.clbits = clbits self.qubit_layer = [None] * len(qubits) @@ -1198,7 +1206,7 @@ def set_clbit(self, clbit, element): clbit (cbit): Element of self.clbits. element (DrawElement): Element to set in the clbit """ - if self.cregbundle: + if self.cregbundle and self._clbit_locations[clbit]["register"] is not None: self.clbit_layer[self.clbits.index(self._clbit_locations[clbit]["register"])] = element else: self.clbit_layer[self.clbits.index(clbit)] = element @@ -1329,53 +1337,58 @@ def _set_multibox( ) return bit_index - def set_cl_multibox(self, creg, val, top_connect="┴"): + def set_cl_multibox(self, condition, top_connect="┴"): """Sets the multi clbit box. Args: - creg (string): The affected classical register. - val (int): The value of the condition. + condition (list[Union(Clbit, ClassicalRegister), int]): The condition top_connect (char): The char to connect the box on the top. """ + label, clbit_mask, val_list = get_condition_label( + condition, self.clbits_raw, self._clbit_locations, self.cregbundle + ) + if not self.reverse_bits: + val_list = val_list[::-1] + if self.cregbundle: - if isinstance(creg, Clbit): - bit_reg = self._clbit_locations[creg]["register"] - bit_index = self._clbit_locations[creg]["index"] - label_bool = "= T" if val is True else "= F" - label = f"{bit_reg.name}_{bit_index} {label_bool}" - self.set_clbit(creg, BoxOnClWire(label=label, top_connect=top_connect)) + if isinstance(condition[0], Clbit): + # if it's a registerless Clbit + if self._clbit_locations[condition[0]]["register"] is None: + self.set_cond_bullets(label, val_list, [condition[0]]) + # if it's a single bit in a register + else: + self.set_clbit(condition[0], BoxOnClWire(label=label, top_connect=top_connect)) + # if it's a whole register else: - label = "%s" % str(hex(val)) - self.set_clbit(creg[0], BoxOnClWire(label=label, top_connect=top_connect)) + self.set_clbit(condition[0][0], BoxOnClWire(label=label, top_connect=top_connect)) else: - if isinstance(creg, Clbit): - clbit = [creg] - cond_bin = "1" if val is True else "0" - self.set_cond_bullets(cond_bin, clbit) - else: - clbit = [ - bit for bit in self.clbits if self._clbit_locations[bit]["register"] == creg - ] - cond_bin = bin(val)[2:].zfill(len(clbit)) - self.set_cond_bullets(cond_bin, clbits=clbit) + clbits = [] + for i, _ in enumerate(clbit_mask): + if clbit_mask[i] == "1": + clbits.append(self.clbits[i]) + self.set_cond_bullets(label, val_list, clbits) - def set_cond_bullets(self, val, clbits): + def set_cond_bullets(self, label, val_list, clbits): """Sets bullets for classical conditioning when cregbundle=False. Args: - val (int): The condition value. + label (str): String to display below the condition + val_list (list(int)): A list of bit values clbits (list[Clbit]): The list of classical bits on which the instruction is conditioned. """ - vlist = list(val) if self.reverse_bits else list(val[::-1]) for i, bit in enumerate(clbits): bot_connect = " " if bit == clbits[-1]: - 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": - self.set_clbit(bit, ClOpenBullet(top_connect="║", bot_connect=bot_connect)) + bot_connect = label + if val_list[i] == "1": + self.clbit_layer[self.clbits.index(bit)] = ClBullet( + top_connect="║", bot_connect=bot_connect + ) + elif val_list[i] == "0": + self.clbit_layer[self.clbits.index(bit)] = ClOpenBullet( + top_connect="║", bot_connect=bot_connect + ) def set_qu_multibox( self, diff --git a/qiskit/visualization/utils.py b/qiskit/visualization/utils.py index 5618298206fc..94436db786f1 100644 --- a/qiskit/visualization/utils.py +++ b/qiskit/visualization/utils.py @@ -220,6 +220,54 @@ def get_bit_label(drawer, register, index, qubit=True, layout=None, cregbundle=T return bit_label +def get_condition_label(condition, clbits, bit_locations, cregbundle): + """Get the label to display as a condition + + Args: + condition (Union[Clbit, ClassicalRegister], int): classical condition + clbits (list(Clbit)): the classical bits in the circuit + bit_locations (dict): the bits in the circuit with register and index + cregbundle (bool): if set True bundle classical registers + + Returns: + str: label to display for the condition + list(str): list of 1's and 0's with 1's indicating a bit that's part of the condition + list(str): list of 1's and 0's indicating values of condition at that position + """ + cond_is_bit = bool(isinstance(condition[0], Clbit)) + mask = 0 + if cond_is_bit: + for index, cbit in enumerate(clbits): + if cbit == condition[0]: + mask = 1 << index + break + else: + for index, cbit in enumerate(clbits): + if bit_locations[cbit]["register"] == condition[0]: + mask |= 1 << index + val = condition[1] + + # cbit list to consider + fmt_c = f"{{:0{len(clbits)}b}}" + clbit_mask = list(fmt_c.format(mask))[::-1] + + # value + fmt_v = f"{{:0{clbit_mask.count('1')}b}}" + vlist = list(fmt_v.format(val)) + + label = "" + if cond_is_bit and cregbundle: + cond_reg = bit_locations[condition[0]]["register"] + ctrl_bit = bit_locations[condition[0]]["index"] + truth = "0x1" if val else "0x0" + if cond_reg is not None: + label = f"{cond_reg.name}_{ctrl_bit}={truth}" + elif not cond_is_bit: + label = hex(val) + + return label, clbit_mask, vlist + + def generate_latex_label(label): """Convert a label to a valid latex string.""" if not HAS_PYLATEX: @@ -297,7 +345,7 @@ def _get_layered_instructions(circuit, reverse_bits=False, justify=None, idle_wi # Create a mapping of each register to the max layer number for all measure ops # with that register as the target. Then when an op with condition is seen, # it will be placed to the right of the measure op if the register matches. - measure_map = OrderedDict([(c, -1) for c in circuit.cregs]) + measure_map = OrderedDict([(c, -1) for c in clbits]) if justify == "none": for node in dag.topological_op_nodes(): @@ -374,6 +422,7 @@ def __init__(self, dag, justification, measure_map, reverse_bits): super().__init__() self.dag = dag self.qubits = dag.qubits + self.clbits = dag.clbits self.justification = justification self.measure_map = measure_map self.cregs = [self.dag.cregs[reg] for reg in self.dag.cregs] @@ -415,7 +464,7 @@ def slide_from_left(self, node, index): """Insert node into first layer where there is no conflict going l > r""" measure_layer = None if isinstance(node.op, Measure): - measure_reg = next(reg for reg in self.measure_map if node.cargs[0] in reg) + measure_bit = next(bit for bit in self.measure_map if node.cargs[0] == bit) if not self: inserted = True @@ -427,19 +476,22 @@ def slide_from_left(self, node, index): index_stop = -1 if node.op.condition: if isinstance(node.op.condition[0], Clbit): - cond_reg = [creg for creg in self.cregs if node.op.condition[0] in creg] - index_stop = self.measure_map[cond_reg[0]] + cond_bit = [clbit for clbit in self.clbits if node.op.condition[0] == clbit] + index_stop = self.measure_map[cond_bit[0]] else: - index_stop = self.measure_map[node.op.condition[0]] - elif node.cargs: + for bit in node.op.condition[0]: + max_index = -1 + if bit in self.measure_map: + if self.measure_map[bit] > max_index: + index_stop = max_index = self.measure_map[bit] + if node.cargs: for carg in node.cargs: try: - carg_reg = next(reg for reg in self.measure_map if carg in reg) - if self.measure_map[carg_reg] > index_stop: - index_stop = self.measure_map[carg_reg] + carg_bit = next(bit for bit in self.measure_map if carg == bit) + if self.measure_map[carg_bit] > index_stop: + index_stop = self.measure_map[carg_bit] except StopIteration: pass - while curr_index > index_stop: if self.is_found_in(node, self[curr_index]): break @@ -468,8 +520,8 @@ def slide_from_left(self, node, index): if isinstance(node.op, Measure): if not measure_layer: measure_layer = len(self) - 1 - if measure_layer > self.measure_map[measure_reg]: - self.measure_map[measure_reg] = measure_layer + if measure_layer > self.measure_map[measure_bit]: + self.measure_map[measure_bit] = measure_layer def slide_from_right(self, node, index): """Insert node into rightmost layer as long there is no conflict.""" diff --git a/releasenotes/notes/fix-bit-failures-circuit-drawers-cc502c9cb7f90e2b.yaml b/releasenotes/notes/fix-bit-failures-circuit-drawers-cc502c9cb7f90e2b.yaml new file mode 100644 index 000000000000..0efe0361afaf --- /dev/null +++ b/releasenotes/notes/fix-bit-failures-circuit-drawers-cc502c9cb7f90e2b.yaml @@ -0,0 +1,25 @@ +--- +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 targeted on a classical bit instead of a register, using + the ``latex`` drawer option, the drawer would fail. +fixes: + - | + Fixed an issue with the :func:`~qiskit.visualization.circuit_drawer` + function and :meth:`~qiskit.circuit.QuantumCircuit.draw` method of + :class:`~qiskit.circuit.QuantumCircuit`. With any of the 3 drawer + options, ``mpl``, ``latex``, or ``text``, if a gate with a classical + condition was encountered that was conditioned on a classical bit + without a register, the drawer would fail. +fixes: + - | + Fixed an issue with the :func:`~qiskit.visualization.circuit_drawer` + function and :meth:`~qiskit.circuit.QuantumCircuit.draw` method of + :class:`~qiskit.circuit.QuantumCircuit`. With any of the 3 drawer + options, ``mpl``, ``latex``, or ``text``, if a gate with a classical + condition was conditioned on the same classical bit as a ``measure`` + and the bit that the measure targeted did not have a register, the + drawer would fail. diff --git a/test/ipynb/mpl/circuit/references/bit_conditional_bundle.png b/test/ipynb/mpl/circuit/references/bit_conditional_bundle.png index 79295f95e18b4a894ec2448ccc61777d919a08b6..3397ad9fd20c11979f3787adc0df33af74b46009 100644 GIT binary patch literal 15562 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/ps~g%cO2S;o44kNwI@{|a-Plf3`ok~YDDyq= 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 literal 15773 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 ZcC(U6!L8&6@Pr`>eOdQX!Nr>o{s~d+_0<3X literal 0 HcmV?d00001 diff --git a/test/ipynb/mpl/circuit/references/measure_cond_bits_true.png b/test/ipynb/mpl/circuit/references/measure_cond_bits_true.png new file mode 100644 index 0000000000000000000000000000000000000000..f13566ba1c7b28504f79a15821b260dc5a560167 GIT binary patch literal 14811 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 literal 0 HcmV?d00001 diff --git a/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py b/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py index 900f69692cf5..9613ffd42fae 100644 --- a/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py +++ b/test/ipynb/mpl/circuit/test_circuit_matplotlib_drawer.py @@ -28,7 +28,7 @@ from qiskit.circuit.library import XGate, MCXGate, HGate, RZZGate, SwapGate, DCXGate, ZGate, SGate from qiskit.circuit.library import MCXVChain from qiskit.extensions import HamiltonianGate -from qiskit.circuit import Parameter +from qiskit.circuit import Parameter, Qubit, Clbit from qiskit.circuit.library import IQP from qiskit.quantum_info.random import random_unitary from qiskit.tools.visualization import HAS_MATPLOTLIB @@ -486,7 +486,7 @@ def test_scale(self): self.circuit_drawer(circuit, filename="scale_double.png", scale=2) def test_pi_param_expr(self): - """Text pi in circuit with parameter expression.""" + """Test pi in circuit with parameter expression.""" x, y = Parameter("x"), Parameter("y") circuit = QuantumCircuit(1) circuit.rx((pi - x) * (pi - y), 0) @@ -787,8 +787,6 @@ def test_figwidth(self): def test_registerless_one_bit(self): """Test circuit with one-bit registers and registerless bits.""" - from qiskit.circuit import Qubit, Clbit - qrx = QuantumRegister(2, "qrx") qry = QuantumRegister(1, "qry") crx = ClassicalRegister(2, "crx") @@ -809,6 +807,28 @@ def test_measures_with_conditions(self): self.circuit_drawer(circuit, cregbundle=False, filename="measure_cond_false.png") self.circuit_drawer(circuit, cregbundle=True, filename="measure_cond_true.png") + def test_conditions_measures_with_bits(self): + """Test that gates with conditions and measures work with bits""" + bits = [Qubit(), Qubit(), Clbit(), Clbit()] + cr = ClassicalRegister(2, "cr") + crx = ClassicalRegister(3, "cs") + circuit = QuantumCircuit(bits, cr, [Clbit()], crx) + circuit.x(0).c_if(crx[1], 0) + circuit.measure(0, bits[3]) + self.circuit_drawer(circuit, cregbundle=False, filename="measure_cond_bits_false.png") + self.circuit_drawer(circuit, cregbundle=True, filename="measure_cond_bits_true.png") + + def test_conditional_gates_right_of_measures_with_bits(self): + """Test that gates with conditions draw to right of measures when same bit""" + qr = QuantumRegister(3, "qr") + cr = ClassicalRegister(2, "cr") + circuit = QuantumCircuit(qr, cr) + circuit.h(qr[0]) + circuit.measure(qr[0], cr[1]) + circuit.h(qr[1]).c_if(cr[1], 0) + circuit.h(qr[2]).c_if(cr[0], 0) + self.circuit_drawer(circuit, cregbundle=False, filename="measure_cond_bits_right.png") + if __name__ == "__main__": unittest.main(verbosity=1) diff --git a/test/python/visualization/references/test_latex_cif_single_bit.tex b/test/python/visualization/references/test_latex_cif_single_bit.tex index 7b50bfdb5180..9977924a3194 100644 --- a/test/python/visualization/references/test_latex_cif_single_bit.tex +++ b/test/python/visualization/references/test_latex_cif_single_bit.tex @@ -8,7 +8,7 @@ \Qcircuit @C=1.0em @R=0.2em @!R { \\ \nghost{{qr}_{0} : } & \lstick{{qr}_{0} : } & \gate{\mathrm{H}} & \qw & \qw & \qw\\ \nghost{{qr}_{1} : } & \lstick{{qr}_{1} : } & \qw & \gate{\mathrm{X}} & \qw & \qw\\ - \nghost{{cr}_{0} : } & \lstick{{cr}_{0} : } & \cw & \control \cw^(0.0){^{\mathtt{0x1}}} \cwx[-1] & \cw & \cw\\ - \nghost{{cr}_{1} : } & \lstick{{cr}_{1} : } & \controlo \cw^(0.0){^{\mathtt{0x0}}} \cwx[-3] & \cw & \cw & \cw\\ + \nghost{{cr}_{0} : } & \lstick{{cr}_{0} : } & \cw & \control \cw^(0.0){^{\mathtt{}}} \cwx[-1] & \cw & \cw\\ + \nghost{{cr}_{1} : } & \lstick{{cr}_{1} : } & \controlo \cw^(0.0){^{\mathtt{}}} \cwx[-3] & \cw & \cw & \cw\\ \\ }} \end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_cif_single_bit_bundle.tex b/test/python/visualization/references/test_latex_cif_single_bit_bundle.tex index 99d3d5b2e0af..ead346d7e6b2 100644 --- a/test/python/visualization/references/test_latex_cif_single_bit_bundle.tex +++ b/test/python/visualization/references/test_latex_cif_single_bit_bundle.tex @@ -8,6 +8,6 @@ \Qcircuit @C=1.0em @R=0.2em @!R { \\ \nghost{{qr}_{0} : } & \lstick{{qr}_{0} : } & \qw & \gate{\mathrm{H}} & \qw & \qw & \qw\\ \nghost{{qr}_{1} : } & \lstick{{qr}_{1} : } & \qw & \qw & \gate{\mathrm{X}} & \qw & \qw\\ - \nghost{\mathrm{cr : }} & \lstick{\mathrm{cr : }} & \lstick{/_{_{2}}} \cw & \control \cw^(0.0){^{\mathtt{cr_1=F}}} \cwx[-2] & \control \cw^(0.0){^{\mathtt{cr_0=T}}} \cwx[-1] & \cw & \cw\\ + \nghost{\mathrm{cr : }} & \lstick{\mathrm{cr : }} & \lstick{/_{_{2}}} \cw & \controlo \cw^(0.0){^{\mathtt{cr_1=0x0}}} \cwx[-2] & \control \cw^(0.0){^{\mathtt{cr_0=0x1}}} \cwx[-1] & \cw & \cw\\ \\ }} \end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_meas_cond_bits_false.tex b/test/python/visualization/references/test_latex_meas_cond_bits_false.tex new file mode 100644 index 000000000000..1db61a8ddaeb --- /dev/null +++ b/test/python/visualization/references/test_latex_meas_cond_bits_false.tex @@ -0,0 +1,20 @@ +\documentclass[border=2px]{standalone} + +\usepackage[braket, qm]{qcircuit} +\usepackage{graphicx} + +\begin{document} +\scalebox{1.0}{ +\Qcircuit @C=1.0em @R=0.2em @!R { \\ + \nghost{{0} : } & \lstick{{0} : } & \gate{\mathrm{X}} & \meter & \qw & \qw\\ + \nghost{{1} : } & \lstick{{1} : } & \qw & \qw & \qw & \qw\\ + \nghost{{0} : } & \lstick{{0} : } & \cw & \cw & \cw & \cw\\ + \nghost{{1} : } & \lstick{{1} : } & \cw & \cw \ar @{<=} [-3,0] & \cw & \cw\\ + \nghost{{cr}_{0} : } & \lstick{{cr}_{0} : } & \cw & \cw & \cw & \cw\\ + \nghost{{cr}_{1} : } & \lstick{{cr}_{1} : } & \cw & \cw & \cw & \cw\\ + \nghost{{4} : } & \lstick{{4} : } & \cw & \cw & \cw & \cw\\ + \nghost{{cs}_{0} : } & \lstick{{cs}_{0} : } & \cw & \cw & \cw & \cw\\ + \nghost{{cs}_{1} : } & \lstick{{cs}_{1} : } & \controlo \cw^(0.0){^{\mathtt{}}} \cwx[-8] & \cw & \cw & \cw\\ + \nghost{{cs}_{2} : } & \lstick{{cs}_{2} : } & \cw & \cw & \cw & \cw\\ +\\ }} +\end{document} \ No newline at end of file diff --git a/test/python/visualization/references/test_latex_meas_cond_bits_true.tex b/test/python/visualization/references/test_latex_meas_cond_bits_true.tex new file mode 100644 index 000000000000..0ef5c66b0268 --- /dev/null +++ b/test/python/visualization/references/test_latex_meas_cond_bits_true.tex @@ -0,0 +1,17 @@ +\documentclass[border=2px]{standalone} + +\usepackage[braket, qm]{qcircuit} +\usepackage{graphicx} + +\begin{document} +\scalebox{1.0}{ +\Qcircuit @C=1.0em @R=0.2em @!R { \\ + \nghost{{0} : } & \lstick{{0} : } & \qw & \gate{\mathrm{X}} & \meter & \qw & \qw\\ + \nghost{{1} : } & \lstick{{1} : } & \qw & \qw & \qw & \qw & \qw\\ + \nghost{\mathrm{{0} : }} & \lstick{\mathrm{{0} : }} & \cw & \cw & \cw & \cw & \cw\\ + \nghost{\mathrm{{1} : }} & \lstick{\mathrm{{1} : }} & \cw & \cw & \dstick{_{_{\hspace{0.0em}}}} \cw \ar @{<=} [-3,0] & \cw & \cw\\ + \nghost{\mathrm{cr : }} & \lstick{\mathrm{cr : }} & \lstick{/_{_{2}}} \cw & \cw & \cw & \cw & \cw\\ + \nghost{\mathrm{{4} : }} & \lstick{\mathrm{{4} : }} & \cw & \cw & \cw & \cw & \cw\\ + \nghost{\mathrm{cs : }} & \lstick{\mathrm{cs : }} & \lstick{/_{_{3}}} \cw & \controlo \cw^(0.0){^{\mathtt{cs_1=0x0}}} \cwx[-6] & \cw & \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 3b302c42fcf0..c3e987fa44ac 100644 --- a/test/python/visualization/test_circuit_latex.py +++ b/test/python/visualization/test_circuit_latex.py @@ -25,6 +25,7 @@ from qiskit.circuit.library import XGate, MCXGate, RZZGate, SwapGate, DCXGate from qiskit.extensions import HamiltonianGate from qiskit.circuit import Parameter +from qiskit.circuit import Qubit, Clbit from qiskit.circuit.library import IQP from qiskit.quantum_info.random import random_unitary from .visualization import QiskitVisualizationTestCase @@ -576,8 +577,6 @@ def test_cif_single_bit_cregbundle(self): def test_registerless_one_bit(self): """Text circuit with one-bit registers and registerless bits.""" - from qiskit.circuit import Qubit, Clbit - filename = self._get_resource_path("test_latex_registerless_one_bit.tex") qrx = QuantumRegister(2, "qrx") qry = QuantumRegister(1, "qry") @@ -605,6 +604,21 @@ def test_measures_with_conditions(self): self.assertEqualToReference(filename1) self.assertEqualToReference(filename2) + def test_measures_with_conditions_with_bits(self): + """Condition and measure on single bits cregbundle true""" + filename1 = self._get_resource_path("test_latex_meas_cond_bits_false.tex") + filename2 = self._get_resource_path("test_latex_meas_cond_bits_true.tex") + bits = [Qubit(), Qubit(), Clbit(), Clbit()] + cr = ClassicalRegister(2, "cr") + crx = ClassicalRegister(3, "cs") + circuit = QuantumCircuit(bits, cr, [Clbit()], crx) + circuit.x(0).c_if(crx[1], 0) + circuit.measure(0, bits[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 836a46f4e050..090c5716beb7 100644 --- a/test/python/visualization/test_circuit_text_drawer.py +++ b/test/python/visualization/test_circuit_text_drawer.py @@ -20,7 +20,7 @@ import numpy from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile -from qiskit.circuit import Gate, Parameter +from qiskit.circuit import Gate, Parameter, Qubit, Clbit from qiskit.quantum_info.operators import SuperOp from qiskit.quantum_info.random import random_unitary from qiskit.test import QiskitTestCase @@ -2904,7 +2904,6 @@ def test_text_conditional_measure(self): " 0x1 ", ] ) - self.assertEqual(str(_text_circuit_drawer(circuit)), expected) def test_text_bit_conditional(self): @@ -2924,9 +2923,9 @@ def test_text_bit_conditional(self): "qr_1: |0>──╫──┤ H ├", " ║ └─╥─┘", " cr_0: 0 ══■════╬══", - " 0x1 ║ ", + " ║ ", " cr_1: 0 ═══════o══", - " 0x0 ", + " ", ] ) @@ -2949,7 +2948,7 @@ def test_text_bit_conditional_cregbundle(self): "qr_1: |0>─────╫─────────┤ H ├────", " ║ └─╥─┘ ", " ┌────╨─────┐┌────╨─────┐", - " cr: 0 2/╡ cr_0 = T ╞╡ cr_1 = F ╞", + " cr: 0 2/╡ cr_0=0x1 ╞╡ cr_1=0x0 ╞", " └──────────┘└──────────┘", ] ) @@ -2959,6 +2958,78 @@ def test_text_bit_conditional_cregbundle(self): expected, ) + def test_text_condition_measure_bits_true(self): + """Condition and measure on single bits cregbundle true""" + + bits = [Qubit(), Qubit(), Clbit(), Clbit()] + cr = ClassicalRegister(2, "cr") + crx = ClassicalRegister(3, "cs") + circuit = QuantumCircuit(bits, cr, [Clbit()], crx) + circuit.x(0).c_if(crx[1], 0) + circuit.measure(0, bits[3]) + + expected = "\n".join( + [ + " ┌───┐ ┌─┐", + " 0: ───┤ X ├────┤M├", + " └─╥─┘ └╥┘", + " 1: ─────╫───────╫─", + " ║ ║ ", + " 0: ═════╬═══════╬═", + " ║ ║ ", + " 1: ═════╬═══════╩═", + " ║ ", + "cr: 2/═════╬═════════", + " ║ ", + " 4: ═════╬═════════", + " ┌────╨─────┐ ", + "cs: 3/╡ cs_1=0x0 ╞═══", + " └──────────┘ ", + ] + ) + self.assertEqual( + str(_text_circuit_drawer(circuit, cregbundle=True, initial_state=False)), expected + ) + + def test_text_condition_measure_bits_false(self): + """Condition and measure on single bits cregbundle false""" + + bits = [Qubit(), Qubit(), Clbit(), Clbit()] + cr = ClassicalRegister(2, "cr") + crx = ClassicalRegister(3, "cs") + circuit = QuantumCircuit(bits, cr, [Clbit()], crx) + circuit.x(0).c_if(crx[1], 0) + circuit.measure(0, bits[3]) + + expected = "\n".join( + [ + " ┌───┐┌─┐", + " 0: ┤ X ├┤M├", + " └─╥─┘└╥┘", + " 1: ──╫───╫─", + " ║ ║ ", + " 0: ══╬═══╬═", + " ║ ║ ", + " 1: ══╬═══╩═", + " ║ ", + "cr_0: ══╬═════", + " ║ ", + "cr_1: ══╬═════", + " ║ ", + " 4: ══╬═════", + " ║ ", + "cs_0: ══╬═════", + " ║ ", + "cs_1: ══o═════", + " ", + "cs_2: ════════", + " ", + ] + ) + self.assertEqual( + str(_text_circuit_drawer(circuit, cregbundle=False, initial_state=False)), expected + ) + def test_text_conditional_reverse_bits_1(self): """Classical condition on 2q2c circuit with cregbundle=False and reverse bits""" qr = QuantumRegister(2, "qr") @@ -4688,8 +4759,6 @@ def test_empty_noregs(self): def test_registerless_one_bit(self): """Text circuit with one-bit registers and registerless bits.""" - from qiskit.circuit import Qubit, Clbit - # fmt: off expected = "\n".join([" ", "qrx_0: ",