2026-06-02ยท9 min readยทsota.io team

Deploy Promela/SPIN to Europe โ€” Gerard Holzmann ๐Ÿ‡ณ๐Ÿ‡ฑ (Bell Labs/NASA JPL, 1980), the Model Checker Behind NASA Curiosity Rover and Safety-Critical Systems Verification, on EU Infrastructure in 2026

When NASA's Jet Propulsion Laboratory needed to verify the flight software controlling the Mars Science Laboratory โ€” the Curiosity rover that landed on Mars in August 2012 carrying a 900-kilogram nuclear-powered laboratory โ€” the engineers reached for SPIN. Not TLA+, not Coq, not Z notation. SPIN: the model checker built at Bell Labs by Gerard Holzmann ๐Ÿ‡ณ๐Ÿ‡ฑ starting in 1980, open-sourced over a decade later, and by then the most widely used explicit-state model checker in industrial practice. The choice was not accidental. SPIN had already verified Lucent's 5ESS telephone switching system โ€” at the time one of the most complex concurrent C programs in production โ€” finding bugs that testing had not found. It had verified the Bluetooth pairing protocol, the IEEE 802.11 WiFi protocol, and Boeing's TCAS collision avoidance system. In 2001, the ACM gave SPIN its Software System Award โ€” the same award previously given to Unix, TeX, the Internet's Domain Name System, and the World Wide Web. Holzmann's model checker had become infrastructure for safety-critical software verification worldwide. In 2026, as EU AI Act Article 9 mandates "systematic testing and verification" for high-risk AI systems, and IEC 61508 SIL 3/4 certification requires demonstrable absence of concurrency bugs, SPIN remains the pragmatic choice for engineers who need to verify real concurrent C programs against real temporal logic properties โ€” not in an ivory tower, but in a production pipeline.

What Promela/SPIN Is โ€” Explicit-State Model Checking

SPIN (Simple Promela INterpreter) is an explicit-state model checker for concurrent systems. Where TLA+ works with abstract state machines in set theory, and process algebras (CSP, CCS) work with algebraic process terms, SPIN operates close to the metal of concurrent programming: channels, processes, shared variables, synchronization โ€” the same primitives a C programmer uses, elevated to a verifiable specification language.

Promela (Process Meta Language) is SPIN's input language. A Promela model consists of:

A minimal Promela example โ€” Peterson's mutual exclusion algorithm:

bool flag[2] = { false, false };
byte turn = 0;

active [2] proctype Peterson()
{
  byte i = _pid;     /* process index: 0 or 1 */
  byte j = 1 - i;   /* other process index   */

  do
  :: /* critical section attempt */
    flag[i] = true;
    turn = j;
    !flag[j] || turn == i;  /* await: until other is not waiting or it's our turn */

    /* CRITICAL SECTION */
    assert(!flag[j]);   /* safety: mutual exclusion */
    flag[i] = false
  od
}

ltl mutex { [] !(Peterson[0]@crit && Peterson[1]@crit) }

SPIN verifies this model by exhaustive state-space exploration: it constructs the synchronous product of all process state machines, explores all interleavings, and checks every reachable state against the safety and liveness properties. If a violation is found, SPIN produces a counterexample trace โ€” the exact sequence of process steps that leads to the bug.

