Repository: Qiskit/qiskit

Issue:
dissasembler does not handle multi-control gates correctly
<!-- ⚠️ If you do not respect this template, your issue will be closed -->
<!-- ⚠️ Make sure to browse the opened and closed issues -->

### Information

- **Qiskit Terra version**: 0.17
- **Python version**: 3.9.2
- **Operating system**: macOS 11.2.3 (Big Sur)

### What is the current behavior?
When attempting to use `assembler.disassemble` on a Qobj with an mcx gate, the disassembler throws an error.


### Steps to reproduce the problem
```
from qiskit import assembler, compiler
qc = QuantumCircuit(5,5)
qc.mcx([0,1,2,3], 4)
qobj = compiler.assemble(qc)
assembler.disassemble(qobj)
```
produces
```

~/anaconda3/envs/qiskit_env/lib/python3.9/site-packages/qiskit/assembler/disassemble.py in _experiments_to_circuits(qobj)
    128                     _inst = instr_method(*params, qubits, clbits)
    129                 else:
--> 130                     _inst = instr_method(*params, *qubits, *clbits)
    131             elif name == 'bfunc':
    132                 conditional['value'] = int(i.val, 16)

TypeError: mcx() takes from 3 to 5 positional arguments but 6 were given
```
a shorter version that doesn't break the argument number also hints at what's being passed being incorrect in some way:
(same input as above except `qc.mcx([0,1,2],3)`)

```
~/anaconda3/envs/qiskit_env/lib/python3.9/site-packages/qiskit/circuit/quantumcircuit.py in mcx(self, control_qubits, target_qubit, ancilla_qubits, mode)
   2536         """
   2537         from .library.standard_gates.x import MCXGrayCode, MCXRecursive, MCXVChain
-> 2538         num_ctrl_qubits = len(control_qubits)
   2539 
   2540         available_implementations = {

TypeError: object of type 'Qubit' has no len()
```

### What is the expected behavior?
correct disassembly into a circuit

### Suggested solutions
I think what's happening here is that the signature for quantumcircuit.mcx expects a _list_  of controls, followed by a target; `mcx(control_qubits, target_qubit, ...)`  The qobj representation of an mcx gate is just a list of qubits, with (I think) the last being the target; L130 is unzipping the entire qubit list into the method, which does not match the signature. 


granted, this might eventually be moot given #5897, but it looks like there needs to be another case in the disassembler for this gate and any like it that expect a list, or else a change in the gate def to accommodate this case.


Discussion:
@ColemanCollins If you're not working on this, I think I have at least a rudimentary solution. It appears that 4 `QuantumCircuit` methods, `mcx, mct, mcp, and mcu1` use the `control_qubits` list. (There may be others if we look through all the internally created gates, but I think fixing these will handle the immediate problem). It's easy to treat these as a special case in the disassembler.

If you'd like, I can submit a PR to fix this.

Resolving patch:
diff --git a/qiskit/assembler/disassemble.py b/qiskit/assembler/disassemble.py
--- a/qiskit/assembler/disassemble.py
+++ b/qiskit/assembler/disassemble.py
@@ -126,6 +126,8 @@ def _experiments_to_circuits(qobj):
                     _inst = instr_method(params, qubits)
                 elif i.name == 'isometry':
                     _inst = instr_method(*params, qubits, clbits)
+                elif i.name in ['mcx', 'mcu1', 'mcp']:
+                    _inst = instr_method(*params, qubits[:-1], qubits[-1], *clbits)
                 else:
                     _inst = instr_method(*params, *qubits, *clbits)
             elif name == 'bfunc':


Test patch:
diff --git a/test/python/compiler/test_disassembler.py b/test/python/compiler/test_disassembler.py
--- a/test/python/compiler/test_disassembler.py
+++ b/test/python/compiler/test_disassembler.py
@@ -189,6 +189,21 @@ def test_circuit_with_simple_conditional(self):
         self.assertEqual(circuits[0], qc)
         self.assertEqual({}, header)
 
+    def test_circuit_with_mcx(self):
+        """Verify disassemble handles mcx gate - #6271."""
+        qr = QuantumRegister(5)
+        cr = ClassicalRegister(5)
+        qc = QuantumCircuit(qr, cr)
+        qc.mcx([0, 1, 2], 4)
+        qobj = assemble(qc)
+        circuits, run_config_out, header = disassemble(qobj)
+        run_config_out = RunConfig(**run_config_out)
+        self.assertEqual(run_config_out.n_qubits, 5)
+        self.assertEqual(run_config_out.memory_slots, 5)
+        self.assertEqual(len(circuits), 1)
+        self.assertEqual(circuits[0], qc)
+        self.assertEqual({}, header)
+
     def test_multiple_conditionals_multiple_registers(self):
         """Verify disassemble handles multiple conditionals and registers."""
         qr = QuantumRegister(3)