/** * Creates a new <b>basic_indent_streambuf</b> instance. * * @param indent_size a <b>size_t</b> value of the number of spaces for each indentation * level. * * @param flags an <b>unsigned int</b> value of Flags to enable or disable * BLANK_LINES and BRACES. * */ explicit basic_indent_streambuf(std::basic_streambuf<Ch, Tr> *stream_buffer, size_t indent_size = 2, unsigned flags = BRACES) : m_streamBuffer(stream_buffer), m_atLineBegin(true), m_leftJustify(false), m_indentLevel(0), m_nextIndentLevel(0), m_indentSize(indent_size), m_flags((Flags) flags), m_indentString(0) { set_indent_size(indent_size); }
/**Function******************************************************************** Synopsis [Goes to a given state of a trace] CommandName [goto_state] CommandSynopsis [Goes to a given state of a trace] CommandArguments [\[-h\] state] CommandDescription [Makes <tt>state</tt> the <em>current state</em>. This command is used to navigate alongs traces produced by NuSMV. During the navigation, there is a <em>current state</em>, and the <em>current trace</em> is the trace the <em>current state</em> belongs to. Command options:<p> <dl> <dt><tt>state: </tt> <dd> The state of a trace (trace.state) to be picked. </dl> ] SideEffects [<em>state</em> became the current state.] ******************************************************************************/ int CommandGotoState(int argc, char **argv) { int c; int status = 0; util_getopt_reset(); while ((c = util_getopt(argc,argv,"h")) != EOF) { switch (c) { case 'h': return UsageGotoState(); default: return UsageGotoState(); } } if (argc == 1) return UsageGotoState(); /* pre-conditions */ if (Compile_check_if_model_was_built(nusmv_stderr, true)) return 1; { TraceLabel label; argv += util_optind-1; argc -= util_optind-1; label = TraceLabel_create_from_string(argv[1]); if (label != TRACE_LABEL_INVALID) { if (TraceManager_is_label_valid(global_trace_manager, label)) { Trace_ptr from_trace, new_trace; TraceIter iter; bdd_ptr state; int new_trace_id; node_ptr new_label; int from_trace_no = TraceLabel_get_trace(label); BddEnc_ptr enc = Enc_get_bdd_encoding(); PropDb_ptr propDB = PropPkg_get_prop_database(); SexpFsm_ptr scalar_fsm = PropDb_master_get_scalar_sexp_fsm(propDB); from_trace = TraceManager_get_trace_at_index(global_trace_manager, from_trace_no); iter = TraceManager_get_iterator_from_label(global_trace_manager, label); state = TraceUtils_fetch_as_bdd(from_trace, iter, TRACE_ITER_SF_VARS, enc); /* create new trace copying from given one up to given iter */ new_trace = Trace_copy(from_trace, iter, false); Trace_set_desc(new_trace, "Simulation Trace"); Trace_set_type(new_trace, TRACE_TYPE_SIMULATION); /* Now the new label we get would be the label of the next * trace that is going to be registered. */ new_label = TraceLabel_create( TraceManager_get_size(global_trace_manager), TraceManager_get_abs_index_from_label(global_trace_manager, label)); new_trace_id = TraceManager_register_trace(global_trace_manager, new_trace); TraceManager_set_current_trace_number(global_trace_manager, new_trace_id); current_state_set(state, new_label); fprintf(nusmv_stdout, "The current state for new trace is:\n"); fprintf(nusmv_stdout, "-> State %d.%d <-\n", TraceLabel_get_trace(new_label)+1, TraceLabel_get_state(new_label)+1); BddEnc_print_bdd_begin(enc, SexpFsm_get_vars_list(scalar_fsm), true); set_indent_size(2); BddEnc_print_bdd(enc, state, (VPFNNF) NULL, nusmv_stdout); reset_indent_size(); BddEnc_print_bdd_end(enc); } else { fprintf(nusmv_stderr, "The label %d.%d is invalid.\n", TraceLabel_get_trace(label) + 1, TraceLabel_get_state(label) + 1); } } else { fprintf(nusmv_stderr, "Parsing error: expected " \ "\"goto_state <trace_number>.<state_number>\".\n"); status = 1; } } return status; }