open Utils type 'a gdef = Gfun of 'a type 'a prog = (string * 'a gdef) list let dump_gdef dump_fun oc gd = match gd with | (fname, Gfun f) -> dump_fun oc fname f; Format.fprintf oc "\n" let dump_prog dump_fun oc = List.iter (dump_gdef dump_fun oc) type 'a state = { env: (string, 'a) Hashtbl.t; mem: Mem.t } let init_state memsize = { mem = Mem.init memsize; env = Hashtbl.create 17; } let set_val env v i = Hashtbl.replace env v i let get_val env v = Hashtbl.find_opt env v let find_function (ep: 'a prog) fname : 'a res = match List.assoc_opt fname ep with | Some (Gfun f) -> OK f | _ -> Error (Format.sprintf "Unknown function %s\n" fname)