diff --git a/AFAIRE b/AFAIRE index 020aa118f6156f660992681bd76dfbaa857aba56..af7e376936510aedd623984038b560e73cf01bf5 100644 --- a/AFAIRE +++ b/AFAIRE @@ -1,3 +1,9 @@ + +12/08/06 +bug +./objlinux64/lus2lic test_static/cond01.lus -dbg lazyc + + 12/08/03 ./objlinux/lus2lic test_static/predef01.lus diff --git a/Makefile b/Makefile index 62701d45a8844b75a681958a887a3e3900e21201..c9afa1570d955d0807f9f9463a2c04f2aa61ef91 100644 --- a/Makefile +++ b/Makefile @@ -72,13 +72,13 @@ SOURCES = \ $(OBJDIR)/syntaxTab.mli \ $(OBJDIR)/syntaxTab.ml \ $(OBJDIR)/uglyStuff.ml \ - $(OBJDIR)/builtIn.ml \ $(OBJDIR)/predefEvalType.mli \ $(OBJDIR)/predefEvalType.ml \ $(OBJDIR)/predefEvalConst.mli \ $(OBJDIR)/predefEvalConst.ml \ $(OBJDIR)/predefEvalClock.mli \ $(OBJDIR)/predefEvalClock.ml \ + $(OBJDIR)/builtIn.ml \ $(OBJDIR)/evalConst.mli \ $(OBJDIR)/evalConst.ml \ $(OBJDIR)/evalType.mli \ diff --git a/src/builtIn.ml b/src/builtIn.ml index 9055db3d4a5e679d34dac954e0b7f3f190bd84d5..ba04ce028a3f4ba9c8b2a1822a95c24c6de9a3cb 100644 --- a/src/builtIn.ml +++ b/src/builtIn.ml @@ -28,6 +28,16 @@ let get_node_and_int_const let var_to_array (c:int) (vi: Eff.var_info) : Eff.var_info = { vi with var_type_eff = Array_type_eff(vi.var_type_eff,c) } +(*** +MESSAGES D'ERREUR : +Pour rester homogène, utiliser les fonctions de PredefEvalType: + raise_type_error (provided: string) (expect: string) (msg: string) + raise_arity_error (msg:string) (provided:int) (expect:int) +*) +let raise_type_error = PredefEvalType.raise_type_error +let raise_arity_error = PredefEvalType.raise_arity_error +exception EvalType_error = PredefEvalType.EvalType_error + (* On a éventuellement besoin du node_exp des args *) @@ -41,9 +51,9 @@ let rec do_node | ("Lustre", "map") -> do_map nk2nd nk lxm | ("Lustre", "red") | ("Lustre", "fill") - | ("Lustre", "fillred") -> assert false (*do_fillred sargs *) - | ("Lustre", "boolred") -> assert false - | ("Lustre", "condact") -> assert false + | ("Lustre", "fillred") -> do_fillred nk2nd nk lxm + | ("Lustre", "boolred") -> do_boolred nk2nd nk lxm + | ("Lustre", "condact") -> do_condact nk2nd nk lxm | _ -> raise Not_found (*-------------------------------------------------------------------- @@ -69,3 +79,121 @@ and do_map nk2nd nk lxm = has_mem_eff = nd.has_mem_eff; is_safe_eff = nd.is_safe_eff; } +(*-------------------------------------------------------------------- +FILLRED +---------------------------------------------------------------------- + Given : + - A node : aa * a_1 * ... * a_n -> aa * b_1 * ... * b_k + - An int c +Gen a node : aa * a_1^c * ... * a_n^c -> aa * b_1^c * ... * b_k^c +--------------------------------------------------------------------*) +and do_fillred nk2nd nk lxm = + let sargs = snd nk in + let (np, c) = get_node_and_int_const lxm sargs in + let nd = nk2nd np in + let ins = nd.inlist_eff in + let outs = nd.outlist_eff in + let _ = assert (ins <> [] && outs <> []) in + let ins' = (List.hd ins)::(List.map (var_to_array c) (List.tl ins)) in + let outs' = (List.hd outs)::(List.map (var_to_array c) (List.tl outs)) in + (* pas d'unif : egalité et c'est tout ! *) + let t1 = (List.hd ins').var_type_eff in + let t2 = (List.hd outs').var_type_eff in + if t1 <> t2 then + let msg = Printf.sprintf + "node can't be used in iterator, first input type '%s' differs from first output type '%s'" + (LicDump.string_of_type_eff t1) + (LicDump.string_of_type_eff t2) + in + raise (Compile_error(lxm, msg)) + else + { + node_key_eff = nk; + inlist_eff = ins'; + outlist_eff = outs'; + loclist_eff = None; + def_eff = BuiltInEff; + has_mem_eff = nd.has_mem_eff; + is_safe_eff = nd.is_safe_eff; + } +(*-------------------------------------------------------------------- +CONDACT +---------------------------------------------------------------------- + Given : + - A node n of type: a_1 * ... * a_n -> b_1 * ... * b_k + - A (tuple) const: b_1 * ... * b_k +Gen a node of type : bool * a_1 * ... * a_n -> b_1 * ... * b_k +---------------------------------------------------------------------*) +and do_condact nk2nd nk lxm = +try + let sargs = snd nk in + let nk, dflt = + match sargs with + | [NodeStaticArgEff(_,nk) ; ConstStaticArgEff(_,dflt)] -> nk, dflt + | _ -> assert false + in + (* recherche le profil de nk ... *) + let ne = nk2nd nk in + let inlist = ne.inlist_eff in + let outlist = ne.outlist_eff in + (* dflt_types doit êre compatiple avec outlist *) + let dflt_types = types_of_const dflt in + let out_types = List.map (fun x -> x.var_type_eff) outlist in + let matches = try + UnifyType.is_matched out_types dflt_types + with UnifyType.Match_failed msg -> + raise (Compile_error(lxm, "in condact default output "^msg)) + in + let out_types = Eff.apply_type_matches matches out_types in + let in_types = Eff.apply_type_matches matches + (Bool_type_eff::(List.map (fun x -> x.var_type_eff) inlist)) + in + (* ok pour les args statiques, le profil dynamique est : *) + let ins = Eff.create_var_list SyntaxTreeCore.VarInput in_types in + let outs = Eff.create_var_list SyntaxTreeCore.VarOutput out_types in + { + node_key_eff = nk; + inlist_eff = ins; + outlist_eff = outs; + loclist_eff = None; + def_eff = BuiltInEff; + has_mem_eff = ne.has_mem_eff; + is_safe_eff = ne.is_safe_eff; + } +with +| EvalType_error msg -> raise (Compile_error(lxm, "type error: "^msg)) + + + + +(*-------------------------------------------------------------------- +BOOLRED +---------------------------------------------------------------------- + Given + - 3 integer constant i, j, k + + returns the profile bool^k -> bool +---------------------------------------------------------------------*) +and do_boolred nk2nd nk lxm = + let sargs = snd nk in + let (i,j,k) = match sargs with + | [ + ConstStaticArgEff(_,Int_const_eff i); + ConstStaticArgEff(_,Int_const_eff j); + ConstStaticArgEff(_,Int_const_eff k) + ] -> i,j,k + | _ -> raise (Compile_error(lxm, "\n*** type error: 3 int were expected")) + in + let ins = Eff.create_var_list SyntaxTreeCore.VarInput [ Array_type_eff(Bool_type_eff,k) ] in + let outs = Eff.create_var_list SyntaxTreeCore.VarOutput [ Bool_type_eff ] in + { + node_key_eff = nk; + inlist_eff = ins; + outlist_eff = outs; + loclist_eff = None; + def_eff = BuiltInEff; + (* ???? *) + has_mem_eff = true; + is_safe_eff = true; + } + diff --git a/src/doNoPoly.ml b/src/doNoPoly.ml index 0fd99e6c338e83e02d2f8b1dee3229622916b376..452b230e45864c7cb5abb449a43945e16f13d1cb 100644 --- a/src/doNoPoly.ml +++ b/src/doNoPoly.ml @@ -54,6 +54,7 @@ let rec doit (inp : LicPrg.t) : LicPrg.t = else (); let def' = match ne.def_eff with | ExternEff -> ne.def_eff + | BuiltInEff _ -> BuiltInEff | AbstractEff _ -> assert false | BodyEff nb -> BodyEff (do_body nb) diff --git a/src/eff.ml b/src/eff.ml index f0545ebcfcc802947bd864a1a1f1f71709a3c51a..7feb348174e7ce4f82d9ad502bed9abe67675c8a 100644 --- a/src/eff.ml +++ b/src/eff.ml @@ -541,6 +541,11 @@ let rec subst_matches (matches: type_matches) (t: type_) : type_ = | TypeVar tvar -> try (List.assoc tvar matches) with Not_found -> t +let apply_type_matches (matches: type_matches) (tl: type_ list) : type_ list = + match matches with + | [] -> tl + | _ -> List.map (subst_matches matches) tl + let rec (type_is_poly : type_ -> bool) = fun t -> match t with @@ -710,6 +715,28 @@ and string_of_type_matches pm = (* NodeStaticArgEff of (Ident.t * sarg_node_eff * node_exp) *) (* sarg_node_eff = node_key * var_info list * var_info list *) +(* utile : liste standard de var_info a partir de liste de type *) +let create_var_list nat tl = ( + let pfx = match nat with + | SyntaxTreeCore.VarInput -> "i" + | SyntaxTreeCore.VarOutput -> "o" + | SyntaxTreeCore.VarLocal -> assert false + in + let cpt = ref 0 in + let dovar t = ( + let i = !cpt in + let id = Printf.sprintf "%s%d" pfx i in + incr cpt; + { + var_name_eff = id; + var_nature_eff = nat; + var_number_eff = i; + var_type_eff = t; + (* ???? *) + var_clock_eff = (id, BaseEff); + } + ) in List.map dovar tl +) (*--------------------------------------------------------------------- Une erreur associée à un noeud + 1 lexeme dans le fichier source diff --git a/src/evalType.ml b/src/evalType.ml index 86442ba09adc89ba0bd8feaf2dd793df9f311192..de5f6d29dc4bfa0340c1fe6da4bd41ae8cc6b250 100644 --- a/src/evalType.ml +++ b/src/evalType.ml @@ -111,7 +111,7 @@ and eval_by_pos_type Printf.fprintf stderr "# required matches %s\n" (Eff.string_of_type_matches tmatches) ); - List.map (Eff.subst_matches tmatches) lto + Eff.apply_type_matches tmatches lto in (* let subst_opt = match U nifyType.f lti t_args with diff --git a/src/licDump.ml b/src/licDump.ml index eeadfc8cb92d75e6f146604a7d91dfe8ddf2a289..dcfebcb896254f0f8c2b10f651b7eb5e80e4ab93 100644 --- a/src/licDump.ml +++ b/src/licDump.ml @@ -542,7 +542,7 @@ and wrap_long_profile str = and (profile_of_node_exp_eff: Eff.node_exp -> string) = fun neff -> ("(" ^ (string_of_type_decl_list neff.inlist_eff "; ") ^ ") returns (" ^ - (string_of_type_decl_list neff.outlist_eff "; ") ^ ");\n") + (string_of_type_decl_list neff.outlist_eff "; ") ^ ")") and (string_of_node_def : Eff.node_def -> string list) = function @@ -598,36 +598,51 @@ and (const_decl: Ident.long -> Eff.const -> string) = (* exported *) -and (node_of_node_exp_eff: Eff.node_exp -> string) = - fun neff -> - wrap_long_profile ( - (if - neff.def_eff = ExternEff - && not (!Global.lv4) (* no extern kwd in v4... *) - then "extern " - else "") ^ - (if !Global.lv4 then - (* node and function does not have the same meaning in v4... *) - (if neff.def_eff = ExternEff then "function " else "node ") - else - (if neff.has_mem_eff then "node " else "function ") - ) ^ - (string_of_node_key_rec neff.node_key_eff) ^ - (profile_of_node_exp_eff neff)) ^ - (match neff.def_eff with - | ExternEff -> "" - | BuiltInEff -> "" +and node_of_node_exp_eff + (neff: Eff.node_exp) +: string = + wrap_long_profile ( + + ( + if neff.def_eff = ExternEff && not (!Global.lv4) + (* no extern kwd in v4... *) + then "extern " else "" + )^( + if !Global.lv4 then ( + (* node and function does not have the same meaning in v4... *) + if neff.def_eff = ExternEff then "function " else "node " + ) else ( + if neff.has_mem_eff then "node " else "function " + ) + )^( + string_of_node_key_rec neff.node_key_eff + )^( + profile_of_node_exp_eff neff + ) + )^( + match neff.def_eff with + | ExternEff -> ";\n" + | BuiltInEff -> ( (* on écrit juste un alias *) - | AbstractEff _ -> "" - | BodyEff _ -> - ((match neff.loclist_eff with None -> "" | Some [] -> "" - | Some l -> - "var\n " ^ (string_of_type_decl_list l ";\n ") ^ ";\n") ^ - "let\n " ^ - (String.concat "\n " (string_of_node_def neff.def_eff)) ^ - "\ntel\n-- end of node " ^ - (string_of_node_key_rec neff.node_key_eff) ^ "\n" - ) + " = "^ + (string_of_node_key_iter neff.node_key_eff)^ + (";\n") + ) + | AbstractEff _ -> ";\n" + | BodyEff _ -> ( + ";\n"^ + ( + match neff.loclist_eff with + | None -> "" + | Some [] -> "" + | Some l -> + "var\n " ^ (string_of_type_decl_list l ";\n ") ^ ";\n" + ) ^ + "let\n " ^ + (String.concat "\n " (string_of_node_def neff.def_eff)) ^ + "\ntel\n-- end of node " ^ + (string_of_node_key_rec neff.node_key_eff) ^ "\n" + ) ) diff --git a/test_static/cond01.lus b/test_static/cond01.lus new file mode 100644 index 0000000000000000000000000000000000000000..7fa845872d76e754a51189f4980dc954bde1ba81 --- /dev/null +++ b/test_static/cond01.lus @@ -0,0 +1,5 @@ + +node main(c: bool; x,y:int) returns (o: int); +let + o = condact<<+,0>>(x,y); +tel diff --git a/test_static/predef02.lus b/test_static/predef02.lus new file mode 100644 index 0000000000000000000000000000000000000000..5f5822e9f90e0fc9e9d3e2eebea7f024194569b2 --- /dev/null +++ b/test_static/predef02.lus @@ -0,0 +1,7 @@ + + + +node main(x: bool^42) returns (o: bool); +let + o = red<<or, 42>>(false,x); +tel diff --git a/test_static/predef03.lus b/test_static/predef03.lus new file mode 100644 index 0000000000000000000000000000000000000000..c9e9dcac95e3973048686871023c9a070cea8b5d --- /dev/null +++ b/test_static/predef03.lus @@ -0,0 +1,7 @@ + + + +node main(x: bool^13) returns (o: bool); +let + o = boolred<<1,2,13>>(x); +tel