Open source · MIT · v0.7.0

Firmware and physics,
one program

Hover compiles one source file into two clocks: a discrete task for the MCU and a continuous solver for the plant it drives. A crossing without sample or hold is a compile error, not a warning.

$ curl -fsSL hover-lang.org/install | sh
Hover disc mark
motor.hv
module motor_loop {
  plant motor {
    state omega: rad/s = 0.0
    integrate omega' = (kt * i - b * omega) / j
  }

  controller foc on every 50us {
    let e = target - sample omega
    emit pwm = hold pid(e)
  }
}

Real clocks

Every controller runs on every a stated period. No hidden scheduler, no implicit polling — the timing in the source is the timing on the target.

Continuous state

A plant block declares state and its derivative with integrate. The solver steps it between samples; you never hand-roll an integrator.

One seam, checked

Reading continuous state into discrete code needs sample; writing discrete output into the plant needs hold. The compiler rejects the crossing without them.

Hover keeps the discrete task and the continuous plant in two explicit domains, joined at one checked boundary — the same seam the palette marks in yellow, blue and red.

Domain / logic

Discrete — the MCU task

Controllers, state machines and I/O run on the sample clock you declare. Deterministic, timed, compiled to your target.

Domain / physics

Continuous — the plant model

Motors, circuits and mechanisms evolve as differential state, stepped by the solver between samples.

Solver steps / s
1.9M
Logic tasks
256
Targets
11
Trace channels
v0.7.0

Rejected steps: 0

Install the compiler, run the DC motor example, and watch the trace channels agree at every sample point.

Install Hover Browse examples