Um sicher zu stellen, dass kein logischer Wert eines Gatters verwendet wird, bevor er endgültig berechnet wurde, erfordert die Compiled-Code-Simulation eine Strukturierung der Schaltung in logische Ebenen (Levelizing). Auf diese Weise wird die (real parallel arbeitende) Schaltung in eine Sequenz von Rechnerschritten abgebildet.
Hierzu beschreibt man die Schaltung als gerichteten azyklischen Graphen (DAG), dessen Knoten die Gatter der Schaltung sowie die Ein- und Ausgänge repräsentieren. Jedem Knoten (K) wird eine nicht negative ganze Zahl level(K) zugewiesen, wobei gilt
- Für alle primären Eingänge Xi:level(Xi)=0
- Für alle anderen Knoten Ki:level(Ki)=1+max(level(Kj)), wobei Kj die Anfangsknoten aller bei Ki eingehenden Kanten bezeichnet.
Die sich nach dem Levelizing ergebende Sequenz, die in einer Programmiersprache beschrieben werden kann, lässt sich in einfacher Weise durch den Maschinencode eines beliebigen Prozessors ersetzen. Auf diese Weise erhält man einen schnellen Simulator, der jedoch auch rechnerabhängig ist. Im Falle der Hochsprache ist eine Übersetzung erforderlich. Dabei erzeugt ein Simulationsgenerator aus der Schaltungsbeschreibung den Simulator in einer Hochsprache. Ein gewöhnlicher Compiler übersetzt ihn in Maschinensprache. Erzeugt der Simulationsgenerator unmittelbar aus der Schaltungsbeschreibung Maschinencode, spricht man von einem "Native-Compiled"-Simulator.