diff --git a/examples/features/keepoutsolver/keepoutsolver01-input.json b/examples/features/keepoutsolver/keepoutsolver01-input.json new file mode 100644 index 00000000..4c74b2ab --- /dev/null +++ b/examples/features/keepoutsolver/keepoutsolver01-input.json @@ -0,0 +1,7491 @@ +[ + { + "hdRoutes": [ + { + "connectionName": "source_net_1_mst2", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -33.144999999999996, + "y": 16.040000000000003, + "z": 0 + }, + { + "x": -33.54719964857121, + "y": 16.422776602298317, + "z": 0 + }, + { + "x": -34.62280035142878, + "y": 16.597223397701686, + "z": 0 + }, + { + "x": -35.02499999999999, + "y": 16.98, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_3", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -33.144999999999996, + "y": 13.499999999999998, + "z": 0 + }, + { + "x": -33.551289755499994, + "y": 13.499999999999998, + "z": 0 + }, + { + "x": -34.61871024450001, + "y": 13.499999999999998, + "z": 0 + }, + { + "x": -35.025000000000006, + "y": 13.499999999999998, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_3", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -7.620000000000001, + "y": -11.919999999999998, + "z": 0 + }, + { + "x": -8.025597164353895, + "y": -12.005497318852813, + "z": 0 + }, + { + "x": -8.214402835646109, + "y": -12.02616934781385, + "z": 0 + }, + { + "x": -8.620000000000001, + "y": -12.111666666666665, + "z": 0 + }, + { + "x": -9.019901481982533, + "y": -12.500525862455989, + "z": 0 + }, + { + "x": -14.20013471801754, + "y": -15.661867915021565, + "z": 0 + }, + { + "x": -14.600036200000073, + "y": -16.05072711081089, + "z": 0 + }, + { + "x": -15.006325955500074, + "y": -16.05072711081089, + "z": 0 + }, + { + "x": -16.393742044500073, + "y": -16.05072711081089, + "z": 0 + }, + { + "x": -16.800031800000074, + "y": -16.05072711081089, + "z": 0 + }, + { + "x": -17.19663178089257, + "y": -15.667010498800355, + "z": 0 + }, + { + "x": -22.802218810456004, + "y": -10.625408601517128, + "z": 0 + }, + { + "x": -23.19996820000004, + "y": -10.459021780000064, + "z": 0 + }, + { + "x": -23.60625795550004, + "y": -10.397294771088395, + "z": 0 + }, + { + "x": -24.993674044500036, + "y": -10.397294771088395, + "z": 0 + }, + { + "x": -25.399963800000037, + "y": -10.459021780000064, + "z": 0 + }, + { + "x": -25.829157029002705, + "y": -10.192370264915263, + "z": 0 + }, + { + "x": -28.985165572265597, + "y": -9.993479399535737, + "z": 0 + }, + { + "x": -29.39, + "y": -10.16, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_trace_12", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -7.62, + "y": -4.299999999999999, + "z": 0 + }, + { + "x": -8.025597164353893, + "y": -4.385497318852815, + "z": 0 + }, + { + "x": -8.214402835646109, + "y": -4.406169347813849, + "z": 0 + }, + { + "x": -8.620000000000001, + "y": -4.491666666666665, + "z": 0 + }, + { + "x": -9.018651751679643, + "y": -4.432048528023444, + "z": 0 + }, + { + "x": -14.201384448320429, + "y": -0.11062055864327983, + "z": 0 + }, + { + "x": -14.600036200000073, + "y": -0.051002420000057835, + "z": 0 + }, + { + "x": -15.006060826047028, + "y": -0.16456304084078538, + "z": 0 + }, + { + "x": -16.39400717395312, + "y": -0.1961513748114308, + "z": 0 + }, + { + "x": -16.800031800000074, + "y": -0.30971199565215835, + "z": 0 + }, + { + "x": -17.19941894156704, + "y": -0.6993322357260092, + "z": 0 + }, + { + "x": -22.800581058433078, + "y": -4.689463718722397, + "z": 0 + }, + { + "x": -23.199968200000043, + "y": -4.746436785714346, + "z": 0 + }, + { + "x": -23.605571019807304, + "y": -4.3716258352280075, + "z": 0 + }, + { + "x": -28.98439718019274, + "y": -3.939810950486339, + "z": 0 + }, + { + "x": -29.39, + "y": -3.5650000000000017, + "z": 0 + }, + { + "x": -29.796289755500002, + "y": -3.5650000000000017, + "z": 0 + }, + { + "x": -30.5837102445, + "y": -3.5650000000000017, + "z": 0 + }, + { + "x": -30.990000000000002, + "y": -3.5650000000000017, + "z": 0 + }, + { + "x": -31.298887079621053, + "y": -3.9708837761098543, + "z": 0 + }, + { + "x": -31.39611292037894, + "y": -8.059116223890149, + "z": 0 + }, + { + "x": -31.70499999999999, + "y": -8.465000000000002, + "z": 0 + }, + { + "x": -32.0280578993095, + "y": -8.848407900829692, + "z": 0 + }, + { + "x": -32.111842300690554, + "y": -8.97659209917031, + "z": 0 + }, + { + "x": -32.43490020000006, + "y": -9.36, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_trace_4", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": 15.70003399999996, + "y": 2.2500589999999647, + "z": 0 + }, + { + "x": 9.090058999999966, + "y": 2.2500589999999647, + "z": 0 + }, + { + "x": 7.620000000000001, + "y": 0.7799999999999994, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_trace_6", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": 15.70003399999996, + "y": -7.749941000000035, + "z": 0 + }, + { + "x": 13.609941000000035, + "y": -7.749941000000035, + "z": 0 + }, + { + "x": 7.62, + "y": -1.7600000000000016, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_1_mst0", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": 15.70003399999996, + "y": -12.250059000000078, + "z": 0 + }, + { + "x": 10.490059000000077, + "y": -12.250059000000078, + "z": 0 + }, + { + "x": 7.619999999999999, + "y": -9.38, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_1_mst3", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": 15.70003399999996, + "y": -12.250059000000078, + "z": 0 + }, + { + "x": 17.09437406750257, + "y": -10.855718932497467, + "z": 0 + }, + { + "x": 17.09437406750257, + "y": -3.6721999809429358, + "z": 0 + }, + { + "x": 17.09437406750257, + "y": -3.6443990675026896, + "z": 0 + }, + { + "x": 15.70003399999996, + "y": -2.2500590000000784, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_trace_8", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -15.700034000000073, + "y": 2.2500589999999647, + "z": 0 + }, + { + "x": -8.689941000000037, + "y": 2.2500589999999647, + "z": 0 + }, + { + "x": -7.619999999999999, + "y": 3.320000000000002, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_1_mst2", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -15.700034000000073, + "y": -2.2500590000000784, + "z": 0 + }, + { + "x": -16.05711479879851, + "y": -2.5723815738367852, + "z": 0 + }, + { + "x": -16.39422320806981, + "y": -2.596105977229822, + "z": 0 + }, + { + "x": -16.800031800000074, + "y": -2.4250585000000786, + "z": 0 + }, + { + "x": -17.192607415429134, + "y": -2.4876235384092364, + "z": 0 + }, + { + "x": -22.808541993222516, + "y": -9.873811684293308, + "z": 0 + }, + { + "x": -23.19996820000004, + "y": -10.051002420000058, + "z": 0 + }, + { + "x": -23.60625795550004, + "y": -10.112729428911727, + "z": 0 + }, + { + "x": -24.993674044500036, + "y": -10.112729428911727, + "z": 0 + }, + { + "x": -25.399963800000037, + "y": -10.051002420000058, + "z": 0 + }, + { + "x": -25.777780285098075, + "y": -9.804303059472463, + "z": 0 + }, + { + "x": -28.987824713633692, + "y": -8.082161904149787, + "z": 0 + }, + { + "x": -29.39, + "y": -7.709971250000018, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_trace_10", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -15.700034000000073, + "y": -7.749941000000035, + "z": 0 + }, + { + "x": -8.529941000000036, + "y": -7.749941000000035, + "z": 0 + }, + { + "x": -7.62, + "y": -6.839999999999999, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_1_mst1", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -15.700034000000073, + "y": -12.250059000000078, + "z": 0 + }, + { + "x": -17.114039893449068, + "y": -10.836053106551084, + "z": 0 + }, + { + "x": -17.114039893449068, + "y": -3.664064893449073, + "z": 0 + }, + { + "x": -17.114039893449068, + "y": -3.664064893449073, + "z": 0 + }, + { + "x": -15.700034000000073, + "y": -2.2500590000000784, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_trace_12", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -15.700034000000073, + "y": 12.250058999999965, + "z": 0 + }, + { + "x": -16.105842591930337, + "y": 12.172194506920844, + "z": 0 + }, + { + "x": -16.39422320806981, + "y": 12.152923993079087, + "z": 0 + }, + { + "x": -16.800031800000074, + "y": 12.075059499999965, + "z": 0 + }, + { + "x": -17.18201157328734, + "y": 11.986084708093266, + "z": 0 + }, + { + "x": -22.784957355632994, + "y": 4.718903495311736, + "z": 0 + }, + { + "x": -23.19996820000004, + "y": 4.7464367857142316, + "z": 0 + }, + { + "x": -23.592425145694364, + "y": 4.567555922248487, + "z": 0 + }, + { + "x": -28.98444163920324, + "y": 3.533368283871699, + "z": 0 + }, + { + "x": -29.39, + "y": 3.170028749999982, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_1_mst2", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -15.700034000000073, + "y": 7.749940999999922, + "z": 0 + }, + { + "x": -15.79879203272318, + "y": 7.706720243420978, + "z": 0 + }, + { + "x": -16.39422320806981, + "y": 7.687449729579219, + "z": 0 + }, + { + "x": -16.800031800000074, + "y": 7.574941499999921, + "z": 0 + }, + { + "x": -17.19492107601652, + "y": 7.5040937796199865, + "z": 0 + }, + { + "x": -22.805078923983594, + "y": 1.5451212150741636, + "z": 0 + }, + { + "x": -23.19996820000004, + "y": 1.1501256500000336, + "z": 0 + }, + { + "x": -23.60152003178846, + "y": 0.7640127656971301, + "z": 0 + }, + { + "x": -24.998411968211617, + "y": 0.33511046430284575, + "z": 0 + }, + { + "x": -25.399963800000037, + "y": -0.051002420000057835, + "z": 0 + }, + { + "x": -25.80100706608506, + "y": -0.43801789092356047, + "z": 0 + }, + { + "x": -28.98895673391498, + "y": -1.9830132790765376, + "z": 0 + }, + { + "x": -29.39, + "y": -2.3700287500000403, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_0", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": 3.81, + "y": 14, + "z": 0 + }, + { + "x": 4.200507647999999, + "y": 14, + "z": 0 + }, + { + "x": 4.319492352, + "y": 14, + "z": 0 + }, + { + "x": 4.709999999999999, + "y": 14, + "z": 0 + }, + { + "x": 5.131148092255273, + "y": 13.64781933026343, + "z": 0 + }, + { + "x": 15.875277793204145, + "y": 7.637273547586945, + "z": 0 + }, + { + "x": 16.097760272727232, + "y": 7.16, + "z": 0 + }, + { + "x": 16.289176295851117, + "y": 6.806323148096977, + "z": 0 + }, + { + "x": 16.504263947719753, + "y": 5.956317614222348, + "z": 0 + }, + { + "x": 16.80003179999996, + "y": 5.783638534482748, + "z": 0 + }, + { + "x": 17.17501890700906, + "y": 5.769793657008904, + "z": 0 + }, + { + "x": 17.47668580113494, + "y": -11.666841981408318, + "z": 0 + }, + { + "x": 17.62481209090895, + "y": -12.039809199999898, + "z": 0 + }, + { + "x": 17.624812090908947, + "y": -12.408746191791279, + "z": 0 + }, + { + "x": 17.624812090908947, + "y": -12.631120508208697, + "z": 0 + }, + { + "x": 17.624812090908947, + "y": -13.000057500000079, + "z": 0 + }, + { + "x": 17.308774527147357, + "y": -13.263548118068096, + "z": 0 + }, + { + "x": 9.010368710336166, + "y": -13.487787512016784, + "z": 0 + }, + { + "x": 8.619999999999997, + "y": -13.330028750000043, + "z": 0 + }, + { + "x": 8.226755747540587, + "y": -13.058588646585662, + "z": 0 + }, + { + "x": 8.083698797913955, + "y": -12.991440103414384, + "z": 0 + }, + { + "x": 7.6904545454545445, + "y": -12.720000000000002, + "z": 0 + }, + { + "x": 7.658777923535055, + "y": -12.36319636944922, + "z": 0 + }, + { + "x": 7.6516766219194885, + "y": -12.276803630550784, + "z": 0 + }, + { + "x": 7.619999999999999, + "y": -11.920000000000002, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_1_mst4", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": 1.27, + "y": 14, + "z": 0 + }, + { + "x": 0.17806375232909177, + "y": 12.908063752329092, + "z": 0 + }, + { + "x": -2.277611970197334, + "y": 12.908063752329092, + "z": 0 + }, + { + "x": -2.6364021005857805, + "y": 13.266853882717538, + "z": 0 + }, + { + "x": -2.6364021005857805, + "y": 14.904702686454806, + "z": 0 + }, + { + "x": -2.9460937082708925, + "y": 15.214394294139918, + "z": 0 + }, + { + "x": -8.235580705860077, + "y": 15.214394294139918, + "z": 0 + }, + { + "x": -8.235580705860077, + "y": 15.214394294139918, + "z": 0 + }, + { + "x": -15.700034000000073, + "y": 7.749940999999922, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_1_mst5", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": 1.27, + "y": 14, + "z": 0 + }, + { + "x": 7.557058256646538, + "y": 7.712941743353461, + "z": 0 + }, + { + "x": 14.91435246159008, + "y": 7.712941743353461, + "z": 0 + }, + { + "x": 14.94002244231864, + "y": 7.687271762624903, + "z": 0 + }, + { + "x": 15.550614588198577, + "y": 7.5431861096394135, + "z": 0 + }, + { + "x": 15.550614588198577, + "y": 7.5431861096394135, + "z": 0 + }, + { + "x": 15.779579254545414, + "y": 7.16, + "z": 0 + }, + { + "x": 15.779579254545414, + "y": 7.16, + "z": 0 + }, + { + "x": 15.905410158294302, + "y": 6.735872086043502, + "z": 0 + }, + { + "x": 15.900333536752001, + "y": 6.752983438187801, + "z": 0 + }, + { + "x": 15.900333536752001, + "y": 6.579707959855058, + "z": 0 + }, + { + "x": 15.900333536752001, + "y": 4.181834156111259, + "z": 0 + }, + { + "x": 17.031332100841787, + "y": 3.050835592021473, + "z": 0 + }, + { + "x": 17.031332100841787, + "y": -0.9187608991582508, + "z": 0 + }, + { + "x": 15.70003399999996, + "y": -2.2500590000000784, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_3", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -1.27, + "y": 14, + "z": 0 + }, + { + "x": -1.27, + "y": 14.390507648, + "z": 0 + }, + { + "x": -1.27, + "y": 14.509492351999999, + "z": 0 + }, + { + "x": -1.27, + "y": 14.899999999999999, + "z": 0 + }, + { + "x": -1.625005417163898, + "y": 15.313064900468385, + "z": 0 + }, + { + "x": -4.283177049694513, + "y": 17.150673459671054, + "z": 0 + }, + { + "x": -4.709999999999999, + "y": 17.45, + "z": 0 + }, + { + "x": -5.129508172013803, + "y": 17.161705691359877, + "z": 0 + }, + { + "x": -14.19448497265074, + "y": 16.90207068071559, + "z": 0 + }, + { + "x": -14.600036200000073, + "y": 16.949330389189193, + "z": 0 + }, + { + "x": -15.006325955500074, + "y": 16.949330389189193, + "z": 0 + }, + { + "x": -16.393742044500073, + "y": 16.949330389189193, + "z": 0 + }, + { + "x": -16.800031800000074, + "y": 16.949330389189193, + "z": 0 + }, + { + "x": -17.18683290645326, + "y": 16.557500550359403, + "z": 0 + }, + { + "x": -22.84619816462664, + "y": 5.443152868002759, + "z": 0 + }, + { + "x": -23.19996820000004, + "y": 5.253563214285654, + "z": 0 + }, + { + "x": -23.61881699137389, + "y": 4.981003217570675, + "z": 0 + }, + { + "x": -28.98425262372859, + "y": 4.83362814396315, + "z": 0 + }, + { + "x": -29.389999999999997, + "y": 5.079999999999998, + "z": 0 + } + ], + "vias": [] + }, + { + "connectionName": "source_net_2", + "traceThickness": 0.15, + "viaDiameter": 0.6, + "route": [ + { + "x": -3.81, + "y": 14, + "z": 0 + }, + { + "x": 2.7995946159002805, + "y": 7.3904053840997195, + "z": 0 + }, + { + "x": 15.073309413334021, + "y": 7.3904053840997195, + "z": 0 + }, + { + "x": 15.13810932150548, + "y": 7.378963111456373, + "z": 0 + }, + { + "x": 15.461398236363596, + "y": 7.16, + "z": 0 + }, + { + "x": 15.672261731177166, + "y": 6.986470863552442, + "z": 0 + }, + { + "x": 15.672261731177166, + "y": 6.986470863552442, + "z": 0 + }, + { + "x": 16.50373409395306, + "y": 7.084390647958256, + "z": 0 + }, + { + "x": 16.50373409395306, + "y": 7.084390647958256, + "z": 0 + }, + { + "x": 16.50373409395306, + "y": 7.084390647958256, + "z": 0 + }, + { + "x": 16.80003179999996, + "y": 7.318787155172417, + "z": 0 + }, + { + "x": 16.80003179999996, + "y": 7.318787155172417, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.29030754304036, + "y": 6.9231267532552625, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.82389710892105, + "y": -11.622167812180587, + "z": 0 + }, + { + "x": 17.924702236363444, + "y": -12.039809199999898, + "z": 0 + }, + { + "x": 17.924702236363444, + "y": -12.039809199999898, + "z": 0 + }, + { + "x": 17.924702236363444, + "y": -12.408746191791279, + "z": 0 + }, + { + "x": 17.924702236363444, + "y": -12.631120508208697, + "z": 0 + }, + { + "x": 17.924702236363444, + "y": -12.631120508208697, + "z": 0 + }, + { + "x": 17.924702236363444, + "y": -13.000057500000079, + "z": 0 + }, + { + "x": 17.62105492278438, + "y": -13.463758477170906, + "z": 0 + }, + { + "x": 17.77007218645092, + "y": -13.23619364228721, + "z": 0 + }, + { + "x": 13.768293187060165, + "y": -17.237972641677967, + "z": 0 + }, + { + "x": -6.672745931123345, + "y": -17.237972641677967, + "z": 0 + }, + { + "x": -7.620000000000001, + "y": -16.29071857280131, + "z": 0 + }, + { + "x": -7.620000000000001, + "y": -14.459999999999999, + "z": 0 + } + ], + "vias": [] + } + ], + "obstacles": [ + { + "type": "rect", + "width": 2, + "center": { + "x": 7.619999999999999, + "y": -14.460000000000003 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_0", + "connectivity_net379", + "source_port_0", + "pcb_smtpad_0", + "pcb_port_0" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.619999999999999, + "y": -11.920000000000002 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_1", + "connectivity_net37", + "source_trace_14", + "source_port_43", + "source_trace_0", + "source_port_1", + "source_net_0", + "pcb_smtpad_1", + "pcb_port_1", + "pcb_plated_hole_0", + "pcb_port_43" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.619999999999999, + "y": -9.38 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_2", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "source_net_1", + "pcb_smtpad_2", + "pcb_port_2", + "pcb_smtpad_25", + "pcb_port_25", + "pcb_smtpad_29", + "pcb_port_29", + "pcb_smtpad_34", + "pcb_port_34", + "pcb_smtpad_38", + "pcb_port_38", + "pcb_smtpad_42", + "pcb_port_42", + "pcb_plated_hole_1", + "pcb_port_44" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.62, + "y": -6.840000000000001 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_3", + "connectivity_net380", + "source_port_3", + "pcb_smtpad_3", + "pcb_port_3" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.62, + "y": -4.300000000000001 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_4", + "connectivity_net381", + "source_port_4", + "pcb_smtpad_4", + "pcb_port_4" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.62, + "y": -1.7600000000000016 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_5", + "connectivity_net17", + "source_trace_6", + "source_port_27", + "source_port_5", + "pcb_smtpad_5", + "pcb_port_5", + "pcb_smtpad_27", + "pcb_port_27" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.620000000000001, + "y": 0.7799999999999994 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_6", + "connectivity_net12", + "source_trace_4", + "source_port_23", + "source_port_6", + "pcb_smtpad_6", + "pcb_port_6", + "pcb_smtpad_23", + "pcb_port_23" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.620000000000001, + "y": 3.3200000000000003 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_7", + "connectivity_net382", + "source_port_7", + "pcb_smtpad_7", + "pcb_port_7" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": 7.620000000000001, + "y": 5.859999999999998 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_8", + "connectivity_net383", + "source_port_8", + "pcb_smtpad_8", + "pcb_port_8" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.620000000000001, + "y": -14.459999999999999 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_9", + "connectivity_net41", + "source_trace_16", + "source_port_46", + "source_trace_2", + "source_port_9", + "source_net_2", + "pcb_smtpad_9", + "pcb_port_9", + "pcb_plated_hole_3", + "pcb_port_46" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.620000000000001, + "y": -11.919999999999998 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_10", + "connectivity_net43", + "source_trace_17", + "source_port_45", + "source_trace_3", + "source_port_10", + "source_net_3", + "pcb_smtpad_10", + "pcb_port_10", + "pcb_plated_hole_2", + "pcb_port_45" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.620000000000001, + "y": -9.379999999999999 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_11", + "connectivity_net384", + "source_port_11", + "pcb_smtpad_11", + "pcb_port_11" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.62, + "y": -6.839999999999999 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_12", + "connectivity_net27", + "source_trace_10", + "source_port_36", + "source_port_12", + "pcb_smtpad_12", + "pcb_port_12", + "pcb_smtpad_36", + "pcb_port_36" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.62, + "y": -4.299999999999999 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_13", + "connectivity_net32", + "source_trace_12", + "source_port_40", + "source_port_13", + "pcb_smtpad_13", + "pcb_port_13", + "pcb_smtpad_40", + "pcb_port_40" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.62, + "y": -1.7599999999999998 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_14", + "connectivity_net385", + "source_port_14", + "pcb_smtpad_14", + "pcb_port_14" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.619999999999999, + "y": 0.7800000000000011 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_15", + "connectivity_net386", + "source_port_15", + "pcb_smtpad_15", + "pcb_port_15" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.619999999999999, + "y": 3.320000000000002 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_16", + "connectivity_net22", + "source_trace_8", + "source_port_32", + "source_port_16", + "pcb_smtpad_16", + "pcb_port_16", + "pcb_smtpad_32", + "pcb_port_32" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2, + "center": { + "x": -7.619999999999999, + "y": 5.860000000000001 + }, + "height": 1.6, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_17", + "connectivity_net387", + "source_port_17", + "pcb_smtpad_17", + "pcb_port_17" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 1.6, + "center": { + "x": 5.080000000000001, + "y": 6.16 + }, + "height": 2, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_18", + "connectivity_net388", + "source_port_18", + "pcb_smtpad_18", + "pcb_port_18" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 1.6, + "center": { + "x": 2.5400000000000014, + "y": 6.16 + }, + "height": 2, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_19", + "connectivity_net389", + "source_port_19", + "pcb_smtpad_19", + "pcb_port_19" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 1.6, + "center": { + "x": 1.2442411479337109e-15, + "y": 6.16 + }, + "height": 2, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_20", + "connectivity_net390", + "source_port_20", + "pcb_smtpad_20", + "pcb_port_20" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 1.6, + "center": { + "x": -2.5399999999999987, + "y": 6.16 + }, + "height": 2, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_21", + "connectivity_net391", + "source_port_21", + "pcb_smtpad_21", + "pcb_port_21" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 1.6, + "center": { + "x": -5.079999999999999, + "y": 6.16 + }, + "height": 2, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_22", + "connectivity_net392", + "source_port_22", + "pcb_smtpad_22", + "pcb_port_22" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 15.70003399999996, + "y": 2.2500589999999647 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_23", + "connectivity_net12", + "source_trace_4", + "source_port_23", + "source_port_6", + "pcb_smtpad_6", + "pcb_port_6", + "pcb_smtpad_23", + "pcb_port_23" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 24.299965999999927, + "y": 2.2500589999999647 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_24", + "connectivity_net393", + "source_port_24", + "pcb_smtpad_24", + "pcb_port_24" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 15.70003399999996, + "y": -2.2500590000000784 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_25", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "source_net_1", + "pcb_smtpad_2", + "pcb_port_2", + "pcb_smtpad_25", + "pcb_port_25", + "pcb_smtpad_29", + "pcb_port_29", + "pcb_smtpad_34", + "pcb_port_34", + "pcb_smtpad_38", + "pcb_port_38", + "pcb_smtpad_42", + "pcb_port_42", + "pcb_plated_hole_1", + "pcb_port_44" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 24.299965999999927, + "y": -2.2500590000000784 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_26", + "connectivity_net394", + "source_port_26", + "pcb_smtpad_26", + "pcb_port_26" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 15.70003399999996, + "y": -7.749941000000035 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_27", + "connectivity_net17", + "source_trace_6", + "source_port_27", + "source_port_5", + "pcb_smtpad_5", + "pcb_port_5", + "pcb_smtpad_27", + "pcb_port_27" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 24.299965999999927, + "y": -7.749941000000035 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_28", + "connectivity_net395", + "source_port_28", + "pcb_smtpad_28", + "pcb_port_28" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 15.70003399999996, + "y": -12.250059000000078 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_29", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "source_net_1", + "pcb_smtpad_2", + "pcb_port_2", + "pcb_smtpad_25", + "pcb_port_25", + "pcb_smtpad_29", + "pcb_port_29", + "pcb_smtpad_34", + "pcb_port_34", + "pcb_smtpad_38", + "pcb_port_38", + "pcb_smtpad_42", + "pcb_port_42", + "pcb_plated_hole_1", + "pcb_port_44" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": 24.299965999999927, + "y": -12.250059000000078 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_30", + "connectivity_net396", + "source_port_30", + "pcb_smtpad_30", + "pcb_port_30" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -24.29996600000004, + "y": 2.2500589999999647 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_31", + "connectivity_net397", + "source_port_31", + "pcb_smtpad_31", + "pcb_port_31" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -15.700034000000073, + "y": 2.2500589999999647 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_32", + "connectivity_net22", + "source_trace_8", + "source_port_32", + "source_port_16", + "pcb_smtpad_16", + "pcb_port_16", + "pcb_smtpad_32", + "pcb_port_32" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -24.29996600000004, + "y": -2.2500590000000784 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_33", + "connectivity_net398", + "source_port_33", + "pcb_smtpad_33", + "pcb_port_33" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -15.700034000000073, + "y": -2.2500590000000784 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_34", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "source_net_1", + "pcb_smtpad_2", + "pcb_port_2", + "pcb_smtpad_25", + "pcb_port_25", + "pcb_smtpad_29", + "pcb_port_29", + "pcb_smtpad_34", + "pcb_port_34", + "pcb_smtpad_38", + "pcb_port_38", + "pcb_smtpad_42", + "pcb_port_42", + "pcb_plated_hole_1", + "pcb_port_44" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -24.29996600000004, + "y": -7.749941000000035 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_35", + "connectivity_net399", + "source_port_35", + "pcb_smtpad_35", + "pcb_port_35" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -15.700034000000073, + "y": -7.749941000000035 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_36", + "connectivity_net27", + "source_trace_10", + "source_port_36", + "source_port_12", + "pcb_smtpad_12", + "pcb_port_12", + "pcb_smtpad_36", + "pcb_port_36" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -24.29996600000004, + "y": -12.250059000000078 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_37", + "connectivity_net400", + "source_port_37", + "pcb_smtpad_37", + "pcb_port_37" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -15.700034000000073, + "y": -12.250059000000078 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_38", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "source_net_1", + "pcb_smtpad_2", + "pcb_port_2", + "pcb_smtpad_25", + "pcb_port_25", + "pcb_smtpad_29", + "pcb_port_29", + "pcb_smtpad_34", + "pcb_port_34", + "pcb_smtpad_38", + "pcb_port_38", + "pcb_smtpad_42", + "pcb_port_42", + "pcb_plated_hole_1", + "pcb_port_44" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -24.29996600000004, + "y": 12.250058999999965 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_39", + "connectivity_net401", + "source_port_39", + "pcb_smtpad_39", + "pcb_port_39" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -15.700034000000073, + "y": 12.250058999999965 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_40", + "connectivity_net32", + "source_trace_12", + "source_port_40", + "source_port_13", + "pcb_smtpad_13", + "pcb_port_13", + "pcb_smtpad_40", + "pcb_port_40" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -24.29996600000004, + "y": 7.749940999999922 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_41", + "connectivity_net402", + "source_port_41", + "pcb_smtpad_41", + "pcb_port_41" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 2.1999956, + "center": { + "x": -15.700034000000073, + "y": 7.749940999999922 + }, + "height": 1.499997, + "layers": ["top"], + "connectedTo": [ + "pcb_smtpad_42", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "source_net_1", + "pcb_smtpad_2", + "pcb_port_2", + "pcb_smtpad_25", + "pcb_port_25", + "pcb_smtpad_29", + "pcb_port_29", + "pcb_smtpad_34", + "pcb_port_34", + "pcb_smtpad_38", + "pcb_port_38", + "pcb_smtpad_42", + "pcb_port_42", + "pcb_plated_hole_1", + "pcb_port_44" + ], + "zLayers": [0] + }, + { + "type": "oval", + "width": 1.8, + "center": { + "x": 3.81, + "y": 14 + }, + "height": 1.8, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_0", + "connectivity_net37", + "source_trace_14", + "source_port_43", + "source_trace_0", + "source_port_1", + "source_net_0", + "pcb_smtpad_1", + "pcb_port_1", + "pcb_plated_hole_0", + "pcb_port_43" + ], + "zLayers": [0] + }, + { + "type": "oval", + "width": 1.8, + "center": { + "x": 1.27, + "y": 14 + }, + "height": 1.8, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_1", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "source_net_1", + "pcb_smtpad_2", + "pcb_port_2", + "pcb_smtpad_25", + "pcb_port_25", + "pcb_smtpad_29", + "pcb_port_29", + "pcb_smtpad_34", + "pcb_port_34", + "pcb_smtpad_38", + "pcb_port_38", + "pcb_smtpad_42", + "pcb_port_42", + "pcb_plated_hole_1", + "pcb_port_44" + ], + "zLayers": [0] + }, + { + "type": "oval", + "width": 1.8, + "center": { + "x": -1.27, + "y": 14 + }, + "height": 1.8, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_2", + "connectivity_net43", + "source_trace_17", + "source_port_45", + "source_trace_3", + "source_port_10", + "source_net_3", + "pcb_smtpad_10", + "pcb_port_10", + "pcb_plated_hole_2", + "pcb_port_45" + ], + "zLayers": [0] + }, + { + "type": "oval", + "width": 1.8, + "center": { + "x": -3.81, + "y": 14 + }, + "height": 1.8, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_3", + "connectivity_net41", + "source_trace_16", + "source_port_46", + "source_trace_2", + "source_port_9", + "source_net_2", + "pcb_smtpad_9", + "pcb_port_9", + "pcb_plated_hole_3", + "pcb_port_46" + ], + "zLayers": [0] + }, + { + "type": "rect", + "width": 1.6, + "center": { + "x": 37.81, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_4", + "connectivity_net403", + "source_port_47", + "pcb_plated_hole_4", + "pcb_port_47" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_0"], + "zLayers": [0], + "obstacleId": "__obs0" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_5", + "connectivity_net404", + "source_port_48", + "pcb_plated_hole_5", + "pcb_port_48" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_1"], + "zLayers": [0], + "obstacleId": "__obs1" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": 12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_6", + "connectivity_net405", + "source_port_49", + "pcb_plated_hole_6", + "pcb_port_49" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_2"], + "zLayers": [0], + "obstacleId": "__obs2" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_7", + "connectivity_net406", + "source_port_50", + "pcb_plated_hole_7", + "pcb_port_50" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_3"], + "zLayers": [0], + "obstacleId": "__obs3" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": 7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_8", + "connectivity_net407", + "source_port_51", + "pcb_plated_hole_8", + "pcb_port_51" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_0"], + "zLayers": [0], + "obstacleId": "__obs4" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": 5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_9", + "connectivity_net408", + "source_port_52", + "pcb_plated_hole_9", + "pcb_port_52" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_4"], + "zLayers": [0], + "obstacleId": "__obs5" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": 2.5400000000000014 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_10", + "connectivity_net409", + "source_port_53", + "pcb_plated_hole_10", + "pcb_port_53" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_5"], + "zLayers": [0], + "obstacleId": "__obs6" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": 2.3329521523757077e-16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_11", + "connectivity_net410", + "source_port_54", + "pcb_plated_hole_11", + "pcb_port_54" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_1"], + "zLayers": [0], + "obstacleId": "__obs7" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": -2.5399999999999987 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_12", + "connectivity_net411", + "source_port_55", + "pcb_plated_hole_12", + "pcb_port_55" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_4"], + "zLayers": [0], + "obstacleId": "__obs8" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": -5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_13", + "connectivity_net412", + "source_port_56", + "pcb_plated_hole_13", + "pcb_port_56" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_1"], + "zLayers": [0], + "obstacleId": "__obs9" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": -7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_14", + "connectivity_net413", + "source_port_57", + "pcb_plated_hole_14", + "pcb_port_57" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_6"], + "zLayers": [0], + "obstacleId": "__obs10" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_15", + "connectivity_net414", + "source_port_58", + "pcb_plated_hole_15", + "pcb_port_58" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_7"], + "zLayers": [0], + "obstacleId": "__obs11" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": -12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_16", + "connectivity_net415", + "source_port_59", + "pcb_plated_hole_16", + "pcb_port_59" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_8"], + "zLayers": [0], + "obstacleId": "__obs12" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_17", + "connectivity_net416", + "source_port_60", + "pcb_plated_hole_17", + "pcb_port_60" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_9"], + "zLayers": [0], + "obstacleId": "__obs13" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 37.81, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_18", + "connectivity_net417", + "source_port_61", + "pcb_plated_hole_18", + "pcb_port_61" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_2"], + "zLayers": [0], + "obstacleId": "__obs14" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.269999999999996, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_19", + "connectivity_net418", + "source_port_62", + "pcb_plated_hole_19", + "pcb_port_62" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_9"], + "zLayers": [0], + "obstacleId": "__obs15" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.269999999999996, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_20", + "connectivity_net419", + "source_port_63", + "pcb_plated_hole_20", + "pcb_port_63" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_6"], + "zLayers": [0], + "obstacleId": "__obs16" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.269999999999996, + "y": 12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_21", + "connectivity_net420", + "source_port_64", + "pcb_plated_hole_21", + "pcb_port_64" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_10"], + "zLayers": [0], + "obstacleId": "__obs17" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.269999999999996, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_22", + "connectivity_net421", + "source_port_65", + "pcb_plated_hole_22", + "pcb_port_65" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_7"], + "zLayers": [0], + "obstacleId": "__obs18" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.269999999999996, + "y": 7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_23", + "connectivity_net422", + "source_port_66", + "pcb_plated_hole_23", + "pcb_port_66" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_11"], + "zLayers": [0], + "obstacleId": "__obs19" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": 5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_24", + "connectivity_net423", + "source_port_67", + "pcb_plated_hole_24", + "pcb_port_67" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_12"], + "zLayers": [0], + "obstacleId": "__obs20" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": 2.540000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_25", + "connectivity_net424", + "source_port_68", + "pcb_plated_hole_25", + "pcb_port_68" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_3"], + "zLayers": [0], + "obstacleId": "__obs21" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": 7.776507174585693e-17 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_26", + "connectivity_net425", + "source_port_69", + "pcb_plated_hole_26", + "pcb_port_69" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_2"], + "zLayers": [0], + "obstacleId": "__obs22" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": -2.539999999999999 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_27", + "connectivity_net426", + "source_port_70", + "pcb_plated_hole_27", + "pcb_port_70" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_10"], + "zLayers": [0], + "obstacleId": "__obs23" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": -5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_28", + "connectivity_net427", + "source_port_71", + "pcb_plated_hole_28", + "pcb_port_71" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_8"], + "zLayers": [0], + "obstacleId": "__obs24" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": -7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_29", + "connectivity_net428", + "source_port_72", + "pcb_plated_hole_29", + "pcb_port_72" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_3"], + "zLayers": [0], + "obstacleId": "__obs25" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_30", + "connectivity_net429", + "source_port_73", + "pcb_plated_hole_30", + "pcb_port_73" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_13"], + "zLayers": [0], + "obstacleId": "__obs26" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": -12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_31", + "connectivity_net430", + "source_port_74", + "pcb_plated_hole_31", + "pcb_port_74" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_5"], + "zLayers": [0], + "obstacleId": "__obs27" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_32", + "connectivity_net431", + "source_port_75", + "pcb_plated_hole_32", + "pcb_port_75" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_14"], + "zLayers": [0], + "obstacleId": "__obs28" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 35.27, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_33", + "connectivity_net432", + "source_port_76", + "pcb_plated_hole_33", + "pcb_port_76" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_0"], + "zLayers": [0], + "obstacleId": "__obs29" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_34", + "connectivity_net433", + "source_port_77", + "pcb_plated_hole_34", + "pcb_port_77" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_6"], + "zLayers": [0], + "obstacleId": "__obs30" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_35", + "connectivity_net434", + "source_port_78", + "pcb_plated_hole_35", + "pcb_port_78" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_4"], + "zLayers": [0], + "obstacleId": "__obs31" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": 12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_36", + "connectivity_net435", + "source_port_79", + "pcb_plated_hole_36", + "pcb_port_79" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_0"], + "zLayers": [0], + "obstacleId": "__obs32" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_37", + "connectivity_net436", + "source_port_80", + "pcb_plated_hole_37", + "pcb_port_80" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_12"], + "zLayers": [0], + "obstacleId": "__obs33" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": 7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_38", + "connectivity_net437", + "source_port_81", + "pcb_plated_hole_38", + "pcb_port_81" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_6"], + "zLayers": [0], + "obstacleId": "__obs34" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": 5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_39", + "connectivity_net438", + "source_port_82", + "pcb_plated_hole_39", + "pcb_port_82" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_5"], + "zLayers": [0], + "obstacleId": "__obs35" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": 2.540000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_40", + "connectivity_net439", + "source_port_83", + "pcb_plated_hole_40", + "pcb_port_83" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_9"], + "zLayers": [0], + "obstacleId": "__obs36" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": -7.776507174585693e-17 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_41", + "connectivity_net440", + "source_port_84", + "pcb_plated_hole_41", + "pcb_port_84" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_13"], + "zLayers": [0], + "obstacleId": "__obs37" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": -2.539999999999999 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_42", + "connectivity_net441", + "source_port_85", + "pcb_plated_hole_42", + "pcb_port_85" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_11"], + "zLayers": [0], + "obstacleId": "__obs38" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.73, + "y": -5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_43", + "connectivity_net442", + "source_port_86", + "pcb_plated_hole_43", + "pcb_port_86" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_2"], + "zLayers": [0], + "obstacleId": "__obs39" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.730000000000004, + "y": -7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_44", + "connectivity_net443", + "source_port_87", + "pcb_plated_hole_44", + "pcb_port_87" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_14"], + "zLayers": [0], + "obstacleId": "__obs40" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.730000000000004, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_45", + "connectivity_net444", + "source_port_88", + "pcb_plated_hole_45", + "pcb_port_88" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_1"], + "zLayers": [0], + "obstacleId": "__obs41" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.730000000000004, + "y": -12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_46", + "connectivity_net445", + "source_port_89", + "pcb_plated_hole_46", + "pcb_port_89" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_10"], + "zLayers": [0], + "obstacleId": "__obs42" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.730000000000004, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_47", + "connectivity_net446", + "source_port_90", + "pcb_plated_hole_47", + "pcb_port_90" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_7"], + "zLayers": [0], + "obstacleId": "__obs43" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 32.730000000000004, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_48", + "connectivity_net447", + "source_port_91", + "pcb_plated_hole_48", + "pcb_port_91" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_12"], + "zLayers": [0], + "obstacleId": "__obs44" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.189999999999998, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_49", + "connectivity_net448", + "source_port_92", + "pcb_plated_hole_49", + "pcb_port_92" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_14"], + "zLayers": [0], + "obstacleId": "__obs45" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.189999999999998, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_50", + "connectivity_net449", + "source_port_93", + "pcb_plated_hole_50", + "pcb_port_93" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_13"], + "zLayers": [0], + "obstacleId": "__obs46" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.189999999999998, + "y": 12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_51", + "connectivity_net450", + "source_port_94", + "pcb_plated_hole_51", + "pcb_port_94" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_8"], + "zLayers": [0], + "obstacleId": "__obs47" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.189999999999998, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_52", + "connectivity_net451", + "source_port_95", + "pcb_plated_hole_52", + "pcb_port_95" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_5"], + "zLayers": [0], + "obstacleId": "__obs48" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.189999999999998, + "y": 7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_53", + "connectivity_net452", + "source_port_96", + "pcb_plated_hole_53", + "pcb_port_96" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_0"], + "zLayers": [0], + "obstacleId": "__obs49" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.189999999999998, + "y": 5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_54", + "connectivity_net453", + "source_port_97", + "pcb_plated_hole_54", + "pcb_port_97" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_6"], + "zLayers": [0], + "obstacleId": "__obs50" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": 2.5400000000000005 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_55", + "connectivity_net454", + "source_port_98", + "pcb_plated_hole_55", + "pcb_port_98" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_7"], + "zLayers": [0], + "obstacleId": "__obs51" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -2.3329521523757077e-16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_56", + "connectivity_net455", + "source_port_99", + "pcb_plated_hole_56", + "pcb_port_99" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_2"], + "zLayers": [0], + "obstacleId": "__obs52" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -2.5399999999999996 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_57", + "connectivity_net456", + "source_port_100", + "pcb_plated_hole_57", + "pcb_port_100" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_12"], + "zLayers": [0], + "obstacleId": "__obs53" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_58", + "connectivity_net457", + "source_port_101", + "pcb_plated_hole_58", + "pcb_port_101" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_10"], + "zLayers": [0], + "obstacleId": "__obs54" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_59", + "connectivity_net458", + "source_port_102", + "pcb_plated_hole_59", + "pcb_port_102" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_9"], + "zLayers": [0], + "obstacleId": "__obs55" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_60", + "connectivity_net459", + "source_port_103", + "pcb_plated_hole_60", + "pcb_port_103" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_11"], + "zLayers": [0], + "obstacleId": "__obs56" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_61", + "connectivity_net460", + "source_port_104", + "pcb_plated_hole_61", + "pcb_port_104" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_3"], + "zLayers": [0], + "obstacleId": "__obs57" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_62", + "connectivity_net461", + "source_port_105", + "pcb_plated_hole_62", + "pcb_port_105" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_4"], + "zLayers": [0], + "obstacleId": "__obs58" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": 30.19, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_63", + "connectivity_net462", + "source_port_106", + "pcb_plated_hole_63", + "pcb_port_106" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_1"], + "zLayers": [0], + "obstacleId": "__obs59" + }, + { + "type": "rect", + "width": 1.6, + "center": { + "x": -37.81, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_64", + "connectivity_net463", + "source_port_107", + "pcb_plated_hole_64", + "pcb_port_107" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_15"], + "zLayers": [0], + "obstacleId": "__obs60" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_65", + "connectivity_net464", + "source_port_108", + "pcb_plated_hole_65", + "pcb_port_108" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_16"], + "zLayers": [0], + "obstacleId": "__obs61" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": -12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_66", + "connectivity_net465", + "source_port_109", + "pcb_plated_hole_66", + "pcb_port_109" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_17"], + "zLayers": [0], + "obstacleId": "__obs62" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_67", + "connectivity_net466", + "source_port_110", + "pcb_plated_hole_67", + "pcb_port_110" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_18"], + "zLayers": [0], + "obstacleId": "__obs63" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": -7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_68", + "connectivity_net467", + "source_port_111", + "pcb_plated_hole_68", + "pcb_port_111" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_15"], + "zLayers": [0], + "obstacleId": "__obs64" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": -5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_69", + "connectivity_net468", + "source_port_112", + "pcb_plated_hole_69", + "pcb_port_112" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_19"], + "zLayers": [0], + "obstacleId": "__obs65" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": -2.5400000000000005 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_70", + "connectivity_net469", + "source_port_113", + "pcb_plated_hole_70", + "pcb_port_113" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_20"], + "zLayers": [0], + "obstacleId": "__obs66" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 2.3329521523757077e-16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_71", + "connectivity_net470", + "source_port_114", + "pcb_plated_hole_71", + "pcb_port_114" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_16"], + "zLayers": [0], + "obstacleId": "__obs67" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 2.5399999999999996 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_72", + "connectivity_net471", + "source_port_115", + "pcb_plated_hole_72", + "pcb_port_115" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_19"], + "zLayers": [0], + "obstacleId": "__obs68" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_73", + "connectivity_net472", + "source_port_116", + "pcb_plated_hole_73", + "pcb_port_116" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_16"], + "zLayers": [0], + "obstacleId": "__obs69" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_74", + "connectivity_net473", + "source_port_117", + "pcb_plated_hole_74", + "pcb_port_117" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_21"], + "zLayers": [0], + "obstacleId": "__obs70" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_75", + "connectivity_net474", + "source_port_118", + "pcb_plated_hole_75", + "pcb_port_118" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_22"], + "zLayers": [0], + "obstacleId": "__obs71" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_76", + "connectivity_net475", + "source_port_119", + "pcb_plated_hole_76", + "pcb_port_119" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_23"], + "zLayers": [0], + "obstacleId": "__obs72" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_77", + "connectivity_net476", + "source_port_120", + "pcb_plated_hole_77", + "pcb_port_120" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_24"], + "zLayers": [0], + "obstacleId": "__obs73" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -37.81, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_78", + "connectivity_net477", + "source_port_121", + "pcb_plated_hole_78", + "pcb_port_121" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_17"], + "zLayers": [0], + "obstacleId": "__obs74" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_79", + "connectivity_net478", + "source_port_122", + "pcb_plated_hole_79", + "pcb_port_122" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_24"], + "zLayers": [0], + "obstacleId": "__obs75" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_80", + "connectivity_net479", + "source_port_123", + "pcb_plated_hole_80", + "pcb_port_123" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_21"], + "zLayers": [0], + "obstacleId": "__obs76" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": -12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_81", + "connectivity_net480", + "source_port_124", + "pcb_plated_hole_81", + "pcb_port_124" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_25"], + "zLayers": [0], + "obstacleId": "__obs77" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_82", + "connectivity_net481", + "source_port_125", + "pcb_plated_hole_82", + "pcb_port_125" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_22"], + "zLayers": [0], + "obstacleId": "__obs78" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": -7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_83", + "connectivity_net482", + "source_port_126", + "pcb_plated_hole_83", + "pcb_port_126" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_26"], + "zLayers": [0], + "obstacleId": "__obs79" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": -5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_84", + "connectivity_net483", + "source_port_127", + "pcb_plated_hole_84", + "pcb_port_127" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_27"], + "zLayers": [0], + "obstacleId": "__obs80" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": -2.540000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_85", + "connectivity_net484", + "source_port_128", + "pcb_plated_hole_85", + "pcb_port_128" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_18"], + "zLayers": [0], + "obstacleId": "__obs81" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": 7.776507174585693e-17 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_86", + "connectivity_net485", + "source_port_129", + "pcb_plated_hole_86", + "pcb_port_129" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_17"], + "zLayers": [0], + "obstacleId": "__obs82" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": 2.539999999999999 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_87", + "connectivity_net486", + "source_port_130", + "pcb_plated_hole_87", + "pcb_port_130" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_25"], + "zLayers": [0], + "obstacleId": "__obs83" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.27, + "y": 5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_88", + "connectivity_net487", + "source_port_131", + "pcb_plated_hole_88", + "pcb_port_131" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_23"], + "zLayers": [0], + "obstacleId": "__obs84" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.269999999999996, + "y": 7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_89", + "connectivity_net488", + "source_port_132", + "pcb_plated_hole_89", + "pcb_port_132" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_18"], + "zLayers": [0], + "obstacleId": "__obs85" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.269999999999996, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_90", + "connectivity_net489", + "source_port_133", + "pcb_plated_hole_90", + "pcb_port_133" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_28"], + "zLayers": [0], + "obstacleId": "__obs86" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.269999999999996, + "y": 12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_91", + "connectivity_net490", + "source_port_134", + "pcb_plated_hole_91", + "pcb_port_134" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_20"], + "zLayers": [0], + "obstacleId": "__obs87" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.269999999999996, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_92", + "connectivity_net491", + "source_port_135", + "pcb_plated_hole_92", + "pcb_port_135" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_29"], + "zLayers": [0], + "obstacleId": "__obs88" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -35.269999999999996, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_93", + "connectivity_net492", + "source_port_136", + "pcb_plated_hole_93", + "pcb_port_136" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_15"], + "zLayers": [0], + "obstacleId": "__obs89" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.730000000000004, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_94", + "connectivity_net493", + "source_port_137", + "pcb_plated_hole_94", + "pcb_port_137" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_21"], + "zLayers": [0], + "obstacleId": "__obs90" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.730000000000004, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_95", + "connectivity_net494", + "source_port_138", + "pcb_plated_hole_95", + "pcb_port_138" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_19"], + "zLayers": [0], + "obstacleId": "__obs91" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.730000000000004, + "y": -12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_96", + "connectivity_net495", + "source_port_139", + "pcb_plated_hole_96", + "pcb_port_139" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_15"], + "zLayers": [0], + "obstacleId": "__obs92" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.730000000000004, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_97", + "connectivity_net496", + "source_port_140", + "pcb_plated_hole_97", + "pcb_port_140" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_27"], + "zLayers": [0], + "obstacleId": "__obs93" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.730000000000004, + "y": -7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_98", + "connectivity_net497", + "source_port_141", + "pcb_plated_hole_98", + "pcb_port_141" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_21"], + "zLayers": [0], + "obstacleId": "__obs94" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": -5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_99", + "connectivity_net498", + "source_port_142", + "pcb_plated_hole_99", + "pcb_port_142" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_20"], + "zLayers": [0], + "obstacleId": "__obs95" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": -2.540000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_100", + "connectivity_net499", + "source_port_143", + "pcb_plated_hole_100", + "pcb_port_143" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_24"], + "zLayers": [0], + "obstacleId": "__obs96" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": -7.776507174585693e-17 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_101", + "connectivity_net500", + "source_port_144", + "pcb_plated_hole_101", + "pcb_port_144" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_28"], + "zLayers": [0], + "obstacleId": "__obs97" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": 2.539999999999999 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_102", + "connectivity_net501", + "source_port_145", + "pcb_plated_hole_102", + "pcb_port_145" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_26"], + "zLayers": [0], + "obstacleId": "__obs98" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": 5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_103", + "connectivity_net502", + "source_port_146", + "pcb_plated_hole_103", + "pcb_port_146" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_17"], + "zLayers": [0], + "obstacleId": "__obs99" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": 7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_104", + "connectivity_net503", + "source_port_147", + "pcb_plated_hole_104", + "pcb_port_147" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_29"], + "zLayers": [0], + "obstacleId": "__obs100" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_105", + "connectivity_net504", + "source_port_148", + "pcb_plated_hole_105", + "pcb_port_148" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_16"], + "zLayers": [0], + "obstacleId": "__obs101" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": 12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_106", + "connectivity_net505", + "source_port_149", + "pcb_plated_hole_106", + "pcb_port_149" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_25"], + "zLayers": [0], + "obstacleId": "__obs102" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_107", + "connectivity_net506", + "source_port_150", + "pcb_plated_hole_107", + "pcb_port_150" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_22"], + "zLayers": [0], + "obstacleId": "__obs103" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -32.73, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_108", + "connectivity_net507", + "source_port_151", + "pcb_plated_hole_108", + "pcb_port_151" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_27"], + "zLayers": [0], + "obstacleId": "__obs104" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_109", + "connectivity_net508", + "source_port_152", + "pcb_plated_hole_109", + "pcb_port_152" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_29"], + "zLayers": [0], + "obstacleId": "__obs105" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_110", + "connectivity_net509", + "source_port_153", + "pcb_plated_hole_110", + "pcb_port_153" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_28"], + "zLayers": [0], + "obstacleId": "__obs106" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -12.700000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_111", + "connectivity_net510", + "source_port_154", + "pcb_plated_hole_111", + "pcb_port_154" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_23"], + "zLayers": [0], + "obstacleId": "__obs107" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_112", + "connectivity_net511", + "source_port_155", + "pcb_plated_hole_112", + "pcb_port_155" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_20"], + "zLayers": [0], + "obstacleId": "__obs108" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -7.620000000000001 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_113", + "connectivity_net512", + "source_port_156", + "pcb_plated_hole_113", + "pcb_port_156" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_15"], + "zLayers": [0], + "obstacleId": "__obs109" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -5.080000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_114", + "connectivity_net513", + "source_port_157", + "pcb_plated_hole_114", + "pcb_port_157" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_21"], + "zLayers": [0], + "obstacleId": "__obs110" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -2.5400000000000014 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_115", + "connectivity_net514", + "source_port_158", + "pcb_plated_hole_115", + "pcb_port_158" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_22"], + "zLayers": [0], + "obstacleId": "__obs111" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": -2.3329521523757077e-16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_116", + "connectivity_net515", + "source_port_159", + "pcb_plated_hole_116", + "pcb_port_159" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_17"], + "zLayers": [0], + "obstacleId": "__obs112" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.19, + "y": 2.5399999999999987 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_117", + "connectivity_net516", + "source_port_160", + "pcb_plated_hole_117", + "pcb_port_160" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_27"], + "zLayers": [0], + "obstacleId": "__obs113" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.189999999999998, + "y": 5.079999999999998 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_118", + "connectivity_net517", + "source_port_161", + "pcb_plated_hole_118", + "pcb_port_161" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_25"], + "zLayers": [0], + "obstacleId": "__obs114" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.189999999999998, + "y": 7.619999999999997 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_119", + "connectivity_net518", + "source_port_162", + "pcb_plated_hole_119", + "pcb_port_162" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_24"], + "zLayers": [0], + "obstacleId": "__obs115" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.189999999999998, + "y": 10.16 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_120", + "connectivity_net519", + "source_port_163", + "pcb_plated_hole_120", + "pcb_port_163" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_26"], + "zLayers": [0], + "obstacleId": "__obs116" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.189999999999998, + "y": 12.7 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_121", + "connectivity_net520", + "source_port_164", + "pcb_plated_hole_121", + "pcb_port_164" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_18"], + "zLayers": [0], + "obstacleId": "__obs117" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.189999999999998, + "y": 15.240000000000002 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_122", + "connectivity_net521", + "source_port_165", + "pcb_plated_hole_122", + "pcb_port_165" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_19"], + "zLayers": [0], + "obstacleId": "__obs118" + }, + { + "type": "oval", + "width": 1.6, + "center": { + "x": -30.189999999999998, + "y": 17.78 + }, + "height": 1.6, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [ + "pcb_plated_hole_123", + "connectivity_net522", + "source_port_166", + "pcb_plated_hole_123", + "pcb_port_166" + ], + "netIsAssignable": true, + "offBoardConnectsTo": ["source_component_internal_connection_16"], + "zLayers": [0], + "obstacleId": "__obs119" + }, + { + "type": "rect", + "width": 13, + "center": { + "x": -2.4492935982947064e-16, + "y": -6 + }, + "height": 22, + "layers": ["top", "inner1", "inner2", "bottom"], + "connectedTo": [], + "zLayers": [0] + } + ], + "connMap": { + "netMap": { + "connectivity_net0": [ + "source_net_3", + "-762,-1192:0", + "pcb_port_10", + "-127,1400:0", + "pcb_port_45", + "pcb_smtpad_10", + "connectivity_net43", + "source_trace_17", + "source_port_45", + "source_trace_3", + "source_port_10", + "pcb_plated_hole_2", + "-127,1400:0-0-1-2", + "pcb_plated_hole_81", + "connectivity_net480", + "source_port_124", + "pcb_port_124", + "source_component_internal_connection_25", + "-3527,-1270:0-0-1-2", + "pcb_plated_hole_87", + "connectivity_net486", + "source_port_130", + "pcb_port_130", + "-3527,254:0-0-1-2", + "pcb_plated_hole_106", + "connectivity_net505", + "source_port_149", + "pcb_port_149", + "-3273,1270:0-0-1-2", + "pcb_plated_hole_118", + "connectivity_net517", + "source_port_161", + "pcb_port_161", + "-3019,508:0-0-1-2", + "__obs102", + "pcb_plated_hole_70", + "connectivity_net469", + "source_port_113", + "pcb_port_113", + "source_component_internal_connection_20", + "-3781,-254:0-0-1-2", + "pcb_plated_hole_91", + "connectivity_net490", + "source_port_134", + "pcb_port_134", + "-3527,1270:0-0-1-2", + "pcb_plated_hole_99", + "connectivity_net498", + "source_port_142", + "pcb_port_142", + "-3273,-508:0-0-1-2", + "pcb_plated_hole_112", + "connectivity_net511", + "source_port_155", + "pcb_port_155", + "-3019,-1016:0-0-1-2", + "__obs87", + "__obs108", + "__obs114" + ], + "connectivity_net1": [ + "source_net_2", + "-762,-1446:0", + "pcb_port_9", + "-381,1400:0", + "pcb_port_46", + "pcb_smtpad_9", + "connectivity_net41", + "source_trace_16", + "source_port_46", + "source_trace_2", + "source_port_9", + "pcb_plated_hole_3", + "-381,1400:0-0-1-2" + ], + "connectivity_net2": [ + "source_net_1_mst0", + "source_net_1", + "762,-938:0", + "pcb_port_2", + "1570,-1225:0", + "pcb_port_29", + "source_net_1_mst1", + "-1570,-225:0", + "pcb_port_34", + "-1570,-1225:0", + "pcb_port_38", + "source_net_1_mst2", + "-1570,775:0", + "pcb_port_42", + "source_net_1_mst3", + "1570,-225:0", + "pcb_port_25", + "source_net_1_mst4", + "127,1400:0", + "pcb_port_44", + "source_net_1_mst5", + "pcb_smtpad_2", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "pcb_smtpad_25", + "pcb_smtpad_29", + "pcb_smtpad_34", + "pcb_smtpad_38", + "pcb_smtpad_42", + "pcb_plated_hole_1", + "127,1400:0-0-1-2", + "pcb_plated_hole_75", + "connectivity_net474", + "source_port_118", + "pcb_port_118", + "source_component_internal_connection_22", + "-3781,1016:0-0-1-2", + "pcb_plated_hole_82", + "connectivity_net481", + "source_port_125", + "pcb_port_125", + "-3527,-1016:0-0-1-2", + "pcb_plated_hole_107", + "connectivity_net506", + "source_port_150", + "pcb_port_150", + "-3273,1524:0-0-1-2", + "pcb_plated_hole_115", + "connectivity_net514", + "source_port_158", + "pcb_port_158", + "-3019,-254:0-0-1-2", + "__obs103", + "pcb_plated_hole_64", + "connectivity_net463", + "source_port_107", + "pcb_port_107", + "source_component_internal_connection_15", + "-3781,-1778:0-0-1-2", + "pcb_plated_hole_68", + "connectivity_net467", + "source_port_111", + "pcb_port_111", + "-3781,-762:0-0-1-2", + "pcb_plated_hole_93", + "connectivity_net492", + "source_port_136", + "pcb_port_136", + "-3527,1778:0-0-1-2", + "pcb_plated_hole_96", + "connectivity_net495", + "source_port_139", + "pcb_port_139", + "-3273,-1270:0-0-1-2", + "pcb_plated_hole_113", + "connectivity_net512", + "source_port_156", + "pcb_port_156", + "-3019,-762:0-0-1-2", + "__obs89", + "__obs109", + "__obs111" + ], + "connectivity_net3": [ + "source_net_0", + "762,-1192:0", + "pcb_port_1", + "381,1400:0", + "pcb_port_43", + "pcb_smtpad_1", + "connectivity_net37", + "source_trace_14", + "source_port_43", + "source_trace_0", + "source_port_1", + "pcb_plated_hole_0", + "381,1400:0-0-1-2" + ], + "connectivity_net4": [ + "source_trace_12", + "-1570,1225:0", + "pcb_port_40", + "-762,-430:0", + "pcb_port_13", + "pcb_smtpad_13", + "connectivity_net32", + "source_port_40", + "source_port_13", + "pcb_smtpad_40", + "pcb_plated_hole_84", + "connectivity_net483", + "source_port_127", + "pcb_port_127", + "source_component_internal_connection_27", + "-3527,-508:0-0-1-2", + "pcb_plated_hole_97", + "connectivity_net496", + "source_port_140", + "pcb_port_140", + "-3273,-1016:0-0-1-2", + "pcb_plated_hole_108", + "connectivity_net507", + "source_port_151", + "pcb_port_151", + "-3273,1778:0-0-1-2", + "pcb_plated_hole_117", + "connectivity_net516", + "source_port_160", + "pcb_port_160", + "-3019,254:0-0-1-2", + "__obs93", + "__obs113" + ], + "connectivity_net5": [ + "source_trace_10", + "-1570,-775:0", + "pcb_port_36", + "-762,-684:0", + "pcb_port_12", + "pcb_smtpad_12", + "connectivity_net27", + "source_port_36", + "source_port_12", + "pcb_smtpad_36" + ], + "connectivity_net6": [ + "source_trace_8", + "-1570,225:0", + "pcb_port_32", + "-762,332:0", + "pcb_port_16", + "pcb_smtpad_16", + "connectivity_net22", + "source_port_32", + "source_port_16", + "pcb_smtpad_32" + ], + "connectivity_net7": [ + "source_trace_6", + "1570,-775:0", + "pcb_port_27", + "762,-176:0", + "pcb_port_5", + "pcb_smtpad_5", + "connectivity_net17", + "source_port_27", + "source_port_5", + "pcb_smtpad_27" + ], + "connectivity_net8": [ + "source_trace_4", + "1570,225:0", + "pcb_port_23", + "762,78:0", + "pcb_port_6", + "pcb_smtpad_6", + "connectivity_net12", + "source_port_23", + "source_port_6", + "pcb_smtpad_23" + ], + "connectivity_net9": [ + "pcb_smtpad_0", + "connectivity_net379", + "source_port_0", + "pcb_port_0", + "762,-1446:0" + ], + "connectivity_net10": [ + "pcb_smtpad_3", + "connectivity_net380", + "source_port_3", + "pcb_port_3", + "762,-684:0" + ], + "connectivity_net11": [ + "pcb_smtpad_4", + "connectivity_net381", + "source_port_4", + "pcb_port_4", + "762,-430:0" + ], + "connectivity_net12": [ + "pcb_smtpad_7", + "connectivity_net382", + "source_port_7", + "pcb_port_7", + "762,332:0" + ], + "connectivity_net13": [ + "pcb_smtpad_8", + "connectivity_net383", + "source_port_8", + "pcb_port_8", + "762,586:0" + ], + "connectivity_net14": [ + "pcb_smtpad_11", + "connectivity_net384", + "source_port_11", + "pcb_port_11", + "-762,-938:0" + ], + "connectivity_net15": [ + "pcb_smtpad_14", + "connectivity_net385", + "source_port_14", + "pcb_port_14", + "-762,-176:0" + ], + "connectivity_net16": [ + "pcb_smtpad_15", + "connectivity_net386", + "source_port_15", + "pcb_port_15", + "-762,78:0" + ], + "connectivity_net17": [ + "pcb_smtpad_17", + "connectivity_net387", + "source_port_17", + "pcb_port_17", + "-762,586:0" + ], + "connectivity_net18": [ + "pcb_smtpad_18", + "connectivity_net388", + "source_port_18", + "pcb_port_18", + "508,616:0" + ], + "connectivity_net19": [ + "pcb_smtpad_19", + "connectivity_net389", + "source_port_19", + "pcb_port_19", + "254,616:0" + ], + "connectivity_net20": [ + "pcb_smtpad_20", + "connectivity_net390", + "source_port_20", + "pcb_port_20", + "0,616:0" + ], + "connectivity_net21": [ + "pcb_smtpad_21", + "connectivity_net391", + "source_port_21", + "pcb_port_21", + "-254,616:0" + ], + "connectivity_net22": [ + "pcb_smtpad_22", + "connectivity_net392", + "source_port_22", + "pcb_port_22", + "-508,616:0" + ], + "connectivity_net23": [ + "pcb_smtpad_24", + "connectivity_net393", + "source_port_24", + "pcb_port_24", + "2430,225:0" + ], + "connectivity_net24": [ + "pcb_smtpad_26", + "connectivity_net394", + "source_port_26", + "pcb_port_26", + "2430,-225:0" + ], + "connectivity_net25": [ + "pcb_smtpad_28", + "connectivity_net395", + "source_port_28", + "pcb_port_28", + "2430,-775:0" + ], + "connectivity_net26": [ + "pcb_smtpad_30", + "connectivity_net396", + "source_port_30", + "pcb_port_30", + "2430,-1225:0" + ], + "connectivity_net27": [ + "pcb_smtpad_31", + "connectivity_net397", + "source_port_31", + "pcb_port_31", + "-2430,225:0" + ], + "connectivity_net28": [ + "pcb_smtpad_33", + "connectivity_net398", + "source_port_33", + "pcb_port_33", + "-2430,-225:0" + ], + "connectivity_net29": [ + "pcb_smtpad_35", + "connectivity_net399", + "source_port_35", + "pcb_port_35", + "-2430,-775:0" + ], + "connectivity_net30": [ + "pcb_smtpad_37", + "connectivity_net400", + "source_port_37", + "pcb_port_37", + "-2430,-1225:0" + ], + "connectivity_net31": [ + "pcb_smtpad_39", + "connectivity_net401", + "source_port_39", + "pcb_port_39", + "-2430,1225:0" + ], + "connectivity_net32": [ + "pcb_smtpad_41", + "connectivity_net402", + "source_port_41", + "pcb_port_41", + "-2430,775:0" + ], + "connectivity_net33": [ + "pcb_plated_hole_4", + "connectivity_net403", + "source_port_47", + "pcb_port_47", + "source_component_internal_connection_0", + "3781,1778:0-0-1-2", + "pcb_plated_hole_8", + "connectivity_net407", + "source_port_51", + "pcb_port_51", + "3781,762:0-0-1-2", + "pcb_plated_hole_33", + "connectivity_net432", + "source_port_76", + "pcb_port_76", + "3527,-1778:0-0-1-2", + "pcb_plated_hole_36", + "connectivity_net435", + "source_port_79", + "pcb_port_79", + "3273,1270:0-0-1-2", + "pcb_plated_hole_53", + "connectivity_net452", + "source_port_96", + "pcb_port_96", + "3019,762:0-0-1-2" + ], + "connectivity_net34": [ + "pcb_plated_hole_5", + "connectivity_net404", + "source_port_48", + "pcb_port_48", + "source_component_internal_connection_1", + "3781,1524:0-0-1-2", + "pcb_plated_hole_11", + "connectivity_net410", + "source_port_54", + "pcb_port_54", + "3781,0:0-0-1-2", + "pcb_plated_hole_13", + "connectivity_net412", + "source_port_56", + "pcb_port_56", + "3781,-508:0-0-1-2", + "pcb_plated_hole_45", + "connectivity_net444", + "source_port_88", + "pcb_port_88", + "3273,-1016:0-0-1-2", + "pcb_plated_hole_63", + "connectivity_net462", + "source_port_106", + "pcb_port_106", + "3019,-1778:0-0-1-2" + ], + "connectivity_net35": [ + "pcb_plated_hole_6", + "connectivity_net405", + "source_port_49", + "pcb_port_49", + "source_component_internal_connection_2", + "3781,1270:0-0-1-2", + "pcb_plated_hole_18", + "connectivity_net417", + "source_port_61", + "pcb_port_61", + "3781,-1778:0-0-1-2", + "pcb_plated_hole_26", + "connectivity_net425", + "source_port_69", + "pcb_port_69", + "3527,0:0-0-1-2", + "pcb_plated_hole_43", + "connectivity_net442", + "source_port_86", + "pcb_port_86", + "3273,-508:0-0-1-2", + "pcb_plated_hole_56", + "connectivity_net455", + "source_port_99", + "pcb_port_99", + "3019,0:0-0-1-2" + ], + "connectivity_net36": [ + "pcb_plated_hole_7", + "connectivity_net406", + "source_port_50", + "pcb_port_50", + "source_component_internal_connection_3", + "3781,1016:0-0-1-2", + "pcb_plated_hole_25", + "connectivity_net424", + "source_port_68", + "pcb_port_68", + "3527,254:0-0-1-2", + "pcb_plated_hole_29", + "connectivity_net428", + "source_port_72", + "pcb_port_72", + "3527,-762:0-0-1-2", + "pcb_plated_hole_61", + "connectivity_net460", + "source_port_104", + "pcb_port_104", + "3019,-1270:0-0-1-2" + ], + "connectivity_net37": [ + "pcb_plated_hole_9", + "connectivity_net408", + "source_port_52", + "pcb_port_52", + "source_component_internal_connection_4", + "3781,508:0-0-1-2", + "pcb_plated_hole_12", + "connectivity_net411", + "source_port_55", + "pcb_port_55", + "3781,-254:0-0-1-2", + "pcb_plated_hole_35", + "connectivity_net434", + "source_port_78", + "pcb_port_78", + "3273,1524:0-0-1-2", + "pcb_plated_hole_62", + "connectivity_net461", + "source_port_105", + "pcb_port_105", + "3019,-1524:0-0-1-2" + ], + "connectivity_net38": [ + "pcb_plated_hole_10", + "connectivity_net409", + "source_port_53", + "pcb_port_53", + "source_component_internal_connection_5", + "3781,254:0-0-1-2", + "pcb_plated_hole_31", + "connectivity_net430", + "source_port_74", + "pcb_port_74", + "3527,-1270:0-0-1-2", + "pcb_plated_hole_39", + "connectivity_net438", + "source_port_82", + "pcb_port_82", + "3273,508:0-0-1-2", + "pcb_plated_hole_52", + "connectivity_net451", + "source_port_95", + "pcb_port_95", + "3019,1016:0-0-1-2" + ], + "connectivity_net39": [ + "pcb_plated_hole_14", + "connectivity_net413", + "source_port_57", + "pcb_port_57", + "source_component_internal_connection_6", + "3781,-762:0-0-1-2", + "pcb_plated_hole_20", + "connectivity_net419", + "source_port_63", + "pcb_port_63", + "3527,1524:0-0-1-2", + "pcb_plated_hole_34", + "connectivity_net433", + "source_port_77", + "pcb_port_77", + "3273,1778:0-0-1-2", + "pcb_plated_hole_38", + "connectivity_net437", + "source_port_81", + "pcb_port_81", + "3273,762:0-0-1-2", + "pcb_plated_hole_54", + "connectivity_net453", + "source_port_97", + "pcb_port_97", + "3019,508:0-0-1-2" + ], + "connectivity_net40": [ + "pcb_plated_hole_15", + "connectivity_net414", + "source_port_58", + "pcb_port_58", + "source_component_internal_connection_7", + "3781,-1016:0-0-1-2", + "pcb_plated_hole_22", + "connectivity_net421", + "source_port_65", + "pcb_port_65", + "3527,1016:0-0-1-2", + "pcb_plated_hole_47", + "connectivity_net446", + "source_port_90", + "pcb_port_90", + "3273,-1524:0-0-1-2", + "pcb_plated_hole_55", + "connectivity_net454", + "source_port_98", + "pcb_port_98", + "3019,254:0-0-1-2" + ], + "connectivity_net41": [ + "pcb_plated_hole_16", + "connectivity_net415", + "source_port_59", + "pcb_port_59", + "source_component_internal_connection_8", + "3781,-1270:0-0-1-2", + "pcb_plated_hole_28", + "connectivity_net427", + "source_port_71", + "pcb_port_71", + "3527,-508:0-0-1-2", + "pcb_plated_hole_51", + "connectivity_net450", + "source_port_94", + "pcb_port_94", + "3019,1270:0-0-1-2" + ], + "connectivity_net42": [ + "pcb_plated_hole_17", + "connectivity_net416", + "source_port_60", + "pcb_port_60", + "source_component_internal_connection_9", + "3781,-1524:0-0-1-2", + "pcb_plated_hole_19", + "connectivity_net418", + "source_port_62", + "pcb_port_62", + "3527,1778:0-0-1-2", + "pcb_plated_hole_40", + "connectivity_net439", + "source_port_83", + "pcb_port_83", + "3273,254:0-0-1-2", + "pcb_plated_hole_59", + "connectivity_net458", + "source_port_102", + "pcb_port_102", + "3019,-762:0-0-1-2" + ], + "connectivity_net43": [ + "pcb_plated_hole_21", + "connectivity_net420", + "source_port_64", + "pcb_port_64", + "source_component_internal_connection_10", + "3527,1270:0-0-1-2", + "pcb_plated_hole_27", + "connectivity_net426", + "source_port_70", + "pcb_port_70", + "3527,-254:0-0-1-2", + "pcb_plated_hole_46", + "connectivity_net445", + "source_port_89", + "pcb_port_89", + "3273,-1270:0-0-1-2", + "pcb_plated_hole_58", + "connectivity_net457", + "source_port_101", + "pcb_port_101", + "3019,-508:0-0-1-2" + ], + "connectivity_net44": [ + "pcb_plated_hole_23", + "connectivity_net422", + "source_port_66", + "pcb_port_66", + "source_component_internal_connection_11", + "3527,762:0-0-1-2", + "pcb_plated_hole_42", + "connectivity_net441", + "source_port_85", + "pcb_port_85", + "3273,-254:0-0-1-2", + "pcb_plated_hole_60", + "connectivity_net459", + "source_port_103", + "pcb_port_103", + "3019,-1016:0-0-1-2" + ], + "connectivity_net45": [ + "pcb_plated_hole_24", + "connectivity_net423", + "source_port_67", + "pcb_port_67", + "source_component_internal_connection_12", + "3527,508:0-0-1-2", + "pcb_plated_hole_37", + "connectivity_net436", + "source_port_80", + "pcb_port_80", + "3273,1016:0-0-1-2", + "pcb_plated_hole_48", + "connectivity_net447", + "source_port_91", + "pcb_port_91", + "3273,-1778:0-0-1-2", + "pcb_plated_hole_57", + "connectivity_net456", + "source_port_100", + "pcb_port_100", + "3019,-254:0-0-1-2" + ], + "connectivity_net46": [ + "pcb_plated_hole_30", + "connectivity_net429", + "source_port_73", + "pcb_port_73", + "source_component_internal_connection_13", + "3527,-1016:0-0-1-2", + "pcb_plated_hole_41", + "connectivity_net440", + "source_port_84", + "pcb_port_84", + "3273,0:0-0-1-2", + "pcb_plated_hole_50", + "connectivity_net449", + "source_port_93", + "pcb_port_93", + "3019,1524:0-0-1-2" + ], + "connectivity_net47": [ + "pcb_plated_hole_32", + "connectivity_net431", + "source_port_75", + "pcb_port_75", + "source_component_internal_connection_14", + "3527,-1524:0-0-1-2", + "pcb_plated_hole_44", + "connectivity_net443", + "source_port_87", + "pcb_port_87", + "3273,-762:0-0-1-2", + "pcb_plated_hole_49", + "connectivity_net448", + "source_port_92", + "pcb_port_92", + "3019,1778:0-0-1-2" + ], + "connectivity_net48": [ + "source_net_1_mst0", + "source_net_1", + "762,-938:0", + "pcb_port_2", + "1570,-1225:0", + "pcb_port_29", + "source_net_1_mst1", + "-1570,-225:0", + "pcb_port_34", + "-1570,-1225:0", + "pcb_port_38", + "source_net_1_mst2", + "-1570,775:0", + "pcb_port_42", + "source_net_1_mst3", + "1570,-225:0", + "pcb_port_25", + "source_net_1_mst4", + "127,1400:0", + "pcb_port_44", + "source_net_1_mst5", + "pcb_smtpad_2", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "pcb_smtpad_25", + "pcb_smtpad_29", + "pcb_smtpad_34", + "pcb_smtpad_38", + "pcb_smtpad_42", + "pcb_plated_hole_1", + "127,1400:0-0-1-2", + "pcb_plated_hole_75", + "connectivity_net474", + "source_port_118", + "pcb_port_118", + "source_component_internal_connection_22", + "-3781,1016:0-0-1-2", + "pcb_plated_hole_82", + "connectivity_net481", + "source_port_125", + "pcb_port_125", + "-3527,-1016:0-0-1-2", + "pcb_plated_hole_107", + "connectivity_net506", + "source_port_150", + "pcb_port_150", + "-3273,1524:0-0-1-2", + "pcb_plated_hole_115", + "connectivity_net514", + "source_port_158", + "pcb_port_158", + "-3019,-254:0-0-1-2", + "__obs103", + "pcb_plated_hole_64", + "connectivity_net463", + "source_port_107", + "pcb_port_107", + "source_component_internal_connection_15", + "-3781,-1778:0-0-1-2", + "pcb_plated_hole_68", + "connectivity_net467", + "source_port_111", + "pcb_port_111", + "-3781,-762:0-0-1-2", + "pcb_plated_hole_93", + "connectivity_net492", + "source_port_136", + "pcb_port_136", + "-3527,1778:0-0-1-2", + "pcb_plated_hole_96", + "connectivity_net495", + "source_port_139", + "pcb_port_139", + "-3273,-1270:0-0-1-2", + "pcb_plated_hole_113", + "connectivity_net512", + "source_port_156", + "pcb_port_156", + "-3019,-762:0-0-1-2", + "__obs89", + "__obs109", + "__obs111" + ], + "connectivity_net49": [ + "pcb_plated_hole_65", + "connectivity_net464", + "source_port_108", + "pcb_port_108", + "source_component_internal_connection_16", + "-3781,-1524:0-0-1-2", + "pcb_plated_hole_71", + "connectivity_net470", + "source_port_114", + "pcb_port_114", + "-3781,0:0-0-1-2", + "pcb_plated_hole_73", + "connectivity_net472", + "source_port_116", + "pcb_port_116", + "-3781,508:0-0-1-2", + "pcb_plated_hole_105", + "connectivity_net504", + "source_port_148", + "pcb_port_148", + "-3273,1016:0-0-1-2", + "pcb_plated_hole_123", + "connectivity_net522", + "source_port_166", + "pcb_port_166", + "-3019,1778:0-0-1-2" + ], + "connectivity_net50": [ + "pcb_plated_hole_66", + "connectivity_net465", + "source_port_109", + "pcb_port_109", + "source_component_internal_connection_17", + "-3781,-1270:0-0-1-2", + "pcb_plated_hole_78", + "connectivity_net477", + "source_port_121", + "pcb_port_121", + "-3781,1778:0-0-1-2", + "pcb_plated_hole_86", + "connectivity_net485", + "source_port_129", + "pcb_port_129", + "-3527,0:0-0-1-2", + "pcb_plated_hole_103", + "connectivity_net502", + "source_port_146", + "pcb_port_146", + "-3273,508:0-0-1-2", + "pcb_plated_hole_116", + "connectivity_net515", + "source_port_159", + "pcb_port_159", + "-3019,0:0-0-1-2" + ], + "connectivity_net51": [ + "pcb_plated_hole_67", + "connectivity_net466", + "source_port_110", + "pcb_port_110", + "source_component_internal_connection_18", + "-3781,-1016:0-0-1-2", + "pcb_plated_hole_85", + "connectivity_net484", + "source_port_128", + "pcb_port_128", + "-3527,-254:0-0-1-2", + "pcb_plated_hole_89", + "connectivity_net488", + "source_port_132", + "pcb_port_132", + "-3527,762:0-0-1-2", + "pcb_plated_hole_121", + "connectivity_net520", + "source_port_164", + "pcb_port_164", + "-3019,1270:0-0-1-2" + ], + "connectivity_net52": [ + "pcb_plated_hole_69", + "connectivity_net468", + "source_port_112", + "pcb_port_112", + "source_component_internal_connection_19", + "-3781,-508:0-0-1-2", + "pcb_plated_hole_72", + "connectivity_net471", + "source_port_115", + "pcb_port_115", + "-3781,254:0-0-1-2", + "pcb_plated_hole_95", + "connectivity_net494", + "source_port_138", + "pcb_port_138", + "-3273,-1524:0-0-1-2", + "pcb_plated_hole_122", + "connectivity_net521", + "source_port_165", + "pcb_port_165", + "-3019,1524:0-0-1-2" + ], + "connectivity_net53": [ + "source_net_3", + "-762,-1192:0", + "pcb_port_10", + "-127,1400:0", + "pcb_port_45", + "pcb_smtpad_10", + "connectivity_net43", + "source_trace_17", + "source_port_45", + "source_trace_3", + "source_port_10", + "pcb_plated_hole_2", + "-127,1400:0-0-1-2", + "pcb_plated_hole_81", + "connectivity_net480", + "source_port_124", + "pcb_port_124", + "source_component_internal_connection_25", + "-3527,-1270:0-0-1-2", + "pcb_plated_hole_87", + "connectivity_net486", + "source_port_130", + "pcb_port_130", + "-3527,254:0-0-1-2", + "pcb_plated_hole_106", + "connectivity_net505", + "source_port_149", + "pcb_port_149", + "-3273,1270:0-0-1-2", + "pcb_plated_hole_118", + "connectivity_net517", + "source_port_161", + "pcb_port_161", + "-3019,508:0-0-1-2", + "__obs102", + "pcb_plated_hole_70", + "connectivity_net469", + "source_port_113", + "pcb_port_113", + "source_component_internal_connection_20", + "-3781,-254:0-0-1-2", + "pcb_plated_hole_91", + "connectivity_net490", + "source_port_134", + "pcb_port_134", + "-3527,1270:0-0-1-2", + "pcb_plated_hole_99", + "connectivity_net498", + "source_port_142", + "pcb_port_142", + "-3273,-508:0-0-1-2", + "pcb_plated_hole_112", + "connectivity_net511", + "source_port_155", + "pcb_port_155", + "-3019,-1016:0-0-1-2", + "__obs87", + "__obs108", + "__obs114" + ], + "connectivity_net54": [ + "pcb_plated_hole_74", + "connectivity_net473", + "source_port_117", + "pcb_port_117", + "source_component_internal_connection_21", + "-3781,762:0-0-1-2", + "pcb_plated_hole_80", + "connectivity_net479", + "source_port_123", + "pcb_port_123", + "-3527,-1524:0-0-1-2", + "pcb_plated_hole_94", + "connectivity_net493", + "source_port_137", + "pcb_port_137", + "-3273,-1778:0-0-1-2", + "pcb_plated_hole_98", + "connectivity_net497", + "source_port_141", + "pcb_port_141", + "-3273,-762:0-0-1-2", + "pcb_plated_hole_114", + "connectivity_net513", + "source_port_157", + "pcb_port_157", + "-3019,-508:0-0-1-2" + ], + "connectivity_net55": [ + "source_net_1_mst0", + "source_net_1", + "762,-938:0", + "pcb_port_2", + "1570,-1225:0", + "pcb_port_29", + "source_net_1_mst1", + "-1570,-225:0", + "pcb_port_34", + "-1570,-1225:0", + "pcb_port_38", + "source_net_1_mst2", + "-1570,775:0", + "pcb_port_42", + "source_net_1_mst3", + "1570,-225:0", + "pcb_port_25", + "source_net_1_mst4", + "127,1400:0", + "pcb_port_44", + "source_net_1_mst5", + "pcb_smtpad_2", + "connectivity_net39", + "source_trace_15", + "source_port_44", + "source_trace_13", + "source_port_42", + "source_trace_11", + "source_port_38", + "source_trace_9", + "source_port_34", + "source_trace_7", + "source_port_29", + "source_trace_5", + "source_port_25", + "source_trace_1", + "source_port_2", + "pcb_smtpad_25", + "pcb_smtpad_29", + "pcb_smtpad_34", + "pcb_smtpad_38", + "pcb_smtpad_42", + "pcb_plated_hole_1", + "127,1400:0-0-1-2", + "pcb_plated_hole_75", + "connectivity_net474", + "source_port_118", + "pcb_port_118", + "source_component_internal_connection_22", + "-3781,1016:0-0-1-2", + "pcb_plated_hole_82", + "connectivity_net481", + "source_port_125", + "pcb_port_125", + "-3527,-1016:0-0-1-2", + "pcb_plated_hole_107", + "connectivity_net506", + "source_port_150", + "pcb_port_150", + "-3273,1524:0-0-1-2", + "pcb_plated_hole_115", + "connectivity_net514", + "source_port_158", + "pcb_port_158", + "-3019,-254:0-0-1-2", + "__obs103", + "pcb_plated_hole_64", + "connectivity_net463", + "source_port_107", + "pcb_port_107", + "source_component_internal_connection_15", + "-3781,-1778:0-0-1-2", + "pcb_plated_hole_68", + "connectivity_net467", + "source_port_111", + "pcb_port_111", + "-3781,-762:0-0-1-2", + "pcb_plated_hole_93", + "connectivity_net492", + "source_port_136", + "pcb_port_136", + "-3527,1778:0-0-1-2", + "pcb_plated_hole_96", + "connectivity_net495", + "source_port_139", + "pcb_port_139", + "-3273,-1270:0-0-1-2", + "pcb_plated_hole_113", + "connectivity_net512", + "source_port_156", + "pcb_port_156", + "-3019,-762:0-0-1-2", + "__obs89", + "__obs109", + "__obs111" + ], + "connectivity_net56": [ + "pcb_plated_hole_76", + "connectivity_net475", + "source_port_119", + "pcb_port_119", + "source_component_internal_connection_23", + "-3781,1270:0-0-1-2", + "pcb_plated_hole_88", + "connectivity_net487", + "source_port_131", + "pcb_port_131", + "-3527,508:0-0-1-2", + "pcb_plated_hole_111", + "connectivity_net510", + "source_port_154", + "pcb_port_154", + "-3019,-1270:0-0-1-2" + ], + "connectivity_net57": [ + "pcb_plated_hole_77", + "connectivity_net476", + "source_port_120", + "pcb_port_120", + "source_component_internal_connection_24", + "-3781,1524:0-0-1-2", + "pcb_plated_hole_79", + "connectivity_net478", + "source_port_122", + "pcb_port_122", + "-3527,-1778:0-0-1-2", + "pcb_plated_hole_100", + "connectivity_net499", + "source_port_143", + "pcb_port_143", + "-3273,-254:0-0-1-2", + "pcb_plated_hole_119", + "connectivity_net518", + "source_port_162", + "pcb_port_162", + "-3019,762:0-0-1-2" + ], + "connectivity_net58": [ + "source_net_3", + "-762,-1192:0", + "pcb_port_10", + "-127,1400:0", + "pcb_port_45", + "pcb_smtpad_10", + "connectivity_net43", + "source_trace_17", + "source_port_45", + "source_trace_3", + "source_port_10", + "pcb_plated_hole_2", + "-127,1400:0-0-1-2", + "pcb_plated_hole_81", + "connectivity_net480", + "source_port_124", + "pcb_port_124", + "source_component_internal_connection_25", + "-3527,-1270:0-0-1-2", + "pcb_plated_hole_87", + "connectivity_net486", + "source_port_130", + "pcb_port_130", + "-3527,254:0-0-1-2", + "pcb_plated_hole_106", + "connectivity_net505", + "source_port_149", + "pcb_port_149", + "-3273,1270:0-0-1-2", + "pcb_plated_hole_118", + "connectivity_net517", + "source_port_161", + "pcb_port_161", + "-3019,508:0-0-1-2", + "__obs102", + "pcb_plated_hole_70", + "connectivity_net469", + "source_port_113", + "pcb_port_113", + "source_component_internal_connection_20", + "-3781,-254:0-0-1-2", + "pcb_plated_hole_91", + "connectivity_net490", + "source_port_134", + "pcb_port_134", + "-3527,1270:0-0-1-2", + "pcb_plated_hole_99", + "connectivity_net498", + "source_port_142", + "pcb_port_142", + "-3273,-508:0-0-1-2", + "pcb_plated_hole_112", + "connectivity_net511", + "source_port_155", + "pcb_port_155", + "-3019,-1016:0-0-1-2", + "__obs87", + "__obs108", + "__obs114" + ], + "connectivity_net59": [ + "pcb_plated_hole_83", + "connectivity_net482", + "source_port_126", + "pcb_port_126", + "source_component_internal_connection_26", + "-3527,-762:0-0-1-2", + "pcb_plated_hole_102", + "connectivity_net501", + "source_port_145", + "pcb_port_145", + "-3273,254:0-0-1-2", + "pcb_plated_hole_120", + "connectivity_net519", + "source_port_163", + "pcb_port_163", + "-3019,1016:0-0-1-2" + ], + "connectivity_net60": [ + "source_trace_12", + "-1570,1225:0", + "pcb_port_40", + "-762,-430:0", + "pcb_port_13", + "pcb_smtpad_13", + "connectivity_net32", + "source_port_40", + "source_port_13", + "pcb_smtpad_40", + "pcb_plated_hole_84", + "connectivity_net483", + "source_port_127", + "pcb_port_127", + "source_component_internal_connection_27", + "-3527,-508:0-0-1-2", + "pcb_plated_hole_97", + "connectivity_net496", + "source_port_140", + "pcb_port_140", + "-3273,-1016:0-0-1-2", + "pcb_plated_hole_108", + "connectivity_net507", + "source_port_151", + "pcb_port_151", + "-3273,1778:0-0-1-2", + "pcb_plated_hole_117", + "connectivity_net516", + "source_port_160", + "pcb_port_160", + "-3019,254:0-0-1-2", + "__obs93", + "__obs113" + ], + "connectivity_net61": [ + "pcb_plated_hole_90", + "connectivity_net489", + "source_port_133", + "pcb_port_133", + "source_component_internal_connection_28", + "-3527,1016:0-0-1-2", + "pcb_plated_hole_101", + "connectivity_net500", + "source_port_144", + "pcb_port_144", + "-3273,0:0-0-1-2", + "pcb_plated_hole_110", + "connectivity_net509", + "source_port_153", + "pcb_port_153", + "-3019,-1524:0-0-1-2" + ], + "connectivity_net62": [ + "pcb_plated_hole_92", + "connectivity_net491", + "source_port_135", + "pcb_port_135", + "source_component_internal_connection_29", + "-3527,1524:0-0-1-2", + "pcb_plated_hole_104", + "connectivity_net503", + "source_port_147", + "pcb_port_147", + "-3273,762:0-0-1-2", + "pcb_plated_hole_109", + "connectivity_net508", + "source_port_152", + "pcb_port_152", + "-3019,-1778:0-0-1-2" + ], + "connectivity_net63": ["0,-600:0-0-1-2"] + }, + "idToNetMap": { + "source_net_3": "connectivity_net0", + "-762,-1192:0": "connectivity_net0", + "pcb_port_10": "connectivity_net0", + "-127,1400:0": "connectivity_net0", + "pcb_port_45": "connectivity_net0", + "source_net_2": "connectivity_net1", + "-762,-1446:0": "connectivity_net1", + "pcb_port_9": "connectivity_net1", + "-381,1400:0": "connectivity_net1", + "pcb_port_46": "connectivity_net1", + "source_net_1_mst0": "connectivity_net2", + "source_net_1": "connectivity_net2", + "762,-938:0": "connectivity_net2", + "pcb_port_2": "connectivity_net2", + "1570,-1225:0": "connectivity_net2", + "pcb_port_29": "connectivity_net2", + "source_net_1_mst1": "connectivity_net2", + "-1570,-225:0": "connectivity_net2", + "pcb_port_34": "connectivity_net2", + "-1570,-1225:0": "connectivity_net2", + "pcb_port_38": "connectivity_net2", + "source_net_1_mst2": "connectivity_net2", + "-1570,775:0": "connectivity_net2", + "pcb_port_42": "connectivity_net2", + "source_net_1_mst3": "connectivity_net2", + "1570,-225:0": "connectivity_net2", + "pcb_port_25": "connectivity_net2", + "source_net_1_mst4": "connectivity_net2", + "127,1400:0": "connectivity_net2", + "pcb_port_44": "connectivity_net2", + "source_net_1_mst5": "connectivity_net2", + "source_net_0": "connectivity_net3", + "762,-1192:0": "connectivity_net3", + "pcb_port_1": "connectivity_net3", + "381,1400:0": "connectivity_net3", + "pcb_port_43": "connectivity_net3", + "source_trace_12": "connectivity_net4", + "-1570,1225:0": "connectivity_net4", + "pcb_port_40": "connectivity_net4", + "-762,-430:0": "connectivity_net4", + "pcb_port_13": "connectivity_net4", + "source_trace_10": "connectivity_net5", + "-1570,-775:0": "connectivity_net5", + "pcb_port_36": "connectivity_net5", + "-762,-684:0": "connectivity_net5", + "pcb_port_12": "connectivity_net5", + "source_trace_8": "connectivity_net6", + "-1570,225:0": "connectivity_net6", + "pcb_port_32": "connectivity_net6", + "-762,332:0": "connectivity_net6", + "pcb_port_16": "connectivity_net6", + "source_trace_6": "connectivity_net7", + "1570,-775:0": "connectivity_net7", + "pcb_port_27": "connectivity_net7", + "762,-176:0": "connectivity_net7", + "pcb_port_5": "connectivity_net7", + "source_trace_4": "connectivity_net8", + "1570,225:0": "connectivity_net8", + "pcb_port_23": "connectivity_net8", + "762,78:0": "connectivity_net8", + "pcb_port_6": "connectivity_net8", + "pcb_smtpad_0": "connectivity_net9", + "connectivity_net379": "connectivity_net9", + "source_port_0": "connectivity_net9", + "pcb_port_0": "connectivity_net9", + "762,-1446:0": "connectivity_net9", + "pcb_smtpad_1": "connectivity_net3", + "connectivity_net37": "connectivity_net3", + "source_trace_14": "connectivity_net3", + "source_port_43": "connectivity_net3", + "source_trace_0": "connectivity_net3", + "source_port_1": "connectivity_net3", + "pcb_plated_hole_0": "connectivity_net3", + "pcb_smtpad_2": "connectivity_net2", + "connectivity_net39": "connectivity_net2", + "source_trace_15": "connectivity_net2", + "source_port_44": "connectivity_net2", + "source_trace_13": "connectivity_net2", + "source_port_42": "connectivity_net2", + "source_trace_11": "connectivity_net2", + "source_port_38": "connectivity_net2", + "source_trace_9": "connectivity_net2", + "source_port_34": "connectivity_net2", + "source_trace_7": "connectivity_net2", + "source_port_29": "connectivity_net2", + "source_trace_5": "connectivity_net2", + "source_port_25": "connectivity_net2", + "source_trace_1": "connectivity_net2", + "source_port_2": "connectivity_net2", + "pcb_smtpad_25": "connectivity_net2", + "pcb_smtpad_29": "connectivity_net2", + "pcb_smtpad_34": "connectivity_net2", + "pcb_smtpad_38": "connectivity_net2", + "pcb_smtpad_42": "connectivity_net2", + "pcb_plated_hole_1": "connectivity_net2", + "pcb_smtpad_3": "connectivity_net10", + "connectivity_net380": "connectivity_net10", + "source_port_3": "connectivity_net10", + "pcb_port_3": "connectivity_net10", + "762,-684:0": "connectivity_net10", + "pcb_smtpad_4": "connectivity_net11", + "connectivity_net381": "connectivity_net11", + "source_port_4": "connectivity_net11", + "pcb_port_4": "connectivity_net11", + "762,-430:0": "connectivity_net11", + "pcb_smtpad_5": "connectivity_net7", + "connectivity_net17": "connectivity_net7", + "source_port_27": "connectivity_net7", + "source_port_5": "connectivity_net7", + "pcb_smtpad_27": "connectivity_net7", + "pcb_smtpad_6": "connectivity_net8", + "connectivity_net12": "connectivity_net8", + "source_port_23": "connectivity_net8", + "source_port_6": "connectivity_net8", + "pcb_smtpad_23": "connectivity_net8", + "pcb_smtpad_7": "connectivity_net12", + "connectivity_net382": "connectivity_net12", + "source_port_7": "connectivity_net12", + "pcb_port_7": "connectivity_net12", + "762,332:0": "connectivity_net12", + "pcb_smtpad_8": "connectivity_net13", + "connectivity_net383": "connectivity_net13", + "source_port_8": "connectivity_net13", + "pcb_port_8": "connectivity_net13", + "762,586:0": "connectivity_net13", + "pcb_smtpad_9": "connectivity_net1", + "connectivity_net41": "connectivity_net1", + "source_trace_16": "connectivity_net1", + "source_port_46": "connectivity_net1", + "source_trace_2": "connectivity_net1", + "source_port_9": "connectivity_net1", + "pcb_plated_hole_3": "connectivity_net1", + "pcb_smtpad_10": "connectivity_net0", + "connectivity_net43": "connectivity_net0", + "source_trace_17": "connectivity_net0", + "source_port_45": "connectivity_net0", + "source_trace_3": "connectivity_net0", + "source_port_10": "connectivity_net0", + "pcb_plated_hole_2": "connectivity_net0", + "pcb_smtpad_11": "connectivity_net14", + "connectivity_net384": "connectivity_net14", + "source_port_11": "connectivity_net14", + "pcb_port_11": "connectivity_net14", + "-762,-938:0": "connectivity_net14", + "pcb_smtpad_12": "connectivity_net5", + "connectivity_net27": "connectivity_net5", + "source_port_36": "connectivity_net5", + "source_port_12": "connectivity_net5", + "pcb_smtpad_36": "connectivity_net5", + "pcb_smtpad_13": "connectivity_net4", + "connectivity_net32": "connectivity_net4", + "source_port_40": "connectivity_net4", + "source_port_13": "connectivity_net4", + "pcb_smtpad_40": "connectivity_net4", + "pcb_smtpad_14": "connectivity_net15", + "connectivity_net385": "connectivity_net15", + "source_port_14": "connectivity_net15", + "pcb_port_14": "connectivity_net15", + "-762,-176:0": "connectivity_net15", + "pcb_smtpad_15": "connectivity_net16", + "connectivity_net386": "connectivity_net16", + "source_port_15": "connectivity_net16", + "pcb_port_15": "connectivity_net16", + "-762,78:0": "connectivity_net16", + "pcb_smtpad_16": "connectivity_net6", + "connectivity_net22": "connectivity_net6", + "source_port_32": "connectivity_net6", + "source_port_16": "connectivity_net6", + "pcb_smtpad_32": "connectivity_net6", + "pcb_smtpad_17": "connectivity_net17", + "connectivity_net387": "connectivity_net17", + "source_port_17": "connectivity_net17", + "pcb_port_17": "connectivity_net17", + "-762,586:0": "connectivity_net17", + "pcb_smtpad_18": "connectivity_net18", + "connectivity_net388": "connectivity_net18", + "source_port_18": "connectivity_net18", + "pcb_port_18": "connectivity_net18", + "508,616:0": "connectivity_net18", + "pcb_smtpad_19": "connectivity_net19", + "connectivity_net389": "connectivity_net19", + "source_port_19": "connectivity_net19", + "pcb_port_19": "connectivity_net19", + "254,616:0": "connectivity_net19", + "pcb_smtpad_20": "connectivity_net20", + "connectivity_net390": "connectivity_net20", + "source_port_20": "connectivity_net20", + "pcb_port_20": "connectivity_net20", + "0,616:0": "connectivity_net20", + "pcb_smtpad_21": "connectivity_net21", + "connectivity_net391": "connectivity_net21", + "source_port_21": "connectivity_net21", + "pcb_port_21": "connectivity_net21", + "-254,616:0": "connectivity_net21", + "pcb_smtpad_22": "connectivity_net22", + "connectivity_net392": "connectivity_net22", + "source_port_22": "connectivity_net22", + "pcb_port_22": "connectivity_net22", + "-508,616:0": "connectivity_net22", + "pcb_smtpad_24": "connectivity_net23", + "connectivity_net393": "connectivity_net23", + "source_port_24": "connectivity_net23", + "pcb_port_24": "connectivity_net23", + "2430,225:0": "connectivity_net23", + "pcb_smtpad_26": "connectivity_net24", + "connectivity_net394": "connectivity_net24", + "source_port_26": "connectivity_net24", + "pcb_port_26": "connectivity_net24", + "2430,-225:0": "connectivity_net24", + "pcb_smtpad_28": "connectivity_net25", + "connectivity_net395": "connectivity_net25", + "source_port_28": "connectivity_net25", + "pcb_port_28": "connectivity_net25", + "2430,-775:0": "connectivity_net25", + "pcb_smtpad_30": "connectivity_net26", + "connectivity_net396": "connectivity_net26", + "source_port_30": "connectivity_net26", + "pcb_port_30": "connectivity_net26", + "2430,-1225:0": "connectivity_net26", + "pcb_smtpad_31": "connectivity_net27", + "connectivity_net397": "connectivity_net27", + "source_port_31": "connectivity_net27", + "pcb_port_31": "connectivity_net27", + "-2430,225:0": "connectivity_net27", + "pcb_smtpad_33": "connectivity_net28", + "connectivity_net398": "connectivity_net28", + "source_port_33": "connectivity_net28", + "pcb_port_33": "connectivity_net28", + "-2430,-225:0": "connectivity_net28", + "pcb_smtpad_35": "connectivity_net29", + "connectivity_net399": "connectivity_net29", + "source_port_35": "connectivity_net29", + "pcb_port_35": "connectivity_net29", + "-2430,-775:0": "connectivity_net29", + "pcb_smtpad_37": "connectivity_net30", + "connectivity_net400": "connectivity_net30", + "source_port_37": "connectivity_net30", + "pcb_port_37": "connectivity_net30", + "-2430,-1225:0": "connectivity_net30", + "pcb_smtpad_39": "connectivity_net31", + "connectivity_net401": "connectivity_net31", + "source_port_39": "connectivity_net31", + "pcb_port_39": "connectivity_net31", + "-2430,1225:0": "connectivity_net31", + "pcb_smtpad_41": "connectivity_net32", + "connectivity_net402": "connectivity_net32", + "source_port_41": "connectivity_net32", + "pcb_port_41": "connectivity_net32", + "-2430,775:0": "connectivity_net32", + "381,1400:0-0-1-2": "connectivity_net3", + "127,1400:0-0-1-2": "connectivity_net2", + "-127,1400:0-0-1-2": "connectivity_net0", + "-381,1400:0-0-1-2": "connectivity_net1", + "pcb_plated_hole_4": "connectivity_net33", + "connectivity_net403": "connectivity_net33", + "source_port_47": "connectivity_net33", + "pcb_port_47": "connectivity_net33", + "source_component_internal_connection_0": "connectivity_net33", + "3781,1778:0-0-1-2": "connectivity_net33", + "pcb_plated_hole_5": "connectivity_net34", + "connectivity_net404": "connectivity_net34", + "source_port_48": "connectivity_net34", + "pcb_port_48": "connectivity_net34", + "source_component_internal_connection_1": "connectivity_net34", + "3781,1524:0-0-1-2": "connectivity_net34", + "pcb_plated_hole_6": "connectivity_net35", + "connectivity_net405": "connectivity_net35", + "source_port_49": "connectivity_net35", + "pcb_port_49": "connectivity_net35", + "source_component_internal_connection_2": "connectivity_net35", + "3781,1270:0-0-1-2": "connectivity_net35", + "pcb_plated_hole_7": "connectivity_net36", + "connectivity_net406": "connectivity_net36", + "source_port_50": "connectivity_net36", + "pcb_port_50": "connectivity_net36", + "source_component_internal_connection_3": "connectivity_net36", + "3781,1016:0-0-1-2": "connectivity_net36", + "pcb_plated_hole_8": "connectivity_net33", + "connectivity_net407": "connectivity_net33", + "source_port_51": "connectivity_net33", + "pcb_port_51": "connectivity_net33", + "3781,762:0-0-1-2": "connectivity_net33", + "pcb_plated_hole_9": "connectivity_net37", + "connectivity_net408": "connectivity_net37", + "source_port_52": "connectivity_net37", + "pcb_port_52": "connectivity_net37", + "source_component_internal_connection_4": "connectivity_net37", + "3781,508:0-0-1-2": "connectivity_net37", + "pcb_plated_hole_10": "connectivity_net38", + "connectivity_net409": "connectivity_net38", + "source_port_53": "connectivity_net38", + "pcb_port_53": "connectivity_net38", + "source_component_internal_connection_5": "connectivity_net38", + "3781,254:0-0-1-2": "connectivity_net38", + "pcb_plated_hole_11": "connectivity_net34", + "connectivity_net410": "connectivity_net34", + "source_port_54": "connectivity_net34", + "pcb_port_54": "connectivity_net34", + "3781,0:0-0-1-2": "connectivity_net34", + "pcb_plated_hole_12": "connectivity_net37", + "connectivity_net411": "connectivity_net37", + "source_port_55": "connectivity_net37", + "pcb_port_55": "connectivity_net37", + "3781,-254:0-0-1-2": "connectivity_net37", + "pcb_plated_hole_13": "connectivity_net34", + "connectivity_net412": "connectivity_net34", + "source_port_56": "connectivity_net34", + "pcb_port_56": "connectivity_net34", + "3781,-508:0-0-1-2": "connectivity_net34", + "pcb_plated_hole_14": "connectivity_net39", + "connectivity_net413": "connectivity_net39", + "source_port_57": "connectivity_net39", + "pcb_port_57": "connectivity_net39", + "source_component_internal_connection_6": "connectivity_net39", + "3781,-762:0-0-1-2": "connectivity_net39", + "pcb_plated_hole_15": "connectivity_net40", + "connectivity_net414": "connectivity_net40", + "source_port_58": "connectivity_net40", + "pcb_port_58": "connectivity_net40", + "source_component_internal_connection_7": "connectivity_net40", + "3781,-1016:0-0-1-2": "connectivity_net40", + "pcb_plated_hole_16": "connectivity_net41", + "connectivity_net415": "connectivity_net41", + "source_port_59": "connectivity_net41", + "pcb_port_59": "connectivity_net41", + "source_component_internal_connection_8": "connectivity_net41", + "3781,-1270:0-0-1-2": "connectivity_net41", + "pcb_plated_hole_17": "connectivity_net42", + "connectivity_net416": "connectivity_net42", + "source_port_60": "connectivity_net42", + "pcb_port_60": "connectivity_net42", + "source_component_internal_connection_9": "connectivity_net42", + "3781,-1524:0-0-1-2": "connectivity_net42", + "pcb_plated_hole_18": "connectivity_net35", + "connectivity_net417": "connectivity_net35", + "source_port_61": "connectivity_net35", + "pcb_port_61": "connectivity_net35", + "3781,-1778:0-0-1-2": "connectivity_net35", + "pcb_plated_hole_19": "connectivity_net42", + "connectivity_net418": "connectivity_net42", + "source_port_62": "connectivity_net42", + "pcb_port_62": "connectivity_net42", + "3527,1778:0-0-1-2": "connectivity_net42", + "pcb_plated_hole_20": "connectivity_net39", + "connectivity_net419": "connectivity_net39", + "source_port_63": "connectivity_net39", + "pcb_port_63": "connectivity_net39", + "3527,1524:0-0-1-2": "connectivity_net39", + "pcb_plated_hole_21": "connectivity_net43", + "connectivity_net420": "connectivity_net43", + "source_port_64": "connectivity_net43", + "pcb_port_64": "connectivity_net43", + "source_component_internal_connection_10": "connectivity_net43", + "3527,1270:0-0-1-2": "connectivity_net43", + "pcb_plated_hole_22": "connectivity_net40", + "connectivity_net421": "connectivity_net40", + "source_port_65": "connectivity_net40", + "pcb_port_65": "connectivity_net40", + "3527,1016:0-0-1-2": "connectivity_net40", + "pcb_plated_hole_23": "connectivity_net44", + "connectivity_net422": "connectivity_net44", + "source_port_66": "connectivity_net44", + "pcb_port_66": "connectivity_net44", + "source_component_internal_connection_11": "connectivity_net44", + "3527,762:0-0-1-2": "connectivity_net44", + "pcb_plated_hole_24": "connectivity_net45", + "connectivity_net423": "connectivity_net45", + "source_port_67": "connectivity_net45", + "pcb_port_67": "connectivity_net45", + "source_component_internal_connection_12": "connectivity_net45", + "3527,508:0-0-1-2": "connectivity_net45", + "pcb_plated_hole_25": "connectivity_net36", + "connectivity_net424": "connectivity_net36", + "source_port_68": "connectivity_net36", + "pcb_port_68": "connectivity_net36", + "3527,254:0-0-1-2": "connectivity_net36", + "pcb_plated_hole_26": "connectivity_net35", + "connectivity_net425": "connectivity_net35", + "source_port_69": "connectivity_net35", + "pcb_port_69": "connectivity_net35", + "3527,0:0-0-1-2": "connectivity_net35", + "pcb_plated_hole_27": "connectivity_net43", + "connectivity_net426": "connectivity_net43", + "source_port_70": "connectivity_net43", + "pcb_port_70": "connectivity_net43", + "3527,-254:0-0-1-2": "connectivity_net43", + "pcb_plated_hole_28": "connectivity_net41", + "connectivity_net427": "connectivity_net41", + "source_port_71": "connectivity_net41", + "pcb_port_71": "connectivity_net41", + "3527,-508:0-0-1-2": "connectivity_net41", + "pcb_plated_hole_29": "connectivity_net36", + "connectivity_net428": "connectivity_net36", + "source_port_72": "connectivity_net36", + "pcb_port_72": "connectivity_net36", + "3527,-762:0-0-1-2": "connectivity_net36", + "pcb_plated_hole_30": "connectivity_net46", + "connectivity_net429": "connectivity_net46", + "source_port_73": "connectivity_net46", + "pcb_port_73": "connectivity_net46", + "source_component_internal_connection_13": "connectivity_net46", + "3527,-1016:0-0-1-2": "connectivity_net46", + "pcb_plated_hole_31": "connectivity_net38", + "connectivity_net430": "connectivity_net38", + "source_port_74": "connectivity_net38", + "pcb_port_74": "connectivity_net38", + "3527,-1270:0-0-1-2": "connectivity_net38", + "pcb_plated_hole_32": "connectivity_net47", + "connectivity_net431": "connectivity_net47", + "source_port_75": "connectivity_net47", + "pcb_port_75": "connectivity_net47", + "source_component_internal_connection_14": "connectivity_net47", + "3527,-1524:0-0-1-2": "connectivity_net47", + "pcb_plated_hole_33": "connectivity_net33", + "connectivity_net432": "connectivity_net33", + "source_port_76": "connectivity_net33", + "pcb_port_76": "connectivity_net33", + "3527,-1778:0-0-1-2": "connectivity_net33", + "pcb_plated_hole_34": "connectivity_net39", + "connectivity_net433": "connectivity_net39", + "source_port_77": "connectivity_net39", + "pcb_port_77": "connectivity_net39", + "3273,1778:0-0-1-2": "connectivity_net39", + "pcb_plated_hole_35": "connectivity_net37", + "connectivity_net434": "connectivity_net37", + "source_port_78": "connectivity_net37", + "pcb_port_78": "connectivity_net37", + "3273,1524:0-0-1-2": "connectivity_net37", + "pcb_plated_hole_36": "connectivity_net33", + "connectivity_net435": "connectivity_net33", + "source_port_79": "connectivity_net33", + "pcb_port_79": "connectivity_net33", + "3273,1270:0-0-1-2": "connectivity_net33", + "pcb_plated_hole_37": "connectivity_net45", + "connectivity_net436": "connectivity_net45", + "source_port_80": "connectivity_net45", + "pcb_port_80": "connectivity_net45", + "3273,1016:0-0-1-2": "connectivity_net45", + "pcb_plated_hole_38": "connectivity_net39", + "connectivity_net437": "connectivity_net39", + "source_port_81": "connectivity_net39", + "pcb_port_81": "connectivity_net39", + "3273,762:0-0-1-2": "connectivity_net39", + "pcb_plated_hole_39": "connectivity_net38", + "connectivity_net438": "connectivity_net38", + "source_port_82": "connectivity_net38", + "pcb_port_82": "connectivity_net38", + "3273,508:0-0-1-2": "connectivity_net38", + "pcb_plated_hole_40": "connectivity_net42", + "connectivity_net439": "connectivity_net42", + "source_port_83": "connectivity_net42", + "pcb_port_83": "connectivity_net42", + "3273,254:0-0-1-2": "connectivity_net42", + "pcb_plated_hole_41": "connectivity_net46", + "connectivity_net440": "connectivity_net46", + "source_port_84": "connectivity_net46", + "pcb_port_84": "connectivity_net46", + "3273,0:0-0-1-2": "connectivity_net46", + "pcb_plated_hole_42": "connectivity_net44", + "connectivity_net441": "connectivity_net44", + "source_port_85": "connectivity_net44", + "pcb_port_85": "connectivity_net44", + "3273,-254:0-0-1-2": "connectivity_net44", + "pcb_plated_hole_43": "connectivity_net35", + "connectivity_net442": "connectivity_net35", + "source_port_86": "connectivity_net35", + "pcb_port_86": "connectivity_net35", + "3273,-508:0-0-1-2": "connectivity_net35", + "pcb_plated_hole_44": "connectivity_net47", + "connectivity_net443": "connectivity_net47", + "source_port_87": "connectivity_net47", + "pcb_port_87": "connectivity_net47", + "3273,-762:0-0-1-2": "connectivity_net47", + "pcb_plated_hole_45": "connectivity_net34", + "connectivity_net444": "connectivity_net34", + "source_port_88": "connectivity_net34", + "pcb_port_88": "connectivity_net34", + "3273,-1016:0-0-1-2": "connectivity_net34", + "pcb_plated_hole_46": "connectivity_net43", + "connectivity_net445": "connectivity_net43", + "source_port_89": "connectivity_net43", + "pcb_port_89": "connectivity_net43", + "3273,-1270:0-0-1-2": "connectivity_net43", + "pcb_plated_hole_47": "connectivity_net40", + "connectivity_net446": "connectivity_net40", + "source_port_90": "connectivity_net40", + "pcb_port_90": "connectivity_net40", + "3273,-1524:0-0-1-2": "connectivity_net40", + "pcb_plated_hole_48": "connectivity_net45", + "connectivity_net447": "connectivity_net45", + "source_port_91": "connectivity_net45", + "pcb_port_91": "connectivity_net45", + "3273,-1778:0-0-1-2": "connectivity_net45", + "pcb_plated_hole_49": "connectivity_net47", + "connectivity_net448": "connectivity_net47", + "source_port_92": "connectivity_net47", + "pcb_port_92": "connectivity_net47", + "3019,1778:0-0-1-2": "connectivity_net47", + "pcb_plated_hole_50": "connectivity_net46", + "connectivity_net449": "connectivity_net46", + "source_port_93": "connectivity_net46", + "pcb_port_93": "connectivity_net46", + "3019,1524:0-0-1-2": "connectivity_net46", + "pcb_plated_hole_51": "connectivity_net41", + "connectivity_net450": "connectivity_net41", + "source_port_94": "connectivity_net41", + "pcb_port_94": "connectivity_net41", + "3019,1270:0-0-1-2": "connectivity_net41", + "pcb_plated_hole_52": "connectivity_net38", + "connectivity_net451": "connectivity_net38", + "source_port_95": "connectivity_net38", + "pcb_port_95": "connectivity_net38", + "3019,1016:0-0-1-2": "connectivity_net38", + "pcb_plated_hole_53": "connectivity_net33", + "connectivity_net452": "connectivity_net33", + "source_port_96": "connectivity_net33", + "pcb_port_96": "connectivity_net33", + "3019,762:0-0-1-2": "connectivity_net33", + "pcb_plated_hole_54": "connectivity_net39", + "connectivity_net453": "connectivity_net39", + "source_port_97": "connectivity_net39", + "pcb_port_97": "connectivity_net39", + "3019,508:0-0-1-2": "connectivity_net39", + "pcb_plated_hole_55": "connectivity_net40", + "connectivity_net454": "connectivity_net40", + "source_port_98": "connectivity_net40", + "pcb_port_98": "connectivity_net40", + "3019,254:0-0-1-2": "connectivity_net40", + "pcb_plated_hole_56": "connectivity_net35", + "connectivity_net455": "connectivity_net35", + "source_port_99": "connectivity_net35", + "pcb_port_99": "connectivity_net35", + "3019,0:0-0-1-2": "connectivity_net35", + "pcb_plated_hole_57": "connectivity_net45", + "connectivity_net456": "connectivity_net45", + "source_port_100": "connectivity_net45", + "pcb_port_100": "connectivity_net45", + "3019,-254:0-0-1-2": "connectivity_net45", + "pcb_plated_hole_58": "connectivity_net43", + "connectivity_net457": "connectivity_net43", + "source_port_101": "connectivity_net43", + "pcb_port_101": "connectivity_net43", + "3019,-508:0-0-1-2": "connectivity_net43", + "pcb_plated_hole_59": "connectivity_net42", + "connectivity_net458": "connectivity_net42", + "source_port_102": "connectivity_net42", + "pcb_port_102": "connectivity_net42", + "3019,-762:0-0-1-2": "connectivity_net42", + "pcb_plated_hole_60": "connectivity_net44", + "connectivity_net459": "connectivity_net44", + "source_port_103": "connectivity_net44", + "pcb_port_103": "connectivity_net44", + "3019,-1016:0-0-1-2": "connectivity_net44", + "pcb_plated_hole_61": "connectivity_net36", + "connectivity_net460": "connectivity_net36", + "source_port_104": "connectivity_net36", + "pcb_port_104": "connectivity_net36", + "3019,-1270:0-0-1-2": "connectivity_net36", + "pcb_plated_hole_62": "connectivity_net37", + "connectivity_net461": "connectivity_net37", + "source_port_105": "connectivity_net37", + "pcb_port_105": "connectivity_net37", + "3019,-1524:0-0-1-2": "connectivity_net37", + "pcb_plated_hole_63": "connectivity_net34", + "connectivity_net462": "connectivity_net34", + "source_port_106": "connectivity_net34", + "pcb_port_106": "connectivity_net34", + "3019,-1778:0-0-1-2": "connectivity_net34", + "pcb_plated_hole_64": "connectivity_net2", + "connectivity_net463": "connectivity_net2", + "source_port_107": "connectivity_net2", + "pcb_port_107": "connectivity_net2", + "source_component_internal_connection_15": "connectivity_net2", + "-3781,-1778:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_65": "connectivity_net49", + "connectivity_net464": "connectivity_net49", + "source_port_108": "connectivity_net49", + "pcb_port_108": "connectivity_net49", + "source_component_internal_connection_16": "connectivity_net49", + "-3781,-1524:0-0-1-2": "connectivity_net49", + "pcb_plated_hole_66": "connectivity_net50", + "connectivity_net465": "connectivity_net50", + "source_port_109": "connectivity_net50", + "pcb_port_109": "connectivity_net50", + "source_component_internal_connection_17": "connectivity_net50", + "-3781,-1270:0-0-1-2": "connectivity_net50", + "pcb_plated_hole_67": "connectivity_net51", + "connectivity_net466": "connectivity_net51", + "source_port_110": "connectivity_net51", + "pcb_port_110": "connectivity_net51", + "source_component_internal_connection_18": "connectivity_net51", + "-3781,-1016:0-0-1-2": "connectivity_net51", + "pcb_plated_hole_68": "connectivity_net2", + "connectivity_net467": "connectivity_net2", + "source_port_111": "connectivity_net2", + "pcb_port_111": "connectivity_net2", + "-3781,-762:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_69": "connectivity_net52", + "connectivity_net468": "connectivity_net52", + "source_port_112": "connectivity_net52", + "pcb_port_112": "connectivity_net52", + "source_component_internal_connection_19": "connectivity_net52", + "-3781,-508:0-0-1-2": "connectivity_net52", + "pcb_plated_hole_70": "connectivity_net0", + "connectivity_net469": "connectivity_net0", + "source_port_113": "connectivity_net0", + "pcb_port_113": "connectivity_net0", + "source_component_internal_connection_20": "connectivity_net0", + "-3781,-254:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_71": "connectivity_net49", + "connectivity_net470": "connectivity_net49", + "source_port_114": "connectivity_net49", + "pcb_port_114": "connectivity_net49", + "-3781,0:0-0-1-2": "connectivity_net49", + "pcb_plated_hole_72": "connectivity_net52", + "connectivity_net471": "connectivity_net52", + "source_port_115": "connectivity_net52", + "pcb_port_115": "connectivity_net52", + "-3781,254:0-0-1-2": "connectivity_net52", + "pcb_plated_hole_73": "connectivity_net49", + "connectivity_net472": "connectivity_net49", + "source_port_116": "connectivity_net49", + "pcb_port_116": "connectivity_net49", + "-3781,508:0-0-1-2": "connectivity_net49", + "pcb_plated_hole_74": "connectivity_net54", + "connectivity_net473": "connectivity_net54", + "source_port_117": "connectivity_net54", + "pcb_port_117": "connectivity_net54", + "source_component_internal_connection_21": "connectivity_net54", + "-3781,762:0-0-1-2": "connectivity_net54", + "pcb_plated_hole_75": "connectivity_net2", + "connectivity_net474": "connectivity_net2", + "source_port_118": "connectivity_net2", + "pcb_port_118": "connectivity_net2", + "source_component_internal_connection_22": "connectivity_net2", + "-3781,1016:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_76": "connectivity_net56", + "connectivity_net475": "connectivity_net56", + "source_port_119": "connectivity_net56", + "pcb_port_119": "connectivity_net56", + "source_component_internal_connection_23": "connectivity_net56", + "-3781,1270:0-0-1-2": "connectivity_net56", + "pcb_plated_hole_77": "connectivity_net57", + "connectivity_net476": "connectivity_net57", + "source_port_120": "connectivity_net57", + "pcb_port_120": "connectivity_net57", + "source_component_internal_connection_24": "connectivity_net57", + "-3781,1524:0-0-1-2": "connectivity_net57", + "pcb_plated_hole_78": "connectivity_net50", + "connectivity_net477": "connectivity_net50", + "source_port_121": "connectivity_net50", + "pcb_port_121": "connectivity_net50", + "-3781,1778:0-0-1-2": "connectivity_net50", + "pcb_plated_hole_79": "connectivity_net57", + "connectivity_net478": "connectivity_net57", + "source_port_122": "connectivity_net57", + "pcb_port_122": "connectivity_net57", + "-3527,-1778:0-0-1-2": "connectivity_net57", + "pcb_plated_hole_80": "connectivity_net54", + "connectivity_net479": "connectivity_net54", + "source_port_123": "connectivity_net54", + "pcb_port_123": "connectivity_net54", + "-3527,-1524:0-0-1-2": "connectivity_net54", + "pcb_plated_hole_81": "connectivity_net0", + "connectivity_net480": "connectivity_net0", + "source_port_124": "connectivity_net0", + "pcb_port_124": "connectivity_net0", + "source_component_internal_connection_25": "connectivity_net0", + "-3527,-1270:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_82": "connectivity_net2", + "connectivity_net481": "connectivity_net2", + "source_port_125": "connectivity_net2", + "pcb_port_125": "connectivity_net2", + "-3527,-1016:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_83": "connectivity_net59", + "connectivity_net482": "connectivity_net59", + "source_port_126": "connectivity_net59", + "pcb_port_126": "connectivity_net59", + "source_component_internal_connection_26": "connectivity_net59", + "-3527,-762:0-0-1-2": "connectivity_net59", + "pcb_plated_hole_84": "connectivity_net4", + "connectivity_net483": "connectivity_net4", + "source_port_127": "connectivity_net4", + "pcb_port_127": "connectivity_net4", + "source_component_internal_connection_27": "connectivity_net4", + "-3527,-508:0-0-1-2": "connectivity_net4", + "pcb_plated_hole_85": "connectivity_net51", + "connectivity_net484": "connectivity_net51", + "source_port_128": "connectivity_net51", + "pcb_port_128": "connectivity_net51", + "-3527,-254:0-0-1-2": "connectivity_net51", + "pcb_plated_hole_86": "connectivity_net50", + "connectivity_net485": "connectivity_net50", + "source_port_129": "connectivity_net50", + "pcb_port_129": "connectivity_net50", + "-3527,0:0-0-1-2": "connectivity_net50", + "pcb_plated_hole_87": "connectivity_net0", + "connectivity_net486": "connectivity_net0", + "source_port_130": "connectivity_net0", + "pcb_port_130": "connectivity_net0", + "-3527,254:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_88": "connectivity_net56", + "connectivity_net487": "connectivity_net56", + "source_port_131": "connectivity_net56", + "pcb_port_131": "connectivity_net56", + "-3527,508:0-0-1-2": "connectivity_net56", + "pcb_plated_hole_89": "connectivity_net51", + "connectivity_net488": "connectivity_net51", + "source_port_132": "connectivity_net51", + "pcb_port_132": "connectivity_net51", + "-3527,762:0-0-1-2": "connectivity_net51", + "pcb_plated_hole_90": "connectivity_net61", + "connectivity_net489": "connectivity_net61", + "source_port_133": "connectivity_net61", + "pcb_port_133": "connectivity_net61", + "source_component_internal_connection_28": "connectivity_net61", + "-3527,1016:0-0-1-2": "connectivity_net61", + "pcb_plated_hole_91": "connectivity_net0", + "connectivity_net490": "connectivity_net0", + "source_port_134": "connectivity_net0", + "pcb_port_134": "connectivity_net0", + "-3527,1270:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_92": "connectivity_net62", + "connectivity_net491": "connectivity_net62", + "source_port_135": "connectivity_net62", + "pcb_port_135": "connectivity_net62", + "source_component_internal_connection_29": "connectivity_net62", + "-3527,1524:0-0-1-2": "connectivity_net62", + "pcb_plated_hole_93": "connectivity_net2", + "connectivity_net492": "connectivity_net2", + "source_port_136": "connectivity_net2", + "pcb_port_136": "connectivity_net2", + "-3527,1778:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_94": "connectivity_net54", + "connectivity_net493": "connectivity_net54", + "source_port_137": "connectivity_net54", + "pcb_port_137": "connectivity_net54", + "-3273,-1778:0-0-1-2": "connectivity_net54", + "pcb_plated_hole_95": "connectivity_net52", + "connectivity_net494": "connectivity_net52", + "source_port_138": "connectivity_net52", + "pcb_port_138": "connectivity_net52", + "-3273,-1524:0-0-1-2": "connectivity_net52", + "pcb_plated_hole_96": "connectivity_net2", + "connectivity_net495": "connectivity_net2", + "source_port_139": "connectivity_net2", + "pcb_port_139": "connectivity_net2", + "-3273,-1270:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_97": "connectivity_net4", + "connectivity_net496": "connectivity_net4", + "source_port_140": "connectivity_net4", + "pcb_port_140": "connectivity_net4", + "-3273,-1016:0-0-1-2": "connectivity_net4", + "pcb_plated_hole_98": "connectivity_net54", + "connectivity_net497": "connectivity_net54", + "source_port_141": "connectivity_net54", + "pcb_port_141": "connectivity_net54", + "-3273,-762:0-0-1-2": "connectivity_net54", + "pcb_plated_hole_99": "connectivity_net0", + "connectivity_net498": "connectivity_net0", + "source_port_142": "connectivity_net0", + "pcb_port_142": "connectivity_net0", + "-3273,-508:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_100": "connectivity_net57", + "connectivity_net499": "connectivity_net57", + "source_port_143": "connectivity_net57", + "pcb_port_143": "connectivity_net57", + "-3273,-254:0-0-1-2": "connectivity_net57", + "pcb_plated_hole_101": "connectivity_net61", + "connectivity_net500": "connectivity_net61", + "source_port_144": "connectivity_net61", + "pcb_port_144": "connectivity_net61", + "-3273,0:0-0-1-2": "connectivity_net61", + "pcb_plated_hole_102": "connectivity_net59", + "connectivity_net501": "connectivity_net59", + "source_port_145": "connectivity_net59", + "pcb_port_145": "connectivity_net59", + "-3273,254:0-0-1-2": "connectivity_net59", + "pcb_plated_hole_103": "connectivity_net50", + "connectivity_net502": "connectivity_net50", + "source_port_146": "connectivity_net50", + "pcb_port_146": "connectivity_net50", + "-3273,508:0-0-1-2": "connectivity_net50", + "pcb_plated_hole_104": "connectivity_net62", + "connectivity_net503": "connectivity_net62", + "source_port_147": "connectivity_net62", + "pcb_port_147": "connectivity_net62", + "-3273,762:0-0-1-2": "connectivity_net62", + "pcb_plated_hole_105": "connectivity_net49", + "connectivity_net504": "connectivity_net49", + "source_port_148": "connectivity_net49", + "pcb_port_148": "connectivity_net49", + "-3273,1016:0-0-1-2": "connectivity_net49", + "pcb_plated_hole_106": "connectivity_net0", + "connectivity_net505": "connectivity_net0", + "source_port_149": "connectivity_net0", + "pcb_port_149": "connectivity_net0", + "-3273,1270:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_107": "connectivity_net2", + "connectivity_net506": "connectivity_net2", + "source_port_150": "connectivity_net2", + "pcb_port_150": "connectivity_net2", + "-3273,1524:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_108": "connectivity_net4", + "connectivity_net507": "connectivity_net4", + "source_port_151": "connectivity_net4", + "pcb_port_151": "connectivity_net4", + "-3273,1778:0-0-1-2": "connectivity_net4", + "pcb_plated_hole_109": "connectivity_net62", + "connectivity_net508": "connectivity_net62", + "source_port_152": "connectivity_net62", + "pcb_port_152": "connectivity_net62", + "-3019,-1778:0-0-1-2": "connectivity_net62", + "pcb_plated_hole_110": "connectivity_net61", + "connectivity_net509": "connectivity_net61", + "source_port_153": "connectivity_net61", + "pcb_port_153": "connectivity_net61", + "-3019,-1524:0-0-1-2": "connectivity_net61", + "pcb_plated_hole_111": "connectivity_net56", + "connectivity_net510": "connectivity_net56", + "source_port_154": "connectivity_net56", + "pcb_port_154": "connectivity_net56", + "-3019,-1270:0-0-1-2": "connectivity_net56", + "pcb_plated_hole_112": "connectivity_net0", + "connectivity_net511": "connectivity_net0", + "source_port_155": "connectivity_net0", + "pcb_port_155": "connectivity_net0", + "-3019,-1016:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_113": "connectivity_net2", + "connectivity_net512": "connectivity_net2", + "source_port_156": "connectivity_net2", + "pcb_port_156": "connectivity_net2", + "-3019,-762:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_114": "connectivity_net54", + "connectivity_net513": "connectivity_net54", + "source_port_157": "connectivity_net54", + "pcb_port_157": "connectivity_net54", + "-3019,-508:0-0-1-2": "connectivity_net54", + "pcb_plated_hole_115": "connectivity_net2", + "connectivity_net514": "connectivity_net2", + "source_port_158": "connectivity_net2", + "pcb_port_158": "connectivity_net2", + "-3019,-254:0-0-1-2": "connectivity_net2", + "pcb_plated_hole_116": "connectivity_net50", + "connectivity_net515": "connectivity_net50", + "source_port_159": "connectivity_net50", + "pcb_port_159": "connectivity_net50", + "-3019,0:0-0-1-2": "connectivity_net50", + "pcb_plated_hole_117": "connectivity_net4", + "connectivity_net516": "connectivity_net4", + "source_port_160": "connectivity_net4", + "pcb_port_160": "connectivity_net4", + "-3019,254:0-0-1-2": "connectivity_net4", + "pcb_plated_hole_118": "connectivity_net0", + "connectivity_net517": "connectivity_net0", + "source_port_161": "connectivity_net0", + "pcb_port_161": "connectivity_net0", + "-3019,508:0-0-1-2": "connectivity_net0", + "pcb_plated_hole_119": "connectivity_net57", + "connectivity_net518": "connectivity_net57", + "source_port_162": "connectivity_net57", + "pcb_port_162": "connectivity_net57", + "-3019,762:0-0-1-2": "connectivity_net57", + "pcb_plated_hole_120": "connectivity_net59", + "connectivity_net519": "connectivity_net59", + "source_port_163": "connectivity_net59", + "pcb_port_163": "connectivity_net59", + "-3019,1016:0-0-1-2": "connectivity_net59", + "pcb_plated_hole_121": "connectivity_net51", + "connectivity_net520": "connectivity_net51", + "source_port_164": "connectivity_net51", + "pcb_port_164": "connectivity_net51", + "-3019,1270:0-0-1-2": "connectivity_net51", + "pcb_plated_hole_122": "connectivity_net52", + "connectivity_net521": "connectivity_net52", + "source_port_165": "connectivity_net52", + "pcb_port_165": "connectivity_net52", + "-3019,1524:0-0-1-2": "connectivity_net52", + "pcb_plated_hole_123": "connectivity_net49", + "connectivity_net522": "connectivity_net49", + "source_port_166": "connectivity_net49", + "pcb_port_166": "connectivity_net49", + "-3019,1778:0-0-1-2": "connectivity_net49", + "0,-600:0-0-1-2": "connectivity_net63", + "__obs103": "connectivity_net2", + "__obs89": "connectivity_net2", + "__obs102": "connectivity_net0", + "__obs87": "connectivity_net0", + "__obs108": "connectivity_net0", + "__obs93": "connectivity_net4", + "__obs109": "connectivity_net2", + "__obs113": "connectivity_net4", + "__obs111": "connectivity_net2", + "__obs114": "connectivity_net0" + } + }, + "colorMap": { + "connectivity_net8": "hsl(0, 100%, 50%)", + "source_net_3": "hsl(0, 100%, 50%)", + "connectivity_net7": "hsl(21.428571428571427, 100%, 50%)", + "source_net_2": "hsl(21.428571428571427, 100%, 50%)", + "source_net_1_mst0": "hsl(48.57142857142857, 100%, 50%)", + "source_net_1_mst1": "hsl(72.85714285714286, 100%, 50%)", + "source_net_1_mst2": "hsl(97.14285714285714, 100%, 50%)", + "source_net_1_mst3": "hsl(121.42857142857143, 100%, 50%)", + "source_net_1_mst4": "hsl(145.71428571428572, 100%, 50%)", + "source_net_1_mst5": "hsl(170, 100%, 50%)", + "connectivity_net5": "hsl(171.42857142857142, 100%, 50%)", + "source_net_0": "hsl(171.42857142857142, 100%, 50%)", + "connectivity_net4": "hsl(192.85714285714286, 100%, 50%)", + "source_trace_12": "hsl(192.85714285714286, 100%, 50%)", + "connectivity_net3": "hsl(214.28571428571428, 100%, 50%)", + "source_trace_10": "hsl(214.28571428571428, 100%, 50%)", + "connectivity_net2": "hsl(235.71428571428572, 100%, 50%)", + "source_trace_8": "hsl(235.71428571428572, 100%, 50%)", + "connectivity_net1": "hsl(257.14285714285717, 100%, 50%)", + "source_trace_6": "hsl(257.14285714285717, 100%, 50%)", + "connectivity_net0": "hsl(278.57142857142856, 100%, 50%)", + "source_trace_4": "hsl(278.57142857142856, 100%, 50%)" + } + } +] diff --git a/examples/features/keepoutsolver/keepoutsolver01.fixture.tsx b/examples/features/keepoutsolver/keepoutsolver01.fixture.tsx new file mode 100644 index 00000000..6f43c879 --- /dev/null +++ b/examples/features/keepoutsolver/keepoutsolver01.fixture.tsx @@ -0,0 +1,22 @@ +import { GenericSolverDebugger } from "lib/testing/GenericSolverDebugger" +import { TraceKeepoutSolver } from "lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver" +import { ConnectivityMap } from "circuit-json-to-connectivity-map" +import input from "./keepoutsolver01-input.json" + +export default () => { + const createSolver = () => { + const data = input[0] as any + + const connMap = new ConnectivityMap(data.connMap.netMap) + + return new TraceKeepoutSolver({ + hdRoutes: data.hdRoutes, + obstacles: data.obstacles, + connMap, + colorMap: data.colorMap, + keepoutRadiusSchedule: data.keepoutRadiusSchedule, + }) + } + + return +} diff --git a/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts b/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts index caab6d30..640bc939 100644 --- a/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts +++ b/lib/autorouter-pipelines/AssignableAutoroutingPipeline2/AssignableAutoroutingPipeline2.ts @@ -34,6 +34,7 @@ import { getGlobalInMemoryCache } from "lib/cache/setupGlobalCaches" import { NetToPointPairsSolver2_OffBoardConnection } from "../../solvers/NetToPointPairsSolver2_OffBoardConnection/NetToPointPairsSolver2_OffBoardConnection" import { RectDiffPipeline } from "@tscircuit/rectdiff" import { TraceSimplificationSolver } from "../../solvers/TraceSimplificationSolver/TraceSimplificationSolver" +import { TraceKeepoutSolver } from "../../solvers/TraceKeepoutSolver/TraceKeepoutSolver" import { AvailableSegmentPointSolver } from "../../solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver" import { PortPointPathingSolver, @@ -102,6 +103,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver { strawSolver?: StrawSolver deadEndSolver?: DeadEndSolver traceSimplificationSolver?: TraceSimplificationSolver + traceKeepoutSolver?: TraceKeepoutSolver availableSegmentPointSolver?: AvailableSegmentPointSolver portPointPathingSolver?: PortPointPathingSolver multiSectionPortPointOptimizer?: MultiSectionPortPointOptimizer @@ -244,14 +246,14 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver { inputNodes, capacityMeshNodes: cms.capacityNodes!, colorMap: cms.colorMap, - numShuffleSeeds: 2000, + numShuffleSeeds: 10000, + minAllowedBoardScore: -1, hyperParameters: { // 1 = 60% maximum pf (see computeSectionScore) // 5 = 99.3% maximum pf // 10 = 99.995% maximum pf (1 - e**(-10)) // NODE_PF_MAX_PENALTY: 10, // RANDOM_WALK_DISTANCE: 50, - MIN_ALLOWED_BOARD_SCORE: -1, NODE_PF_FACTOR: 10000, FORCE_OFF_BOARD_FREQUENCY: 0.3, CENTER_OFFSET_DIST_PENALTY_FACTOR: 1, @@ -296,19 +298,19 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver { }, ], ), - // definePipelineStep( - // "highDensityStitchSolver", - // MultipleHighDensityRouteStitchSolver, - // (cms) => [ - // { - // connections: cms.srjWithPointPairs!.connections, - // hdRoutes: cms.highDensityRouteSolver!.routes, - // colorMap: cms.colorMap, - // layerCount: cms.srj.layerCount, - // defaultViaDiameter: cms.viaDiameter, - // }, - // ], - // ), + definePipelineStep( + "highDensityStitchSolver", + MultipleHighDensityRouteStitchSolver, + (cms) => [ + { + connections: cms.srjWithPointPairs!.connections, + hdRoutes: cms.simpleHighDensityRouteSolver!.routes, + colorMap: cms.colorMap, + layerCount: cms.srj.layerCount, + defaultViaDiameter: cms.viaDiameter, + }, + ], + ), definePipelineStep( "traceSimplificationSolver", TraceSimplificationSolver, @@ -328,6 +330,14 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver { }, ], ), + definePipelineStep("traceKeepoutSolver", TraceKeepoutSolver, (cms) => [ + { + hdRoutes: cms.traceSimplificationSolver?.simplifiedHdRoutes ?? [], + obstacles: cms.srj.obstacles, + connMap: cms.connMap, + colorMap: cms.colorMap, + }, + ]), ] constructor( @@ -430,6 +440,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver { const simpleHighDensityViz = this.simpleHighDensityRouteSolver?.visualize() const highDensityStitchViz = this.highDensityStitchSolver?.visualize() const traceSimplificationViz = this.traceSimplificationSolver?.visualize() + const traceKeepoutViz = this.traceKeepoutSolver?.visualize() const problemOutline = this.srj.outline const problemLines: Line[] = [] @@ -516,6 +527,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver { : null, highDensityStitchViz, traceSimplificationViz, + traceKeepoutViz, this.solved ? combineVisualizations( problemViz, @@ -582,6 +594,7 @@ export class AssignableAutoroutingPipeline2 extends BaseSolver { _getOutputHdRoutes(): HighDensityRoute[] { return ( + this.traceKeepoutSolver?.redrawnHdRoutes ?? this.traceSimplificationSolver?.simplifiedHdRoutes ?? this.highDensityStitchSolver?.mergedHdRoutes ?? this.simpleHighDensityRouteSolver?.routes ?? diff --git a/lib/data-structures/HighDensityRouteSpatialIndex.ts b/lib/data-structures/HighDensityRouteSpatialIndex.ts index bc99419d..e2bd3528 100644 --- a/lib/data-structures/HighDensityRouteSpatialIndex.ts +++ b/lib/data-structures/HighDensityRouteSpatialIndex.ts @@ -14,6 +14,7 @@ type Segment = [Point, Point] export type HighDensityIntraNodeRoute = { connectionName: string // Assuming this is unique per route + rootConnectionName?: string // Parent connection for merged routes traceThickness: number viaDiameter: number // Now used in conflict calculation route: Array<{ x: number; y: number; z: number }> diff --git a/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts b/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts index 58429a99..0e24589c 100644 --- a/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts +++ b/lib/solvers/AvailableSegmentPointSolver/AvailableSegmentPointSolver.ts @@ -176,7 +176,7 @@ export class AvailableSegmentPointSolver extends BaseSolver { const centerY = (overlap.start.y + overlap.end.y) / 2 if (maxPortPoints > 5) { - maxPortPoints = 5 + maxPortPoints / 4 + maxPortPoints = 5 + Math.floor(maxPortPoints / 4) } // First pass: compute all XY positions and find which is closest to segment center diff --git a/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts b/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts index 8b6d6889..9c2fca81 100644 --- a/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts +++ b/lib/solvers/PortPointPathingSolver/HyperPortPointPathingSolver.ts @@ -100,8 +100,9 @@ export class HyperPortPointPathingSolver extends HyperParameterSupervisorSolver< ...this.params.hyperParameters, ...hyperParameters, MIN_ALLOWED_BOARD_SCORE: + this.params.minAllowedBoardScore ?? hyperParameters.MIN_ALLOWED_BOARD_SCORE ?? - this.params.minAllowedBoardScore, + this.params.hyperParameters?.MIN_ALLOWED_BOARD_SCORE, }, }) } diff --git a/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts b/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts index e8682bb1..91b50d15 100644 --- a/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts +++ b/lib/solvers/PortPointPathingSolver/visualizePointPathSolver.ts @@ -56,7 +56,7 @@ export function visualizePointPathSolver( const red = Math.min(255, Math.floor(pf * 512)) const greenAndBlue = Math.max(0, 255 - Math.floor(pf * 512)) - let color = `rgba(${red}, ${greenAndBlue}, ${greenAndBlue}, 0.3)` + let color = `rgba(${red}, ${greenAndBlue}, ${greenAndBlue}, ${pf < 0.001 ? "0.1" : "0.3"})` if (node._containsObstacle) { color = "rgba(255, 0, 0, 0.3)" @@ -68,8 +68,8 @@ export function visualizePointPathSolver( graphics.rects!.push({ center: node.center, - width: node.width * 0.9, - height: node.height * 0.9, + width: node.width - 0.2, + height: node.height - 0.2, layer: `z${node.availableZ.join(",")}`, fill: color, label: `${node.capacityMeshNodeId}\npf: ${pf.toFixed(3)}, memPf: ${memPf.toFixed(3)}\nxSame: ${crossings.numSameLayerCrossings}, xLC: ${crossings.numEntryExitLayerChanges}, xTransition: ${crossings.numTransitionPairCrossings}\nobCmid: ${node._offBoardConnectedCapacityMeshNodeIds?.join(",")}\nobs: ${node._containsObstacle ? "yes" : "no"}`, diff --git a/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts b/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts index 0f8a63f9..0f5ab335 100644 --- a/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts +++ b/lib/solvers/RouteStitchingSolver/MultipleHighDensityRouteStitchSolver.ts @@ -6,6 +6,8 @@ import { mapLayerNameToZ } from "lib/utils/mapLayerNameToZ" import { SingleHighDensityRouteStitchSolver } from "./SingleHighDensityRouteStitchSolver" import { GraphicsObject } from "graphics-debug" import { safeTransparentize } from "../colors" +import { ConnectivityMap } from "connectivity-map" +import { distance } from "@tscircuit/math-utils" export type UnsolvedRoute = { connectionName: string @@ -14,6 +16,9 @@ export type UnsolvedRoute = { end: { x: number; y: number; z: number } } +const roundedPointHash = (p: { x: number; y: number; z: number }) => + `${Math.round(p.x * 100)},${Math.round(p.y * 100)},${Math.round(p.z * 100)}` + export class MultipleHighDensityRouteStitchSolver extends BaseSolver { unsolvedRoutes: UnsolvedRoute[] activeSolver: SingleHighDensityRouteStitchSolver | null = null @@ -22,7 +27,7 @@ export class MultipleHighDensityRouteStitchSolver extends BaseSolver { defaultTraceThickness: number defaultViaDiameter: number - constructor(opts: { + constructor(params: { connections: SimpleRouteConnection[] hdRoutes: HighDensityIntraNodeRoute[] colorMap?: Record @@ -30,31 +35,115 @@ export class MultipleHighDensityRouteStitchSolver extends BaseSolver { defaultViaDiameter?: number }) { super() - this.colorMap = opts.colorMap ?? {} + this.colorMap = params.colorMap ?? {} - const firstRoute = opts.hdRoutes[0] + const firstRoute = params.hdRoutes[0] this.defaultTraceThickness = firstRoute?.traceThickness ?? 0.15 this.defaultViaDiameter = - firstRoute?.viaDiameter ?? opts.defaultViaDiameter ?? 0.6 - - this.unsolvedRoutes = opts.connections.map((c) => ({ - connectionName: c.name, - hdRoutes: opts.hdRoutes.filter((r) => r.connectionName === c.name), - start: { - ...c.pointsToConnect[0], - z: mapLayerNameToZ( - getConnectionPointLayer(c.pointsToConnect[0]), - opts.layerCount, - ), - }, - end: { - ...c.pointsToConnect[1], - z: mapLayerNameToZ( - getConnectionPointLayer(c.pointsToConnect[1]), - opts.layerCount, - ), - }, - })) + firstRoute?.viaDiameter ?? params.defaultViaDiameter ?? 0.6 + + const routeIslandConnectivityMap = new ConnectivityMap({}) + const routeIslandConnections: Array = [] + const routeIslands = [] + + const pointHashCounts = new Map() + + for (let i = 0; i < params.hdRoutes.length; i++) { + const hdRoute = params.hdRoutes[i] + const start = hdRoute.route[0] + const end = hdRoute.route[hdRoute.route.length - 1] + routeIslandConnections.push([ + `route_island_${i}`, + `${hdRoute.connectionName}:${roundedPointHash(start)}`, + `${hdRoute.connectionName}:${roundedPointHash(end)}`, + ]) + } + routeIslandConnectivityMap.addConnections(routeIslandConnections) + for (const routeIslandConnection of routeIslandConnections) { + for (const pointHash of routeIslandConnection.slice(1)) { + pointHashCounts.set( + pointHash, + (pointHashCounts.get(pointHash) ?? 0) + 1, + ) + } + } + + this.unsolvedRoutes = [] + + const uniqueNets = Array.from( + new Set(Object.values(routeIslandConnectivityMap.idToNetMap)), + ) + + for (const netName of uniqueNets) { + const netMembers = + routeIslandConnectivityMap.getIdsConnectedToNet(netName) + + const hdRoutes = params.hdRoutes.filter((r, i) => + netMembers.includes(`route_island_${i}`), + ) + if (hdRoutes.length === 0) continue + + const connection = params.connections.find( + (c) => c.name === hdRoutes[0].connectionName, + )! + + const possibleEndpoints1 = hdRoutes.flatMap((r) => [ + r.route[0], + r.route[r.route.length - 1], + ]) + + const possibleEndpoints2 = [] + for (const possibleEndpoint1 of possibleEndpoints1) { + const pointHash = `${hdRoutes[0].connectionName}:${roundedPointHash(possibleEndpoint1)}` + if (pointHashCounts.get(pointHash) === 1) { + possibleEndpoints2.push(possibleEndpoint1) + } + } + // Not sure why this happens + // If removing, make sure off-board-assignable2 doesn't break + if (possibleEndpoints2.length === 0) { + console.log("no possible endpoints, can't stitch") + continue + } + + let start: { x: number; y: number; z: number } + let end: { x: number; y: number; z: number } + + if (possibleEndpoints2.length !== 2) { + start = { + ...connection.pointsToConnect[0], + z: mapLayerNameToZ( + getConnectionPointLayer(connection.pointsToConnect[0]), + params.layerCount, + ), + } + end = { + ...connection.pointsToConnect[1], + z: mapLayerNameToZ( + getConnectionPointLayer(connection.pointsToConnect[1]), + params.layerCount, + ), + } + } else { + start = possibleEndpoints2[0] + end = possibleEndpoints2[1] + + if ( + distance(start, connection.pointsToConnect[1]) < + distance(end, connection.pointsToConnect[0]) + ) { + ;[start, end] = [end, start] + } + } + + this.unsolvedRoutes.push({ + connectionName: hdRoutes[0].connectionName, + hdRoutes, + start, + end, + }) + } + this.MAX_ITERATIONS = 100e3 } diff --git a/lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver.ts b/lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver.ts new file mode 100644 index 00000000..37a26c10 --- /dev/null +++ b/lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver.ts @@ -0,0 +1,675 @@ +import { BaseSolver } from "../BaseSolver" +import { HighDensityRoute } from "lib/types/high-density-types" +import { Obstacle } from "lib/types" +import { ConnectivityMap } from "circuit-json-to-connectivity-map" +import { ObstacleSpatialHashIndex } from "lib/data-structures/ObstacleTree" +import { HighDensityRouteSpatialIndex } from "lib/data-structures/HighDensityRouteSpatialIndex" +import { GraphicsObject } from "graphics-debug" +import { + computeDrawPositionFromCollisions, + Segment, +} from "./computeDrawPositionFromCollisions" +import { + obstacleToSegments, + routeToOutlineSegments, +} from "./obstacleToSegments" +import { + distance, + pointToSegmentClosestPoint, + pointToSegmentDistance, +} from "@tscircuit/math-utils" +import { smoothHdRoutes } from "./smoothLines" + +const CURSOR_STEP_DISTANCE = 0.2 + +interface Point2D { + x: number + y: number +} + +interface Point3D extends Point2D { + z: number +} + +export interface TraceKeepoutSolverInput { + hdRoutes: HighDensityRoute[] + obstacles: Obstacle[] + connMap: ConnectivityMap + colorMap: Record + keepoutRadiusSchedule?: number[] + smoothDistance?: number +} + +/** + * TraceKeepoutSolver adjusts traces to maintain keepout distance from obstacles + * and non-connected traces. It works by walking along each trace with a cursor, + * detecting obstacles within a keepout radius, and pushing the draw position + * orthogonally to avoid them. + * + * The solver processes traces through multiple passes with decreasing keepout + * radii as defined by KEEPOUT_RADIUS_SCHEDULE. + */ +export class TraceKeepoutSolver extends BaseSolver { + originalHdRoutes: HighDensityRoute[] + hdRoutes: HighDensityRoute[] + redrawnHdRoutes: HighDensityRoute[] = [] + + smoothDistance: number + + KEEPOUT_RADIUS_SCHEDULE: number[] + currentScheduleIndex = 0 + currentKeepoutRadius: number + + unprocessedRoutes: HighDensityRoute[] = [] + smoothedCursorRoutes: HighDensityRoute[] = [] + processedRoutes: HighDensityRoute[] = [] + + // Current trace being processed + currentTrace: HighDensityRoute | null = null + cursorPosition: Point3D | null = null + lastCursorPosition: Point3D | null = null + drawPosition: Point2D | null = null + currentTraceSegmentIndex = 0 + currentTraceSegmentT = 0 // Parameter t in [0, 1] along the current segment + recordedDrawPositions: Point3D[] = [] + lastCollidingSegments: Segment[] = [] + + obstacleSHI: ObstacleSpatialHashIndex + hdRouteSHI: HighDensityRouteSpatialIndex + + constructor(private input: TraceKeepoutSolverInput) { + super() + this.MAX_ITERATIONS = 1e6 + + // Store original routes for visualization + this.originalHdRoutes = [...input.hdRoutes] + + // Apply smoothing to routes + this.smoothDistance = input.smoothDistance ?? 0.5 + this.hdRoutes = smoothHdRoutes(input.hdRoutes, this.smoothDistance) + + this.KEEPOUT_RADIUS_SCHEDULE = input.keepoutRadiusSchedule ?? [ + 0.5, 0.5, 0.5, 0.5, + ] + this.currentKeepoutRadius = this.KEEPOUT_RADIUS_SCHEDULE[0] ?? 0.15 + this.unprocessedRoutes = [...this.hdRoutes] + this.smoothedCursorRoutes = [...this.unprocessedRoutes] + + this.obstacleSHI = new ObstacleSpatialHashIndex("flatbush", input.obstacles) + this.hdRouteSHI = new HighDensityRouteSpatialIndex(this.hdRoutes) + + // Make sure the start/endpoint of any route is properly connected in the + // connMap to the obstacle + for (const [ + endpoint, + connectionName, + rootConnectionName, + ] of this.hdRoutes.flatMap( + ( + r, + ): [ + { x: number; y: number; z: number }, + string, + string | undefined, + ][] => [ + [r.route[0]!, r.connectionName, r.rootConnectionName], + [r.route[r.route.length - 1]!, r.connectionName, r.rootConnectionName], + ], + )) { + const obstacles = this.obstacleSHI + .searchArea(endpoint.x, endpoint.y, 0.01, 0.01) + .filter((o) => o.zLayers?.includes(endpoint.z)) + if (obstacles.length === 0) continue + const obstacle = obstacles[0]! + + this.input.connMap.addConnections([ + [ + connectionName, + rootConnectionName!, + ...(obstacle.offBoardConnectsTo ?? []), + obstacle.obstacleId!, + ...obstacle.connectedTo, + ].filter(Boolean), + ]) + } + } + + _step() { + // If no current trace, dequeue one + if (!this.currentTrace) { + const nextTrace = this.unprocessedRoutes.shift() + + if (!nextTrace) { + // All traces processed for this schedule pass + // Check if there's another keepout radius in the schedule + this.currentScheduleIndex++ + if (this.currentScheduleIndex < this.KEEPOUT_RADIUS_SCHEDULE.length) { + // Requeue all traces with the new keepout radius + this.currentKeepoutRadius = + this.KEEPOUT_RADIUS_SCHEDULE[this.currentScheduleIndex]! + this.unprocessedRoutes = smoothHdRoutes( + [...this.processedRoutes], + this.smoothDistance, + ) + this.smoothedCursorRoutes = [...this.unprocessedRoutes] + this.processedRoutes = [] + // Rebuild the spatial index with processed routes + this.hdRouteSHI = new HighDensityRouteSpatialIndex( + this.unprocessedRoutes, + ) + return + } + + // All schedule passes complete + this.redrawnHdRoutes = this.processedRoutes + this.solved = true + return + } + + // Initialize the new trace processing + this.currentTrace = nextTrace + if (this.currentTrace.route.length < 2) { + // Trace is too short to process, just pass it through + this.processedRoutes.push(this.currentTrace) + this.currentTrace = null + return + } + + const startPoint = this.currentTrace.route[0]! + this.cursorPosition = { ...startPoint } + this.lastCursorPosition = { ...startPoint } + this.drawPosition = { x: startPoint.x, y: startPoint.y } + this.currentTraceSegmentIndex = 0 + this.currentTraceSegmentT = 0 + this.recordedDrawPositions = [{ ...startPoint }] + return + } + + // Save last cursor position before stepping + this.lastCursorPosition = { ...this.cursorPosition! } + + // Step the cursor forward along the trace + const stepped = this.stepCursorForward() + + if (!stepped) { + // Reached end of trace, finalize it + this.finalizeCurrentTrace() + return + } + + // Get colliding segments for obstacles and traces + const collidingSegments = this.getCollidingSegments(this.cursorPosition!) + this.lastCollidingSegments = collidingSegments + + // Compute draw position using the collision avoidance algorithm + const newDrawPosition = computeDrawPositionFromCollisions({ + cursorPosition: this.cursorPosition!, + lastCursorPosition: this.lastCursorPosition!, + collidingSegments, + keepoutRadius: this.currentKeepoutRadius, + }) + + this.drawPosition = newDrawPosition ?? { ...this.cursorPosition! } + + // if ( + // this.positionHasCollision( + // { + // ...this.drawPosition!, + // z: this.cursorPosition!.z, + // }, + // -0.001, + // ) || + // distance(this.drawPosition!, this.cursorPosition!) > + // this.currentKeepoutRadius + 0.001 + // ) { + // this.drawPosition = { ...this.cursorPosition! } + // } + + // Record the draw position + this.recordedDrawPositions.push({ + x: this.drawPosition!.x, + y: this.drawPosition!.y, + z: this.cursorPosition!.z, + }) + } + + /** + * Steps the cursor forward by CURSOR_STEP_DISTANCE along the trace + * Returns false if we've reached the end of the trace + */ + private stepCursorForward(): boolean { + if (!this.currentTrace || !this.cursorPosition) return false + + const route = this.currentTrace.route + let remainingDistance = CURSOR_STEP_DISTANCE + + while (remainingDistance > 0) { + if (this.currentTraceSegmentIndex >= route.length - 1) { + // Reached end of trace + return false + } + + const segStart = route[this.currentTraceSegmentIndex]! + const segEnd = route[this.currentTraceSegmentIndex + 1]! + + const segDx = segEnd.x - segStart.x + const segDy = segEnd.y - segStart.y + const segLength = Math.sqrt(segDx * segDx + segDy * segDy) + + if (segLength === 0) { + // Zero-length segment, skip it + this.currentTraceSegmentIndex++ + this.currentTraceSegmentT = 0 + continue + } + + // How far we are into this segment + const currentDistInSeg = this.currentTraceSegmentT * segLength + const distToSegEnd = segLength - currentDistInSeg + + if (remainingDistance <= distToSegEnd) { + // We can complete the step within this segment + const newDistInSeg = currentDistInSeg + remainingDistance + this.currentTraceSegmentT = newDistInSeg / segLength + + // Update cursor position + this.cursorPosition = { + x: segStart.x + segDx * this.currentTraceSegmentT, + y: segStart.y + segDy * this.currentTraceSegmentT, + z: segStart.z, // Stay on same layer within segment + } + + return true + } else { + // Step goes beyond this segment + remainingDistance -= distToSegEnd + this.currentTraceSegmentIndex++ + this.currentTraceSegmentT = 0 + + if (this.currentTraceSegmentIndex >= route.length - 1) { + // Reached end of trace + const lastPoint = route[route.length - 1]! + this.cursorPosition = { ...lastPoint } + return false + } + } + } + + return true + } + + /** + * Gets all colliding segments (obstacle edges and trace outlines) within the keepout radius + */ + private getCollidingSegments(position: { + x: number + y: number + z: number + }): Segment[] { + if (!this.currentTrace) return [] + + const rootConnectionName = + this.currentTrace.rootConnectionName ?? this.currentTrace.connectionName + const searchRadius = this.currentKeepoutRadius * 2 + const segments: Segment[] = [] + + // Check for obstacles within the keepout radius + const nearbyObstacles = this.obstacleSHI.searchArea( + position.x, + position.y, + searchRadius, + searchRadius, + ) + + // Filter to non-connected obstacles on the same layer and convert to segments + for (const obstacle of nearbyObstacles) { + // Check if obstacle is on the same layer + if (obstacle.zLayers && !obstacle.zLayers.includes(position.z)) { + continue + } + + // Check if obstacle is connected to this trace's net + if (obstacle.connectedTo.includes(rootConnectionName)) { + continue + } + + // Check if obstacle's own ID is connected + if ( + obstacle.obstacleId && + this.input.connMap.areIdsConnected( + rootConnectionName, + obstacle.obstacleId, + ) + ) { + continue + } + + // Check connectivity via connMap + let isConnected = false + for (const connectedId of obstacle.connectedTo) { + if ( + this.input.connMap.areIdsConnected(rootConnectionName, connectedId) + ) { + isConnected = true + break + } + } + if (isConnected) continue + + // Convert obstacle to edge segments + segments.push(...obstacleToSegments(obstacle)) + } + + // Check for non-connected traces within the keepout radius + const nearbyRoutes = this.hdRouteSHI.getConflictingRoutesNearPoint( + { x: position.x, y: position.y }, + searchRadius, + ) + + for (const { conflictingRoute } of nearbyRoutes) { + const routeRootName = + conflictingRoute.rootConnectionName ?? conflictingRoute.connectionName + + // Don't avoid our own trace + if (routeRootName === rootConnectionName) { + continue + } + + // Check connectivity + if ( + this.input.connMap.areIdsConnected(rootConnectionName, routeRootName) + ) { + continue + } + + // Convert route to outline segments (considering trace width) + const traceWidth = conflictingRoute.traceThickness ?? 0.15 + segments.push( + ...routeToOutlineSegments(conflictingRoute.route, traceWidth), + ) + } + + return segments + } + + positionHasCollision( + position: { + x: number + y: number + z: number + }, + margin: number = 0, + ): boolean { + const collidingSegments = this.getCollidingSegments(position) + + for (const segment of collidingSegments) { + if ( + pointToSegmentDistance(position, segment.start, segment.end) <= + this.currentKeepoutRadius + margin + ) { + return true + } + } + return false + } + + /** + * Finalizes the current trace with the recorded draw positions + */ + private finalizeCurrentTrace() { + if (!this.currentTrace) return + + // Add the final point if not already there + const lastRoutePoint = + this.currentTrace.route[this.currentTrace.route.length - 1]! + const lastRecorded = + this.recordedDrawPositions[this.recordedDrawPositions.length - 1] + if ( + !lastRecorded || + lastRecorded.x !== lastRoutePoint.x || + lastRecorded.y !== lastRoutePoint.y + ) { + this.recordedDrawPositions.push({ ...lastRoutePoint }) + } + + // Simplify the recorded positions to remove redundant points + const simplifiedRoute = this.simplifyRoute(this.recordedDrawPositions) + + // Create the redrawn trace + const redrawnTrace: HighDensityRoute = { + connectionName: this.currentTrace.connectionName, + rootConnectionName: this.currentTrace.rootConnectionName, + traceThickness: this.currentTrace.traceThickness, + viaDiameter: this.currentTrace.viaDiameter, + route: simplifiedRoute, + vias: [...this.currentTrace.vias], // Keep vias unchanged + } + + this.processedRoutes.push(redrawnTrace) + this.currentTrace = null + this.cursorPosition = null + this.lastCursorPosition = null + this.drawPosition = null + this.recordedDrawPositions = [] + } + + /** + * Simplifies the route by removing collinear points + */ + private simplifyRoute(points: Point3D[]): Point3D[] { + if (points.length <= 2) return points + + const result: Point3D[] = [points[0]!] + + for (let i = 1; i < points.length - 1; i++) { + const prev = result[result.length - 1]! + const curr = points[i]! + const next = points[i + 1]! + + // Skip points where z changes - always keep layer transitions + if (curr.z !== prev.z || curr.z !== next.z) { + result.push(curr) + continue + } + + // Check if the point is collinear with prev and next + const dx1 = curr.x - prev.x + const dy1 = curr.y - prev.y + const dx2 = next.x - curr.x + const dy2 = next.y - curr.y + + // Cross product to check collinearity + const cross = dx1 * dy2 - dy1 * dx2 + const epsilon = 1e-6 + + if (Math.abs(cross) > epsilon) { + // Not collinear, keep this point + result.push(curr) + } + } + + result.push(points[points.length - 1]!) + return result + } + + visualize(): GraphicsObject { + const visualization: GraphicsObject & { + lines: NonNullable + points: NonNullable + rects: NonNullable + circles: NonNullable + } = { + lines: [], + points: [], + rects: [], + circles: [], + coordinateSystem: "cartesian", + title: `Trace Keepout Solver (radius: ${this.currentKeepoutRadius.toFixed(2)}, smooth: ${this.smoothDistance.toFixed(2)}mm)`, + } + + for (const route of this.originalHdRoutes) { + if (route.route.length === 0) continue + + for (let i = 0; i < route.route.length - 1; i++) { + const current = route.route[i]! + const next = route.route[i + 1]! + + if (current.z === next.z) { + visualization.lines.push({ + points: [ + { x: current.x, y: current.y }, + { x: next.x, y: next.y }, + ], + strokeColor: "rgba(0,0,0,0.25)", + strokeWidth: (route.traceThickness ?? 0.15) * 1.5, + }) + } + } + } + + // Visualize obstacles + for (const obstacle of this.input.obstacles) { + let fillColor = "rgba(128, 128, 128, 0.2)" + const isOnLayer0 = obstacle.zLayers?.includes(0) + const isOnLayer1 = obstacle.zLayers?.includes(1) + + if (isOnLayer0 && isOnLayer1) { + fillColor = "rgba(128, 0, 128, 0.2)" + } else if (isOnLayer0) { + fillColor = "rgba(255, 0, 0, 0.2)" + } else if (isOnLayer1) { + fillColor = "rgba(0, 0, 255, 0.2)" + } + + visualization.rects.push({ + center: obstacle.center, + width: obstacle.width, + height: obstacle.height, + fill: fillColor, + label: `Obstacle (Z: ${obstacle.zLayers?.join(", ")})`, + }) + } + + // Draw processed routes + for (const route of this.processedRoutes) { + if (route.route.length === 0) continue + + const color = this.input.colorMap[route.connectionName] || "#888888" + + for (let i = 0; i < route.route.length - 1; i++) { + const current = route.route[i]! + const next = route.route[i + 1]! + + if (current.z === next.z) { + visualization.lines.push({ + points: [ + { x: current.x, y: current.y }, + { x: next.x, y: next.y }, + ], + strokeColor: current.z === 0 ? "red" : "blue", + strokeWidth: route.traceThickness, + label: `${route.connectionName} (z=${current.z})`, + }) + } + } + + for (const via of route.vias) { + visualization.circles.push({ + center: { x: via.x, y: via.y }, + radius: route.viaDiameter / 2, + fill: "rgba(255, 0, 255, 0.5)", + label: `${route.connectionName} via`, + }) + } + } + + // Draw current trace being processed (if any) + if (this.currentTrace && this.recordedDrawPositions.length > 0) { + const color = + this.input.colorMap[this.currentTrace.connectionName] || "#00FF00" + + for (let i = 0; i < this.recordedDrawPositions.length - 1; i++) { + const current = this.recordedDrawPositions[i]! + const next = this.recordedDrawPositions[i + 1]! + + visualization.lines.push({ + points: [ + { x: current.x, y: current.y }, + { x: next.x, y: next.y }, + ], + strokeColor: "green", + strokeWidth: this.currentTrace.traceThickness, + }) + } + + // Draw cursor position + if (this.cursorPosition) { + visualization.circles.push({ + center: { x: this.cursorPosition.x, y: this.cursorPosition.y }, + radius: this.currentKeepoutRadius, + stroke: "orange", + label: "Cursor keepout", + }) + + visualization.points.push({ + x: this.cursorPosition.x, + y: this.cursorPosition.y, + color: "orange", + label: "Cursor", + }) + } + + // Draw draw position + if (this.drawPosition) { + visualization.points.push({ + x: this.drawPosition.x, + y: this.drawPosition.y, + color: "lime", + label: "Draw", + }) + } + + // Draw colliding segments + for (const segment of this.lastCollidingSegments) { + visualization.lines.push({ + points: [ + { x: segment.start.x, y: segment.start.y }, + { x: segment.end.x, y: segment.end.y }, + ], + strokeColor: "rgba(255, 0, 255, 0.8)", + strokeWidth: 0.02, + label: "Colliding segment", + }) + } + } + + if (!this.solved) { + // Draw smoothed routes (these are what the solver will process) + for (const route of this.smoothedCursorRoutes) { + if (route.route.length === 0) continue + + for (let i = 0; i < route.route.length - 1; i++) { + const current = route.route[i]! + const next = route.route[i + 1]! + + if (current.z === next.z) { + visualization.lines.push({ + points: [ + { x: current.x, y: current.y }, + { x: next.x, y: next.y }, + ], + strokeColor: "gray", + }) + } + } + } + } + + return visualization + } + + /** Returns the redrawn routes. This is the primary output of the solver. */ + getRedrawnHdRoutes(): HighDensityRoute[] { + return this.redrawnHdRoutes + } +} diff --git a/lib/solvers/TraceKeepoutSolver/computeDrawPositionFromCollisions.ts b/lib/solvers/TraceKeepoutSolver/computeDrawPositionFromCollisions.ts new file mode 100644 index 00000000..e55fcf08 --- /dev/null +++ b/lib/solvers/TraceKeepoutSolver/computeDrawPositionFromCollisions.ts @@ -0,0 +1,294 @@ +interface Point2D { + x: number + y: number +} + +export interface Segment { + start: Point2D + end: Point2D +} + +export interface ComputeDrawPositionInput { + cursorPosition: Point2D + lastCursorPosition: Point2D + collidingSegments: Segment[] + keepoutRadius: number +} + +function closestPointOnSegment(p: Point2D, a: Point2D, b: Point2D): Point2D { + const dx = b.x - a.x, + dy = b.y - a.y + const lenSq = dx * dx + dy * dy + if (lenSq === 0) return { x: a.x, y: a.y } + const t = Math.max( + 0, + Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / lenSq), + ) + return { x: a.x + t * dx, y: a.y + t * dy } +} + +/** + * Gets minimum clearance from a point to all segments + */ +function getMinClearance(pos: Point2D, segments: Segment[]): number { + let minClearance = Infinity + for (const seg of segments) { + const closest = closestPointOnSegment(pos, seg.start, seg.end) + const dist = Math.sqrt((pos.x - closest.x) ** 2 + (pos.y - closest.y) ** 2) + minClearance = Math.min(minClearance, dist) + } + return minClearance +} + +/** + * Checks if two line segments intersect + */ +function segmentsIntersect( + a1: Point2D, + a2: Point2D, + b1: Point2D, + b2: Point2D, +): boolean { + const d1 = direction(b1, b2, a1) + const d2 = direction(b1, b2, a2) + const d3 = direction(a1, a2, b1) + const d4 = direction(a1, a2, b2) + + if ( + ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && + ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0)) + ) { + return true + } + + const eps = 0.0001 + if (Math.abs(d1) < eps && onSegment(b1, b2, a1)) return true + if (Math.abs(d2) < eps && onSegment(b1, b2, a2)) return true + if (Math.abs(d3) < eps && onSegment(a1, a2, b1)) return true + if (Math.abs(d4) < eps && onSegment(a1, a2, b2)) return true + + return false +} + +function direction(a: Point2D, b: Point2D, c: Point2D): number { + return (c.x - a.x) * (b.y - a.y) - (b.x - a.x) * (c.y - a.y) +} + +function onSegment(a: Point2D, b: Point2D, c: Point2D): boolean { + return ( + c.x >= Math.min(a.x, b.x) - 0.0001 && + c.x <= Math.max(a.x, b.x) + 0.0001 && + c.y >= Math.min(a.y, b.y) - 0.0001 && + c.y <= Math.max(a.y, b.y) + 0.0001 + ) +} + +/** + * Checks if the path from cursor to position is clear (no segments in between) + */ +function isPathClear( + cursor: Point2D, + pos: Point2D, + segments: Segment[], +): boolean { + for (const seg of segments) { + if (segmentsIntersect(cursor, pos, seg.start, seg.end)) { + return false + } + } + return true +} + +/** + * Computes an optimal draw position that maintains keepoutRadius from all segments. + * + * The draw position is constrained to: + * 1. Lie on the barrier line (perpendicular to trace direction, passing through cursor) + * 2. Stay within keepoutRadius distance from the cursor position + * + * Within these constraints, it finds the position that maximizes the minimum + * clearance to all colliding segments. This provides the "safest" position + * even when a fully valid position (clearance >= keepoutRadius) isn't possible. + * + * @param input.cursorPosition - Current position along the trace + * @param input.lastCursorPosition - Previous position (used to determine trace direction) + * @param input.collidingSegments - Line segments representing obstacle edges and trace outlines + * @param input.keepoutRadius - Minimum distance to maintain from obstacles (also max distance from cursor) + * + * @returns The optimal draw position on the barrier line within keepoutRadius, or null if cursor is valid + */ +export function computeDrawPositionFromCollisions( + input: ComputeDrawPositionInput, +): Point2D | null { + const { + cursorPosition, + lastCursorPosition, + collidingSegments, + keepoutRadius, + } = input + if (collidingSegments.length === 0) return null + + const epsilon = 0.0001 + + // Calculate trace direction + const tdx = cursorPosition.x - lastCursorPosition.x + const tdy = cursorPosition.y - lastCursorPosition.y + const tLen = Math.sqrt(tdx * tdx + tdy * tdy) + const traceDir = + tLen > epsilon ? { x: tdx / tLen, y: tdy / tLen } : { x: 1, y: 0 } + + // Barrier direction (perpendicular to trace) + const barrierDir = { x: -traceDir.y, y: traceDir.x } + + // Check if cursor position itself is valid + const cursorClearance = getMinClearance(cursorPosition, collidingSegments) + if (cursorClearance >= keepoutRadius) { + return null // No adjustment needed + } + + // Search outward from cursor along barrier line in both directions + // Stop as soon as we find a valid position (minimal displacement) + const steps = 20 + + // Search both directions simultaneously, increasing distance from cursor + for (let i = 1; i <= steps; i++) { + const d = (i / steps) * keepoutRadius + + // Test positive direction + const posPlus = { + x: cursorPosition.x + barrierDir.x * d, + y: cursorPosition.y + barrierDir.y * d, + } + const clearancePlus = getMinClearance(posPlus, collidingSegments) + + // Test negative direction + const posMinus = { + x: cursorPosition.x - barrierDir.x * d, + y: cursorPosition.y - barrierDir.y * d, + } + const clearanceMinus = getMinClearance(posMinus, collidingSegments) + + // Return the first valid position found (minimal displacement) + // Position must have sufficient clearance AND path from cursor must be clear + const validPlus = + clearancePlus >= keepoutRadius && + isPathClear(cursorPosition, posPlus, collidingSegments) + const validMinus = + clearanceMinus >= keepoutRadius && + isPathClear(cursorPosition, posMinus, collidingSegments) + + if (validPlus && validMinus) { + return clearancePlus >= clearanceMinus ? posPlus : posMinus + } + if (validPlus) return posPlus + if (validMinus) return posMinus + } + + // No valid position found - return the best suboptimal position + // (position with maximum clearance within the search range that has clear path) + let bestPos: Point2D | null = null + let bestClearance = -Infinity + + for (let i = -steps; i <= steps; i++) { + const d = (i / steps) * keepoutRadius + const testPos = { + x: cursorPosition.x + barrierDir.x * d, + y: cursorPosition.y + barrierDir.y * d, + } + + // Only consider positions with clear path from cursor + if (!isPathClear(cursorPosition, testPos, collidingSegments)) { + continue + } + + const clearance = getMinClearance(testPos, collidingSegments) + if (clearance > bestClearance) { + bestClearance = clearance + bestPos = testPos + } + } + + // If no position has clear path, fall back to cursor position (return null) + if (bestPos === null) { + return null + } + + const movedDist = Math.sqrt( + (bestPos.x - cursorPosition.x) ** 2 + (bestPos.y - cursorPosition.y) ** 2, + ) + return movedDist > epsilon ? bestPos : null +} +/** + * Converts an obstacle (rectangular) to its 4 edge segments + */ +export function obstacleToSegments(obstacle: { + center: { x: number; y: number } + width: number + height: number +}): Segment[] { + const halfW = obstacle.width / 2 + const halfH = obstacle.height / 2 + const cx = obstacle.center.x + const cy = obstacle.center.y + + const topLeft = { x: cx - halfW, y: cy + halfH } + const topRight = { x: cx + halfW, y: cy + halfH } + const bottomLeft = { x: cx - halfW, y: cy - halfH } + const bottomRight = { x: cx + halfW, y: cy - halfH } + + return [ + { start: topLeft, end: topRight }, + { start: topRight, end: bottomRight }, + { start: bottomRight, end: bottomLeft }, + { start: bottomLeft, end: topLeft }, + ] +} + +/** + * Converts a trace segment to its outline segments (left and right edges) + * considering the trace width + */ +export function traceSegmentToOutlineSegments( + segmentStart: Point2D, + segmentEnd: Point2D, + traceWidth: number = 0.1, +): Segment[] { + const dx = segmentEnd.x - segmentStart.x + const dy = segmentEnd.y - segmentStart.y + const len = Math.sqrt(dx * dx + dy * dy) + + if (len === 0) return [] + + const nx = dx / len + const ny = dy / len + const px = -ny + const py = nx + const halfW = traceWidth / 2 + + return [ + { + start: { x: segmentStart.x + px * halfW, y: segmentStart.y + py * halfW }, + end: { x: segmentEnd.x + px * halfW, y: segmentEnd.y + py * halfW }, + }, + { + start: { x: segmentStart.x - px * halfW, y: segmentStart.y - py * halfW }, + end: { x: segmentEnd.x - px * halfW, y: segmentEnd.y - py * halfW }, + }, + ] +} + +/** + * Converts an entire route to outline segments + */ +export function routeToOutlineSegments( + route: Array<{ x: number; y: number }>, + traceWidth: number = 0.1, +): Segment[] { + const segments: Segment[] = [] + for (let i = 0; i < route.length - 1; i++) { + segments.push( + ...traceSegmentToOutlineSegments(route[i]!, route[i + 1]!, traceWidth), + ) + } + return segments +} diff --git a/lib/solvers/TraceKeepoutSolver/obstacleToSegments.ts b/lib/solvers/TraceKeepoutSolver/obstacleToSegments.ts new file mode 100644 index 00000000..8547200d --- /dev/null +++ b/lib/solvers/TraceKeepoutSolver/obstacleToSegments.ts @@ -0,0 +1,107 @@ +interface Point2D { + x: number + y: number +} + +export interface Segment { + start: Point2D + end: Point2D +} + +/** + * Converts an obstacle (rectangular) to its 4 edge segments + */ +export function obstacleToSegments(obstacle: { + center: { x: number; y: number } + width: number + height: number +}): Segment[] { + const halfW = obstacle.width / 2 + const halfH = obstacle.height / 2 + const cx = obstacle.center.x + const cy = obstacle.center.y + + const topLeft = { x: cx - halfW, y: cy + halfH } + const topRight = { x: cx + halfW, y: cy + halfH } + const bottomLeft = { x: cx - halfW, y: cy - halfH } + const bottomRight = { x: cx + halfW, y: cy - halfH } + + return [ + { start: topLeft, end: topRight }, // top edge + { start: topRight, end: bottomRight }, // right edge + { start: bottomRight, end: bottomLeft }, // bottom edge + { start: bottomLeft, end: topLeft }, // left edge + ] +} + +/** + * Converts a trace segment to its outline segments (left and right edges) + * considering the trace width + */ +export function traceSegmentToOutlineSegments( + segmentStart: Point2D, + segmentEnd: Point2D, + traceWidth: number = 0.1, +): Segment[] { + const dx = segmentEnd.x - segmentStart.x + const dy = segmentEnd.y - segmentStart.y + const len = Math.sqrt(dx * dx + dy * dy) + + if (len === 0) { + return [] + } + + // Normalized direction + const nx = dx / len + const ny = dy / len + + // Perpendicular direction + const px = -ny + const py = nx + + // Half width offset + const halfW = traceWidth / 2 + + // Left edge + const leftStart = { + x: segmentStart.x + px * halfW, + y: segmentStart.y + py * halfW, + } + const leftEnd = { + x: segmentEnd.x + px * halfW, + y: segmentEnd.y + py * halfW, + } + + // Right edge + const rightStart = { + x: segmentStart.x - px * halfW, + y: segmentStart.y - py * halfW, + } + const rightEnd = { + x: segmentEnd.x - px * halfW, + y: segmentEnd.y - py * halfW, + } + + return [ + { start: leftStart, end: leftEnd }, + { start: rightStart, end: rightEnd }, + ] +} + +/** + * Converts an entire route to outline segments + */ +export function routeToOutlineSegments( + route: Array<{ x: number; y: number }>, + traceWidth: number = 0.1, +): Segment[] { + const segments: Segment[] = [] + + for (let i = 0; i < route.length - 1; i++) { + const start = route[i]! + const end = route[i + 1]! + segments.push(...traceSegmentToOutlineSegments(start, end, traceWidth)) + } + + return segments +} diff --git a/lib/solvers/TraceKeepoutSolver/smoothLines.ts b/lib/solvers/TraceKeepoutSolver/smoothLines.ts new file mode 100644 index 00000000..eaca332f --- /dev/null +++ b/lib/solvers/TraceKeepoutSolver/smoothLines.ts @@ -0,0 +1,243 @@ +import { HighDensityRoute } from "lib/types/high-density-types" + +interface Point3D { + x: number + y: number + z: number +} + +/** + * Smooths a route to avoid sudden slope changes within the given smoothDistance. + * Uses a weighted average approach where nearby points influence each point's position. + * + * @param route - Array of 3D points representing the route + * @param smoothDistance - Maximum distance over which slope changes are smoothed (default: 0.5mm) + * @param sampleInterval - Interval for resampling the route (default: 0.05mm) + * @returns Smoothed route with gradual slope transitions + */ +export function smoothRoute( + route: Point3D[], + smoothDistance: number = 0.5, + sampleInterval: number = 0.1, +): Point3D[] { + if (route.length < 3) return [...route] + + // Step 1: Resample the route at regular intervals + const resampled = resampleRoute(route, sampleInterval) + if (resampled.length < 3) return [...route] + + // Step 2: Apply Gaussian smoothing while preserving endpoints and layer transitions + const smoothed = gaussianSmooth(resampled, smoothDistance) + + // Step 3: Simplify the route to remove redundant points + return simplifyRoute(smoothed) +} + +/** + * Resamples a route to have evenly spaced points + */ +function resampleRoute(route: Point3D[], interval: number): Point3D[] { + if (route.length < 2) return [...route] + + const result: Point3D[] = [{ ...route[0]! }] + let currentDist = 0 + + for (let i = 0; i < route.length - 1; i++) { + const start = route[i]! + const end = route[i + 1]! + + const dx = end.x - start.x + const dy = end.y - start.y + const segmentLength = Math.sqrt(dx * dx + dy * dy) + + if (segmentLength === 0) continue + + // If layer changes, add both points explicitly + if (start.z !== end.z) { + result.push({ ...end }) + currentDist = 0 + continue + } + + const dirX = dx / segmentLength + const dirY = dy / segmentLength + + let distInSegment = interval - currentDist + while (distInSegment < segmentLength) { + result.push({ + x: start.x + dirX * distInSegment, + y: start.y + dirY * distInSegment, + z: start.z, + }) + distInSegment += interval + } + + currentDist = distInSegment - segmentLength + } + + // Always add the final point + const lastPoint = route[route.length - 1]! + const lastResult = result[result.length - 1]! + if (lastResult.x !== lastPoint.x || lastResult.y !== lastPoint.y) { + result.push({ ...lastPoint }) + } + + return result +} + +/** + * Applies Gaussian smoothing to the route + * Points are smoothed based on distance-weighted average of nearby points + */ +function gaussianSmooth(route: Point3D[], smoothDistance: number): Point3D[] { + if (route.length < 3) return [...route] + + const result: Point3D[] = [] + const sigma = smoothDistance / 3 // Standard deviation for Gaussian kernel + + for (let i = 0; i < route.length; i++) { + const current = route[i]! + + // Keep first and last points fixed (endpoints) + if (i === 0 || i === route.length - 1) { + result.push({ ...current }) + continue + } + + // Check for layer transitions - keep these points fixed + const prev = route[i - 1]! + const next = route[i + 1]! + if (current.z !== prev.z || current.z !== next.z) { + result.push({ ...current }) + continue + } + + // Calculate weighted average position + let sumX = 0 + let sumY = 0 + let sumWeight = 0 + + // Look at points within the smooth distance + let cumulativeDistBack = 0 + for (let j = i; j >= 0 && cumulativeDistBack <= smoothDistance; j--) { + const pt = route[j]! + + // Stop at layer transitions + if (pt.z !== current.z) break + + const weight = gaussianWeight(cumulativeDistBack, sigma) + sumX += pt.x * weight + sumY += pt.y * weight + sumWeight += weight + + if (j > 0) { + const prevPt = route[j - 1]! + cumulativeDistBack += distance(pt, prevPt) + } + } + + let cumulativeDistForward = 0 + for ( + let j = i + 1; + j < route.length && cumulativeDistForward <= smoothDistance; + j++ + ) { + const pt = route[j]! + + // Stop at layer transitions + if (pt.z !== current.z) break + + const prevPt = route[j - 1]! + cumulativeDistForward += distance(pt, prevPt) + + const weight = gaussianWeight(cumulativeDistForward, sigma) + sumX += pt.x * weight + sumY += pt.y * weight + sumWeight += weight + } + + if (sumWeight > 0) { + result.push({ + x: sumX / sumWeight, + y: sumY / sumWeight, + z: current.z, + }) + } else { + result.push({ ...current }) + } + } + + return result +} + +/** + * Gaussian kernel weight function + */ +function gaussianWeight(distance: number, sigma: number): number { + return Math.exp(-(distance * distance) / (2 * sigma * sigma)) +} + +/** + * Calculate distance between two points + */ +function distance(a: Point3D, b: Point3D): number { + const dx = b.x - a.x + const dy = b.y - a.y + return Math.sqrt(dx * dx + dy * dy) +} + +/** + * Simplifies the route by removing collinear points + */ +function simplifyRoute(points: Point3D[]): Point3D[] { + if (points.length <= 2) return points + + const result: Point3D[] = [points[0]!] + + for (let i = 1; i < points.length - 1; i++) { + const prev = result[result.length - 1]! + const curr = points[i]! + const next = points[i + 1]! + + // Always keep points where z changes + if (curr.z !== prev.z || curr.z !== next.z) { + result.push(curr) + continue + } + + // Check if the point is collinear with prev and next + const dx1 = curr.x - prev.x + const dy1 = curr.y - prev.y + const dx2 = next.x - curr.x + const dy2 = next.y - curr.y + + // Cross product to check collinearity + const cross = dx1 * dy2 - dy1 * dx2 + const epsilon = 1e-6 + + if (Math.abs(cross) > epsilon) { + // Not collinear, keep this point + result.push(curr) + } + } + + result.push(points[points.length - 1]!) + return result +} + +/** + * Smooths all routes in a HighDensityRoute array + * + * @param hdRoutes - Array of high density routes to smooth + * @param smoothDistance - Maximum distance over which slope changes are smoothed (default: 0.5mm) + * @returns New array of routes with smoothed paths + */ +export function smoothHdRoutes( + hdRoutes: HighDensityRoute[], + smoothDistance: number = 0.5, +): HighDensityRoute[] { + return hdRoutes.map((route) => ({ + ...route, + route: smoothRoute(route.route, smoothDistance), + })) +} diff --git a/lib/utils/getConnectivityMapFromSimpleRouteJson.ts b/lib/utils/getConnectivityMapFromSimpleRouteJson.ts index f37333c9..ca94fd90 100644 --- a/lib/utils/getConnectivityMapFromSimpleRouteJson.ts +++ b/lib/utils/getConnectivityMapFromSimpleRouteJson.ts @@ -1,5 +1,9 @@ import { SimpleRouteJson } from "lib/types" import { ConnectivityMap } from "circuit-json-to-connectivity-map" +import { mapLayerNameToZ } from "./mapLayerNameToZ" + +const pointHash = (point: { x: number; y: number }) => + `${Math.round(point.x * 100)},${Math.round(point.y * 100)}` export const getConnectivityMapFromSimpleRouteJson = (srj: SimpleRouteJson) => { const connMap = new ConnectivityMap({}) @@ -20,6 +24,19 @@ export const getConnectivityMapFromSimpleRouteJson = (srj: SimpleRouteJson) => { } for (const point of connection.pointsToConnect) { + connMap.addConnections([ + [ + connection.name, + `${pointHash(point)}:${ + "layers" in point + ? point.layers + .map((l) => mapLayerNameToZ(l, srj.layerCount)) + .sort() + .join("-") + : mapLayerNameToZ(point.layer, srj.layerCount) + }`, + ], + ]) if ("pcb_port_id" in point && point.pcb_port_id) { connMap.addConnections([[connection.name, point.pcb_port_id as string]]) } @@ -28,7 +45,17 @@ export const getConnectivityMapFromSimpleRouteJson = (srj: SimpleRouteJson) => { for (const obstacle of srj.obstacles) { const offBoardConnections = obstacle.offBoardConnectsTo ?? [] const connectionGroup = Array.from( - new Set([...obstacle.connectedTo, ...offBoardConnections]), + new Set( + [ + obstacle.obstacleId!, + ...obstacle.connectedTo, + ...offBoardConnections, + `${pointHash(obstacle.center)}:${obstacle.layers + .map((l) => mapLayerNameToZ(l, srj.layerCount)) + .sort() + .join("-")}`, + ].filter(Boolean), + ), ) if (connectionGroup.length > 0) { diff --git a/lib/utils/getIntraNodeCrossings.ts b/lib/utils/getIntraNodeCrossings.ts index f72d6ab1..5cafac6e 100644 --- a/lib/utils/getIntraNodeCrossings.ts +++ b/lib/utils/getIntraNodeCrossings.ts @@ -1,6 +1,9 @@ import { doSegmentsIntersect } from "@tscircuit/math-utils" import { NodeWithPortPoints } from "lib/types/high-density-types" +// Intersection calculation is only accurate to 0.00001 (0.01mm) +const intSpace = (a: number) => Math.floor(a * 10000) + export const getIntraNodeCrossings = (node: NodeWithPortPoints) => { // Count the number of crossings let numSameLayerCrossings = 0 @@ -29,12 +32,12 @@ export const getIntraNodeCrossings = (node: NodeWithPortPoints) => { const pointPair = { connectionName: A.connectionName, z: A.z, - points: [{ x: A.x, y: A.y, z: A.z }], + points: [{ x: intSpace(A.x), y: intSpace(A.y), z: A.z }], } for (const B of node.portPoints) { if (A.connectionName !== B.connectionName) continue if (A.x === B.x && A.y === B.y) continue - pointPair.points.push({ x: B.x, y: B.y, z: B.z }) + pointPair.points.push({ x: intSpace(B.x), y: intSpace(B.y), z: B.z }) } if (pointPair.points.some((p) => p.z !== pointPair.z)) { numEntryExitLayerChanges++ diff --git a/tests/__snapshots__/core1.snap.svg b/tests/__snapshots__/core1.snap.svg index 497e6e33..f8de8203 100644 --- a/tests/__snapshots__/core1.snap.svg +++ b/tests/__snapshots__/core1.snap.svg @@ -1 +1 @@ -R1C1 \ No newline at end of file +R1C1 \ No newline at end of file diff --git a/tests/__snapshots__/e2e3-multisection.snap.svg b/tests/__snapshots__/e2e3-multisection.snap.svg index 84888543..20c276be 100644 --- a/tests/__snapshots__/e2e3-multisection.snap.svg +++ b/tests/__snapshots__/e2e3-multisection.snap.svg @@ -1,4 +1,4 @@ - \ No newline at end of file diff --git a/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg b/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg index c64774b0..16e86d92 100644 --- a/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg +++ b/tests/bugs/__snapshots__/bugreport27-dd3734.snap.svg @@ -1,4 +1,4 @@ - { +test.skip("bugreport27-dd3734", () => { + const portPointWinningHyperParameters = { + NODE_PF_FACTOR: 10000, + FORCE_OFF_BOARD_FREQUENCY: 0.3, + CENTER_OFFSET_DIST_PENALTY_FACTOR: 1, + FORCE_CENTER_FIRST: true, + SHUFFLE_SEED: 2139, + MIN_ALLOWED_BOARD_SCORE: -1, + } + const solver = new AssignableAutoroutingPipeline2(srj) + + // // solve until the high density route solver, take a snapshot of the + // // visualization from the port point pathing solver + // solver.solveUntilPhase("simpleHighDensityRouteSolver") + + // expect( + // getLastStepSvg(solver.portPointPathingSolver!.visualize()), + // ).toMatchSvgSnapshot(import.meta.path, { + // svgName: "bugreport27-portPointPathingSolver", + // }) + solver.solve() expect(getLastStepSvg(solver.visualize())).toMatchSvgSnapshot( import.meta.path, diff --git a/tests/features/keepoutsolver/__snapshots__/keepoutsolver01.snap.svg b/tests/features/keepoutsolver/__snapshots__/keepoutsolver01.snap.svg new file mode 100644 index 00000000..03b87654 --- /dev/null +++ b/tests/features/keepoutsolver/__snapshots__/keepoutsolver01.snap.svg @@ -0,0 +1,44 @@ + \ No newline at end of file diff --git a/tests/features/keepoutsolver/keepoutsolver01.test.ts b/tests/features/keepoutsolver/keepoutsolver01.test.ts new file mode 100644 index 00000000..18d288a5 --- /dev/null +++ b/tests/features/keepoutsolver/keepoutsolver01.test.ts @@ -0,0 +1,24 @@ +import { test, expect } from "bun:test" +import { TraceKeepoutSolver } from "lib/solvers/TraceKeepoutSolver/TraceKeepoutSolver" +import { ConnectivityMap } from "connectivity-map" +import input from "../../../examples/features/keepoutsolver/keepoutsolver01-input.json" + +test.skip("TraceKeepoutSolver - adjusts traces to maintain keepout distance", () => { + const data = (input as any)[0] + + const connMap = new ConnectivityMap(data.connMap.netMap) + + const solver = new TraceKeepoutSolver({ + hdRoutes: data.hdRoutes, + obstacles: data.obstacles, + connMap, + colorMap: data.colorMap, + keepoutRadiusSchedule: data.keepoutRadiusSchedule, + }) + + solver.solve() + + expect(solver.solved).toBe(true) + expect(solver.getRedrawnHdRoutes().length).toBeGreaterThan(0) + expect(solver.visualize()).toMatchGraphicsSvg(import.meta.path) +}) diff --git a/tests/features/multilayerconnectionpoints/__snapshots__/multilayerconnectionpoints01.snap.svg b/tests/features/multilayerconnectionpoints/__snapshots__/multilayerconnectionpoints01.snap.svg index 3cdd69da..3572c16b 100644 --- a/tests/features/multilayerconnectionpoints/__snapshots__/multilayerconnectionpoints01.snap.svg +++ b/tests/features/multilayerconnectionpoints/__snapshots__/multilayerconnectionpoints01.snap.svg @@ -1,4 +1,4 @@ -