Module Denot

From Velus Require Import Lustre.LSyntax.
From Velus Require Import Lustre.LTyping.
From Velus Require Import Lustre.LClocking.
From Velus Require Import Lustre.LOrdered.
From Velus Require Import Lustre.LCausality.
From Velus Require Import Lustre.LSemantics.
From Velus Require Import Lustre.StaticEnv.
From Velus Require Import Common Operators Clocks CoindStreams.

From Velus Require Export Lustre.Denot.Restr.
From Velus Require Export Lustre.Denot.CheckOp.
From Velus Require Export Lustre.Denot.SD.
From Velus Require Export Lustre.Denot.InftyProof.
From Velus Require Export Lustre.Denot.OpErr.
From Velus Require Export Lustre.Denot.Safe.
From Velus Require Export Lustre.Denot.Abs.
From Velus Require Export Lustre.Denot.Lp.
From Velus Require Export Lustre.Denot.SDtoRel.
From Velus Require Export Lustre.Denot.ResetLs.

We put Restr and CheckOp in separate modules for extraction, we don't want to extract the CPO library, which causes compilation error (DS_bot).

Module Type LDENOT
       (Ids : IDS)
       (Op : OPERATORS)
       (OpAux : OPERATORS_AUX Ids Op)
       (Cks : CLOCKS Ids Op OpAux)
       (Senv : STATICENV Ids Op OpAux Cks)
       (Syn : LSYNTAX Ids Op OpAux Cks Senv)
       (Typ : LTYPING Ids Op OpAux Cks Senv Syn)
       (Cl : LCLOCKING Ids Op OpAux Cks Senv Syn)
       (Caus : LCAUSALITY Ids Op OpAux Cks Senv Syn)
       (Lord : LORDERED Ids Op OpAux Cks Senv Syn)
       (Str : COINDSTREAMS Ids Op OpAux Cks)
       (Sem : LSEMANTICS Ids Op OpAux Cks Senv Syn Lord Str)
       (Restr : LRESTR Ids Op OpAux Cks Senv Syn)
       (CheckOp : CHECKOP Ids Op OpAux Cks Senv Syn).

    Declare Module Export Sd : SD Ids Op OpAux Cks Senv Syn Lord.
    Declare Module Export Inf : LDENOTINF Ids Op OpAux Cks Senv Syn Typ Caus Lord Restr Sd.
    Declare Module Export OpErr : OP_ERR Ids Op OpAux Cks Senv Syn Typ Restr Lord Sd CheckOp.
    Declare Module Export Safe : LDENOTSAFE Ids Op OpAux Cks Senv Syn Typ Restr Cl Lord Sd CheckOp OpErr.
    Declare Module Export Abs : ABS_INDEP Ids Op OpAux Cks Senv Syn Typ Lord Sd.
    Declare Module Export Lp : LP Ids Op OpAux Cks Senv Syn Typ Lord Sd.
    Declare Module Export SdR : SDTOREL Ids Op OpAux Cks Senv Syn Typ Cl Caus Lord Str Sem Sd Restr Inf CheckOp OpErr Safe Abs Lp.

End LDENOT.

Module LdenotFun
       (Ids : IDS)
       (Op : OPERATORS)
       (OpAux : OPERATORS_AUX Ids Op)
       (Cks : CLOCKS Ids Op OpAux)
       (Senv : STATICENV Ids Op OpAux Cks)
       (Syn : LSYNTAX Ids Op OpAux Cks Senv)
       (Typ : LTYPING Ids Op OpAux Cks Senv Syn)
       (Cl : LCLOCKING Ids Op OpAux Cks Senv Syn)
       (Caus : LCAUSALITY Ids Op OpAux Cks Senv Syn)
       (Lord : LORDERED Ids Op OpAux Cks Senv Syn)
       (Str : COINDSTREAMS Ids Op OpAux Cks)
       (Sem : LSEMANTICS Ids Op OpAux Cks Senv Syn Lord Str)
       (Restr : LRESTR Ids Op OpAux Cks Senv Syn)
       (CheckOp : CHECKOP Ids Op OpAux Cks Senv Syn)
<: LDENOT Ids Op OpAux Cks Senv Syn Typ Cl Caus Lord Str Sem Restr CheckOp.
  Module Export Sd := SdFun Ids Op OpAux Cks Senv Syn Lord.
  Module Export Inf := LDenotInfFun Ids Op OpAux Cks Senv Syn Typ Caus Lord Restr Sd.
  Module Export OpErr := OpErrFun Ids Op OpAux Cks Senv Syn Typ Restr Lord Sd CheckOp.
  Module Export Safe := LdenotsafeFun Ids Op OpAux Cks Senv Syn Typ Restr Cl Lord Sd CheckOp OpErr.
  Module Export Abs := AbsIndepFun Ids Op OpAux Cks Senv Syn Typ Lord Sd.
  Module Export Lp := LpFun Ids Op OpAux Cks Senv Syn Typ Lord Sd.
  Module Export SdR := SdtorelFun Ids Op OpAux Cks Senv Syn Typ Cl Caus Lord Str Sem Sd Restr Inf CheckOp OpErr Safe Abs Lp.
End LdenotFun.