diff --git a/elab_expr.cc b/elab_expr.cc index c80cf223b..f04be835c 100644 --- a/elab_expr.cc +++ b/elab_expr.cc @@ -1305,7 +1305,7 @@ unsigned PECallFunction::test_width_method_(Design*, NetScope*, if (debug_elaborate) { cerr << get_fileline() << ": PECallFunction::test_width_method_: " - << "search_results.path_item: " << search_results.path_item << endl; + << "search_results.path_head: " << search_results.path_head << endl; cerr << get_fileline() << ": PECallFunction::test_width_method_: " << "search_results.path_tail: " << search_results.path_tail << endl; if (search_results.net) @@ -1336,7 +1336,7 @@ unsigned PECallFunction::test_width_method_(Design*, NetScope*, // .x.size(); // In this example, x is a dynamic array. if (search_results.net && search_results.net->data_type()==IVL_VT_DARRAY - && search_results.path_item.index.empty()) { + && search_results.path_head.back().index.empty()) { NetNet*net = search_results.net; const netdarray_t*darray = net->darray_type(); @@ -1359,7 +1359,7 @@ unsigned PECallFunction::test_width_method_(Design*, NetScope*, // .x.size(); // In this example, x is a queue. if (search_results.net && search_results.net->data_type()==IVL_VT_QUEUE - && search_results.path_item.index.empty()) { + && search_results.path_head.back().index.empty()) { NetNet*net = search_results.net; const netdarray_t*darray = net->darray_type(); @@ -1392,7 +1392,7 @@ unsigned PECallFunction::test_width_method_(Design*, NetScope*, // x[e].len() is the length of the string. if (search_results.net && (search_results.net->data_type()==IVL_VT_QUEUE || search_results.net->data_type()==IVL_VT_DARRAY) - && search_results.path_item.index.size()) { + && search_results.path_head.back().index.size()) { NetNet*net = search_results.net; const netdarray_t*darray = net->darray_type(); @@ -1522,7 +1522,7 @@ unsigned PECallFunction::test_width(Design*des, NetScope*scope, cerr << get_fileline() << ": PECallFunction::test_width: " << "search_results.net: " << search_results.net->name() << endl; cerr << get_fileline() << ": PECallFunction::test_width: " - << "search_results.path_item: " << search_results.path_item << endl; + << "search_results.path_head: " << search_results.path_head << endl; cerr << get_fileline() << ": PECallFunction::test_width: " << "search_results.path_tail: " << search_results.path_tail << endl; } @@ -2611,7 +2611,7 @@ NetExpr* PECallFunction::elaborate_expr(Design*des, NetScope*scope, cerr << get_fileline() << ": PECallFunction::elaborate_expr: " << "search_results.par_val: " << *search_results.par_val << endl; cerr << get_fileline() << ": PECallFunction::elaborate_expr: " - << "search_results.path_item: " << search_results.path_item << endl; + << "search_results.path_head: " << search_results.path_head << endl; cerr << get_fileline() << ": PECallFunction::elaborate_expr: " << "search_results.path_tail: " << search_results.path_tail << endl; } @@ -2640,7 +2640,7 @@ NetExpr* PECallFunction::elaborate_expr(Design*des, NetScope*scope, } else { cerr << get_fileline() << ": error: " << "Object " << scope_path(search_results.scope) - << "." << search_results.path_item + << "." << search_results.path_head.back() << " has no method \"" << search_results.path_tail << "(...)\"." << endl; des->errors += 1; @@ -2648,7 +2648,7 @@ NetExpr* PECallFunction::elaborate_expr(Design*des, NetScope*scope, } } - cerr << get_fileline() << ": error: Object " << search_results.path_item + cerr << get_fileline() << ": error: Object " << search_results.path_head.back() << " in " << scope_path(search_results.scope) << " is not a function." << endl; des->errors += 1; @@ -2696,8 +2696,8 @@ NetExpr* PECallFunction::elaborate_expr(Design*des, NetScope*scope, } symbol_search_results use_search_results; use_search_results.scope = scope; - use_search_results.path_tail.push_back(search_results.path_item); - use_search_results.path_item = name_component_t(perm_string::literal(THIS_TOKEN)); + use_search_results.path_tail.push_back(search_results.path_head.back()); + use_search_results.path_head.push_back(name_component_t(perm_string::literal(THIS_TOKEN))); use_search_results.net = scope->find_signal(perm_string::literal(THIS_TOKEN)); ivl_assert(*this, use_search_results.net); @@ -2931,7 +2931,7 @@ unsigned PECallFunction::elaborate_arguments_(Design*des, NetScope*scope, * * .x.len() * - * Then net refers to object named x, and path_item is "x". The method is + * Then net refers to object named x, and path_head is ".x". The method is * "len" in path_tail, and if x is a string object, we can handle the case. */ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope, @@ -2957,7 +2957,7 @@ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope, cerr << get_fileline() << ": PECallFunction::elaborate_expr_method_: " << "search_results.scope: " << scope_path(search_results.scope) << endl; cerr << get_fileline() << ": PECallFunction::elaborate_expr_method_: " - << "search_results.path_item: " << search_results.path_item << endl; + << "search_results.path_head: " << search_results.path_head << endl; cerr << get_fileline() << ": PECallFunction::elaborate_expr_method_: " << "search_results.path_tail: " << search_results.path_tail << endl; if (search_results.net) @@ -2992,11 +2992,11 @@ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope, // If x is a queue of strings, then x[e] is a string. Elaborate the x[e] // expression and pass that to the len() method. if (search_results.net && search_results.net->data_type()==IVL_VT_QUEUE - && search_results.path_item.index.size()==1) { + && search_results.path_head.back().index.size()==1) { NetNet*net = search_results.net; const netdarray_t*darray = net->darray_type(); - const index_component_t&use_index = search_results.path_item.index.back(); + const index_component_t&use_index = search_results.path_head.back().index.back(); ivl_assert(*this, use_index.msb != 0); ivl_assert(*this, use_index.lsb == 0); @@ -3022,7 +3022,7 @@ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope, // Dynamic array methods. This handles the case that the located signal // is a dynamic array, and there is no index. if (search_results.net && search_results.net->data_type()==IVL_VT_DARRAY - && search_results.path_item.index.size()==0) { + && search_results.path_head.back().index.size()==0) { // Get the method name that we are looking for. perm_string method_name = search_results.path_tail.back().name; @@ -3047,7 +3047,7 @@ NetExpr* PECallFunction::elaborate_expr_method_(Design*des, NetScope*scope, // Queue methods. This handles the case that the located signal is a // QUEUE object, and there is a method. if (search_results.net && search_results.net->data_type()==IVL_VT_QUEUE - && search_results.path_item.index.size()==0) { + && search_results.path_head.back().index.size()==0) { // Get the method name that we are looking for. perm_string method_name = search_results.path_tail.back().name; diff --git a/netmisc.h b/netmisc.h index a8a4782f8..d0997f9f0 100644 --- a/netmisc.h +++ b/netmisc.h @@ -38,8 +38,8 @@ class netsarray_t; * * The search will stop when it finds a component in the path that is an * object of some sort (other then a scope. So for example, if a.b is an - * array, then the search for a.b[1].c will stop at a.b, leave b[1] in - * path_item, and "c" in path_tail. It is up to the caller to then note that + * array, then the search for a.b[1].c will stop at a.b, leave a.b[1] in + * path_head, and "c" in path_tail. It is up to the caller to then note that * "c" must be a method of some sort. */ struct symbol_search_results { @@ -84,17 +84,16 @@ struct symbol_search_results { // If this is a named event, ... NetEvent*eve; - // Store bread crumbs of the search here. The path_tail is the parts of - // the original path that were not found, or are after an object (and so - // are probably members or methods.) + // Store bread crumbs of the search here. The path_tail is the parts + // of the original path that were not found, or are after an object + // (and so are probably members or methods). pform_name_t path_tail; - // The path_item is the final name (possibly before the path_tail items) - // that identifies the object. This name may contain index - // expressions. Parts of the path left of the path_item name scopes, and - // should have all been resolved into the "scope" member above. If the - // search result is a scope, then this path_item is also the name of the - // scope identified. - name_component_t path_item; + // The path_head is the parts of the original path that were found. + // The last item in path_head is the final name (possibly before the + // path_tail items) that identifies the object. This name may contain + // index expressions. If the search result is a scope, then this name + // is also the name of the scope identified. + pform_name_t path_head; }; /* diff --git a/symbol_search.cc b/symbol_search.cc index 8565b00b7..fd4356ad7 100644 --- a/symbol_search.cc +++ b/symbol_search.cc @@ -151,23 +151,26 @@ bool symbol_search(const LineInfo*li, Design*des, NetScope*scope, // endmodule if (!passed_module_boundary) { if (NetNet*net = scope->find_signal(path_tail.name)) { + path.push_back(path_tail); res->scope = scope; res->net = net; - res->path_item = path_tail; + res->path_head = path; return true; } if (NetEvent*eve = scope->find_event(path_tail.name)) { + path.push_back(path_tail); res->scope = scope; res->eve = eve; - res->path_item = path_tail; + res->path_head = path; return true; } if (const NetExpr*par = scope->get_parameter(des, path_tail.name, res->par_type)) { + path.push_back(path_tail); res->scope = scope; res->par_val = par; - res->path_item = path_tail; + res->path_head = path; return true; } @@ -179,9 +182,10 @@ bool symbol_search(const LineInfo*li, Design*des, NetScope*scope, ivl_type_t prop_type = clsnet->get_prop_type(pidx); const netuarray_t*tmp_ua = dynamic_cast(prop_type); if (tmp_ua) prop_type = tmp_ua->element_type(); + path.push_back(path_tail); res->scope = scope; res->cls_val = prop_type; - res->path_item = path_tail; + res->path_head = path; return true; } } @@ -193,7 +197,7 @@ bool symbol_search(const LineInfo*li, Design*des, NetScope*scope, } // Could not find an object. Maybe this is a child scope name? If - // so, evaluate the path conponents to find the exact scope this + // so, evaluate the path components to find the exact scope this // refers to. This item might be: // .s // .s[n] @@ -208,8 +212,9 @@ bool symbol_search(const LineInfo*li, Design*des, NetScope*scope, if (flag) { cerr << li->get_fileline() << ": XXXXX: Errors evaluating scope index" << endl; } else if (NetScope*chld = scope->child(path_item)) { + path.push_back(path_tail); res->scope = chld; - res->path_item = path_tail; + res->path_head = path; return true; } } @@ -232,8 +237,9 @@ bool symbol_search(const LineInfo*li, Design*des, NetScope*scope, // foo by the name "foo" as well. In general, anything within // "foo" can use the name "foo" to reference it. if (scope->type()==NetScope::MODULE && scope->module_name()==path_tail.name) { + path.push_back(path_tail); res->scope = scope; - res->path_item = path_tail; + res->path_head = path; return true; } @@ -275,8 +281,9 @@ bool symbol_search(const LineInfo*li, Design*des, NetScope*scope, hname_t path_item (path_tail.name); scope = des->find_scope(path_item); if (scope) { + path.push_back(path_tail); res->scope = scope; - res->path_item = path_tail; + res->path_head = path; return true; } }