00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00038 #ifndef __NUSMV_CORE_TRACE_TRACE_PRIVATE_H__
00039 #define __NUSMV_CORE_TRACE_TRACE_PRIVATE_H__
00040
00041 #include "nusmv/core/trace/Trace.h"
00042 #include "nusmv/core/utils/array.h"
00043 #include "nusmv/core/utils/error.h"
00044 #include "nusmv/core/utils/assoc.h"
00045 #include "nusmv/core/utils/EnvObject_private.h"
00046
00047
00048
00049
00050 typedef enum TraceSection_TAG {
00051
00052 TRACE_SECTION_INVALID = 0,
00053
00054 TRACE_SECTION_FROZEN_VAR, TRACE_SECTION_STATE_VAR,
00055 TRACE_SECTION_INPUT_VAR, TRACE_SECTION_STATE_DEFINE,
00056 TRACE_SECTION_INPUT_DEFINE, TRACE_SECTION_STATE_INPUT_DEFINE,
00057 TRACE_SECTION_NEXT_DEFINE, TRACE_SECTION_STATE_NEXT_DEFINE,
00058 TRACE_SECTION_INPUT_NEXT_DEFINE, TRACE_SECTION_STATE_INPUT_NEXT_DEFINE,
00059
00060
00061 TRACE_SECTION_END,
00062 } TraceSection;
00063
00064
00065
00072 typedef struct TraceFrozenFrame_TAG* TraceFrozenFrame_ptr;
00073
00080 typedef struct TraceVarFrame_TAG* TraceVarFrame_ptr;
00081
00088 typedef struct TraceDefineFrame_TAG* TraceDefineFrame_ptr;
00089
00119 typedef struct Trace_TAG
00120 {
00121 INHERITS_FROM(EnvObject);
00122
00123
00124 TraceType type;
00125 const char* desc;
00126 int id;
00127
00128 unsigned length;
00129 boolean frozen;
00130 boolean is_volatile;
00131
00132 boolean allow_bits;
00133
00134 SymbTable_ptr st;
00135
00136 NodeList_ptr symbols;
00137 NodeList_ptr s_vars;
00138 NodeList_ptr sf_vars;
00139 NodeList_ptr i_vars;
00140
00141
00142 TraceVarFrame_ptr first_frame;
00143 TraceVarFrame_ptr last_frame;
00144
00145
00146 TraceFrozenFrame_ptr frozen_frame;
00147
00148
00149 unsigned n_buckets[TRACE_SECTION_END];
00150 node_ptr* buckets[TRACE_SECTION_END];
00151
00152
00153 hash_ptr symb2section;
00154 hash_ptr symb2address;
00155 hash_ptr symb2layername;
00156
00157 } Trace;
00158
00159
00160 typedef struct TraceVarFrame_TAG
00161 {
00162
00163 node_ptr* state_values;
00164 node_ptr* input_values;
00165
00166
00167 boolean loopback;
00168
00169
00170 TraceDefineFrame_ptr fwd_define_frame;
00171 TraceDefineFrame_ptr bwd_define_frame;
00172
00173
00174 TraceVarFrame_ptr next_frame;
00175 TraceVarFrame_ptr prev_frame;
00176 } TraceVarFrame;
00177
00178 typedef struct TraceFrozenFrame_TAG
00179 {
00180 node_ptr* frozen_values;
00181
00182 } TraceFrozenFrame;
00183
00184 typedef struct TraceDefineFrame_TAG
00185 {
00186 node_ptr* s_values;
00187 node_ptr* i_values;
00188 node_ptr* si_values;
00189 node_ptr* n_values;
00190 node_ptr* sn_values;
00191 node_ptr* in_values;
00192 node_ptr* sin_values;
00193 } TraceDefineFrame;
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 #undef CHECK
00205 #if defined TRACE_DEBUG
00206
00212 #define CHECK(cond) nusmv_assert(cond)
00213 #else
00214 #define CHECK(cond)
00215 #endif
00216
00222 #define TRACE_VAR_FRAME(x) \
00223 ((TraceVarFrame_ptr) x)
00224
00230 #define TRACE_DEFINE_FRAME(x) \
00231 ((TraceDefineFrame_ptr) x)
00232
00238 #define TRACE_FROZEN_FRAME(x) \
00239 ((TraceFrozenFrame_ptr) x)
00240
00246 #define TRACE_VAR_FRAME_CHECK_INSTANCE(x) \
00247 (nusmv_assert(TRACE_VAR_FRAME(x) != TRACE_VAR_FRAME(NULL)))
00248
00254 #define TRACE_DEFINE_FRAME_CHECK_INSTANCE(x) \
00255 (nusmv_assert(TRACE_DEFINE_FRAME(x) != TRACE_DEFINE_FRAME(NULL)))
00256
00262 #define TRACE_FROZEN_FRAME_CHECK_INSTANCE(x) \
00263 (nusmv_assert(TRACE_FROZEN_FRAME(x) != TRACE_FROZEN_FRAME(NULL)))
00264
00267
00268
00269
00270
00276 Trace_ptr
00277 trace_create(SymbTable_ptr st, const char* desc,
00278 const TraceType type, NodeList_ptr symbols,
00279 boolean is_volatile,
00280 boolean allow_bits);
00281
00288 Trace_ptr
00289 trace_copy(Trace_ptr self, TraceIter until_here,
00290 boolean is_volatile);
00291
00298 boolean
00299 trace_is_volatile(const Trace_ptr self);
00300
00307 boolean
00308 trace_equals(const Trace_ptr self, const Trace_ptr other);
00309
00316 Trace_ptr
00317 trace_concat(Trace_ptr self, Trace_ptr* other);
00318
00325 void
00326 trace_destroy(Trace_ptr self);
00327
00334 boolean
00335 trace_symbol_fwd_lookup(Trace_ptr self, node_ptr symb,
00336 TraceSection* section, unsigned* index);
00337
00344 node_ptr
00345 trace_symbol_bwd_lookup(Trace_ptr self, TraceSection section,
00346 unsigned offset);
00347
00354 TraceIter
00355 trace_append_step(Trace_ptr self);
00356
00363 boolean
00364 trace_step_is_loopback(const Trace_ptr self, const TraceIter step);
00365
00372 boolean
00373 trace_step_test_loopback(Trace_ptr self, const TraceIter step);
00374
00381 void
00382 trace_step_force_loopback(const Trace_ptr self, TraceIter step);
00383
00390 boolean
00391 trace_is_frozen(const Trace_ptr self);
00392
00399 boolean
00400 trace_is_thawed(const Trace_ptr self);
00401
00408 void
00409 trace_freeze(Trace_ptr self);
00410
00417 void
00418 trace_thaw(Trace_ptr self);
00419
00426 boolean
00427 trace_symbol_in_language(const Trace_ptr self, const node_ptr symb);
00428
00435 SymbCategory
00436 trace_symbol_get_category(Trace_ptr self, node_ptr symb);
00437
00444 const char*
00445 trace_get_layer_from_symb(const Trace_ptr self, const node_ptr symb);
00446
00453 boolean
00454 trace_symbol_is_assigned(const Trace_ptr self,
00455 const TraceIter step, node_ptr symb);
00456
00463 boolean
00464 trace_step_put_value(Trace_ptr self, const TraceIter step,
00465 const node_ptr symb, const node_ptr value);
00466
00473 node_ptr
00474 trace_step_get_value(const Trace_ptr self, const TraceIter step,
00475 const node_ptr symb);
00476
00483 boolean
00484 trace_is_complete_vars(const Trace_ptr self, const NodeList_ptr vars,
00485 FILE* report_stream);
00486
00487
00488
00495 TraceIter
00496 trace_first_iter(const Trace_ptr self);
00497
00504 TraceIter
00505 trace_ith_iter(const Trace_ptr self, unsigned i);
00506
00513 TraceIter
00514 trace_last_iter(const Trace_ptr self);
00515
00522 unsigned
00523 trace_iter_i(const Trace_ptr self, TraceIter iter);
00524
00530 TraceIter
00531 trace_iter_get_next(const TraceIter iter);
00532
00538 TraceIter
00539 trace_iter_get_prev(const TraceIter iter);
00540
00541
00542
00549 TraceStepIter
00550 trace_step_iter(const Trace_ptr self, const TraceIter step,
00551 TraceIteratorType iter_type);
00552
00558 boolean
00559 trace_step_iter_fetch(TraceStepIter* step_iter,
00560 node_ptr* symb, node_ptr* value);
00561
00568 TraceSymbolsIter
00569 trace_symbols_iter(const Trace_ptr self, TraceIteratorType iter_type);
00570
00576 boolean
00577 trace_symbols_iter_fetch(TraceSymbolsIter* symbols_iter,
00578 node_ptr* symb);
00579
00580
00581
00588 unsigned
00589 trace_get_length(const Trace_ptr self);
00590
00597 boolean
00598 trace_is_empty(const Trace_ptr self);
00599
00606 NodeList_ptr
00607 trace_get_symbols(const Trace_ptr self);
00608
00615 NodeList_ptr
00616 trace_get_s_vars(const Trace_ptr self);
00617
00624 NodeList_ptr
00625 trace_get_sf_vars(const Trace_ptr self);
00626
00633 NodeList_ptr
00634 trace_get_i_vars(const Trace_ptr self);
00635
00642 SymbTable_ptr
00643 trace_get_symb_table(Trace_ptr self);
00644
00651 void
00652 trace_register(Trace_ptr self, int id);
00653
00660 void
00661 trace_unregister(Trace_ptr self);
00662
00669 boolean
00670 trace_is_registered(Trace_ptr self);
00671
00678 int
00679 trace_get_id(const Trace_ptr self);
00680
00687 TraceType
00688 trace_get_type(const Trace_ptr self);
00689
00696 void
00697 trace_set_type(Trace_ptr self, TraceType trace_type);
00698
00705 const char*
00706 trace_get_desc(const Trace_ptr self);
00707
00714 void
00715 trace_set_desc(Trace_ptr self, const char* desc);
00716
00739 void
00740 trace_step_evaluate_defines(Trace_ptr self, const TraceIter step);
00741
00748 boolean
00749 trace_step_check_defines(Trace_ptr self, const TraceIter step,
00750 NodeList_ptr failures);
00751
00752
00753
00759 SymbCategory
00760 trace_section_to_category(const TraceSection section);
00761
00767 TraceSection
00768 trace_category_to_section(const SymbCategory category);
00769
00775 const char*
00776 trace_symb_category_to_string(const SymbCategory category);
00777
00780 #endif