{-# OPTIONS --safe --cubical #-}
module Spartan6.Examples.DuplicatedToggle where
open import Spartan6.Prelude
open import Spartan6.Netlist.Expression
open import Spartan6.Semantics.Design
open import Spartan6.Semantics.Invariant
firstQ : Expr 0 2
firstQ = register fzero
secondQ : Expr 0 2
secondQ = register (fsuc fzero)
duplicatedToggle : Design 0 2 2
duplicatedToggle =
mkDesign
(low ∷ low ∷ [])
(firstQ ∷ secondQ ∷ [])
(invert firstQ ∷ invert secondQ ∷ [])
EqualState : State duplicatedToggle → Type₀
EqualState (first ∷ second ∷ []) = first ≡ second
duplicated-toggle-invariant : Invariant duplicatedToggle EqualState
initially duplicated-toggle-invariant = refl
preserved duplicated-toggle-invariant idle [] (first ∷ second ∷ []) equal =
equal
preserved duplicated-toggle-invariant risingEdge [] (first ∷ second ∷ []) equal =
cong not equal
all-finite-runs-keep-copies-equal :
∀ samples
→ EqualState
(run duplicatedToggle (initial duplicatedToggle) samples)
all-finite-runs-keep-copies-equal =
initial-run-preserves duplicated-toggle-invariant