|  | #!/usr/bin/env python3 | 
|  | # -*- coding: utf-8 -*- | 
|  | # | 
|  | # Copyright (C) 2017-2020  The Project X-Ray Authors. | 
|  | # | 
|  | # Use of this source code is governed by a ISC-style | 
|  | # license that can be found in the LICENSE file or at | 
|  | # https://opensource.org/licenses/ISC | 
|  | # | 
|  | # SPDX-License-Identifier: ISC | 
|  | import json | 
|  |  | 
|  | with open('output/error_nodes.json') as f: | 
|  | flat_error_nodes = json.load(f) | 
|  |  | 
|  | error_nodes = {} | 
|  | for node, raw_node, generated_nodes in flat_error_nodes: | 
|  | if node not in error_nodes: | 
|  | error_nodes[node] = { | 
|  | 'raw_node': set(raw_node), | 
|  | 'generated_nodes': set(), | 
|  | } | 
|  |  | 
|  | assert error_nodes[node]['raw_node'] == set(raw_node) | 
|  | error_nodes[node]['generated_nodes'].add(tuple(sorted(generated_nodes))) | 
|  |  | 
|  | for node, error in error_nodes.items(): | 
|  | combined_generated_nodes = set() | 
|  | for generated_node in error['generated_nodes']: | 
|  | combined_generated_nodes |= set(generated_node) | 
|  |  | 
|  | assert error['raw_node'] == combined_generated_nodes, (node, error) | 
|  |  | 
|  | good_node = max(error['generated_nodes'], key=lambda x: len(x)) | 
|  | bad_nodes = error['generated_nodes'] - set((good_node, )) | 
|  |  | 
|  | if max(len(generated_node) for generated_node in bad_nodes) > 1: | 
|  | assert False, node | 
|  | else: | 
|  | for generated_node in bad_nodes: | 
|  | for wire in generated_node: | 
|  | print(wire) |