|
| 1 | +open Types |
| 2 | + |
| 3 | +let update_ctx_with_inputs (ctx : 'a ctx) |
| 4 | + (value_inputs : 'a value Com.Var.Map.t) : unit = |
| 5 | + (* let value_inputs = *) |
| 6 | + (* Com.Var.Map.mapi *) |
| 7 | + (* (fun v l -> *) |
| 8 | + (* match l with *) |
| 9 | + (* | Com.Undefined -> Undefined *) |
| 10 | + (* | Com.Float f -> Number (N.of_float_input v f)) *) |
| 11 | + (* inputs *) |
| 12 | + (* in *) |
| 13 | + let default_space = |
| 14 | + ctx.ctx_var_spaces.(ctx.ctx_prog.program_var_space_def.vs_id) |
| 15 | + in |
| 16 | + Com.Var.Map.iter |
| 17 | + (fun (var : Com.Var.t) value -> |
| 18 | + match Com.Var.cat_var_loc var with |
| 19 | + | LocInput -> default_space.input.(Com.Var.loc_idx var) <- value |
| 20 | + | LocComputed -> default_space.computed.(Com.Var.loc_idx var) <- value |
| 21 | + | LocBase -> default_space.base.(Com.Var.loc_idx var) <- value) |
| 22 | + value_inputs |
| 23 | + |
| 24 | +let update_ctx_with_events (ctx : 'a ctx) |
| 25 | + (events : ('a value, Com.Var.t) Com.event_value StrMap.t list) : unit = |
| 26 | + let nbEvt = List.length events in |
| 27 | + let ctx_event_tab = Array.make nbEvt [||] in |
| 28 | + let fold idx (evt : ('a value, Com.Var.t) Com.event_value StrMap.t) = |
| 29 | + let nbProgFields = StrMap.cardinal ctx.ctx_prog.program_event_fields in |
| 30 | + let map = Array.make nbProgFields (Com.Numeric Undefined) in |
| 31 | + for id = 0 to nbProgFields - 1 do |
| 32 | + let fname = IntMap.find id ctx.ctx_prog.program_event_field_idxs in |
| 33 | + let ef = StrMap.find fname ctx.ctx_prog.program_event_fields in |
| 34 | + if ef.is_var then |
| 35 | + map.(id) <- |
| 36 | + Com.RefVar (snd (StrMap.min_binding ctx.ctx_prog.program_vars)) |
| 37 | + done; |
| 38 | + let iter' fname ev = |
| 39 | + match StrMap.find_opt fname ctx.ctx_prog.program_event_fields with |
| 40 | + | Some ef -> ( |
| 41 | + match (ev, ef.is_var) with |
| 42 | + | Com.Numeric _, false | Com.RefVar _, true -> map.(ef.index) <- ev |
| 43 | + | _ -> Errors.raise_error "wrong event field type") |
| 44 | + | None -> Errors.raise_error "unknown event field" |
| 45 | + in |
| 46 | + StrMap.iter iter' evt; |
| 47 | + ctx_event_tab.(idx) <- map; |
| 48 | + idx + 1 |
| 49 | + in |
| 50 | + ignore (List.fold_left fold 0 events); |
| 51 | + (* let max_field_length = |
| 52 | + StrMap.fold |
| 53 | + (fun s _ r -> max r (String.length s)) |
| 54 | + ctx.ctx_prog.program_event_fields 0 |
| 55 | + in |
| 56 | + let pp_field fmt s = |
| 57 | + let l = String.length s in |
| 58 | + Format.fprintf fmt "%s%s" s (String.make (max_field_length - l + 1) ' ') |
| 59 | + in |
| 60 | + let pp_ev fmt = function |
| 61 | + | Com.Numeric Undefined -> Pp.string fmt "indefini" |
| 62 | + | Com.Numeric (Number v) -> N.format_t fmt v |
| 63 | + | Com.RefVar v -> Pp.string fmt (Com.Var.name_str v) |
| 64 | + in |
| 65 | + for i = 0 to Array.length ctx_event_tab - 1 do |
| 66 | + Format.eprintf "%d@." i; |
| 67 | + let map = ctx_event_tab.(i) in |
| 68 | + for j = 0 to Array.length map - 1 do |
| 69 | + let s = IntMap.find j ctx.ctx_prog.program_event_field_idxs in |
| 70 | + Format.eprintf " %a%a@." pp_field s pp_ev map.(j) |
| 71 | + done |
| 72 | + done;*) |
| 73 | + ctx.ctx_events <- [ ctx_event_tab ] |
| 74 | + |
| 75 | +let empty_ctx ?inputs ?events (p : M_ir.Mir.program) : 'a ctx = |
| 76 | + let dummy_var = Com.Var.new_ref ~name:(Pos.without "") in |
| 77 | + let init_tmp_var _i = { var = dummy_var; value = Undefined } in |
| 78 | + let init_ref _i = |
| 79 | + { |
| 80 | + var = dummy_var; |
| 81 | + var_space = p.program_var_space_def; |
| 82 | + ref_var = dummy_var; |
| 83 | + org = -1; |
| 84 | + } |
| 85 | + in |
| 86 | + let ctx_tab_map = |
| 87 | + let init i = IntMap.find i p.program_stats.table_map in |
| 88 | + Array.init (IntMap.cardinal p.program_stats.table_map) init |
| 89 | + in |
| 90 | + let ctx_var_spaces = |
| 91 | + let init i = |
| 92 | + let vsd = IntMap.find i p.program_var_spaces_idx in |
| 93 | + let input = |
| 94 | + if Com.CatVar.LocMap.mem Com.CatVar.LocInput vsd.vs_cats then |
| 95 | + Array.make p.program_stats.sz_input Undefined |
| 96 | + else Array.make 0 Undefined |
| 97 | + in |
| 98 | + let computed = |
| 99 | + if Com.CatVar.LocMap.mem Com.CatVar.LocComputed vsd.vs_cats then |
| 100 | + Array.make p.program_stats.sz_computed Undefined |
| 101 | + else Array.make 0 Undefined |
| 102 | + in |
| 103 | + let base = |
| 104 | + if Com.CatVar.LocMap.mem Com.CatVar.LocBase vsd.vs_cats then |
| 105 | + Array.make p.program_stats.sz_base Undefined |
| 106 | + else Array.make 0 Undefined |
| 107 | + in |
| 108 | + { input; computed; base } |
| 109 | + in |
| 110 | + Array.init (IntMap.cardinal p.program_var_spaces_idx) init |
| 111 | + in |
| 112 | + let res = |
| 113 | + { |
| 114 | + ctx_prog = p; |
| 115 | + ctx_target = snd (StrMap.min_binding p.program_targets); |
| 116 | + ctx_var_space = p.program_var_space_def.vs_id; |
| 117 | + ctx_var_spaces; |
| 118 | + ctx_tmps = Array.init p.program_stats.sz_all_tmps init_tmp_var; |
| 119 | + ctx_tmps_org = 0; |
| 120 | + ctx_ref = Array.init p.program_stats.nb_all_refs init_ref; |
| 121 | + ctx_ref_org = 0; |
| 122 | + ctx_tab_map; |
| 123 | + ctx_pr_out = { indent = 0; is_newline = true }; |
| 124 | + ctx_pr_err = { indent = 0; is_newline = true }; |
| 125 | + ctx_anos = []; |
| 126 | + ctx_nb_anos = 0; |
| 127 | + ctx_nb_discos = 0; |
| 128 | + ctx_nb_infos = 0; |
| 129 | + ctx_nb_bloquantes = 0; |
| 130 | + ctx_archived_anos = StrSet.empty; |
| 131 | + ctx_finalized_anos = []; |
| 132 | + ctx_exported_anos = []; |
| 133 | + ctx_events = []; |
| 134 | + } |
| 135 | + in |
| 136 | + Option.iter (update_ctx_with_inputs res) inputs; |
| 137 | + Option.iter (update_ctx_with_events res) events; |
| 138 | + res |
0 commit comments