Refactoring of the netlist compare code

This commit is contained in:
Matthias Koefferlein 2021-08-01 20:39:16 +02:00
parent 52c79feeed
commit 822709dd5a
4 changed files with 114 additions and 99 deletions

View File

@ -887,7 +887,7 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2,
// derive new identities through topology: first collect all nets with the same topological signature
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > nodes, other_nodes;
std::vector<NodeEdgePair> nodes, other_nodes;
std::vector<NetGraphNode::edge_type> no_edges;
no_edges.push_back (NetGraphNode::edge_type ());
@ -895,24 +895,24 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2,
nodes.reserve (g1.end () - g1.begin ());
for (db::NetGraph::node_iterator i1 = g1.begin (); i1 != g1.end (); ++i1) {
if (! i1->has_other () && i1->net ()) {
nodes.push_back (std::make_pair (i1.operator-> (), no_edges.begin ()));
nodes.push_back (NodeEdgePair (i1.operator-> (), no_edges.begin ()));
}
}
other_nodes.reserve (g2.end () - g2.begin ());
for (db::NetGraph::node_iterator i2 = g2.begin (); i2 != g2.end (); ++i2) {
if (! i2->has_other () && i2->net ()) {
other_nodes.push_back (std::make_pair (i2.operator-> (), no_edges.begin ()));
other_nodes.push_back (NodeEdgePair (i2.operator-> (), no_edges.begin ()));
}
}
if (nodes.empty () || other_nodes.empty ()) {
// active mismatched nodes give an error
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator n = nodes.begin (); n != nodes.end () && good; ++n) {
good = is_passive_net (n->first->net (), c12_circuit_and_pin_mapping);
for (std::vector<NodeEdgePair>::const_iterator n = nodes.begin (); n != nodes.end () && good; ++n) {
good = is_passive_net (n->node->net (), c12_circuit_and_pin_mapping);
}
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator n = other_nodes.begin (); n != other_nodes.end () && good; ++n) {
good = is_passive_net (n->first->net (), c22_circuit_and_pin_mapping);
for (std::vector<NodeEdgePair >::const_iterator n = other_nodes.begin (); n != other_nodes.end () && good; ++n) {
good = is_passive_net (n->node->net (), c22_circuit_and_pin_mapping);
}
if (db::NetlistCompareGlobalOptions::options ()->debug_netcompare) {
tl::info << "Stopped with " << nodes.size () << "/" << other_nodes.size () << " nodes left unresolved " << (good ? "(accepted)" : "(not accepted)");
@ -921,8 +921,8 @@ NetlistComparer::compare_circuits (const db::Circuit *c1, const db::Circuit *c2,
break;
}
std::sort (nodes.begin (), nodes.end (), CompareNodePtrFromNodeEdgePair ());
std::sort (other_nodes.begin (), other_nodes.end (), CompareNodePtrFromNodeEdgePair ());
std::sort (nodes.begin (), nodes.end (), CompareNodeEdgePair ());
std::sort (other_nodes.begin (), other_nodes.end (), CompareNodeEdgePair ());
CompareData data;
data.graph = &g1;
@ -1758,7 +1758,7 @@ NetlistComparer::join_symmetric_nets (db::Circuit *circuit)
// nodes are identical if the attached devices and circuits are of the same kind and with the same parameters
// and connect to other nodes in identical configurations.
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > nodes;
std::vector<NodeEdgePair> nodes;
std::vector<NetGraphNode::edge_type> no_edges;
no_edges.push_back (NetGraphNode::edge_type ());
@ -1766,28 +1766,28 @@ NetlistComparer::join_symmetric_nets (db::Circuit *circuit)
nodes.reserve (graph.end () - graph.begin ());
for (db::NetGraph::node_iterator i = graph.begin (); i != graph.end (); ++i) {
if (! i->has_other () && i->net ()) {
nodes.push_back (std::make_pair (i.operator-> (), no_edges.begin ()));
nodes.push_back (NodeEdgePair (i.operator-> (), no_edges.begin ()));
}
}
std::sort (nodes.begin (), nodes.end (), CompareNodePtrFromNodeEdgePair ());
std::sort (nodes.begin (), nodes.end (), CompareNodeEdgePair ());
// Identical nodes leading to the same nodes on the other side are candidates for symmetry.
tl::equivalence_clusters<const NetGraphNode *> identical_nodes;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator np = nodes.begin (); np + 1 != nodes.end (); ++np) {
if (*np[0].first == *np[1].first) {
identical_nodes.same (np[0].first, np[1].first);
for (std::vector<NodeEdgePair>::const_iterator np = nodes.begin (); np + 1 != nodes.end (); ++np) {
if (*np[0].node == *np[1].node) {
identical_nodes.same (np[0].node, np[1].node);
}
}
std::vector<std::set<size_t> > symmetry_groups;
std::set<size_t> visited;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator np = nodes.begin (); np != nodes.end (); ++np) {
for (std::vector<NodeEdgePair>::const_iterator np = nodes.begin (); np != nodes.end (); ++np) {
size_t node_id = graph.node_index_for_net (np[0].first->net ());
size_t node_id = graph.node_index_for_net (np[0].node->net ());
if (visited.find (node_id) != visited.end ()) {
continue;
}

View File

@ -350,8 +350,8 @@ static bool edges_are_compatible (const NetGraphNode::edge_type &e, const NetGra
*/
struct NodeRange
{
NodeRange (size_t _num1, std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator _n1, std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator _nn1,
size_t _num2, std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator _n2, std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator _nn2)
NodeRange (size_t _num1, std::vector<NodeEdgePair>::iterator _n1, std::vector<NodeEdgePair>::iterator _nn1,
size_t _num2, std::vector<NodeEdgePair>::iterator _n2, std::vector<NodeEdgePair>::iterator _nn2)
: num1 (_num1), num2 (_num2), n1 (_n1), nn1 (_nn1), n2 (_n2), nn2 (_nn2)
{
// .. nothing yet ..
@ -366,7 +366,7 @@ struct NodeRange
}
size_t num1, num2;
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator n1, nn1, n2, nn2;
std::vector<NodeEdgePair>::iterator n1, nn1, n2, nn2;
};
// --------------------------------------------------------------------------------------------------------------------
@ -377,10 +377,10 @@ NetlistCompareCore::derive_node_identities_for_edges (NetGraphNode::edge_iterato
{
// NOTE: we can skip edges to known nodes because we did a pre-analysis making sure those are compatible
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > nodes;
std::vector<NodeEdgePair> nodes;
nodes.reserve (ee - e);
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > other_nodes;
std::vector<NodeEdgePair> other_nodes;
other_nodes.reserve (ee - e);
tl_assert (e->first == e_other->first);
@ -389,7 +389,7 @@ NetlistCompareCore::derive_node_identities_for_edges (NetGraphNode::edge_iterato
if (i->second.first != net_index) {
const NetGraphNode *nn = &data->graph->node (i->second.first);
if (! nn->has_other ()) {
nodes.push_back (std::make_pair (nn, i));
nodes.push_back (NodeEdgePair (nn, i));
}
}
}
@ -400,7 +400,7 @@ NetlistCompareCore::derive_node_identities_for_edges (NetGraphNode::edge_iterato
if (i->second.first != other_net_index) {
const NetGraphNode *nn = &data->other_graph->node (i->second.first);
if (! nn->has_other ()) {
other_nodes.push_back (std::make_pair (nn, i));
other_nodes.push_back (NodeEdgePair (nn, i));
}
}
}
@ -411,8 +411,8 @@ NetlistCompareCore::derive_node_identities_for_edges (NetGraphNode::edge_iterato
return 0;
}
std::sort (nodes.begin (), nodes.end (), CompareNodePtrFromNodeEdgePair ());
std::sort (other_nodes.begin (), other_nodes.end (), CompareNodePtrFromNodeEdgePair ());
std::sort (nodes.begin (), nodes.end (), CompareNodeEdgePair ());
std::sort (other_nodes.begin (), other_nodes.end (), CompareNodeEdgePair ());
size_t new_nodes = 0;
@ -424,30 +424,30 @@ NetlistCompareCore::derive_node_identities_for_edges (NetGraphNode::edge_iterato
bool first = true;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i = nodes.begin (); i != nodes.end (); ++i) {
const NetGraphNode *nn = i->first;
for (std::vector<NodeEdgePair>::const_iterator i = nodes.begin (); i != nodes.end (); ++i) {
const NetGraphNode *nn = i->node;
if (first) {
tl::info << nl_compare_debug_indent (depth) << " here: " << (data->graph->node (net_index).net () ? data->graph->node (net_index).net ()->expanded_name ().c_str () : "(null)") << " ->";
first = false;
}
tl::info << nl_compare_debug_indent (depth) << " " << (nn->net () ? nn->net ()->expanded_name ().c_str() : "(null)") << " via: " << tl::noendl;
for (std::vector<Transition>::const_iterator t = i->second->first.begin (); t != i->second->first.end(); ++t) {
tl::info << (t != i->second->first.begin () ? "; " : "") << t->to_string() << tl::noendl;
for (std::vector<Transition>::const_iterator t = i->edge->first.begin (); t != i->edge->first.end(); ++t) {
tl::info << (t != i->edge->first.begin () ? "; " : "") << t->to_string() << tl::noendl;
}
tl::info << "";
}
first = true;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i = other_nodes.begin (); i != other_nodes.end (); ++i) {
const NetGraphNode *nn = i->first;
for (std::vector<NodeEdgePair>::const_iterator i = other_nodes.begin (); i != other_nodes.end (); ++i) {
const NetGraphNode *nn = i->node;
if (first) {
tl::info << nl_compare_debug_indent (depth) << " there: " << (data->other_graph->node (other_net_index).net () ? data->other_graph->node (other_net_index).net ()->expanded_name ().c_str () : "(null)") << " ->";
first = false;
}
tl::info << nl_compare_debug_indent(depth) << " " << (nn->net() ? nn->net()->expanded_name().c_str() : "(null)") << " via: " << tl::noendl;
for (std::vector<Transition>::const_iterator t = i->second->first.begin (); t != i->second->first.end(); ++t) {
tl::info << (t != i->second->first.begin () ? "; " : "") << t->to_string() << tl::noendl;
for (std::vector<Transition>::const_iterator t = i->edge->first.begin (); t != i->edge->first.end(); ++t) {
tl::info << (t != i->edge->first.begin () ? "; " : "") << t->to_string() << tl::noendl;
}
tl::info << "";
}
@ -468,7 +468,7 @@ NetlistCompareCore::derive_node_identities_for_edges (NetGraphNode::edge_iterato
// 1:1 pairing is less strict
if (nodes.size () > 1 || other_nodes.size () > 1) {
for (size_t i = 0; i < nodes.size (); ++i) {
if (! (*nodes[i].first == *other_nodes[i].first)) {
if (! (*nodes[i].node == *other_nodes[i].node)) {
if (db::NetlistCompareGlobalOptions::options ()->debug_netcompare) {
tl::info << nl_compare_debug_indent(depth) << "=> rejected branch.";
}
@ -704,10 +704,10 @@ namespace {
struct SortNodeByNet
{
public:
bool operator() (const std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> &a, const std::pair<const NetGraphNode *, NetGraphNode::edge_iterator>b) const
bool operator() (const NodeEdgePair &a, const NodeEdgePair &b) const
{
tl_assert (a.first->net () && b.first->net ());
return name_compare (a.first->net (), b.first->net ()) < 0;
tl_assert (a.node->net () && b.node->net ());
return name_compare (a.node->net (), b.node->net ()) < 0;
}
};
@ -718,12 +718,12 @@ static void sort_node_range_by_best_match (const NodeRange &nr)
std::stable_sort (nr.n1, nr.nn1, SortNodeByNet ());
std::stable_sort (nr.n2, nr.nn2, SortNodeByNet ());
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > nomatch1, nomatch2;
std::vector<NodeEdgePair> nomatch1, nomatch2;
nomatch1.reserve (nr.nn1 - nr.n1);
nomatch2.reserve (nr.nn2 - nr.n2);
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i = nr.n1, j = nr.n2;
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator iw = nr.n1, jw = nr.n2;
std::vector<NodeEdgePair>::const_iterator i = nr.n1, j = nr.n2;
std::vector<NodeEdgePair>::iterator iw = nr.n1, jw = nr.n2;
SortNodeByNet compare;
@ -790,45 +790,45 @@ NetlistCompareCore::derive_node_identities_from_ambiguity_group (const NodeRange
TentativeNodeMapping tn_temp;
// collect and mark the ambiguity combinations to consider
std::vector<std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator> iters1, iters2;
std::vector<std::vector<NodeEdgePair>::const_iterator> iters1, iters2;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i1 = nr.n1; i1 != nr.nn1; ++i1) {
if (! i1->first->has_any_other ()) {
for (std::vector<NodeEdgePair>::const_iterator i1 = nr.n1; i1 != nr.nn1; ++i1) {
if (! i1->node->has_any_other ()) {
iters1.push_back (i1);
size_t ni = data->graph->node_index_for_net (i1->first->net ());
size_t ni = data->graph->node_index_for_net (i1->node->net ());
TentativeNodeMapping::map_to_unknown (&tn_temp, data->graph, ni);
}
}
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i2 = nr.n2; i2 != nr.nn2; ++i2) {
if (! i2->first->has_any_other ()) {
for (std::vector<NodeEdgePair>::const_iterator i2 = nr.n2; i2 != nr.nn2; ++i2) {
if (! i2->node->has_any_other ()) {
iters2.push_back (i2);
size_t other_ni = data->other_graph->node_index_for_net (i2->first->net ());
size_t other_ni = data->other_graph->node_index_for_net (i2->node->net ());
TentativeNodeMapping::map_to_unknown (&tn_temp, data->other_graph, other_ni);
}
}
for (std::vector<std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator>::const_iterator ii1 = iters1.begin (); ii1 != iters1.end (); ++ii1) {
for (std::vector<std::vector<NodeEdgePair>::const_iterator>::const_iterator ii1 = iters1.begin (); ii1 != iters1.end (); ++ii1) {
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i1 = *ii1;
std::vector<NodeEdgePair>::const_iterator i1 = *ii1;
// use net names to resolve ambiguities or for passive nets
// (Rationale for the latter: passive nets cannot be told apart topologically and are typical for blackbox models.
// So the net name is the only differentiator)
bool use_name = ! data->dont_consider_net_names || i1->first->net ()->is_passive ();
bool use_name = ! data->dont_consider_net_names || i1->node->net ()->is_passive ();
// in tentative mode, reject this choice if nets are named and all other nets in the ambiguity group differ -> this favors net matching by name
if (use_name && tentative) {
bool any_matching = false;
for (std::vector<std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator>::iterator ii2 = iters2.begin (); ii2 != iters2.end () && ! any_matching; ++ii2) {
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i2 = *ii2;
any_matching = !net_names_are_different (i1->first->net (), i2->first->net ());
for (std::vector<std::vector<NodeEdgePair>::const_iterator>::iterator ii2 = iters2.begin (); ii2 != iters2.end () && ! any_matching; ++ii2) {
std::vector<NodeEdgePair>::const_iterator i2 = *ii2;
any_matching = !net_names_are_different (i1->node->net (), i2->node->net ());
}
if (! any_matching) {
if (db::NetlistCompareGlobalOptions::options ()->debug_netcompare) {
tl::info << indent_s << "ambiguity group rejected - all ambiguous other net names are mismatching for: " << i1->first->net ()->expanded_name ();
tl::info << indent_s << "ambiguity group rejected - all ambiguous other net names are mismatching for: " << i1->node->net ()->expanded_name ();
}
// a mismatch - stop here.
return failed_match;
@ -837,27 +837,27 @@ NetlistCompareCore::derive_node_identities_from_ambiguity_group (const NodeRange
}
bool any = false;
std::vector<std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator>::iterator to_remove = iters2.end ();
std::vector<std::vector<NodeEdgePair>::const_iterator>::iterator to_remove = iters2.end ();
for (std::vector<std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator>::iterator ii2 = iters2.begin (); ii2 != iters2.end (); ++ii2) {
for (std::vector<std::vector<NodeEdgePair>::const_iterator>::iterator ii2 = iters2.begin (); ii2 != iters2.end (); ++ii2) {
++progress;
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i2 = *ii2;
std::vector<NodeEdgePair>::const_iterator i2 = *ii2;
// try this candidate in tentative mode
if (db::NetlistCompareGlobalOptions::options ()->debug_netcompare) {
tl::info << indent_s << "trying in tentative mode: " << i1->first->net ()->expanded_name () << " vs. " << i2->first->net ()->expanded_name ();
tl::info << indent_s << "trying in tentative mode: " << i1->node->net ()->expanded_name () << " vs. " << i2->node->net ()->expanded_name ();
}
if (! edges_are_compatible (*i1->second, *i2->second, *data->device_equivalence, *data->subcircuit_equivalence)) {
if (! edges_are_compatible (*i1->edge, *i2->edge, *data->device_equivalence, *data->subcircuit_equivalence)) {
if (db::NetlistCompareGlobalOptions::options ()->debug_netcompare) {
tl::info << indent_s << "=> rejected because edges are incompatible with already established device or subcircuit equivalences";
}
continue;
}
if (use_name && net_names_are_equal (i1->first->net (), i2->first->net ())) {
if (use_name && net_names_are_equal (i1->node->net (), i2->node->net ())) {
if (db::NetlistCompareGlobalOptions::options ()->debug_netcompare) {
tl::info << indent_s << "=> accepted for identical names";
@ -865,15 +865,15 @@ NetlistCompareCore::derive_node_identities_from_ambiguity_group (const NodeRange
// utilize net names to propose a match
new_nodes += 1;
pairs.push_back (std::make_pair (i1->first, i2->first));
pairs.push_back (std::make_pair (i1->node, i2->node));
to_remove = ii2;
any = true;
break;
} else {
size_t ni = data->graph->node_index_for_net (i1->first->net ());
size_t other_ni = data->other_graph->node_index_for_net (i2->first->net ());
size_t ni = data->graph->node_index_for_net (i1->node->net ());
size_t other_ni = data->other_graph->node_index_for_net (i2->node->net ());
TentativeNodeMapping tn;
TentativeNodeMapping::map_pair_from_unknown (&tn, data->graph, ni, data->other_graph, other_ni, dm, dm_other, *data->device_equivalence, scm, scm_other, *data->subcircuit_equivalence, depth);
@ -891,7 +891,7 @@ NetlistCompareCore::derive_node_identities_from_ambiguity_group (const NodeRange
// there is already a known pair, so we can mark *i2 and the previous *i2 as equivalent
// (makes them ambiguous)
equivalent_other_nodes.same (i2->first, pairs.back ().second);
equivalent_other_nodes.same (i2->node, pairs.back ().second);
// we know enough now ...
break;
@ -899,7 +899,7 @@ NetlistCompareCore::derive_node_identities_from_ambiguity_group (const NodeRange
// identified a new pair
new_nodes += bt_count + 1;
pairs.push_back (std::make_pair (i1->first, i2->first));
pairs.push_back (std::make_pair (i1->node, i2->node));
to_remove = ii2;
any = true;
@ -923,10 +923,10 @@ NetlistCompareCore::derive_node_identities_from_ambiguity_group (const NodeRange
// need to lock the current pairs resources such as devices by listing them in the mapping. This is doing by "derive_*_equivalence" inside
// TentativeNodeMapping::map_pair
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i2 = *to_remove;
std::vector<NodeEdgePair>::const_iterator i2 = *to_remove;
size_t ni = data->graph->node_index_for_net (i1->first->net ());
size_t other_ni = data->other_graph->node_index_for_net (i2->first->net ());
size_t ni = data->graph->node_index_for_net (i1->node->net ());
size_t other_ni = data->other_graph->node_index_for_net (i2->node->net ());
TentativeNodeMapping::map_pair (&tn_temp, data->graph, ni, data->other_graph, other_ni, dm, dm_other, *data->device_equivalence, scm, scm_other, *data->subcircuit_equivalence, depth);
@ -1114,7 +1114,7 @@ NetlistCompareCore::derive_node_identities_from_singular_match (const NetGraphNo
}
size_t
NetlistCompareCore::derive_node_identities_from_node_set (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > &nodes, std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > &other_nodes, size_t depth, size_t n_branch, TentativeNodeMapping *tentative, CompareData *data)
NetlistCompareCore::derive_node_identities_from_node_set (std::vector<NodeEdgePair> &nodes, std::vector<NodeEdgePair> &other_nodes, size_t depth, size_t n_branch, TentativeNodeMapping *tentative, CompareData *data)
{
std::string indent_s;
if (db::NetlistCompareGlobalOptions::options ()->debug_netcompare) {
@ -1131,21 +1131,21 @@ NetlistCompareCore::derive_node_identities_from_node_set (std::vector<std::pair<
DeviceMapperForTargetNode dm;
SubCircuitMapperForTargetNode scm;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i = nodes.begin (); i != nodes.end (); ++i) {
dm.insert (*i->second);
scm.insert (*i->second);
for (std::vector<NodeEdgePair>::const_iterator i = nodes.begin (); i != nodes.end (); ++i) {
dm.insert (*i->edge);
scm.insert (*i->edge);
}
DeviceMapperForTargetNode dm_other;
SubCircuitMapperForTargetNode scm_other;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i = other_nodes.begin (); i != other_nodes.end (); ++i) {
dm_other.insert (*i->second);
scm_other.insert (*i->second);
for (std::vector<NodeEdgePair>::const_iterator i = other_nodes.begin (); i != other_nodes.end (); ++i) {
dm_other.insert (*i->edge);
scm_other.insert (*i->edge);
}
if (nodes.size () == 1 && other_nodes.size () == 1) {
return derive_node_identities_from_singular_match (nodes.front ().first, nodes.front ().second, other_nodes.front ().first, other_nodes.front ().second,
return derive_node_identities_from_singular_match (nodes.front ().node, nodes.front ().edge, other_nodes.front ().node, other_nodes.front ().edge,
dm, dm_other, scm, scm_other, depth, n_branch, tentative, data, false /*don't consider net names*/);
}
@ -1155,43 +1155,43 @@ NetlistCompareCore::derive_node_identities_from_node_set (std::vector<std::pair<
std::vector<NodeRange> node_ranges;
size_t new_nodes = 0;
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator n1 = nodes.begin ();
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator n2 = other_nodes.begin ();
std::vector<NodeEdgePair>::iterator n1 = nodes.begin ();
std::vector<NodeEdgePair>::iterator n2 = other_nodes.begin ();
while (n1 != nodes.end () && n2 != other_nodes.end ()) {
if (n1->first->has_other ()) {
if (n1->node->has_other ()) {
++n1;
continue;
} else if (n2->first->has_other ()) {
} else if (n2->node->has_other ()) {
++n2;
continue;
}
if (*n1->first < *n2->first) {
if (*n1->node < *n2->node) {
++n1;
continue;
} else if (*n2->first < *n1->first) {
} else if (*n2->node < *n1->node) {
++n2;
continue;
}
std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::iterator nn1 = n1, nn2 = n2;
std::vector<NodeEdgePair>::iterator nn1 = n1, nn2 = n2;
++nn1;
++nn2;
size_t num1 = 1;
while (nn1 != nodes.end () && *nn1->first == *n1->first) {
if (! nn1->first->has_other ()) {
while (nn1 != nodes.end () && *nn1->node == *n1->node) {
if (! nn1->node->has_other ()) {
++num1;
}
++nn1;
}
size_t num2 = 1;
while (nn2 != other_nodes.end () && *nn2->first == *n2->first) {
if (! nn2->first->has_other ()) {
while (nn2 != other_nodes.end () && *nn2->node == *n2->node) {
if (! nn2->node->has_other ()) {
++num2;
}
++nn2;
@ -1221,9 +1221,9 @@ NetlistCompareCore::derive_node_identities_from_node_set (std::vector<std::pair<
// node ranges might have changed - adjust to real count and skip leading pairs assigned already
while (nr->n1 != nr->nn1 && nr->n2 != nr->nn2) {
if (nr->n1->first->has_other ()) {
if (nr->n1->node->has_other ()) {
++nr->n1;
} else if (nr->n2->first->has_other ()) {
} else if (nr->n2->node->has_other ()) {
++nr->n2;
} else {
break;
@ -1231,15 +1231,15 @@ NetlistCompareCore::derive_node_identities_from_node_set (std::vector<std::pair<
}
nr->num1 = 0;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i = nr->n1; i != nr->nn1; ++i) {
if (! i->first->has_other ()) {
for (std::vector<NodeEdgePair>::const_iterator i = nr->n1; i != nr->nn1; ++i) {
if (! i->node->has_other ()) {
++nr->num1;
}
}
nr->num2 = 0;
for (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> >::const_iterator i = nr->n2; i != nr->nn2; ++i) {
if (! i->first->has_other ()) {
for (std::vector<NodeEdgePair>::const_iterator i = nr->n2; i != nr->nn2; ++i) {
if (! i->node->has_other ()) {
++nr->num2;
}
}
@ -1250,7 +1250,7 @@ NetlistCompareCore::derive_node_identities_from_node_set (std::vector<std::pair<
} else if (nr->num1 == 1 && nr->num2 == 1) {
size_t n = derive_node_identities_from_singular_match (nr->n1->first, nr->n1->second, nr->n2->first, nr->n2->second, dm, dm_other, scm, scm_other, depth, n_branch, tentative, data, ! data->dont_consider_net_names);
size_t n = derive_node_identities_from_singular_match (nr->n1->node, nr->n1->edge, nr->n2->node, nr->n2->edge, dm, dm_other, scm, scm_other, depth, n_branch, tentative, data, ! data->dont_consider_net_names);
if (n == failed_match) {
return failed_match;
}

View File

@ -105,7 +105,7 @@ public:
* This method will analyze the given nodes and call "derive_node_identities" for all nodes
* with a proposed identity.
*/
static size_t derive_node_identities_from_node_set (std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > &nodes, std::vector<std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> > &other_nodes, size_t depth, size_t n_branch, TentativeNodeMapping *tentative, CompareData *data);
static size_t derive_node_identities_from_node_set (std::vector<NodeEdgePair> &nodes, std::vector<NodeEdgePair> &other_nodes, size_t depth, size_t n_branch, TentativeNodeMapping *tentative, CompareData *data);
private:

View File

@ -271,14 +271,29 @@ private:
static bool net_equal (const db::Net *a, const db::Net *b, bool with_name);
};
/**
* @brief A combination of a node and an edge reference
*/
struct NodeEdgePair
{
public:
NodeEdgePair (const NetGraphNode *_node, NetGraphNode::edge_iterator _edge)
: node (_node), edge (_edge)
{ }
public:
const NetGraphNode *node;
NetGraphNode::edge_iterator edge;
};
/**
* @brief A comparator comparing the first node pointer from a node/edge pair
*/
struct CompareNodePtrFromNodeEdgePair
struct CompareNodeEdgePair
{
bool operator() (const std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> &a, const std::pair<const NetGraphNode *, NetGraphNode::edge_iterator> &b) const
bool operator() (const NodeEdgePair &a, const NodeEdgePair &b) const
{
return a.first->less (*b.first, true);
return a.node->less (*b.node, true);
}
};