  This paper proposes an efficient stabilizer circuit simulation algorithm that
only traverses the circuit forward once. We introduce phase symbolization into
stabilizer generators, which allows possible Pauli faults in the circuit to be
accumulated explicitly as symbolic expressions in the phases of stabilizer
generators. This way, the measurement outcomes are also symbolic expressions,
and we can sample them by substituting the symbolic variables with concrete
values, without traversing the circuit repeatedly. We show how to integrate
symbolic phases into the stabilizer tableau and maintain them efficiently using
bit-vector encoding. A new data layout of the stabilizer tableau in memory is
proposed, which improves the performance of our algorithm (and other stabilizer
simulation algorithms based on the stabilizer tableau). We implement our
algorithm and data layout in a Julia package named SymPhase.jl, and compare it
with Stim, the state-of-the-art simulator, on several benchmarks. We show that
SymPhase.jl has superior performance in terms of sampling time, which is
crucial for generating a large number of samples for further analysis.
