Anatomy of the graph
Four things, nothing more. An actor is a unit of computation — the circles. A channel is an unbounded FIFO queue connecting two actors — the wires. A token is one indivisible packet of data sitting in a channel — the glowing pulses, counted in the badges. The set of all token counts is the marking; it is the entire state of the program.
That is the whole vocabulary. Everything that follows — throughput, deadlock, compile-time scheduling — falls out of these four nouns and one rule.
The firing rule
An actor is enabled when every incoming channel holds at least as many tokens as that actor consumes. An enabled actor may fire: in one atomic step it removes its consumption count from each input and appends its production count to each output.
The order you fire enabled actors in does not change the result — this is determinacy. Click a glowing actor on the and then a different one; the final marking is the same. A grey actor is starved — clicking it shakes and lights the channel that is short.
The balance equation
When an actor produces a different number of tokens than the next one consumes, the graph is multirate. For the schedule to repeat without buffers growing forever, firings must balance across every channel:
q[from] · production = q[to] · consumption (for every channel)
The smallest positive integer solution is the repetition vector q. Load the : producing 2 and 3 against consuming 1 and 2 forces the solution A1 B2 C3 — read it live in the bench's readout. If no integer solution exists, the graph is inconsistent and no bounded schedule can exist.
Cycles, delays & deadlock
Feedback makes a cycle, and a cycle is a chicken-and-egg trap: the plant waits for the controller, the controller waits for the plant, nobody moves. The fix is an initial token placed on the channel before anything runs — a delay, written z⁻¹ in signal processing. It is the seed that lets the loop turn.
Open the and press Run. With the magenta delay on, tokens circulate forever. Toggle the delay to 0 and reset: the status panel flips to DEADLOCK on the first step. A live marked graph needs at least one initial token on every cycle.
Why engineers love them
Because all rates are known before the program runs, a finite firing order that returns the graph to its starting marking can be computed at compile time — a periodic admissible sequential schedule. That is the “One static period” readout in the bench, generated by the same engine the simulator runs.
No runtime scheduler, no locks, provably bounded memory, and a deadlock that is caught before deployment instead of at 3 a.m. That is why marked graphs sit underneath modems, audio codecs, radar, and the block diagrams in tools like Simulink and LabVIEW — and why they are worth an afternoon at the bench.