can communicate back and forth in the same cycle. Signal Coherence rules Each signal is only present or absent in a cycle, never both. All writers run before any readers do. Thus present A else emit A end is an erroneous program: the writer "emit A" must run before the reader "present A", but this program asks the "present A" to be performed first. The language constructs Primitive Esterel statements Pure Esterel has eleven primitive statements. Derived Esterel statements Esterel has several derived constructions: Other Esterel statements The full Esterel language also has statements for declaring and instantiating modules, for variables, for calling external procedures, and for valued signals. Example (ABRO) The following program emits the output O as soon as both inputs A and B have been received. Reset the behaviour whenever the input R is received. module ABRO: input A, B, R; output O; loop [ await A || await B ]; emit O each R end module Advantages of Esterel Model of time gives programmer precise control Concurrency convenient for specifying control systems Completely deterministic Finite-state language Execution time predictable Much easier to verify formally Can be implemented in hardware as well as in software Disadvantages of Esterel Finite-state nature of the language limits flexibility (but expressivity is sufficient for the chosen application field) Semantic challenges Avoiding causality violations is often difficult Difficult to compile in the general case, but simple correctness criteria exist See also Lustre, a cousin programming language SIGNAL, a dataflow-oriented synchronous language enabling multi-clock specifications Esterel Technologies, developer of Esterel Studio and other tools Parallel programming model References External links The Esterel Language at Inria The Columbia Esterel Compiler an open-source compiler Synchronous programming languages Hardware description languages