  The study of the impact of noise on quantum circuits is especially relevant
to guide the progress of Noisy Intermediate-Scale Quantum (NISQ) computing. In
this paper, we address the pulse-level simulation of noisy quantum circuits
with the Quantum Toolbox in Python (QuTiP). We introduce new tools in
qutip-qip, QuTiP's quantum information processing package. These tools simulate
quantum circuits at the pulse level, leveraging QuTiP's quantum dynamics
solvers and control optimization features. We show how quantum circuits can be
compiled on simulated processors, with control pulses acting on a target
Hamiltonian that describes the unitary evolution of the physical qubits.
Various types of noise can be introduced based on the physical model, e.g., by
simulating the Lindblad density-matrix dynamics or Monte Carlo quantum
trajectories. In particular, the user can define environment-induced
decoherence at the processor level and include noise simulation at the level of
control pulses. We illustrate how the Deutsch-Jozsa algorithm is compiled and
executed on a superconducting-qubit-based processor, on a spin-chain-based
processor and using control optimization algorithms. We also show how to easily
reproduce experimental results on cross-talk noise in an ion-based processor,
and how a Ramsey experiment can be modeled with Lindblad dynamics. Finally, we
illustrate how to integrate these features with other software frameworks.
