static void output_init(FILE *tbl_file) { int state[N]; GBgetInitialState(model, state); fprintf(tbl_file, "begin state\n"); for (int i = 0; i < N; i++) { fprint_ltsmin_ident(tbl_file, lts_type_get_state_name(ltstype, i)); fprintf(tbl_file, ":"); fprint_ltsmin_ident(tbl_file, lts_type_get_state_type(ltstype, i)); fprintf(tbl_file, (i == (N - 1))?"\n":" "); } fprintf(tbl_file,"end state\n"); fprintf(tbl_file,"begin edge\n"); for(int i = 0; i < eLbls; i++) { fprint_ltsmin_ident(tbl_file, lts_type_get_edge_label_name(ltstype, i)); fprintf(tbl_file, ":"); fprint_ltsmin_ident(tbl_file, lts_type_get_edge_label_type(ltstype, i)); fprintf(tbl_file, (i == (eLbls - 1))?"\n":" "); } fprintf(tbl_file, "end edge\n"); fprintf(tbl_file, "begin init\n"); for(int i = 0; i < N; i++) fprintf(tbl_file, "%d%s", state[i], (i == (N - 1))?"\n":" "); fprintf(tbl_file,"end init\n"); }
static void ltsmin_expr_lookup_value(ltsmin_expr_t top, ltsmin_expr_t e, int typeno, ltsmin_parse_env_t env, model_t model) { switch(e->node_type) { case VAR: case CHUNK: case INT: break; default: return; } chunk c; data_format_t format = lts_type_get_format(GBgetLTStype(model), typeno); switch (format) { case LTStypeDirect: case LTStypeRange: if (INT != e->node_type) Abort ("Expected an integer value for comparison: %s", LTSminPrintExpr(top, env)); break; case LTStypeEnum: case LTStypeChunk: c.data = env->buffer; c.len = LTSminSPrintExpr(c.data, e, env); HREassert (c.len < ENV_BUFFER_SIZE, "Buffer overflow in print expression"); lookup_type_value (e, typeno, c, model, format==LTStypeEnum); Debug ("Bound '%s' to %d in table for type '%s'", c.data, e->num, lts_type_get_state_type(GBgetLTStype(model),typeno)); break; } }
static char * str_slot (check_ctx_t *ctx, int *s, int i) { model_t model = ctx->parent; lts_type_t ltstype = GBgetLTStype (model); char *name = lts_type_get_state_name (ltstype, i); char *type = lts_type_get_state_type (ltstype, i); int typeno = lts_type_get_state_typeno (ltstype, i); int max = 4096; char *res = RTmalloc (max); int l = snprintf (res, max, "%s : %s = ", name, type); if (s != NULL) { print_chunk (model, res+l, max-l, typeno, s[i]); } else { res[l-2] = '\0'; } return res; }
/** * \brief Initialises the data structures for generating symbolic parity games. */ void init_spg(model_t model) { lts_type_t type = GBgetLTStype(model); var_pos = 0; var_type_no = 0; for(int i=0; i<N; i++) { //Printf(infoLong, "%d: %s (%d [%s])\n", i, lts_type_get_state_name(type, i), lts_type_get_state_typeno(type, i), lts_type_get_state_type(type, i)); #ifdef LTSMIN_PBES char* str1 = "string"; // for the PBES language module #else char* str1 = "mu"; // for the mu-calculus PINS layer #endif size_t strlen1 = strlen(str1); char* str2 = lts_type_get_state_type(type, i); size_t strlen2 = strlen(str2); if (strlen1==strlen2 && strncmp(str1, str2, strlen1)==0) { var_pos = i; var_type_no = lts_type_get_state_typeno(type, i); if (GBhaveMucalc()) { true_index = 0; // enforced by mucalc parser (mucalc-grammar.lemon / mucalc-syntax.c) false_index = 1; } else { // required for the PBES language module. true_index = pins_chunk_put (model, var_type_no, chunk_str("true")); false_index = pins_chunk_put (model, var_type_no, chunk_str("false")); } } } int p_len = 1; int proj[1] = {var_pos}; // position 0 encodes the variable variable_projection = vproj_create(domain, p_len, proj); num_vars = pins_chunk_count (model, var_type_no); // number of propositional variables if (GBhaveMucalc()) { num_vars = GBgetMucalcNodeCount(); // number of mu-calculus subformulae } Print(infoLong, "init_spg: var_type_no=%d, num_vars=%zu", var_type_no, num_vars); priority = RTmalloc(num_vars * sizeof(int)); // priority of variables player = RTmalloc(num_vars * sizeof(int)); // player of variables for(size_t i=0; i<num_vars; i++) { lts_type_t type = GBgetLTStype(model); int state_length = lts_type_get_state_length(type); // create dummy state with variable i: int state[state_length]; for(int j=0; j < state_length; j++) { state[j] = 0; } state[var_pos] = i; int label = GBgetStateLabelLong(model, PG_PRIORITY, state); // priority priority[i] = label; if (label < min_priority) { min_priority = label; } if (label > max_priority) { max_priority = label; } //Print(infoLong, " label %d (priority): %d", 0, label); label = GBgetStateLabelLong(model, PG_PLAYER, state); // player player[i] = label; //Print(infoLong, " label %d (player): %d", 1, label); } true_states = vset_create(domain, -1, NULL); false_states = vset_create(domain, -1, NULL); }