  (* Example from Nicolas Berthier *)

node transceiver(enter_tx,
		 enter_rx,
		 exit_rx,
		 calibrate,
		 sleep,
		 wake_up,
		 irq_tx_done,
		 irq_on_packet,
		 irq_end_of_packet,
		 irq_end_of_calibration,
		 irq_fifo_threshold,
		 ok:bool) returns (red:bool)
let
  automaton
    state Idle
      do
	red = false;
      until enter_tx & ok then Tx
          | calibrate & ok then Calibrate
          | sleep & ok then Sleep
          | enter_rx & ok then Rx
    state Tx
      do
	red = true;
      until irq_tx_done then Idle
    state Calibrate
      do
	red = false;
      until irq_end_of_calibration then Idle
    state Sleep
      do
	red = false;
      until wake_up & ok then Idle
    state Rx
      do
	red = true;
      until irq_on_packet then Rx_Packet
          | exit_rx & ok then Idle
    state Rx_Packet
      do
	red = true;
      until irq_end_of_packet then Idle
  end
tel

node adc(adc_on,adc_off,ok:bool) returns (o:bool)
let
  automaton
    state Off
      do
	o = false;
      until adc_on & ok then On
    state On
      do
	o = true;
      until adc_off & ok then Off
  end
tel

node main(enter_tx,
	  enter_rx,
	  exit_rx,
	  calibrate,
	  sleep,
	  wake_up,
	  irq_tx_done,
	  irq_on_packet,
	  irq_end_of_packet,
	  irq_end_of_calibration,
	  irq_fifo_threshold,adc_on,adc_off:bool)
    returns (a_on,red:bool)

contract
    enforce (not (a_on & red)) with (ok_r,ok_a:bool)

let
  a_on = inlined adc(adc_on,adc_off,ok_a);
  red = inlined transceiver(enter_tx,
			    enter_rx,
			    exit_rx,
			    calibrate,
			    sleep,
			    wake_up,
			    irq_tx_done,
			    irq_on_packet,
			    irq_end_of_packet,
			    irq_end_of_calibration,
			    irq_fifo_threshold,ok_r);
tel
