/*----------------------------------------------------------------------
--  User rules for procedure Latch.UpdateDevice.
--
--  File name: updatedevice.rlu
--
--  Description:
--    Procedure rule file.
--
--  Author: Phil Thornley, April 2009.  See www.sparksure.com
--
-- Copyright (c) 2009, Phil Thornley
-- All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions
-- are met:
--
--  * Redistributions of source code must retain the above copyright
--    notice, this list of conditions and the following disclaimer.
--
--  * Redistributions in binary form must reproduce the above copyright
--    notice, this list of conditions and the following disclaimer in
--    the documentation and/or other materials provided with the distribution.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------*/


/*----------------------------------------------------------------------
--  Rule 1
--
--  Justification:
--    C1 and (1)1 are equivalent:
--      latch__islocked(S2) and islocked(fld_currentlatch(S2)) are the
--      external and internal views of the same function; the equivalence
--      is completed by (2).
--    C2 and (1)2 are equivalent:
--      The proof function prf_isLocked(Output) models the internal
--      proof function Latch.Interface.prf_isLocked(Output) and the
--      abstract own variable Output is refined to the own variable
--      Latch.Interface.Output
--    C3 and (1)3 are the same condition.
--
--    It follows that C and (1) are equivalent expressions.
----------------------------------------------------------------------*/
updatedevice_user(1): (latch__islocked(S2) <->                          /* C1 */
                        prf_islocked(Op))                               /* C2 */
                      or B                                              /* C3 */
                        may_be_deduced_from
                      [ (islocked(fld_currentlatch(S)) <->              /* (1)1 */
                          latch__interface__prf_islocked(
                            fld_latch__interface__output(Op)))          /* (1)2 */
                        or B,                                           /* (1)3 */
                        fld_currentlatch(S) = fld_currentlatch(S2) ] .  /* (2)  */
