def routing_tree_to_json(node):
     return {
         "chip":
         node.chip,
         "children": [{
             "route":
             (route_name(route) if isinstance(route, Routes) else route),
             "next_hop": (routing_tree_to_json(obj) if isinstance(
                 obj, RoutingTree) else obj)
         } for route, obj in node.children]
     }
 def routing_tree_to_json(node):
     return {
         "chip": node.chip,
         "children": [
             {
                 "route": (route_name(route)
                           if isinstance(route, Routes)
                           else route),
                 "next_hop": (routing_tree_to_json(obj)
                              if isinstance(obj, RoutingTree)
                              else obj)
             }
             for route, obj in node.children
         ]
     }
    if args.verbose >= 2:
        logging.basicConfig(level=logging.DEBUG)
    elif args.verbose >= 1:
        logging.basicConfig(level=logging.INFO)

    with open(args.routes, "r") as f:
        routes = unpack_routes(json.load(f))
    with open(args.routing_keys, "r") as f:
        net_keys = unpack_net_keys(json.load(f))

    tables = build_routing_tables(routes,
                                  net_keys,
                                  not args.keep_default_routes)

    with open(args.routing_tables, "w") as f:
        json.dump([
            {
                "chip": xy,
                "entries": [
                    {
                        "key": entry.key,
                        "mask": entry.mask,
                        "directions": [route_name(r) for r in entry.route]
                    }
                    for entry in entries
                ]
            }
            for xy, entries in iteritems(tables)
        ], f)
    parser.add_argument("--verbose",
                        "-v",
                        action="count",
                        default=0,
                        help="verbosity level (may be given multiple times)")
    args = parser.parse_args()

    if args.verbose >= 2:
        logging.basicConfig(level=logging.DEBUG)
    elif args.verbose >= 1:
        logging.basicConfig(level=logging.INFO)

    with open(args.routes, "r") as f:
        routes = unpack_routes(json.load(f))
    with open(args.routing_keys, "r") as f:
        net_keys = unpack_net_keys(json.load(f))

    tables = build_routing_tables(routes, net_keys,
                                  not args.keep_default_routes)

    with open(args.routing_tables, "w") as f:
        json.dump([{
            "chip":
            xy,
            "entries": [{
                "key": entry.key,
                "mask": entry.mask,
                "directions": [route_name(r) for r in entry.route]
            } for entry in entries]
        } for xy, entries in iteritems(tables)], f)