Project

General

Profile

« Previous | Next » 

Revision 66359a5e

Added by Pierre-Loïc Garoche about 7 years ago

[general] large modification: added machine types, a second typing phase dealing with machine types (eg uint8)
typing was transformed as a functor and parametrized by basic types (int/real/bool)
it can also be applied multiple times on the same program

View differences:

src/normalization.ml
90 90
    var_dec_clock = dummy_clock_dec;
91 91
    var_dec_const = false;
92 92
    var_dec_value = None;
93
    var_parent_nodeid = Some node.node_id;
93 94
    var_type = ty;
94 95
    var_clock = ck;
95 96
    var_loc = loc
......
167 168
	    (Clocks.clock_list_of_clock expr.expr_clock) in
168 169
	let new_def =
169 170
	  mkeq expr.expr_loc (List.map (fun v -> v.var_id) new_aliases, expr)
170
	in (new_def::defs, new_aliases@vars), replace_expr new_aliases expr
171
	in
172
	(* Typing and Registering machine type *) 
173
	let _ = Machine_types.type_def node new_aliases expr  in
174
	(new_def::defs, new_aliases@vars), replace_expr new_aliases expr
171 175
      else
172 176
	(defs, vars), expr
173 177

  
......
420 424
    ) (vars, [], []) node.node_asserts in
421 425
  let new_locals = List.filter not_is_orig_var vars in (* we filter out inout
422 426
							  vars and initial locals ones *)
423
  let new_locals = node.node_locals @ new_locals in (* we add again, at the
427
  
428
  let all_locals = node.node_locals @ new_locals in (* we add again, at the
424 429
						       beginning of the list the
425 430
						       local declared ones *)
426 431
  (*Format.eprintf "New locals: %a@.@?" (fprintf_list ~sep:", " Printers.pp_var) new_locals;*)
427 432

  
433

  
434
  (* Updating annotations: traceability and machine types for fresh variables *)
435
  
436
  (* Compute traceability info:
437
     - gather newly bound variables
438
     - compute the associated expression without aliases
439
  *)
428 440
  let new_annots =
429 441
    if !Options.traces then
430 442
      begin
431
	(* Compute traceability info:
432
	   - gather newly bound variables
433
	   - compute the associated expression without aliases
434
	*)
435
	let diff_vars = List.filter (fun v -> not (List.mem v node.node_locals) ) new_locals in
443
	let diff_vars = List.filter (fun v -> not (List.mem v node.node_locals) ) all_locals in
436 444
	let norm_traceability = {
437 445
	  annots = List.map (fun v ->
438 446
	    let eq =
......
446 454
	    in
447 455
	    let expr = substitute_expr diff_vars (defs@assert_defs) eq.eq_rhs in
448 456
	    let pair = mkeexpr expr.expr_loc (mkexpr expr.expr_loc (Expr_tuple [expr_of_ident v.var_id expr.expr_loc; expr])) in
457
	    Annotations.add_expr_ann node.node_id pair.eexpr_tag ["traceability"];
449 458
	    (["traceability"], pair)
450 459
	  ) diff_vars;
451 460
	  annot_loc = Location.dummy_loc
......
457 466
      node.node_annot
458 467
  in
459 468

  
469
  let new_annots =
470
    List.fold_left (fun annots v ->
471
      if Machine_types.is_exportable v then
472
	let typ = Machine_types.get_specified_type v in
473
  	let typ_name = Machine_types.type_name typ in
474

  
475
	let loc = v.var_loc in
476
	let typ_as_string =
477
	  mkexpr
478
	    loc
479
	    (Expr_const
480
	       (Const_string typ_name))
481
	in
482
	let pair = expr_to_eexpr (expr_of_expr_list loc [expr_of_vdecl v; typ_as_string]) in
483
	Annotations.add_expr_ann node.node_id pair.eexpr_tag Machine_types.keyword;
484
	{annots = [Machine_types.keyword, pair]; annot_loc = loc}::annots
485
      else
486
	annots
487
    ) new_annots new_locals
488
  in
460 489
  let node =
461 490
    { node with
462
      node_locals = new_locals;
491
      node_locals = all_locals;
463 492
      node_stmts = List.map (fun eq -> Eq eq) (defs @ assert_defs);
464 493
      node_asserts = asserts;
465 494
      node_annot = new_annots;

Also available in: Unified diff