Skip to content

fix(sim): PushButton/Monoflop Reset handling; InputRef output mirroring - #15

Open
discostu105 wants to merge 2 commits into
eisber:mainfrom
discostu105:fix/sim-pushbutton-monoflop-inputref
Open

fix(sim): PushButton/Monoflop Reset handling; InputRef output mirroring#15
discostu105 wants to merge 2 commits into
eisber:mainfrom
discostu105:fix/sim-pushbutton-monoflop-inputref

Conversation

@discostu105

Copy link
Copy Markdown

Three simulator correctness gaps, found while simulating scenarios from a real Miniserver config (weekday-gated pool UV lamp, alarm hold chain) and fixed in both the interpreter and the JIT compiler so their equivalence holds.

PushButton / PushButton2: Reset and InputDisable were ignored

The parser signature only mapped InputTrigger and On, so a wired Reset connector landed at an input index the eval never read — a PushButton driven off via Reset stayed on forever.

  • parser: Reset + InputDisable added to the PushButton/PushButton2/PushButton2Sel and PushButtonSel input signatures (synthesized when absent, so existing layouts keep their indices)
  • semantics: Reset dominates On and forces off; InputDisable gates the trigger edge; PushButton2 also clears its awaiting-second-press state on Reset
  • JIT: same semantics in EvalStep::PushButton, with a usize::MAX sentinel for absent connectors

Monoflop: Reset input missing from the signature

A wired Reset was never read, so a running pulse could not be aborted. Reset now clears the countdown and blocks retriggering while held (interpreter + JIT).

InputRef: mirror the fed side onto BOTH outputs

The impl forwarded I -> Q and AI -> AQ separately, but the Miniserver mirrors the one fed side onto both outputs — real configs wire ref.AI <- mem.AQ with consumers reading ref.Q. Q is now the digital view (non-zero → 1) and AQ the analog value of whichever side is fed.

Notes

  • The Reset/InputDisable semantics are marked with WARNING: Assumed behavior — not validated against Miniserver comments in the code, following the dominance order that matches observed behavior in the configs I simulate; happy to adjust if you have reference traces.
  • Each fix comes with unit tests; the full lox-sim suite passes (498 tests).

The parser signature for PushButton/PushButton2/PushButton2Sel only mapped
InputTrigger and On, so a wired Reset landed at an input index the eval
never read — a PushButton driven off via Reset stayed on forever.

- parser: add Reset + InputDisable to the PushButton and PushButtonSel
  input signatures (synthesized when absent, so layouts stay stable)
- interpreter: Reset dominates On and forces off; InputDisable gates the
  trigger edge (PushButton and PushButton2; assumed behavior, flagged)
- JIT: same semantics in EvalStep::PushButton (usize::MAX sentinel for
  absent connectors) so interpreter/JIT equivalence holds

Found while simulating the r50 UV-lamp weekday scenario (PushButton with
On: weekday-Or, Reset: Not(weekday-Or)).
…d AQ

- Monoflop: the parser signature lacked Reset, so a wired Reset was never
  read and a running pulse could not be aborted. Reset now clears the
  countdown and blocks retriggering while held (interpreter + JIT;
  assumed behavior, flagged).
- InputRef: the impl forwarded I->Q and AI->AQ separately, but the
  Miniserver mirrors the one fed side onto BOTH outputs — the r50 corpus
  wires 'ref.AI <- mem.AQ' with consumers reading ref.Q. Q is now the
  digital view (non-zero -> 1) and AQ the analog value of whichever side
  is fed.

Found while simulating the r50 alarm chain (Monoflop 'alarm_halten' with
Reset: heimkommen_ref.Q, triggered through an AI-fed InputRef).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant