Project

General

Profile

« Previous | Next » 

Revision a56f563e

Added by LĂ©lio Brun over 3 years ago

more compact assign clauses for state variables, and remove useless memory pack predicates and assertions

View differences:

src/machine_code.ml
185 185
  (* Step instructions *)
186 186
  s : instr_t list;
187 187
  (* Memory pack spec *)
188
  mp : mc_formula_t list;
188
  mp : (int * mc_formula_t) list;
189 189
  (* Transition spec *)
190 190
  t :
191 191
    (var_decl list
......
247 247
  let outputs_pi = Lustre_live.inter_live_i_with id (i - 1) outputs in
248 248
  let locals_i = Lustre_live.inter_live_i_with id i locals in
249 249
  let outputs_i = Lustre_live.inter_live_i_with id i outputs in
250
  let pred_mp ctx a = And [ mk_memory_pack ~i:(i - 1) id; a ] :: ctx.mp in
250
  let pred_mp ctx a =
251
    let j = try fst (List.hd ctx.mp) with _ -> 0 in
252
    match a with
253
    | Some a -> (i, And [ mk_memory_pack ~i:j id; a ]) :: ctx.mp
254
    | None -> ctx.mp
255
  in
251 256
  let pred_t ctx a =
252 257
    ( inputs @ locals_i @ outputs_i,
253 258
      ctx.m,
......
273 278
        {
274 279
          inst with
275 280
          instr_spec =
276
            (if fst (get_stateless_status_node nd) then []
281
            (if fst (get_stateless_status_node nd) || spec_mp = None then []
277 282
            else [ mk_memory_pack ~i id ])
278 283
            @ [
279 284
                mk_transition
......
308 313
    let ctx =
309 314
      ctl
310 315
        (MStep ([ var_x ], inst, [ c1; c2 ]))
311
        (mk_memory_pack ~inst (node_name td))
316
        (Some (mk_memory_pack ~inst (node_name td)))
312 317
        (mk_transition ~inst false (node_name td) [ vdecl_to_val var_x ])
313 318
        { ctx with j = IMap.add inst (td, []) ctx.j }
314 319
    in
......
318 323
    let e = translate_expr e in
319 324
    ctl
320 325
      (MStateAssign (var_x, e))
321
      (mk_state_variable_pack var_x)
326
      (Some (mk_state_variable_pack var_x))
322 327
      (mk_state_assign_tr var_x e)
323 328
      { ctx with m = ISet.add x ctx.m }
324 329
  | [ x ], Expr_fby (e1, e2) when env.is_local x ->
......
327 332
    let ctx =
328 333
      ctl
329 334
        (MStateAssign (var_x, e2))
330
        (mk_state_variable_pack var_x)
335
        (Some (mk_state_variable_pack var_x))
331 336
        (mk_state_assign_tr var_x e2)
332 337
        { ctx with m = ISet.add x ctx.m }
333 338
    in
......
356 361
    let stateless = Stateless.check_node node_f in
357 362
    let inst = if stateless then None else Some i in
358 363
    let mp =
359
      if stateless then True else mk_memory_pack ?inst (node_name node_f)
364
      if stateless then None else Some (mk_memory_pack ?inst (node_name node_f))
360 365
    in
361 366
    let ctx =
362 367
      ctl
......
387 392
    try
388 393
      let var_x = env.get_var x in
389 394
      let instr, spec = translate_act (var_x, eq.eq_rhs) in
390
      control_on_clock eq.eq_rhs.expr_clock instr True spec ctx
395
      control_on_clock eq.eq_rhs.expr_clock instr None spec ctx
391 396
    with Not_found ->
392 397
      Format.eprintf "ERROR: node %s, eq %a@." id Printers.pp_node_eq eq;
393 398
      raise Not_found)
......
609 614
  (* Build the machine *)
610 615
  let mmap = IMap.bindings ctx.j in
611 616
  let mmemory_packs =
617
    let i = try fst (List.hd ctx.mp) with _ -> 0 in
618
    i,
612 619
    memory_pack_0 nd
613
    :: List.mapi
614
         (fun i f -> { mpname = nd; mpindex = Some (i + 1); mpformula = red f })
620
    :: List.map
621
         (fun (i, f) -> { mpname = nd; mpindex = Some i; mpformula = red f })
615 622
         (List.rev ctx.mp)
616
    @ [ memory_pack_toplevel nd (List.length ctx.mp) ]
623
    @ [ memory_pack_toplevel nd i ]
617 624
  in
618 625
  let mtransitions =
619 626
    transition_0 nd

Also available in: Unified diff