diff --git a/qiskit/dagcircuit/dagcircuit.py b/qiskit/dagcircuit/dagcircuit.py index 754169c0d157..065e0f74ff74 100644 --- a/qiskit/dagcircuit/dagcircuit.py +++ b/qiskit/dagcircuit/dagcircuit.py @@ -216,7 +216,9 @@ def add_calibration(self, gate, qubits, schedule, params=None): Exception: if the gate is of type string and params is None. """ if isinstance(gate, Gate): - self._calibrations[gate.name][(tuple(qubits), tuple(gate.params))] = schedule + self._calibrations[gate.name][ + (tuple(qubits), tuple(float(p) for p in gate.params)) + ] = schedule else: self._calibrations[gate][(tuple(qubits), tuple(params or []))] = schedule diff --git a/qiskit/transpiler/passes/calibration/builders.py b/qiskit/transpiler/passes/calibration/builders.py index 966916e384ce..cdb8be5e1bbe 100644 --- a/qiskit/transpiler/passes/calibration/builders.py +++ b/qiskit/transpiler/passes/calibration/builders.py @@ -192,8 +192,8 @@ def rescale_cr_inst(instruction: Play, theta: float, sample_mult: int = 16) -> P gaussian_area = abs(amp) * sigma * np.sqrt(2 * np.pi) * math.erf(n_sigmas) area = gaussian_area + abs(amp) * width - target_area = abs(theta) / (np.pi / 2.0) * area - sign = theta / abs(theta) + target_area = abs(float(theta)) / (np.pi / 2.0) * area + sign = theta / abs(float(theta)) if target_area > gaussian_area: width = (target_area - gaussian_area) / abs(amp) diff --git a/qiskit/transpiler/passes/scheduling/alap.py b/qiskit/transpiler/passes/scheduling/alap.py index e246aa9a61d1..4357f85940f7 100644 --- a/qiskit/transpiler/passes/scheduling/alap.py +++ b/qiskit/transpiler/passes/scheduling/alap.py @@ -84,9 +84,15 @@ def pad_with_delays(qubits: List[int], until, unit) -> None: # validate node.op.duration if node.op.duration is None: indices = [bit_indices[qarg] for qarg in node.qargs] - raise TranspilerError( - f"Duration of {node.op.name} on qubits {indices} is not found." - ) + if dag.has_calibration_for(node): + node.op.duration = dag.calibrations[node.op.name][ + (tuple(indices), tuple(float(p) for p in node.op.params)) + ].duration + + if node.op.duration is None: + raise TranspilerError( + f"Duration of {node.op.name} on qubits {indices} is not found." + ) if isinstance(node.op.duration, ParameterExpression): indices = [bit_indices[qarg] for qarg in node.qargs] raise TranspilerError( diff --git a/qiskit/transpiler/passes/scheduling/asap.py b/qiskit/transpiler/passes/scheduling/asap.py index 5ba174701f68..5c0d08dda2eb 100644 --- a/qiskit/transpiler/passes/scheduling/asap.py +++ b/qiskit/transpiler/passes/scheduling/asap.py @@ -85,9 +85,15 @@ def pad_with_delays(qubits: List[int], until, unit) -> None: # validate node.op.duration if node.op.duration is None: indices = [bit_indices[qarg] for qarg in node.qargs] - raise TranspilerError( - f"Duration of {node.op.name} on qubits {indices} is not found." - ) + if dag.has_calibration_for(node): + node.op.duration = dag.calibrations[node.op.name][ + (tuple(indices), tuple(float(p) for p in node.op.params)) + ].duration + + if node.op.duration is None: + raise TranspilerError( + f"Duration of {node.op.name} on qubits {indices} is not found." + ) if isinstance(node.op.duration, ParameterExpression): indices = [bit_indices[qarg] for qarg in node.qargs] raise TranspilerError(