static void opt_tag_last_value_fcall(tree_t t) { tree_t decl = tree_ref(t); if (tree_attr_str(decl, builtin_i) != NULL) return; // A regular subprogram call may pass parameters as class signal which // could access 'LAST_VALUE in the body const int nports = tree_ports(decl); for (int i = 0; i < nports; i++) { tree_t port = tree_port(decl, i); if (tree_class(port) != C_SIGNAL) continue; tree_t value = tree_value(tree_param(t, i)); tree_kind_t kind; while ((kind = tree_kind(value)) != T_REF) { assert((kind == T_ARRAY_REF) || (kind == T_ARRAY_SLICE)); value = tree_value(value); } tree_add_attr_int(tree_ref(value), last_value_i, 1); } }
class_t class_of(tree_t t) { switch (tree_kind(t)) { case T_VAR_DECL: return C_VARIABLE; case T_SIGNAL_DECL: return C_SIGNAL; case T_CONST_DECL: return C_CONSTANT; case T_PORT_DECL: return tree_class(t); case T_ENUM_LIT: case T_GENVAR: case T_ALIAS: case T_FIELD_DECL: return C_DEFAULT; case T_UNIT_DECL: return C_UNITS; case T_ARCH: return C_ARCHITECTURE; case T_FUNC_DECL: case T_FUNC_BODY: return C_FUNCTION; case T_PROC_DECL: case T_PROC_BODY: return C_PROCEDURE; case T_ENTITY: return C_ENTITY; case T_TYPE_DECL: return C_TYPE; case T_FILE_DECL: return C_FILE; case T_PROCESS: case T_BLOCK: case T_FOR: return C_LABEL; case T_COMPONENT: return C_COMPONENT; case T_REF: return class_of(tree_ref(t)); case T_ARRAY_REF: case T_ARRAY_SLICE: case T_RECORD_REF: return class_of(tree_value(t)); case T_PACKAGE: return C_PACKAGE; case T_LIBRARY: return C_LIBRARY; case T_ELAB: return C_ELAB; default: fatal("missing class_of for %s", tree_kind_str(tree_kind(t))); } }
static void tree_model( GtkTreeStore *tree, struct UMLModel *model ) { struct ListLink *iter; GtkTreeIter child, class_child, package_child; gtk_tree_store_append(tree, &child, NULL); gtk_tree_store_set(tree, &child, COLUMN, nv_get_name(model), -1); gtk_tree_store_append(tree, &package_child, &child); gtk_tree_store_set(tree, &package_child, COLUMN, "Packages", -1); gtk_tree_store_append(tree, &class_child, &child); gtk_tree_store_set(tree, &class_child, COLUMN, "Classes", -1); for(iter = nv_list_front(&model->super.classes); iter; iter = nv_list_next(iter)) { struct UMLClass *c = NV_LIST_GET_DATA( iter, struct UMLClass, link ); tree_class( tree, &class_child, c ); } }
static map_list_t *elab_map(tree_t t, tree_t arch, tree_formals_t tree_Fs, tree_formal_t tree_F, tree_actuals_t tree_As, tree_actual_t tree_A) { tree_t unit = tree_ref(arch); assert(tree_kind(unit) == T_ENTITY); const int nformals = tree_Fs(unit); const int nactuals = (tree_As != NULL) ? tree_As(t) : 0; bool *have_formals = xmalloc(sizeof(bool) * nformals); for (int i = 0; i < nformals; i++) have_formals[i] = false; const int maxr = nformals + nactuals; tree_t *rformals = xmalloc(sizeof(tree_t) * maxr); tree_t *ractuals = xmalloc(sizeof(tree_t) * maxr); int count = 0; map_list_t *maps = NULL; for (int i = 0; i < nactuals; i++) { tree_t p = tree_A(t, i); tree_t formal = NULL; switch (tree_subkind(p)) { case P_POS: { const int pos = tree_pos(p); formal = tree_F(unit, pos); have_formals[pos] = true; } break; case P_NAMED: { ident_t name = elab_formal_name(tree_name(p)); for (int j = 0; j < nformals; j++) { tree_t port = tree_F(unit, j); if (tree_ident(port) == name) { formal = port; have_formals[j] = true; break; } } } break; default: assert(false); } assert(formal != NULL); switch (tree_class(formal)) { case C_SIGNAL: ractuals[count] = elab_signal_port(arch, formal, p, &maps); break; case C_CONSTANT: ractuals[count] = tree_value(p); break; default: assert(false); } rformals[count] = formal; count++; } // Assign default values for (unsigned i = 0; i < nformals; i++) { if (!have_formals[i]) { tree_t f = tree_F(unit, i); if (tree_has_value(f)) { rformals[count] = f; ractuals[count] = tree_value(f); count++; } } } assert(count <= maxr); if (count > 0) { rewrite_params_t params = { .formals = rformals, .actuals = ractuals, .count = count }; tree_rewrite(arch, rewrite_refs, ¶ms); tree_t ent = tree_ref(arch); if (tree_stmts(ent) > 0 || tree_decls(ent) > 0) tree_rewrite(ent, rewrite_refs, ¶ms); }