%% -*- erlang-indent-level: 2 -*-
%%------------------------------------------------------------------------------
%%====================================================================
%% Types
%%====================================================================
%% Code and Monitor servers' info.
-record(svs, {
code :: pid(),
monitor :: pid()
}).
%% Tags of an AST's node.
-record(tags, {
this = undefined :: cuter_cerl:tag() | undefined,
next = undefined :: cuter_cerl:tag() | undefined
}).
-type loaded_ret_atoms() :: cover_compiled | preloaded | non_existing.
-type servers() :: #svs{}.
-type ast_tags() :: #tags{}.
%%====================================================================
%% Directories
%%====================================================================
-define(RELATIVE_TMP_DIR, "temp").
-define(PYTHON_CALL, ?PYTHON_PATH ++ " -u " ++ ?PRIV ++ "/cuter_interface.py").
%%====================================================================
%% Prefixes
%%====================================================================
-define(DEPTH_PREFIX, '__conc_depth').
-define(EXECUTION_PREFIX, '__conc_prefix').
-define(SYMBOLIC_PREFIX, '__s').
-define(CONCOLIC_PREFIX_MSG, '__concm').
-define(ZIPPED_VALUE_PREFIX, '__czip').
-define(CONCOLIC_PREFIX_PDICT, '__concp').
-define(FUNCTION_PREFIX, '__cfunc').
-define(UNBOUND_VAR_PREFIX, '__uboundvar').
-define(BRANCH_TAG_PREFIX, '__branch_tag').
-define(VISITED_TAGS_PREFIX, '__visited_tags').
-define(EXECUTION_COUNTER_PREFIX, '__exec_counter').
%%====================================================================
%% Flags & Default Values
%%====================================================================
-define(LOGGING_FLAG, ok).
-define(DELETE_TRACE, ok).
-define(LOG_UNSUPPORTED_MFAS, ok).
%%-define(VERBOSE_SCHEDULER, ok).
%%-define(VERBOSE_FILE_DELETION, ok).
%%-define(VERBOSE_SOLVING, ok).
%%-define(VERBOSE_MERGING, ok).
%%-define(VERBOSE_REPORTING, ok).
-define(USE_SPECS, ok).
%%====================================================================
%% Solver Responses
%%====================================================================
-define(RSP_MODEL_DELIMITER_START, <<"model_start">>).
-define(RSP_MODEL_DELIMITER_END, <<"model_end">>).
%%====================================================================
%% OpCodes for types in JSON objects
%%====================================================================
-define(JSON_TYPE_ANY, 0).
-define(JSON_TYPE_INT, 1).
-define(JSON_TYPE_FLOAT, 2).
-define(JSON_TYPE_ATOM, 3).
-define(JSON_TYPE_LIST, 4).
-define(JSON_TYPE_TUPLE, 5).
-define(JSON_TYPE_PID, 6).
-define(JSON_TYPE_REF, 7).
%%====================================================================
%% OpCodes for the commands to the solver
%%====================================================================
-define(JSON_CMD_LOAD_TRACE_FILE, 1).
-define(JSON_CMD_SOLVE, 2).
-define(JSON_CMD_GET_MODEL, 3).
-define(JSON_CMD_ADD_AXIOMS, 4).
-define(JSON_CMD_FIX_VARIABLE, 5).
-define(JSON_CMD_RESET_SOLVER, 6).
-define(JSON_CMD_STOP, 42).
%%====================================================================
%% OpCodes for constraint types
%%====================================================================
-define(CONSTRAINT_TRUE, 1).
-define(CONSTRAINT_FALSE, 2).
-define(NOT_CONSTRAINT, 3).
-define(CONSTRAINT_TRUE_REPR, 84). %% $T
-define(CONSTRAINT_FALSE_REPR, 70). %% $F
%%====================================================================
%% OpCodes of constraints & built-in operations
%%====================================================================
%% Empty tag ID
-define(EMPTY_TAG_ID, 0).
%% MFA's Parameters & Spec definitions.
-define(OP_PARAMS, 1).
-define(OP_SPEC, 2).
%% Constraints.
-define(OP_GUARD_TRUE, 3).
-define(OP_GUARD_FALSE, 4).
-define(OP_MATCH_EQUAL_TRUE, 5).
-define(OP_MATCH_EQUAL_FALSE, 6).
-define(OP_TUPLE_SZ, 7).
-define(OP_TUPLE_NOT_SZ, 8).
-define(OP_TUPLE_NOT_TPL, 9).
-define(OP_LIST_NON_EMPTY, 10).
-define(OP_LIST_EMPTY, 11).
-define(OP_LIST_NOT_LST, 12).
%% Information used for syncing & merging the traces of many processes.
-define(OP_SPAWN, 13).
-define(OP_SPAWNED, 14).
-define(OP_MSG_SEND, 15).
-define(OP_MSG_RECEIVE, 16).
-define(OP_MSG_CONSUME, 17).
%% Necessary operations for the evaluation of Core Erlang.
-define(OP_UNFOLD_TUPLE, 18).
-define(OP_UNFOLD_LIST, 19).
%% Bogus operation (operations interpreted as the identity function).
-define(OP_BOGUS, 48).
%% Type conversions.
-define(OP_FLOAT, 47).
-define(OP_LIST_TO_TUPLE, 52).
-define(OP_TUPLE_TO_LIST, 53).
%% Query types.
-define(OP_IS_INTEGER, 27).
-define(OP_IS_ATOM, 28).
-define(OP_IS_FLOAT, 29).
-define(OP_IS_LIST, 30).
-define(OP_IS_TUPLE, 31).
-define(OP_IS_BOOLEAN, 32).
-define(OP_IS_NUMBER, 33).
%% Arithmetic operations.
-define(OP_PLUS, 34).
-define(OP_MINUS, 35).
-define(OP_TIMES, 36).
-define(OP_RDIV, 37).
-define(OP_IDIV_NAT, 38).
-define(OP_REM_NAT, 39).
-define(OP_UNARY, 40).
%% Operations on atoms.
-define(OP_ATOM_NIL, 49).
-define(OP_ATOM_HEAD, 50).
-define(OP_ATOM_TAIL, 51).
%% Operations on lists.
-define(OP_HD, 25).
-define(OP_TL, 26).
-define(OP_CONS, 56).
%% Operations on tuples.
-define(OP_TCONS, 57).
%% Comparisons.
-define(OP_EQUAL, 41).
-define(OP_UNEQUAL, 42).
-define(OP_LT_INT, 54).
-define(OP_LT_FLOAT, 55).
%% Maps MFAs to their JSON Opcodes
-define(OPCODE_MAPPING,
dict:from_list([ %% Simulated built-in operations
{ {cuter_erlang, atom_to_list_bogus, 1}, ?OP_BOGUS }
, { {cuter_erlang, is_atom_nil, 1}, ?OP_ATOM_NIL }
, { {cuter_erlang, safe_atom_head, 1}, ?OP_ATOM_HEAD }
, { {cuter_erlang, safe_atom_tail, 1}, ?OP_ATOM_TAIL }
, { {cuter_erlang, safe_pos_div, 2}, ?OP_IDIV_NAT }
, { {cuter_erlang, safe_pos_rem, 2}, ?OP_REM_NAT }
, { {cuter_erlang, lt_int, 2}, ?OP_LT_INT }
, { {cuter_erlang, lt_float, 2}, ?OP_LT_FLOAT }
, { {cuter_erlang, safe_plus, 2}, ?OP_PLUS }
, { {cuter_erlang, safe_minus, 2}, ?OP_MINUS }
, { {cuter_erlang, safe_times, 2}, ?OP_TIMES }
, { {cuter_erlang, safe_rdiv, 2}, ?OP_RDIV }
, { {cuter_erlang, safe_float, 1}, ?OP_FLOAT }
, { {cuter_erlang, safe_list_to_tuple, 1}, ?OP_LIST_TO_TUPLE }
, { {cuter_erlang, safe_tuple_to_list, 1}, ?OP_TUPLE_TO_LIST }
, { {bogus_erlang, cons, 2}, ?OP_CONS }
%% Actual erlang BIFs
, { {erlang, hd, 1}, ?OP_HD }
, { {erlang, tl, 1}, ?OP_TL }
, { {erlang, is_integer, 1}, ?OP_IS_INTEGER }
, { {erlang, is_atom, 1}, ?OP_IS_ATOM }
, { {erlang, is_boolean, 1}, ?OP_IS_BOOLEAN }
, { {erlang, is_float, 1}, ?OP_IS_FLOAT }
, { {erlang, is_list, 1}, ?OP_IS_LIST }
, { {erlang, is_tuple, 1}, ?OP_IS_TUPLE }
, { {erlang, is_number, 1}, ?OP_IS_NUMBER }
, { {erlang, '-', 1}, ?OP_UNARY }
, { {erlang, '=:=', 2}, ?OP_EQUAL }
, { {erlang, '=/=', 2}, ?OP_UNEQUAL }
])).
%% All the MFAs that are supported for symbolic evaluation.
-define(SUPPORTED_MFAS, gb_sets:from_list(dict:fetch_keys(?OPCODE_MAPPING))).
-define(UNSUPPORTED_MFAS,
gb_sets:from_list([ {cuter_erlang, unsupported_lt, 2} ])).
%% The set of all the built-in operations that the solver can try to reverse.
-define (REVERSIBLE_OPERATIONS,
gb_sets:from_list([ ?OP_HD, ?OP_TL
])).