Module NL2StcNormalArgs

From Velus Require Import NLustre.
From Velus Require Import Stc.

From Velus Require Import NLustreToStc.Translation.

From Velus Require Import VelusMemory.
From Velus Require Import Common.
From Velus Require Import CoindToIndexed.
From Velus Require Import CommonProgram.
From Velus Require Import CommonTyping.

From Coq Require Import List.
Import List.ListNotations.

Module Type NL2STCNORMALARGS
       (Import Ids : IDS)
       (Import Op : OPERATORS)
       (Import OpAux : OPERATORS_AUX Ids Op)
       (Import ComTyp: COMMONTYPING Ids Op OpAux)
       (Import Cks : CLOCKS Ids Op OpAux)
       (Import CStr : COINDSTREAMS Ids Op OpAux Cks)
       (Import IStr : INDEXEDSTREAMS Ids Op OpAux Cks)
       (Import CIStr : COINDTOINDEXED Ids Op OpAux Cks CStr IStr)
       (Import CE : COREEXPR Ids Op OpAux ComTyp Cks IStr)
       (Import NL : NLUSTRE Ids Op OpAux ComTyp Cks CStr IStr CIStr CE)
       (Import Stc : STC Ids Op OpAux ComTyp Cks IStr CE)
       (Import Trans : TRANSLATION Ids Op OpAux Cks CE.Syn NL.Syn Stc.Syn NL.Mem).

  Lemma translate_eqn_normal_args:
    forall G env eq,
      Norm.normal_args_eq G eq ->
      Forall (normal_args_tc (translate G)) (translate_eqn env eq).
  Proof.
    induction 1 as [| |?????? Find|]; simpl; cases.
    all:try constructor; simpl_Forall; eauto with stcsyn.
    apply option_map_inv in Find as ((?&?)& Find &?); simpl in *; subst.
    apply find_unit_transform_units_forward in Find.
    econstructor; eauto. simpl_Forall; auto.
  Qed.

  Lemma translate_node_normal_args:
    forall G n,
      normal_args_node G n ->
      normal_args_system (translate G) (translate_node n).
  Proof.
    intros.
    unfold normal_args_node, normal_args_system in *. simpl in *.
    simpl_Forall. unfold translate_eqns in *. simpl_In. simpl_Forall.
    eapply translate_eqn_normal_args, Forall_forall in H; eauto.
  Qed.

  Lemma translate_normal_args:
    forall G,
      NL.Norm.normal_args G ->
      normal_args (translate G).
  Proof.
    unfold NL.Norm.normal_args, normal_args; simpl.
    induction 1 as [|?? NAS]; simpl; constructor; auto.
    apply translate_node_normal_args in NAS; auto.
  Qed.

End NL2STCNORMALARGS.

Module NL2StcNormalArgsFun
       (Ids : IDS)
       (Op : OPERATORS)
       (OpAux : OPERATORS_AUX Ids Op)
       (ComTyp: COMMONTYPING Ids Op OpAux)
       (Cks : CLOCKS Ids Op OpAux)
       (CStr : COINDSTREAMS Ids Op OpAux Cks)
       (IStr : INDEXEDSTREAMS Ids Op OpAux Cks)
       (CIStr : COINDTOINDEXED Ids Op OpAux Cks CStr IStr)
       (CE : COREEXPR Ids Op OpAux ComTyp Cks IStr)
       (NL : NLUSTRE Ids Op OpAux ComTyp Cks CStr IStr CIStr CE)
       (Stc : STC Ids Op OpAux ComTyp Cks IStr CE)
       (Trans : TRANSLATION Ids Op OpAux Cks CE.Syn NL.Syn Stc.Syn NL.Mem)
<: NL2STCNORMALARGS Ids Op OpAux ComTyp Cks CStr IStr CIStr CE NL Stc Trans.
  Include NL2STCNORMALARGS Ids Op OpAux ComTyp Cks CStr IStr CIStr CE NL Stc Trans.
End NL2StcNormalArgsFun.