diff --git a/src/clock_predef.ml b/src/clock_predef.ml index 7c1a0a5d790ad3f06d94e955fbeaa6482f4909b1..24669fd2f2f653b5e059d9a1c629aaa424136c55 100644 --- a/src/clock_predef.ml +++ b/src/clock_predef.ml @@ -14,6 +14,8 @@ (** Predefined operator clocks *) open Clocks +let ck_tuple cl = new_ck (Ctuple cl) true + let ck_bin_univ = let univ = new_univar () in new_ck (Carrow (new_ck (Ctuple [univ;univ]) true, univ)) true diff --git a/src/corelang.ml b/src/corelang.ml index 3ff58c0577969e714978c32b28a39e1838356847..c819feef297656e57a6d45d9746518734d0ff302 100755 --- a/src/corelang.ml +++ b/src/corelang.ml @@ -391,7 +391,14 @@ let expr_list_of_expr expr = let expr_of_expr_list loc elist = match elist with | [t] -> { t with expr_loc = loc } - | t::_ -> { t with expr_desc = Expr_tuple elist; expr_loc = loc } + | t::_ -> + let tlist = List.map (fun e -> e.expr_type) elist in + let clist = List.map (fun e -> e.expr_clock) elist in + { t with expr_desc = Expr_tuple elist; + expr_type = Type_predef.type_tuple tlist; + expr_clock = Clock_predef.ck_tuple clist; + expr_tag = Utils.new_tag (); + expr_loc = loc } | _ -> assert false let call_of_expr expr = diff --git a/src/inliner.ml b/src/inliner.ml index eb9fa16e91b6f0344e9cfe305ef128cf86107b0b..87f792b911e763a635d3a16f6af82c15ccaae16e 100644 --- a/src/inliner.ml +++ b/src/inliner.ml @@ -62,6 +62,7 @@ let inline_call orig_expr args reset locals node = assert (reset = None); let assign_inputs = mkeq loc (List.map (fun v -> v.var_id) inputs', args) in + let assign_inputs = Splitting.tuple_split_eq assign_inputs in let expr = expr_of_expr_list loc (List.map (fun v -> mkexpr loc (Expr_ident v.var_id)) outputs') @@ -77,7 +78,7 @@ let inline_call orig_expr args reset locals node = in expr, inputs'@outputs'@locals'@locals, - assign_inputs::eqs', + assign_inputs@eqs', asserts' @@ -118,8 +119,7 @@ let rec inline_expr expr locals nodes = (* let _ = Format.eprintf "Inlining call to %s@." id in *) let node = try List.find (check_node_name id) nodes with Not_found -> (assert false) in - let node = - match node.top_decl_desc with Node nd -> nd | _ -> assert false in + let node = node_of_top node in let node = inline_node node nodes in let expr, locals', eqs'', asserts'' = inline_call expr args' reset locals' node in diff --git a/src/machine_code.ml b/src/machine_code.ml index 2b4b4ab4c0d840284622b6194b9c24a79da9e5ed..715dfc71d16ec399f1646a90be282ffab1d85a1c 100644 --- a/src/machine_code.ml +++ b/src/machine_code.ml @@ -425,6 +425,9 @@ let find_eq xl eqs = to the computed schedule [sch] *) let sort_equations_from_schedule nd sch = +(* Format.eprintf "%s schedule: %a@." + nd.node_id + (Utils.fprintf_list ~sep:" ; " Scheduling.pp_eq_schedule) sch;*) let split_eqs = Splitting.tuple_split_eq_list nd.node_eqs in let eqs_rev, remainder = List.fold_left @@ -439,12 +442,14 @@ let sort_equations_from_schedule nd sch = ([], split_eqs) sch in - if List.length remainder > 0 then ( - Format.eprintf "Equations not used are@.%a@.Full equation set is:@.%a@.@?" - Printers.pp_node_eqs remainder - Printers.pp_node_eqs nd.node_eqs; - assert false); - List.rev eqs_rev + begin + if List.length remainder > 0 then ( + Format.eprintf "Equations not used are@.%a@.Full equation set is:@.%a@.@?" + Printers.pp_node_eqs remainder + Printers.pp_node_eqs nd.node_eqs; + assert false); + List.rev eqs_rev + end let translate_eqs node args eqs = List.fold_right (fun eq args -> translate_eq node args eq) eqs args;; diff --git a/src/printers.ml b/src/printers.ml index 504dd06a7dc31d1a64c917a49e2e32e78142e168..7ea7105fda8920365c4563198b966c123568d2f1 100644 --- a/src/printers.ml +++ b/src/printers.ml @@ -85,31 +85,30 @@ and pp_handlers fmt hl = and pp_app fmt id e r = match r with - | None -> - (match id, e.expr_desc with - | "+", Expr_tuple([e1;e2]) -> fprintf fmt "(%a + %a)" pp_expr e1 pp_expr e2 - | "uminus", _ -> fprintf fmt "(- %a)" pp_expr e - | "-", Expr_tuple([e1;e2]) -> fprintf fmt "(%a - %a)" pp_expr e1 pp_expr e2 - | "*", Expr_tuple([e1;e2]) -> fprintf fmt "(%a * %a)" pp_expr e1 pp_expr e2 - | "/", Expr_tuple([e1;e2]) -> fprintf fmt "(%a / %a)" pp_expr e1 pp_expr e2 - | "mod", Expr_tuple([e1;e2]) -> fprintf fmt "(%a mod %a)" pp_expr e1 pp_expr e2 - | "&&", Expr_tuple([e1;e2]) -> fprintf fmt "(%a and %a)" pp_expr e1 pp_expr e2 - | "||", Expr_tuple([e1;e2]) -> fprintf fmt "(%a or %a)" pp_expr e1 pp_expr e2 - | "xor", Expr_tuple([e1;e2]) -> fprintf fmt "(%a xor %a)" pp_expr e1 pp_expr e2 - | "impl", Expr_tuple([e1;e2]) -> fprintf fmt "(%a => %a)" pp_expr e1 pp_expr e2 - | "<", Expr_tuple([e1;e2]) -> fprintf fmt "(%a < %a)" pp_expr e1 pp_expr e2 - | "<=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a <= %a)" pp_expr e1 pp_expr e2 - | ">", Expr_tuple([e1;e2]) -> fprintf fmt "(%a > %a)" pp_expr e1 pp_expr e2 - | ">=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a >= %a)" pp_expr e1 pp_expr e2 - | "!=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a != %a)" pp_expr e1 pp_expr e2 - | "=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a = %a)" pp_expr e1 pp_expr e2 - | "not", _ -> fprintf fmt "(not %a)" pp_expr e - | _, Expr_tuple _ -> fprintf fmt "%s %a" id pp_expr e - | _ -> fprintf fmt "%s (%a)" id pp_expr e -) - | Some (x, l) -> fprintf fmt "%s (%a) every %s(%s)" id pp_expr e l x - - + | None -> pp_call fmt id e + | Some (x, l) -> fprintf fmt "%t every %s(%s)" (fun fmt -> pp_call fmt id e) l x + +and pp_call fmt id e = + match id, e.expr_desc with + | "+", Expr_tuple([e1;e2]) -> fprintf fmt "(%a + %a)" pp_expr e1 pp_expr e2 + | "uminus", _ -> fprintf fmt "(- %a)" pp_expr e + | "-", Expr_tuple([e1;e2]) -> fprintf fmt "(%a - %a)" pp_expr e1 pp_expr e2 + | "*", Expr_tuple([e1;e2]) -> fprintf fmt "(%a * %a)" pp_expr e1 pp_expr e2 + | "/", Expr_tuple([e1;e2]) -> fprintf fmt "(%a / %a)" pp_expr e1 pp_expr e2 + | "mod", Expr_tuple([e1;e2]) -> fprintf fmt "(%a mod %a)" pp_expr e1 pp_expr e2 + | "&&", Expr_tuple([e1;e2]) -> fprintf fmt "(%a and %a)" pp_expr e1 pp_expr e2 + | "||", Expr_tuple([e1;e2]) -> fprintf fmt "(%a or %a)" pp_expr e1 pp_expr e2 + | "xor", Expr_tuple([e1;e2]) -> fprintf fmt "(%a xor %a)" pp_expr e1 pp_expr e2 + | "impl", Expr_tuple([e1;e2]) -> fprintf fmt "(%a => %a)" pp_expr e1 pp_expr e2 + | "<", Expr_tuple([e1;e2]) -> fprintf fmt "(%a < %a)" pp_expr e1 pp_expr e2 + | "<=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a <= %a)" pp_expr e1 pp_expr e2 + | ">", Expr_tuple([e1;e2]) -> fprintf fmt "(%a > %a)" pp_expr e1 pp_expr e2 + | ">=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a >= %a)" pp_expr e1 pp_expr e2 + | "!=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a != %a)" pp_expr e1 pp_expr e2 + | "=", Expr_tuple([e1;e2]) -> fprintf fmt "(%a = %a)" pp_expr e1 pp_expr e2 + | "not", _ -> fprintf fmt "(not %a)" pp_expr e + | _, Expr_tuple _ -> fprintf fmt "%s %a" id pp_expr e + | _ -> fprintf fmt "%s (%a)" id pp_expr e and pp_eexpr fmt e = fprintf fmt "%a%t %a"