The verification engine SPIN generates is not an interpreter but a C program (called pan) that implements the state-space search. You compile pan with your system's C compiler and run it โ€” this makes SPIN's verification orders of magnitude faster than interpretive approaches. For large state spaces, SPIN provides bitstate hashing (Holzmann's innovation from the 1980s): instead of storing full state vectors, it stores a compact hash, accepting a small probability of missing states in exchange for enormous memory savings. A model with 10^8 states that would require gigabytes of memory with full storage can be verified in megabytes with bitstate hashing.

Key SPIN algorithms:

Gerard Holzmann โ€” Bell Labs to NASA JPL

Gerard Holzmann ๐Ÿ‡ณ๐Ÿ‡ฑ was born in the Netherlands and completed his studies in electrical engineering and computer science at Delft University of Technology (TU Delft). He joined Bell Labs (AT&T, Murray Hill, New Jersey) in 1980, where he would spend over two decades in the Computing Sciences Research Center โ€” the same research center that produced Unix, the C language, and the Plan 9 operating system. Ken Thompson, Dennis Ritchie, and Gerard Holzmann were colleagues.

1980: Holzmann joins Bell Labs Computing Sciences Research Center, Murray Hill NJ
      Starts work on protocol verification โ€” motivated by AT&T's massive switching
      network requiring verified communication protocols

1987: First SPIN publication โ€” "On the Verification of Protocols"
      Process Meta Language (Promela) formalized
      Nested depth-first search algorithm for LTL verification

1991: "Design and Validation of Computer Protocols" (Prentice Hall)
      Foundational textbook โ€” first systematic treatment of model checking
      for practicing engineers. Copies still in use in industrial teams today.

1995: SPIN open-sourced โ€” becomes available to academic and industrial users
      worldwide. Citation count accelerates.

2001: ACM Software System Award โ€” SPIN cited as "widely used software tool
      for the formal verification of concurrent systems"
      Previous winners: Unix (1983), TeX (1986), Smalltalk (1987), PostScript (1988),
      RISC architecture (1987), DNS (1988), WWW (1995)

2003: Holzmann moves to NASA Jet Propulsion Laboratory (JPL), Pasadena CA
      Establishes the Laboratory for Reliable Software (LRS)
      Applies SPIN to NASA flight software โ€” starting with Deep Space Network

2004: "The SPIN Model Checker: Primer and Reference Manual" (Addison-Wesley)
      Second definitive reference. Covers partial order reduction,
      bitstate hashing, the pan verifier architecture.

2012: SPIN used to verify Mars Science Laboratory (Curiosity Rover) flight software
      JPL's most complex autonomous system to date โ€”
      autonomous fault response, terrain navigation, sample analysis

2003โ€“2018: NASA JPL Laboratory for Reliable Software under Holzmann
      Develops NASA Software Safety Standard (NPR 7150.2)
      "Power of Ten" rules for safety-critical C code (widely adopted beyond NASA)

Holzmann's "Power of Ten" rules โ€” published in IEEE Software (2006) โ€” are a notable secondary contribution: ten simple rules for writing safety-critical C code (no recursion, fixed-bound loops, no dynamic memory allocation after initialization, etc.) that grew out of SPIN-based verification practice at JPL. They are now embedded in MISRA C, IEC 61508 coding guidelines, and CERT C guidelines used across EU safety-critical industries.

Industrial Verification with SPIN

SPIN's industrial track record spans telecommunications, aerospace, automotive, and networking:

Lucent Technologies (Bell Labs spin-off, USA):
  5ESS telephone switching system โ€” concurrent C code base, millions of lines
  SPIN found race conditions and deadlocks testing had missed
  Verification covered protocol state machines in the switching fabric

Boeing (USA):
  TCAS II (Traffic Collision Avoidance System) โ€” mandatory on commercial aircraft EU/US
  SPIN verified absence of unsafe command pairs and coordination failures
  between aircraft โ€” a correctness property where failure means mid-air collision

Bluetooth Special Interest Group:
  Bluetooth pairing protocol (BR/EDR, Bluetooth 2.x)
  SPIN verified absence of man-in-the-middle vulnerabilities in the key exchange
  protocol โ€” a security property rather than a safety property

IEEE 802.11 WiFi working group:
  Distributed coordination function (DCF) โ€” the CSMA/CA backoff protocol
  SPIN found underspecification bugs in the original draft standard
  Corrections incorporated before ratification

NASA JPL:
  Deep Space Network protocol stacks โ€” verified under Holzmann from 2003
  Mars Science Laboratory (Curiosity Rover, 2012) โ€” autonomous command execution
  Mars 2020 (Perseverance Rover, 2021) โ€” sample caching and fault response
  SPIN part of formal verification suite alongside C static analysis (Coverity, Frama-C)

European railway:
  EN 50128 SIL 4 certification processes โ€” multiple European signalling vendors
  use SPIN-compatible tools (UPPAAL for real-time, SPIN for concurrent protocol logic)
  ETSI standards for GSM-R and LTE-R railway communications โ€” Promela models
  in standardisation documents

Airbus (France/Germany/UK/Spain):
  Avionics software qualification (DO-178C Level A equivalent under EU CS-25)
  SPIN used for protocol-level verification of AFDX (Avionics Full-Duplex Ethernet)
  switching fabric timing properties

LTL Property Specification โ€” What SPIN Verifies

SPIN verifies Linear Temporal Logic (LTL) properties over Promela models. LTL reasons about paths through a system's execution tree โ€” sequences of states rather than branching structures (that is CTL, used by model checkers like NuSMV and UPPAAL).

The core LTL operators:

โ–กP    (G P โ€” "globally")    P holds in all future states
โ—‡P    (F P โ€” "finally")     P holds in some future state
P U Q (until)               P holds continuously until Q becomes true
โ—‹P    (X P โ€” "next")        P holds in the next state

Derived:
โ–กโ—‡P   "infinitely often P" โ€” liveness: P keeps happening
โ—‡โ–กP   "eventually always P" โ€” stability: P eventually holds forever

Example LTL properties for a concurrent server:

/* Safety: no two processes hold the lock simultaneously */
ltl mutex { [] !(lock[0] && lock[1]) }

/* Liveness: every request is eventually served */
ltl liveness { [] (request -> <> response) }

/* No starvation: process 0 is not blocked forever if it wants to proceed */
ltl no_starvation { [] (waiting[0] -> <> critical[0]) }

/* Deadlock freedom: system never gets stuck with all processes waiting */
ltl no_deadlock { [] <> (proc[0]@end || proc[1]@end) }

SPIN translates each LTL formula into a Bรผchi automaton (accepting states visited infinitely often), computes the synchronous product with the Promela model's automaton, and checks for accepting cycles via nested DFS. An accepting cycle represents an infinite execution that violates the property โ€” SPIN reports it as a counterexample trace that can be replayed and inspected.

/* A simple mutual exclusion model for verification */
byte mutex_state = 0;  /* 0: free, 1: held */

active [3] proctype Client()
{
  do
  ::
    /* Request */
    atomic { mutex_state == 0 -> mutex_state = 1 };  /* acquire */

    /* Critical section */
    assert(mutex_state == 1);

    mutex_state = 0;  /* release */
  od
}

/* Verify: spin -run -ltl mutex model.pml */
/* Counterexample: spin -t model.pml      */
/* Pan output: verification statistics + error trail */

The Formal Methods Stack โ€” Where SPIN Fits

Deductive provers (strongest, slowest):
  Coq ๐Ÿ‡ซ๐Ÿ‡ท (INRIA 1984, Thierry Coquand/Christine Paulin-Mohring)
  Isabelle/HOL ๐Ÿ‡ฌ๐Ÿ‡ง๐Ÿ‡ฉ๐Ÿ‡ช (Cambridge + TU Munich, 1986)
  Lean 4 ๐Ÿ‡บ๐Ÿ‡ธ (Microsoft Research, 2013)
  โ†’ Full functional correctness proofs. Requires expert proof engineers.

TLA+/TLAPS ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ‡ซ๐Ÿ‡ท (Lamport DEC 1994, TLAPS INRIA Nancy):
  State machine specification + model checking (TLC) + theorem proving (TLAPS)
  โ†’ Best for distributed algorithms and protocol specifications

Process algebras (CSP, CCS, mCRL2):
  Bisimulation, refinement, process equivalence
  โ†’ Best for concurrent protocol structure and compositional reasoning

SPIN/Promela ๐Ÿ‡ณ๐Ÿ‡ฑ๐Ÿ‡บ๐Ÿ‡ธ (Holzmann Bell Labs 1980):         โ† this post
  Explicit-state model checking, LTL properties, C-close syntax
  โ†’ Best for concurrent C programs, protocol state machines, bug-finding

Abstract interpretation (Astrรฉe ๐Ÿ‡ซ๐Ÿ‡ท โ€” INRIA/ENS Paris):
  Sound static analysis โ€” no false negatives for specific property classes
  โ†’ Best for runtime error absence in C/Ada avionics code

Model-oriented specification (VDM-SL ๐Ÿ‡ฆ๐Ÿ‡น๐Ÿ‡ฌ๐Ÿ‡ง, Z ๐Ÿ‡ฌ๐Ÿ‡ง, B-Method ๐Ÿ‡ซ๐Ÿ‡ท, Event-B ๐Ÿ‡ซ๐Ÿ‡ท๐Ÿ‡จ๐Ÿ‡ญ):
  Formal data models + refinement to code
  โ†’ Best for large system specifications with data-model complexity

SPIN occupies a unique position: it is the pragmatic formal methods tool. Where TLA+ requires learning a new mathematical formalism and Coq requires proof engineering expertise, SPIN's Promela looks like C. An engineer who understands concurrent programming can write meaningful Promela models and find real bugs within hours. This is why industrial adoption of SPIN outpaced all other formal methods tools for two decades.

EU Regulatory Context โ€” SPIN and Safety Certification

SPIN is directly applicable to EU safety-critical certification processes:

IEC 61508 (Functional Safety of Electrical/Electronic/Programmable Safety-Related Systems):

EN 50128 (Railway Software):

EU AI Act Article 9 (Risk Management System):

DO-178C / EASA CS-25 (Aviation Software):

EU Ecosystem โ€” SPIN in European Research and Industry

SPIN's open-source release in 1995 coincided with the expansion of EU research funding for formal methods, creating a dense European ecosystem around it:

INRIA (France):
  Rennes/Rocquencourt groups use SPIN for distributed protocol verification
  Integration with model-oriented methods (B, Event-B) via ProB interface
  CADP (Hubert Garavel, Grenoble) supports LNTโ†’Promela translation

TU Delft (Netherlands) โ€” Holzmann's alma mater:
  Active SPIN research group โ€” partial order reduction theory
  Integration with Java PathFinder (NASA JPL, co-developed with Delft)

Aalborg University (Denmark):
  UPPAAL (time automata, real-time properties) โ€” complementary to SPIN
  SPIN+UPPAAL combined in embedded systems verification courses EU-wide

Eindhoven University of Technology (Netherlands):
  mCRL2 interoperability โ€” Promelaโ†”mCRL2 translation tools
  ASML ๐Ÿ‡ณ๐Ÿ‡ฑ, NXP ๐Ÿ‡ณ๐Ÿ‡ฑ use Promela models for chip-level protocol verification

University of Stuttgart (Germany):
  SPIN applied to AUTOSAR automotive software stack verification
  IEC 61508 SIL 3/4 toolchain integration for Bosch, ZF, Continental

Politecnico di Milano (Italy):
  Promela models of avionics AFDX protocol (Airbus A380 backbone)
  EU FP7 CESAR project โ€” SPIN in model-based safety certification toolchain

KTH Royal Institute of Technology (Sweden):
  SPIN for IoT protocol security verification
  EU Horizon 2020 ARROWSMITH project โ€” formal verification for autonomous systems

Industrial users:
  Airbus ๐Ÿ‡ซ๐Ÿ‡ท๐Ÿ‡ฉ๐Ÿ‡ช๐Ÿ‡ช๐Ÿ‡ธ๐Ÿ‡ฌ๐Ÿ‡ง โ€” avionics protocol verification
  Siemens AG ๐Ÿ‡ฉ๐Ÿ‡ช โ€” railway signalling + industrial automation
  Thales Group ๐Ÿ‡ซ๐Ÿ‡ท โ€” defence + transport + aerospace security protocols
  Ericsson ๐Ÿ‡ธ๐Ÿ‡ช โ€” LTE/5G protocol stack verification
  Nokia Bell Labs ๐Ÿ‡ซ๐Ÿ‡ฎ๐Ÿ‡ซ๐Ÿ‡ท โ€” network protocol model checking
  NXP Semiconductors ๐Ÿ‡ณ๐Ÿ‡ฑ โ€” chip communication protocol verification
  Alstom ๐Ÿ‡ซ๐Ÿ‡ท โ€” railway interlocking formal verification

Deploy SPIN on EU Infrastructure

SPIN is open source (BSD licensed), available as a Debian/Ubuntu package and from spinroot.com. Running SPIN verification pipelines as cloud services โ€” accepting Promela models, returning counterexample traces or verification certificates โ€” is a natural architecture for teams integrating formal verification into CI/CD.

FROM ubuntu:24.04
RUN apt-get update && apt-get install -y \
    spin \
    gcc \
    make \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /verify
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python3", "verification_server.py"]
# Deploy to sota.io EU infrastructure
git push sota main
# SPIN verification service live on EU servers
# GDPR-compliant, managed TLS, EU data residency

Verification pipeline service

# verification_server.py โ€” SPIN as a service
import subprocess
import tempfile
import os
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/verify', methods=['POST'])
def verify():
    model = request.json.get('model', '')
    ltl = request.json.get('ltl', '')

    with tempfile.TemporaryDirectory() as tmpdir:
        model_path = os.path.join(tmpdir, 'model.pml')
        with open(model_path, 'w') as f:
            if ltl:
                f.write(f'ltl property {{ {ltl} }}\n')
            f.write(model)

        # Generate verifier
        spin_result = subprocess.run(
            ['spin', '-a', 'model.pml'],
            cwd=tmpdir, capture_output=True, text=True
        )

        if spin_result.returncode != 0:
            return jsonify({'error': spin_result.stderr}), 400

        # Compile pan verifier
        subprocess.run(['gcc', '-o', 'pan', 'pan.c'], cwd=tmpdir)

        # Run verification
        pan_result = subprocess.run(
            ['./pan', '-a'],  # -a: accept cycles (liveness)
            cwd=tmpdir, capture_output=True, text=True,
            timeout=60
        )

        verified = 'errors: 0' in pan_result.stdout
        return jsonify({
            'verified': verified,
            'output': pan_result.stdout,
            'errors': pan_result.returncode
        })

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)
# sota.io configuration โ€” verification-as-a-service
services:
  spin-verifier:
    build: .
    memory: 2Gi
    cpu: 2
    env:
      - VERIFY_TIMEOUT=60
    postgres:
      enabled: true  # Store verification results + model history in EU Postgres
    healthcheck:
      path: /health
      interval: 30s

