sig
  type call_cond = CActivate of StateVar.t | CRestart of StateVar.t
  type node_call = {
    call_pos : Lib.position;
    call_node_name : LustreIdent.t;
    call_cond : LustreNode.call_cond list;
    call_inputs : StateVar.t LustreIndex.t;
    call_oracles : StateVar.t list;
    call_outputs : StateVar.t LustreIndex.t;
    call_defaults : LustreExpr.t LustreIndex.t option;
  }
  type state_var_source =
      Input
    | Output
    | Local
    | KLocal
    | Call
    | Ghost
    | Oracle
    | Alias of StateVar.t * LustreNode.state_var_source option
  type contract = LustreContract.t
  type equation_lhs =
      StateVar.t * LustreExpr.expr LustreExpr.bound_or_fixed list
  type equation = LustreNode.equation_lhs * LustreExpr.t
  type t = {
    name : LustreIdent.t;
    is_extern : bool;
    instance : StateVar.t;
    init_flag : StateVar.t;
    inputs : StateVar.t LustreIndex.t;
    oracles : StateVar.t list;
    outputs : StateVar.t LustreIndex.t;
    locals : StateVar.t LustreIndex.t list;
    equations : LustreNode.equation list;
    calls : LustreNode.node_call list;
    asserts : LustreExpr.t list;
    props : (StateVar.t * string * Property.prop_source) list;
    contract : LustreNode.contract option;
    is_main : bool;
    is_function : bool;
    state_var_source_map : LustreNode.state_var_source StateVar.StateVarMap.t;
    oracle_state_var_map : StateVar.t StateVar.StateVarHashtbl.t;
    state_var_expr_map : LustreExpr.t StateVar.StateVarHashtbl.t;
    silent_contracts : string list;
  }
  type state_var_instance = Lib.position * LustreIdent.t * StateVar.t
  val empty_node : LustreIdent.t -> bool -> LustreNode.t
  val pp_print_node_equation :
    bool -> Format.formatter -> LustreNode.equation -> unit
  val pp_print_call :
    bool -> Format.formatter -> LustreNode.node_call -> unit
  val pp_print_node : bool -> Format.formatter -> LustreNode.t -> unit
  val pp_print_node_signature : Format.formatter -> LustreNode.t -> unit
  val pp_print_node_debug : Format.formatter -> LustreNode.t -> unit
  val node_of_name : LustreIdent.t -> LustreNode.t list -> LustreNode.t
  val exists_node_of_name : LustreIdent.t -> LustreNode.t list -> bool
  val find_main : LustreNode.t list -> LustreIdent.t
  val ident_of_top : LustreNode.t list -> LustreIdent.t
  val has_contract : LustreNode.t -> bool
  val subsystem_of_nodes : LustreNode.t list -> LustreNode.t SubSystem.t
  val nodes_of_subsystem : LustreNode.t SubSystem.t -> LustreNode.t list
  val stateful_vars_of_node : LustreNode.t -> StateVar.StateVarSet.t
  val name_of_node : LustreNode.t -> LustreIdent.t
  val ordered_equations_of_node :
    LustreNode.t -> StateVar.t list -> bool -> LustreNode.equation list
  val equation_of_svar :
    LustreNode.t -> StateVar.t -> LustreNode.equation option
  val source_of_svar :
    LustreNode.t -> StateVar.t -> LustreNode.state_var_source option
  val node_call_of_svar :
    LustreNode.t -> StateVar.t -> LustreNode.node_call option
  val scope_of_node : LustreNode.t -> Scope.t
  val fold_node_calls_with_trans_sys :
    LustreNode.t list ->
    (LustreNode.t ->
     TransSys.t ->
     (TransSys.t * TransSys.instance * LustreNode.call_cond list) list ->
     'a list -> 'a) ->
    LustreNode.t -> TransSys.t -> 'a
  val pp_print_state_var_source :
    Format.formatter -> LustreNode.state_var_source -> unit
  val set_state_var_source :
    LustreNode.t -> StateVar.t -> LustreNode.state_var_source -> LustreNode.t
  val set_state_var_source_if_undef :
    LustreNode.t -> StateVar.t -> LustreNode.state_var_source -> LustreNode.t
  val get_state_var_source :
    LustreNode.t -> StateVar.t -> LustreNode.state_var_source
  val set_state_var_alias :
    LustreNode.t -> StateVar.t -> StateVar.t -> LustreNode.t
  val set_state_var_node_call : LustreNode.t -> StateVar.t -> LustreNode.t
  val set_state_var_instance :
    StateVar.t -> Lib.position -> LustreIdent.t -> StateVar.t -> unit
  val set_oracle_state_var : LustreNode.t -> StateVar.t -> StateVar.t -> unit
  val get_oracle_state_var_map :
    LustreNode.t -> StateVar.t StateVar.StateVarHashtbl.t
  val set_state_var_expr : LustreNode.t -> StateVar.t -> LustreExpr.t -> unit
  val get_state_var_expr_map :
    LustreNode.t -> LustreExpr.t StateVar.StateVarHashtbl.t
  val get_state_var_instances :
    StateVar.t -> LustreNode.state_var_instance list
  val state_var_is_visible : LustreNode.t -> StateVar.t -> bool
  val is_automaton_state_var : StateVar.t -> (string * string) option
  val node_is_visible : LustreNode.t -> bool
  val node_is_state_handler : LustreNode.t -> string option
  val state_var_is_input : LustreNode.t -> StateVar.t -> bool
  val state_var_is_output : LustreNode.t -> StateVar.t -> bool
  val state_var_is_local : LustreNode.t -> StateVar.t -> bool
  val map_svars_in_equation :
    (StateVar.t -> StateVar.t) -> LustreNode.equation -> LustreNode.equation
end