Revision a56f563e
Added by LĂ©lio Brun over 3 years ago
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
more compact assign clauses for state variables, and remove useless memory pack predicates and assertions