The sota.io platform handles TLS termination, zero-downtime deploys, and EU-jurisdiction data residency. Your SPIN verification service runs on European infrastructure, under European law โ€” producing certification evidence that is straightforward to present to BSI ๐Ÿ‡ฉ๐Ÿ‡ช, ANSSI ๐Ÿ‡ซ๐Ÿ‡ท, or ENISA ๐Ÿ‡ช๐Ÿ‡บ auditors.

The Model Checking Family Tree โ€” SPIN and its Ecosystem

SPIN/Promela โ€” Gerard Holzmann ๐Ÿ‡ณ๐Ÿ‡ฑ (Bell Labs, 1980)
โ”‚   Explicit-state, LTL, C-adjacent syntax
โ”‚   ACM Software System Award 2001
โ”‚
โ”œโ”€โ”€ Java PathFinder (JPF) โ€” NASA Ames + TU Delft ๐Ÿ‡ณ๐Ÿ‡ฑ (1999โ€“present)
โ”‚   Java bytecode model checking โ€” SPIN's successor for JVM programs
โ”‚   Finds concurrency bugs in Java multithreaded code
โ”‚
โ”œโ”€โ”€ DIVINE โ€” Jiล™รญ Barnat (Masaryk University Brno ๐Ÿ‡จ๐Ÿ‡ฟ, 2006โ€“present)
โ”‚   C/C++ model checking via LLVM bitcode โ€” EU academic tradition
โ”‚   DiVM: custom virtual machine for model checking compiled code
โ”‚
โ”œโ”€โ”€ CBMC โ€” Daniel Kroening ๐Ÿ‡ฉ๐Ÿ‡ช (Oxford/ETH Zurich, 2003โ€“present)
โ”‚   Bounded model checking for C โ€” SAT-solver based
โ”‚   Used in: AWS automated reasoning, Airbus C code verification
โ”‚   Verifies bounded traces (unlike SPIN's full LTL)
โ”‚
โ””โ”€โ”€ UPPAAL โ€” KTH Stockholm ๐Ÿ‡ธ๐Ÿ‡ช + Aalborg University ๐Ÿ‡ฉ๐Ÿ‡ฐ (1994โ€“present)
    Timed automata model checking โ€” real-time properties
    Complementary to SPIN: SPIN for logic, UPPAAL for timing
    Used: Ariane 5 analysis (post-Ariane 501 failure), EU railway signalling

Symbolic model checkers (different approach โ€” BDDs/SAT):
  NuSMV โ€” ITC-IRST ๐Ÿ‡ฎ๐Ÿ‡น Trento + CMU (1992โ€“present)
    CTL + LTL, symbolic state representation
    Used: Intel CPU verification, EU railway interlocking
  nuXmv โ€” FBK Trento ๐Ÿ‡ฎ๐Ÿ‡น (2014) โ€” NuSMV successor + k-induction

SPIN in the broader landscape:
  TLA+/TLC: complementary โ€” distributed systems, set-theory-based specification
  mCRL2: complementary โ€” process algebra, behavioural equivalences
  Isabelle/Coq: complementary โ€” deductive proofs (SPIN finds bugs, provers prove correctness)

Why EU Infrastructure for SPIN Work

The European formal methods tradition surrounding SPIN โ€” from TU Delft (Holzmann's own alma mater) to Eindhoven to Stuttgart to Politecnico di Milano to Aalborg โ€” grew in parallel to Bell Labs' work. When Holzmann open-sourced SPIN in 1995, European universities and industrial labs were ready to adopt it because the theoretical foundations (process algebra, LTL model checking, partial order reduction) had been developed partly in Europe and taught in European CS curricula. The industrial uptake at Airbus, Siemens, Ericsson, Thales, and NXP reflects that SPIN verification expertise is genuinely distributed across European institutions.

For organisations working under IEC 61508, EN 50128, DO-178C/EASA CS-25, or EU AI Act Article 9:

Gerard Holzmann built SPIN at Bell Labs in New Jersey, but the European formal methods community made it a global standard. It belongs on European infrastructure.

See Also


Deploy SPIN model checker on EU infrastructure today. sota.io: GDPR-compliant, EU-jurisdiction, managed PostgreSQL, zero DevOps.

Start free on sota.io โ†’