-- This file is generated from ExampleFile2.ump --

-- PLEASE DO NOT EDIT THIS CODE --
-- This code was generated using the UMPLE @UMPLE_VERSION@ modeling language! --


-- This defines a NuSMV module for LockLockState --
MODULE LockLockState

   -- This part declares state variables for the given NuSMV module --
   VAR
     state : { LockState_BothDoorsClosedLockFull , LockState_OpeningUpperGate , LockState_UpperGateOpen , LockState_ClosingUpperGate , LockState_LoweringWater , LockState_BothDoorsClosedLockEmpty , LockState_OpeningLowerGate , LockState_LowerGateOpen , LockState_ClosingLowerGate , LockState_RaisingWater };
     event : { ev_upperGateFullyClosed , ev_boatRequestsToEnterAndGoDown , ev_waterLevelMatchesUpStream , ev_boatInLockRequestingToGoDown , ev_lowerGateFullyClosed , ev_upperGateFullyOpen , ev_lowerGateFullyOpen , ev_boatInLockRequestingToGoUp , ev_waterLevelMatchesDownStream , ev_boatRequestsToEnterAndGoUp , ev_after3minutes , ev_null };
     boatGoingDown : boolean;
     boatGoingUp : boolean;
     boatBlockingGate : boolean;

   -- This part defines macros that summarize the transitions and guards (if any) of the given NuSMV module --
   DEFINE
     lockState_stable :=  !( event = ev_boatRequestsToEnterAndGoDown | event = ev_boatInLockRequestingToGoDown | event = ev_upperGateFullyOpen | event = ev_boatInLockRequestingToGoUp | event = ev_boatRequestsToEnterAndGoUp | event = ev_upperGateFullyClosed | event = ev_waterLevelMatchesUpStream | event = ev_lowerGateFullyClosed | event = ev_lowerGateFullyOpen | event = ev_waterLevelMatchesDownStream | event = ev_after3minutes );
     t1 := event = ev_boatRequestsToEnterAndGoDown & state = LockState_BothDoorsClosedLockFull;
     t2 := event = ev_boatRequestsToEnterAndGoUp & state = LockState_BothDoorsClosedLockFull;
     t3 := event = ev_upperGateFullyOpen & state = LockState_OpeningUpperGate;
     t4 := event = ev_boatInLockRequestingToGoDown & state = LockState_UpperGateOpen;
     t5 := event = ev_after3minutes & state = LockState_UpperGateOpen & g1;
     t6 := event = ev_upperGateFullyClosed & state = LockState_ClosingUpperGate & g2;
     t7 := event = ev_upperGateFullyClosed & state = LockState_ClosingUpperGate & g3;
     t8 := event = ev_waterLevelMatchesDownStream & state = LockState_LoweringWater;
     t9 := event = ev_boatRequestsToEnterAndGoUp & state = LockState_BothDoorsClosedLockEmpty;
     t10 := event = ev_boatRequestsToEnterAndGoDown & state = LockState_BothDoorsClosedLockEmpty;
     t11 := event = ev_lowerGateFullyOpen & state = LockState_OpeningLowerGate;
     t12 := event = ev_boatInLockRequestingToGoUp & state = LockState_LowerGateOpen;
     t13 := event = ev_after3minutes & state = LockState_LowerGateOpen & g1;
     t14 := event = ev_lowerGateFullyClosed & state = LockState_ClosingLowerGate & g4;
     t15 := event = ev_lowerGateFullyClosed & state = LockState_ClosingLowerGate & g5;
     t16 := event = ev_waterLevelMatchesUpStream & state = LockState_RaisingWater;
     g1 := !boatBlockingGate;
     g2 := boatGoingDown;
     g3 := !boatGoingDown;
     g4 := boatGoingUp;
     g5 := !boatGoingUp;

   -- This part defines logic for the assignment of values to state variable "state" of this NuSMV module --
   ASSIGN
     init( state ) := LockState_BothDoorsClosedLockFull;
     next( state ) := case
       t7 : LockState_BothDoorsClosedLockFull;
       t1 | t16 : LockState_OpeningUpperGate;
       t3 : LockState_UpperGateOpen;
       t4 | t5 : LockState_ClosingUpperGate;
       t2 | t6 : LockState_LoweringWater;
       t15 : LockState_BothDoorsClosedLockEmpty;
       t8 | t9 : LockState_OpeningLowerGate;
       t11 : LockState_LowerGateOpen;
       t12 | t13 : LockState_ClosingLowerGate;
       t10 | t14 : LockState_RaisingWater;
       TRUE : state;
     esac;

   -- This part defines logic for the assignment of values to state variable "event" of this NuSMV module --
   ASSIGN
     init( event ) := ev_null;
     next( event ) := case
       lockState_stable : { ev_upperGateFullyClosed , ev_boatRequestsToEnterAndGoDown , ev_waterLevelMatchesUpStream , ev_boatInLockRequestingToGoDown , ev_lowerGateFullyClosed , ev_upperGateFullyOpen , ev_lowerGateFullyOpen , ev_boatInLockRequestingToGoUp , ev_waterLevelMatchesDownStream , ev_boatRequestsToEnterAndGoUp , ev_after3minutes };
       TRUE : ev_null;
     esac;

   -- This part defines logic for the assignment of values to state variable "boatGoingDown" of this NuSMV module --
   ASSIGN
     init( boatGoingDown ) := FALSE;

   -- This part defines logic for the assignment of values to state variable "boatGoingUp" of this NuSMV module --
   ASSIGN
     init( boatGoingUp ) := FALSE;

   -- This part defines logic for the assignment of values to state variable "boatBlockingGate" of this NuSMV module --
   ASSIGN
     init( boatBlockingGate ) := FALSE;

-- This defines a NuSMV module for LockLockState_Machine --
MODULE LockLockState_Machine

   -- This part declares state variables for the given NuSMV module --
   VAR
     lockLockState : LockLockState;

-- This defines a NuSMV module for main --
MODULE main

   -- This part declares state variables for the given NuSMV module --
   VAR
     lockLockState_Machine : LockLockState_Machine;

   -- The following properties are specified to certify that this model is free of non-determinism. 
   INVARSPEC   ( lockLockState_Machine.lockLockState.t6 & lockLockState_Machine.lockLockState.t7 -> next( lockLockState_Machine.lockLockState.state = LockState_LoweringWater & lockLockState_Machine.lockLockState.state = LockState_BothDoorsClosedLockFull ) )
   INVARSPEC   ( lockLockState_Machine.lockLockState.t14 & lockLockState_Machine.lockLockState.t15 -> next( lockLockState_Machine.lockLockState.state = LockState_RaisingWater & lockLockState_Machine.lockLockState.state = LockState_BothDoorsClosedLockEmpty ) )

   -- The following properties are specified to certify that non-symbolic state(s) of this model is (or are) reachable. 
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_BothDoorsClosedLockFull )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_OpeningUpperGate )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_UpperGateOpen )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_ClosingUpperGate )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_LoweringWater )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_BothDoorsClosedLockEmpty )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_OpeningLowerGate )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_LowerGateOpen )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_ClosingLowerGate )
   CTLSPEC   EF( lockLockState_Machine.lockLockState.state = LockState_RaisingWater )