expand.mli 3.56 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
(** EXPANSION : main

------------------------------------------------------------

L'expansion consiste essentiellement à construire 3 tables globales
indexées par des ident target :

- Table des variables (support) : elle contient les entrées/sorties
  et les locales (cf. exist) remontées au top via un nommage unique.

- Table des alias : associe à des idents cible des expressions algébriques.
    Les idents cible correpondent au instances de macros utilisées
    dans le corps du node.

- Table des traces : à chaque trace nommée est associée une expression
  de trace expansée.

- Table des fonctions externes utilisees, pour + tard 

----------------------------------------------------------*)

(** Le type "résultat d'expansion" est abstrait *)
type t

(** Les paramètres de l'expansion sont :
-------------------------------------------------------
- Le CheckEnv.t qui résulte du type/binding check.
    Il permet de retrouver le type effectif (sémantique)
    de toute expression source et l'info associée à toute
    instance d'identificateur.
-------------------------------------------------------
- Le code source (type Syntaxe.package)
-------------------------------------------------------
- Le node "main" (string)
-------------------------------------------------------
*)
val make : CheckEnv.t -> Syntaxe.package -> string -> t

(** Le résultat de l'expansion consiste en 3 tables indexées 
    par des idents cibles (CoIdent.t) :
    - Table des variables (support)
    - Table des alias (d'expressions algébriques)
    - + la liste d'alias
    - Table des traces
*)

(** Info et table des variables support
*)
49 50
type support_scope

51
type support_nature =
erwan's avatar
erwan committed
52 53 54 55 56 57
  | Input
  | Output
  | LocalIn
  | LocalOut
    
type support_info = {
58
	si_ident : CoIdent.t ;
59 60 61 62 63
   si_nature : support_nature ;
   si_type : CkTypeEff.t ;
   si_ref_exp : CoAlgExp.t ;
   si_src : CoIdent.src_stack;
   (* on ne la crée qu'à la demande *)
erwan's avatar
erwan committed
64
   si_pre_ref_exp : CoAlgExp.t option ;
65 66 67
   si_default : CoAlgExp.t option ;
   si_scope : support_scope option ;
   si_init  : CoAlgExp.t option ;
68
   si_range  : (CoAlgExp.t *CoAlgExp.t) option ;
69 70
}

erwan's avatar
erwan committed
71
open Util
72
(* support_info that are actually used in pre's *)
erwan's avatar
erwan committed
73
val support_tab : t -> support_info StringMap.t 
74 75 76

(* support_info that are actually used in pre's *)
val support_pres : t -> (CoIdent.t * support_info) list
77 78 79

val input_list : t -> CoIdent.t list
val output_list : t -> CoIdent.t list
80 81
val local_in_list : t -> CoIdent.t list
val local_out_list : t -> CoIdent.t list
82

83 84
val ident_space : t -> CoIdent.space

85

86 87 88 89 90 91 92 93 94 95
val node_name : t -> string

(** Info et table des alias algébriques *)
type alias_info = {
	ai_type : CkTypeEff.t;
	ai_def_exp : CoAlgExp.t;
	ai_ref_exp : CoAlgExp.t;
	ai_src : CoIdent.src_stack
}

erwan's avatar
erwan committed
96
val alias_tab : t -> alias_info StringMap.t
97 98
val alias_list : t -> CoIdent.t list

99 100
(* Run tab *)
(* not necessary ?
erwan's avatar
erwan committed
101
val run_tab : t -> (CoIdent.t, t) StringMap.t
102 103 104
*)

val get_run_expanded_code : t -> CoIdent.t -> t
105 106 107 108 109 110 111 112

(** Info et table des alias trace *)

type trace_info = {
	ti_def_exp : CoTraceExp.t;
	ti_src : CoIdent.src_stack ;
}

erwan's avatar
erwan committed
113
val trace_tab : t -> trace_info StringMap.t
114

115 116
val get_trace_info : t -> CoIdent.t -> trace_info

117 118 119 120 121 122 123 124 125 126 127 128
(** Info et table des externes utilisées
	on garde le CkIdentInfo.t tel quel pour
	usage ultérieur (génération de code)
	N.B. le source est un lexeme
*)

type extern_info = {
   xi_decl : Syntaxe.let_info;
   xi_prof : CkTypeEff.profile;
   xi_src : Lexeme.t
}

erwan's avatar
erwan committed
129
val extern_tab : t -> extern_info StringMap.t
130 131 132 133 134 135

(** Identificateur (target) de la trace principale *)
val main_trace : t -> CoIdent.t

(** DUMP pour debug etc. *)
val dump : t -> unit
136
val dump_src_ctx : t -> string