diff --git a/src/mckicad/utils/ses_apply.py b/src/mckicad/utils/ses_apply.py new file mode 100644 index 0000000..d838de9 --- /dev/null +++ b/src/mckicad/utils/ses_apply.py @@ -0,0 +1,301 @@ +"""Native Specctra SES -> .kicad_pcb applier. + +KiCad 10's ``kicad-cli`` has no ``specctra-dsn``/``specctra-ses`` subcommands, +the ``kipy`` IPC API has no Specctra support, and ``pcbnew.ImportSpecctraSES`` +requires a GUI display. This module applies FreeRouting's SES output to a +``.kicad_pcb`` directly, fully headless: it reads the routed wires/vias from +the SES, transforms their coordinates into KiCad millimetres, and injects +``(segment ...)`` / ``(via ...)`` nodes as top-level board items. + +The rest of the board is preserved byte-for-byte; only the new track items are +spliced in just before the board's closing paren. + +Coordinate model +---------------- +SES/Specctra units come from the ``(resolution )`` in scope. +For ``(resolution um 10)`` one SES unit is 0.1 um, so ``mm = ses_unit / 10000``. +General: ``mm = ses_unit * unit_in_mm / value``. Specctra is Y-up, KiCad is +Y-down, so ``x_mm = ses_x * scale`` and ``y_mm = -ses_y * scale``. +""" + +from __future__ import annotations + +import logging +import re +import uuid + +from .sexp_tree import ( + SexpNode, + find, + find_one, + make_atom, + make_node, + make_string, + parse, + parse_file, + serialize, +) + +logger = logging.getLogger(__name__) + +# Millimetres per one unit of each Specctra length unit. +_UNIT_IN_MM = { + "um": 0.001, + "mm": 1.0, + "mil": 0.0254, + "inch": 25.4, +} + +# Fallback via geometry (mm) when neither the padstack name nor its shape +# gives usable dimensions. 0.6 mm pad / 0.3 mm drill is KiCad's default via. +_DEFAULT_VIA_SIZE_MM = 0.6 +_DEFAULT_VIA_DRILL_MM = 0.3 + +# Pulls "600:300" (pad:drill) and a trailing unit out of padstack names such as +# "Via[0-1]_600:300_um". +_PADSTACK_DIMS_RE = re.compile(r"(\d+(?:\.\d+)?):(\d+(?:\.\d+)?)_(um|mm|mil|inch)") + + +class SesApplyError(Exception): + """Raised when an SES file cannot be applied to a board.""" + + +def resolution_scale(unit: str, value: float) -> float: + """Return millimetres-per-SES-unit for a ``(resolution unit value)`` scope.""" + if unit not in _UNIT_IN_MM: + raise SesApplyError(f"Unsupported SES resolution unit: {unit!r}") + if value == 0: + raise SesApplyError("SES resolution value must be non-zero") + return _UNIT_IN_MM[unit] / value + + +def _fmt(mm: float) -> str: + """Format a millimetre value the way KiCad writes coordinates.""" + s = f"{mm:.6f}".rstrip("0").rstrip(".") + if s in ("", "-", "-0"): + return "0" + return s + + +def _transform(x: float, y: float, scale: float) -> tuple[str, str]: + """SES (x, y) -> KiCad (x_mm, y_mm) strings, applying the Y-axis flip.""" + return _fmt(x * scale), _fmt(-y * scale) + + +def _find_routes(session: SexpNode) -> SexpNode: + routes = find_one(session, "routes") + if routes is None: + raise SesApplyError("SES has no (routes ...) scope") + return routes + + +def _read_scale(routes: SexpNode) -> float: + res = find_one(routes, "resolution") + if res is None or len(res.values) < 2: + raise SesApplyError("SES (routes ...) has no (resolution unit value)") + unit = res.values[0] + try: + value = float(res.values[1]) + except ValueError as exc: # pragma: no cover - malformed input + raise SesApplyError(f"Bad SES resolution value: {res.values[1]!r}") from exc + return resolution_scale(unit, value) + + +def build_net_map(board_root: SexpNode) -> dict[str, int]: + """Map net name -> net number from the board's top-level ``(net N "name")``.""" + net_map: dict[str, int] = {} + for net in find(board_root, "net"): + # (net "") -- number is values[0], name is values[1] + if len(net.values) >= 2: + try: + number = int(net.values[0]) + except ValueError: + continue + net_map[net.values[1]] = number + return net_map + + +def _padstack_dims(name: str, shape_diameter_mm: float | None) -> tuple[float, float]: + """Derive (size_mm, drill_mm) for a via from its padstack. + + Prefers the ``:_`` encoding in the padstack name (which + carries both pad and drill), then falls back to the shape diameter for the + pad size, then to KiCad's default via dimensions. + """ + match = _PADSTACK_DIMS_RE.search(name) + if match: + unit = match.group(3) + factor = _UNIT_IN_MM[unit] + return float(match.group(1)) * factor, float(match.group(2)) * factor + size = shape_diameter_mm if shape_diameter_mm else _DEFAULT_VIA_SIZE_MM + return size, _DEFAULT_VIA_DRILL_MM + + +def _padstack_shape_diameter(padstack: SexpNode, scale: float) -> float | None: + """Return the pad diameter (mm) from a padstack's first ``(circle ...)`` shape.""" + for shape in find(padstack, "shape"): + circle = find_one(shape, "circle") + # (circle [x y]) -- diameter is values[1] + if circle is not None and len(circle.values) >= 2: + try: + return float(circle.values[1]) * scale + except ValueError: + continue + return None + + +def _build_padstack_table(routes: SexpNode, scale: float) -> dict[str, tuple[float, float]]: + table: dict[str, tuple[float, float]] = {} + library = find_one(routes, "library_out") + if library is None: + return table + for padstack in find(library, "padstack"): + if not padstack.values: + continue + name = padstack.values[0] + if name in table: + continue + diameter = _padstack_shape_diameter(padstack, scale) + table[name] = _padstack_dims(name, diameter) + return table + + +def _segment_node( + p1: tuple[str, str], p2: tuple[str, str], width: str, layer: str, net: int +) -> SexpNode: + return make_node( + "segment", + children=[ + make_atom("start", p1[0], p1[1]), + make_atom("end", p2[0], p2[1]), + make_atom("width", width), + make_string("layer", layer), + make_atom("net", str(net)), + make_string("uuid", str(uuid.uuid4())), + ], + ) + + +def _via_node( + at: tuple[str, str], size: str, drill: str, net: int, layers: tuple[str, str] +) -> SexpNode: + return make_node( + "via", + children=[ + make_atom("at", at[0], at[1]), + make_atom("size", size), + make_atom("drill", drill), + make_string("layers", layers[0], layers[1]), + make_atom("net", str(net)), + make_string("uuid", str(uuid.uuid4())), + ], + ) + + +def _wire_segments(wire: SexpNode, scale: float, net: int) -> tuple[list[SexpNode], str | None]: + """Turn one ``(wire (path L W x1 y1 ...))`` into KiCad segment nodes.""" + path = find_one(wire, "path") + if path is None or len(path.values) < 4: + return [], None + layer = path.values[0] + width = _fmt(float(path.values[1]) * scale) + coords = [float(v) for v in path.values[2:]] + if len(coords) % 2 != 0: + logger.warning("Odd coordinate count in wire path; dropping trailing value") + coords = coords[:-1] + points = [ + _transform(coords[i], coords[i + 1], scale) for i in range(0, len(coords), 2) + ] + segments = [ + _segment_node(points[i], points[i + 1], width, layer, net) + for i in range(len(points) - 1) + ] + return segments, layer + + +def apply_ses_to_board(pcb_path: str, ses_path: str, out_path: str) -> dict: + """Apply a routed SES file to a KiCad board, writing the result to ``out_path``. + + Returns a dict with ``segments_added``, ``vias_added``, ``nets_routed``, + and ``unknown_nets`` (SES nets with no matching board net). + """ + with open(pcb_path, encoding="utf-8") as f: + board_text = f.read() + board_root = parse(board_text) + net_map = build_net_map(board_root) + + session = parse_file(ses_path) + routes = _find_routes(session) + scale = _read_scale(routes) + padstacks = _build_padstack_table(routes, scale) + + network = find_one(routes, "network_out") + if network is None: + raise SesApplyError("SES (routes ...) has no (network_out ...)") + + new_nodes: list[SexpNode] = [] + segments_added = 0 + vias_added = 0 + nets_routed = 0 + unknown_nets: list[str] = [] + + for net in find(network, "net"): + if not net.values: + continue + net_name = net.values[0] + if net_name not in net_map: + unknown_nets.append(net_name) + logger.warning("SES net %r has no matching board net; skipping", net_name) + continue + net_number = net_map[net_name] + net_had_track = False + + for wire in find(net, "wire"): + segments, _layer = _wire_segments(wire, scale, net_number) + if segments: + new_nodes.extend(segments) + segments_added += len(segments) + net_had_track = True + + for via in find(net, "via"): + # (via x y) + if len(via.values) < 3: + continue + padstack = via.values[0] + size_mm, drill_mm = padstacks.get( + padstack, (_DEFAULT_VIA_SIZE_MM, _DEFAULT_VIA_DRILL_MM) + ) + at = _transform(float(via.values[1]), float(via.values[2]), scale) + new_nodes.append( + _via_node(at, _fmt(size_mm), _fmt(drill_mm), net_number, ("F.Cu", "B.Cu")) + ) + vias_added += 1 + net_had_track = True + + if net_had_track: + nets_routed += 1 + + _write_board(board_text, board_root, new_nodes, out_path) + + return { + "segments_added": segments_added, + "vias_added": vias_added, + "nets_routed": nets_routed, + "unknown_nets": unknown_nets, + "out_path": out_path, + } + + +def _write_board( + board_text: str, board_root: SexpNode, new_nodes: list[SexpNode], out_path: str +) -> None: + """Splice serialized track nodes in just before the board's closing paren.""" + if new_nodes: + block = "".join(f"\t{serialize(node, indent=1)}\n" for node in new_nodes) + # board_root.span = (0, offset-after-closing-paren); the ')' sits at span[1]-1. + insert_pos = board_root.span[1] - 1 + out_text = board_text[:insert_pos] + block + board_text[insert_pos:] + else: + out_text = board_text + with open(out_path, "w", encoding="utf-8") as f: + f.write(out_text) diff --git a/tests/fixtures/arduino_mega.kicad_pcb b/tests/fixtures/arduino_mega.kicad_pcb new file mode 100644 index 0000000..82944f4 --- /dev/null +++ b/tests/fixtures/arduino_mega.kicad_pcb @@ -0,0 +1,4040 @@ +(kicad_pcb + (version 20241229) + (generator "pcbnew") + (generator_version "9.0") + (general + (thickness 1.6) + (legacy_teardrops no) + ) + (paper "A4") + (title_block + (date "mar. 31 mars 2015") + ) + (layers + (0 "F.Cu" signal) + (2 "B.Cu" signal) + (9 "F.Adhes" user "F.Adhesive") + (11 "B.Adhes" user "B.Adhesive") + (13 "F.Paste" user) + (15 "B.Paste" user) + (5 "F.SilkS" user "F.Silkscreen") + (7 "B.SilkS" user "B.Silkscreen") + (1 "F.Mask" user) + (3 "B.Mask" user) + (17 "Dwgs.User" user "User.Drawings") + (19 "Cmts.User" user "User.Comments") + (21 "Eco1.User" user "User.Eco1") + (23 "Eco2.User" user "User.Eco2") + (25 "Edge.Cuts" user) + (27 "Margin" user) + (31 "F.CrtYd" user "F.Courtyard") + (29 "B.CrtYd" user "B.Courtyard") + (35 "F.Fab" user) + (33 "B.Fab" user) + ) + (setup + (stackup + (layer "F.SilkS" + (type "Top Silk Screen") + ) + (layer "F.Paste" + (type "Top Solder Paste") + ) + (layer "F.Mask" + (type "Top Solder Mask") + (color "Green") + (thickness 0.01) + ) + (layer "F.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "dielectric 1" + (type "core") + (thickness 1.51) + (material "FR4") + (epsilon_r 4.5) + (loss_tangent 0.02) + ) + (layer "B.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "B.Mask" + (type "Bottom Solder Mask") + (color "Green") + (thickness 0.01) + ) + (layer "B.Paste" + (type "Bottom Solder Paste") + ) + (layer "B.SilkS" + (type "Bottom Silk Screen") + ) + (copper_finish "None") + (dielectric_constraints no) + ) + (pad_to_mask_clearance 0) + (allow_soldermask_bridges_in_footprints no) + (tenting front back) + (aux_axis_origin 100 100) + (grid_origin 100 100) + (pcbplotparams + (layerselection 0x00000000_00000000_00000000_000000a5) + (plot_on_all_layers_selection 0x00000000_00000000_00000000_00000000) + (disableapertmacros no) + (usegerberextensions no) + (usegerberattributes yes) + (usegerberadvancedattributes yes) + (creategerberjobfile yes) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 6) + (plotframeref no) + (mode 1) + (useauxorigin no) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (pdf_front_fp_property_popups yes) + (pdf_back_fp_property_popups yes) + (pdf_metadata yes) + (pdf_single_document no) + (dxfpolygonmode yes) + (dxfimperialunits yes) + (dxfusepcbnewfont yes) + (psnegative no) + (psa4output no) + (plot_black_and_white yes) + (plotinvisibletext no) + (sketchpadsonfab no) + (plotpadnumbers no) + (hidednponfab no) + (sketchdnponfab yes) + (crossoutdnponfab yes) + (subtractmaskfromsilk no) + (outputformat 1) + (mirror no) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + (net 0 "") + (net 1 "GND") + (net 2 "/*52") + (net 3 "/53") + (net 4 "/50") + (net 5 "/51") + (net 6 "/48") + (net 7 "/49") + (net 8 "/*46") + (net 9 "/47") + (net 10 "/*44") + (net 11 "/*45") + (net 12 "/42") + (net 13 "/43") + (net 14 "/40") + (net 15 "/41") + (net 16 "/38") + (net 17 "/39") + (net 18 "/36") + (net 19 "/37") + (net 20 "/34") + (net 21 "/35") + (net 22 "/32") + (net 23 "/33") + (net 24 "/30") + (net 25 "/31") + (net 26 "/28") + (net 27 "/29") + (net 28 "/26") + (net 29 "/27") + (net 30 "/24") + (net 31 "/25") + (net 32 "/22") + (net 33 "/23") + (net 34 "+5V") + (net 35 "/IOREF") + (net 36 "/A0") + (net 37 "/A1") + (net 38 "/A2") + (net 39 "/A3") + (net 40 "/A4") + (net 41 "/A5") + (net 42 "/A6") + (net 43 "/A7") + (net 44 "/A8") + (net 45 "/A9") + (net 46 "/A10") + (net 47 "/A11") + (net 48 "/A12") + (net 49 "/A13") + (net 50 "/A14") + (net 51 "/A15") + (net 52 "/AREF") + (net 53 "/*13") + (net 54 "/*12") + (net 55 "/*11") + (net 56 "/*10") + (net 57 "/*9") + (net 58 "/*8") + (net 59 "/*7") + (net 60 "/*6") + (net 61 "/*5") + (net 62 "/*4") + (net 63 "/*3") + (net 64 "/*2") + (net 65 "/TX0{slash}1") + (net 66 "/RX0{slash}0") + (net 67 "+3V3") + (net 68 "/TX3{slash}14") + (net 69 "/RX3{slash}15") + (net 70 "/TX2{slash}16") + (net 71 "/RX2{slash}17") + (net 72 "/TX1{slash}18") + (net 73 "/RX1{slash}19") + (net 74 "/SDA{slash}20") + (net 75 "/SCL{slash}21") + (net 76 "VCC") + (net 77 "/~{RESET}") + (net 78 "unconnected-(J1-Pin_1-Pad1)") + (footprint "Connector_PinSocket_2.54mm:PinSocket_2x18_P2.54mm_Vertical" + (locked yes) + (layer "F.Cu") + (uuid "00000000-0000-0000-0000-0000551afce5") + (at 193.98 92.38 180) + (descr "Through hole straight socket strip, 2x18, 2.54mm pitch, double cols (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 2x18 2.54mm double row") + (property "Reference" "J7" + (at -1.27 -2.77 0) + (layer "F.SilkS") + (hide yes) + (uuid "c8d9ab51-328d-47af-ae45-df1eec5a36b9") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "Digital" + (at -1.27 46.99 0) + (layer "F.Fab") + (uuid "f003394f-1f7c-418a-a892-9a7835bc0e4e") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 180) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "6f43e9ce-183a-47b0-9868-98c6d3cdb5ed") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "Generic connector, double row, 02x18, odd/even pin numbering scheme (row 1 odd numbers, row 2 even numbers), script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 180) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "a90afe9f-57cc-4d93-b381-ad2b32307964") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_2x??_*") + (path "/00000000-0000-0000-0000-000056d743b5") + (sheetname "/") + (sheetfile "Arduino_Mega.kicad_sch") + (attr through_hole) + (fp_line + (start 1.33 1.27) + (end 1.33 44.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "48cdd860-6823-45fe-8fae-9d772ac831b2") + ) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "f0c84342-07f9-4e65-9b42-73d8f2034114") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "009e16bc-45ed-4a94-8d01-e1f14ee0f034") + ) + (fp_line + (start -1.27 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "8f9e0df5-3320-4405-a4a0-9ee5b0a6359e") + ) + (fp_line + (start -1.27 -1.33) + (end -1.27 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "d7f745f6-82fa-4aee-b53f-d33753e6e532") + ) + (fp_line + (start -3.87 44.51) + (end 1.33 44.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e87f49d0-d70c-4c63-8795-c15d3bdfcbf6") + ) + (fp_line + (start -3.87 -1.33) + (end -1.27 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "720a39f8-3234-4b45-978e-6a91e82b4f9d") + ) + (fp_line + (start -3.87 -1.33) + (end -3.87 44.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "99b66332-380e-4d06-aa2d-f53d9fbc7bd3") + ) + (fp_line + (start 1.76 44.95) + (end -4.34 44.95) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1e70321f-357a-4784-9e06-4876f2d2a2dc") + ) + (fp_line + (start 1.76 -1.8) + (end 1.76 44.95) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "86f0891a-5f98-42b0-b50b-0a8f7f856a08") + ) + (fp_line + (start -4.34 44.95) + (end -4.34 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "c0a36bf7-1d49-470e-b1b8-3e9e5af5a398") + ) + (fp_line + (start -4.34 -1.8) + (end 1.76 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "6f0eeddc-5610-433b-b942-be4f199be574") + ) + (fp_line + (start 1.27 44.45) + (end -3.81 44.45) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "68e76624-8024-4c4b-a1dd-22b0dcdbcb4e") + ) + (fp_line + (start 1.27 -0.27) + (end 1.27 44.45) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "9e1b8941-f356-4961-91fb-de790f71f543") + ) + (fp_line + (start 0.27 -1.27) + (end 1.27 -0.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "2da21ccc-6c22-461c-8ccd-a3b742374f26") + ) + (fp_line + (start -3.81 44.45) + (end -3.81 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "5fdf6fda-b8aa-457e-9af1-66aab2d3105d") + ) + (fp_line + (start -3.81 -1.27) + (end 0.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "3010c515-e2b3-40d5-99bc-33385d28fb56") + ) + (fp_text user "${REFERENCE}" + (at 2.286 0 90) + (layer "F.Fab") + (uuid "3c17affe-3383-4a3e-b0af-0f320048a201") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 1 "GND") + (pinfunction "Pin_1") + (pintype "passive") + (uuid "a74519b7-3dd9-41ad-8f6e-c935f5c3e021") + ) + (pad "2" thru_hole oval + (at -2.54 0 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 1 "GND") + (pinfunction "Pin_2") + (pintype "passive") + (uuid "2eb0ac26-68f2-411b-88f0-0303cf42afe0") + ) + (pad "3" thru_hole oval + (at 0 2.54 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 2 "/*52") + (pinfunction "Pin_3") + (pintype "passive") + (uuid "68f21420-d458-4e21-aedd-df4bef9c6b97") + ) + (pad "4" thru_hole oval + (at -2.54 2.54 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 3 "/53") + (pinfunction "Pin_4") + (pintype "passive") + (uuid "0a797ac2-1f51-44f1-82be-83bda8233e48") + ) + (pad "5" thru_hole oval + (at 0 5.08 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 4 "/50") + (pinfunction "Pin_5") + (pintype "passive") + (uuid "3060e0a5-0a09-48c0-a925-d4f3bc02d8cf") + ) + (pad "6" thru_hole oval + (at -2.54 5.08 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 5 "/51") + (pinfunction "Pin_6") + (pintype "passive") + (uuid "a3fbf161-ad01-4671-9cea-40169911b336") + ) + (pad "7" thru_hole oval + (at 0 7.62 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 6 "/48") + (pinfunction "Pin_7") + (pintype "passive") + (uuid "360946df-91f5-4802-aa98-8bb64085d6eb") + ) + (pad "8" thru_hole oval + (at -2.54 7.62 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 7 "/49") + (pinfunction "Pin_8") + (pintype "passive") + (uuid "afd8573a-7f3f-4059-90e2-a189b1de6236") + ) + (pad "9" thru_hole oval + (at 0 10.16 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 8 "/*46") + (pinfunction "Pin_9") + (pintype "passive") + (uuid "696c7603-3256-4878-9363-b14a6069b4d2") + ) + (pad "10" thru_hole oval + (at -2.54 10.16 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 9 "/47") + (pinfunction "Pin_10") + (pintype "passive") + (uuid "0c21e854-6a13-4435-b4a9-d8ad3ce4f733") + ) + (pad "11" thru_hole oval + (at 0 12.7 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 10 "/*44") + (pinfunction "Pin_11") + (pintype "passive") + (uuid "d2034469-ea1a-4aec-869c-4b7aa276fb75") + ) + (pad "12" thru_hole oval + (at -2.54 12.7 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 11 "/*45") + (pinfunction "Pin_12") + (pintype "passive") + (uuid "60e88a0a-1c4a-4f18-9002-b2cdd10f3cae") + ) + (pad "13" thru_hole oval + (at 0 15.24 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 12 "/42") + (pinfunction "Pin_13") + (pintype "passive") + (uuid "a97072cf-6fe2-40af-864a-0153c8aaf91a") + ) + (pad "14" thru_hole oval + (at -2.54 15.24 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 13 "/43") + (pinfunction "Pin_14") + (pintype "passive") + (uuid "4ca5136a-6aa4-4925-8a6c-da685018f4a9") + ) + (pad "15" thru_hole oval + (at 0 17.78 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 14 "/40") + (pinfunction "Pin_15") + (pintype "passive") + (uuid "b038a8b0-ad81-4be3-8408-39f36bd191dd") + ) + (pad "16" thru_hole oval + (at -2.54 17.78 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 15 "/41") + (pinfunction "Pin_16") + (pintype "passive") + (uuid "fef4016b-04fc-4832-85d9-eb025cea16c2") + ) + (pad "17" thru_hole oval + (at 0 20.32 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 16 "/38") + (pinfunction "Pin_17") + (pintype "passive") + (uuid "85db348b-5670-431e-b560-eb0161c614c5") + ) + (pad "18" thru_hole oval + (at -2.54 20.32 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 17 "/39") + (pinfunction "Pin_18") + (pintype "passive") + (uuid "cb15e6f6-b75d-4d31-aa3e-6ead0a957c7e") + ) + (pad "19" thru_hole oval + (at 0 22.86 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 18 "/36") + (pinfunction "Pin_19") + (pintype "passive") + (uuid "3c7ec131-737c-4a2b-9f93-f30c547ee112") + ) + (pad "20" thru_hole oval + (at -2.54 22.86 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 19 "/37") + (pinfunction "Pin_20") + (pintype "passive") + (uuid "af437591-4446-4e26-bb46-43cd1b397dbe") + ) + (pad "21" thru_hole oval + (at 0 25.4 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 20 "/34") + (pinfunction "Pin_21") + (pintype "passive") + (uuid "b9e9aa01-acd5-4e35-ab7e-b672a65a175d") + ) + (pad "22" thru_hole oval + (at -2.54 25.4 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 21 "/35") + (pinfunction "Pin_22") + (pintype "passive") + (uuid "d489c0a9-c0ed-49db-a7e4-0a4c3734e0a0") + ) + (pad "23" thru_hole oval + (at 0 27.94 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 22 "/32") + (pinfunction "Pin_23") + (pintype "passive") + (uuid "f7f0814d-5b4a-496c-8a5f-68f9af42bc3a") + ) + (pad "24" thru_hole oval + (at -2.54 27.94 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 23 "/33") + (pinfunction "Pin_24") + (pintype "passive") + (uuid "607f96fe-2430-449a-a3b1-06d45f906a8e") + ) + (pad "25" thru_hole oval + (at 0 30.48 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 24 "/30") + (pinfunction "Pin_25") + (pintype "passive") + (uuid "1fb90fdf-f171-42f5-b1f1-be9621428bec") + ) + (pad "26" thru_hole oval + (at -2.54 30.48 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 25 "/31") + (pinfunction "Pin_26") + (pintype "passive") + (uuid "3d6dc8e7-141f-4978-bcde-ae09949893a1") + ) + (pad "27" thru_hole oval + (at 0 33.02 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 26 "/28") + (pinfunction "Pin_27") + (pintype "passive") + (uuid "4d89a519-5029-4fac-baa7-bf2215a570f2") + ) + (pad "28" thru_hole oval + (at -2.54 33.02 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 27 "/29") + (pinfunction "Pin_28") + (pintype "passive") + (uuid "5f2fc6e2-7897-412d-b950-cbf4a0421d60") + ) + (pad "29" thru_hole oval + (at 0 35.56 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 28 "/26") + (pinfunction "Pin_29") + (pintype "passive") + (uuid "fa45138c-3bba-43be-a5ad-31cac8946952") + ) + (pad "30" thru_hole oval + (at -2.54 35.56 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 29 "/27") + (pinfunction "Pin_30") + (pintype "passive") + (uuid "717450f4-afc0-4c97-99cb-28e5bb2e632a") + ) + (pad "31" thru_hole oval + (at 0 38.1 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 30 "/24") + (pinfunction "Pin_31") + (pintype "passive") + (uuid "efa52e82-c121-44de-b2a7-458e4f499c86") + ) + (pad "32" thru_hole oval + (at -2.54 38.1 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 31 "/25") + (pinfunction "Pin_32") + (pintype "passive") + (uuid "e89be26c-9fff-44d1-a23b-9d6d17dec981") + ) + (pad "33" thru_hole oval + (at 0 40.64 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 32 "/22") + (pinfunction "Pin_33") + (pintype "passive") + (uuid "f41a232b-c02d-4da0-8bc9-7f8195017208") + ) + (pad "34" thru_hole oval + (at -2.54 40.64 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 33 "/23") + (pinfunction "Pin_34") + (pintype "passive") + (uuid "8e96a0fa-861c-47d1-b4fd-54cdc1b49554") + ) + (pad "35" thru_hole oval + (at 0 43.18 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 34 "+5V") + (pinfunction "Pin_35") + (pintype "passive") + (uuid "987c05d5-3b70-46fa-b482-12167feae7ad") + ) + (pad "36" thru_hole oval + (at -2.54 43.18 180) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 34 "+5V") + (pinfunction "Pin_36") + (pintype "passive") + (uuid "f24e9fd5-e347-4cd8-9ded-6ee61e0cab45") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_2x18_P2.54mm_Vertical.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical" + (locked yes) + (layer "F.Cu") + (uuid "00000000-0000-0000-0000-0000551afcfc") + (at 127.94 97.46 90) + (descr "Through hole straight socket strip, 1x08, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x08 2.54mm single row") + (property "Reference" "J1" + (at 0 -2.77 90) + (layer "F.SilkS") + (hide yes) + (uuid "fc560a2c-b191-4e71-8a9f-c056ac73e19c") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "Power" + (at -3.81 8.89 180) + (layer "F.Fab") + (uuid "984e4e95-fab1-4274-9160-7ef94608f86a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "785bc86d-c430-465e-9ecf-3fd861e8e78d") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "eed61d5f-31b6-4dec-bc60-aab114d9c959") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_1x??_*") + (path "/00000000-0000-0000-0000-000056d71773") + (sheetname "/") + (sheetfile "Arduino_Mega.kicad_sch") + (attr through_hole) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "3cbbd7b6-94cf-4b56-b952-69f29dfabdeb") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e15a8fdd-435f-40a1-9a1d-17e32a024d9c") + ) + (fp_line + (start 1.33 1.27) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "ef16befc-6949-4284-97fd-bf2ce99e5428") + ) + (fp_line + (start -1.33 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "fff2cd72-8261-4cda-9b7e-9c542b53cb74") + ) + (fp_line + (start -1.33 1.27) + (end -1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "055e3d7f-8bd7-4b8d-871f-e5ec1fc084ce") + ) + (fp_line + (start -1.33 19.11) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "9e2f5625-defa-431a-9dc5-b8acbbcb4589") + ) + (fp_line + (start 1.75 -1.8) + (end 1.75 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "b47e5759-7c4c-44f7-8bdf-301d3f0d02fe") + ) + (fp_line + (start -1.8 -1.8) + (end 1.75 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3e4320e8-9e22-48d1-a222-411d5379c85c") + ) + (fp_line + (start 1.75 19.55) + (end -1.8 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "ac6dfce5-c4b1-4137-98d9-e63bd11edee5") + ) + (fp_line + (start -1.8 19.55) + (end -1.8 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "5bcf4021-acff-40d6-a30f-98c7f129dea7") + ) + (fp_line + (start 0.635 -1.27) + (end 1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "85b29be3-ffbb-4acc-8e3d-0e6536d83596") + ) + (fp_line + (start -1.27 -1.27) + (end 0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "8391a503-a913-4344-b2bb-b6b9eaec6144") + ) + (fp_line + (start 1.27 -0.635) + (end 1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "998fed53-fc5b-4b5d-8d6d-39cedbde5c96") + ) + (fp_line + (start 1.27 19.05) + (end -1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "d00b3799-7bed-4df0-a1f6-c57e6d986de8") + ) + (fp_line + (start -1.27 19.05) + (end -1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "bf726491-917b-4213-9d25-9089919087af") + ) + (fp_text user "${REFERENCE}" + (at -3.81 0 0) + (layer "F.Fab") + (uuid "be17e80b-b66d-4aed-8ddb-4bcc0f8db386") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 78 "unconnected-(J1-Pin_1-Pad1)") + (pinfunction "Pin_1") + (pintype "passive+no_connect") + (uuid "da382d1c-b611-4394-9e8e-bf3d960ae2e7") + ) + (pad "2" thru_hole oval + (at 0 2.54 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 35 "/IOREF") + (pinfunction "Pin_2") + (pintype "passive") + (uuid "422fe281-5bd1-43e5-8d4c-27c0c6c6b51f") + ) + (pad "3" thru_hole oval + (at 0 5.08 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 77 "/~{RESET}") + (pinfunction "Pin_3") + (pintype "passive") + (uuid "6c87a6e0-19ec-4603-b9c7-b52cb05d2bb5") + ) + (pad "4" thru_hole oval + (at 0 7.62 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 67 "+3V3") + (pinfunction "Pin_4") + (pintype "passive") + (uuid "81bfc365-819a-4d03-b2fa-f68436fffcdc") + ) + (pad "5" thru_hole oval + (at 0 10.16 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 34 "+5V") + (pinfunction "Pin_5") + (pintype "passive") + (uuid "6bc3d243-99b3-402e-a1fb-4a37cb7b78f6") + ) + (pad "6" thru_hole oval + (at 0 12.7 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 1 "GND") + (pinfunction "Pin_6") + (pintype "passive") + (uuid "3de012a7-4bd2-4521-936c-b40f0900ee92") + ) + (pad "7" thru_hole oval + (at 0 15.24 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 1 "GND") + (pinfunction "Pin_7") + (pintype "passive") + (uuid "24ae196f-ba9f-42b7-9d8e-0e6ec4681149") + ) + (pad "8" thru_hole oval + (at 0 17.78 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 76 "VCC") + (pinfunction "Pin_8") + (pintype "passive") + (uuid "672e7e8a-459d-40ad-a53a-ea4d7d4fa41a") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x08_P2.54mm_Vertical.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical" + (locked yes) + (layer "F.Cu") + (uuid "00000000-0000-0000-0000-0000551afd13") + (at 150.8 97.46 90) + (descr "Through hole straight socket strip, 1x08, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x08 2.54mm single row") + (property "Reference" "J3" + (at 0 -2.77 90) + (layer "F.SilkS") + (hide yes) + (uuid "1710aff0-5098-4ba2-9473-9f75c0d4bfeb") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "Analog" + (at -3.81 8.89 180) + (layer "F.Fab") + (uuid "932bd656-0eb3-47e1-a94f-901411e72470") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "7a7a05ad-a47b-4b13-8285-e7d9e4c1c6b6") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "5da2371e-a6e0-4fe4-b238-df15df1a9241") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_1x??_*") + (path "/00000000-0000-0000-0000-000056d72f1c") + (sheetname "/") + (sheetfile "Arduino_Mega.kicad_sch") + (attr through_hole) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "369a09b1-08d8-4b5e-964e-08473054f93c") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "a9835397-da49-4f67-a341-9c74e534d1ed") + ) + (fp_line + (start 1.33 1.27) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "70a13ee1-6157-47c2-885b-7ee734719e61") + ) + (fp_line + (start -1.33 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "79fcc534-2879-463c-9aef-5d224677139e") + ) + (fp_line + (start -1.33 1.27) + (end -1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "9174aeb4-5388-48dc-92de-a535a4b4be23") + ) + (fp_line + (start -1.33 19.11) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "c57f42a5-e959-4e1f-bc6c-176dd5cf8aba") + ) + (fp_line + (start 1.75 -1.8) + (end 1.75 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "4a63ca20-9a81-4805-a2ae-d310823d20b3") + ) + (fp_line + (start -1.8 -1.8) + (end 1.75 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "823f938c-d195-4551-a518-a7369d56ef0b") + ) + (fp_line + (start 1.75 19.55) + (end -1.8 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "6f7d02bd-a3d0-43ba-aca0-16dff0c99594") + ) + (fp_line + (start -1.8 19.55) + (end -1.8 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "512c8414-b684-4de7-ac74-70684c7ad89b") + ) + (fp_line + (start 0.635 -1.27) + (end 1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "b348a24b-88c1-4a5d-ab42-c49ed0b91b75") + ) + (fp_line + (start -1.27 -1.27) + (end 0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "e89b6a23-f079-4ca3-9aa0-2a4d49404842") + ) + (fp_line + (start 1.27 -0.635) + (end 1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "41211233-266f-4063-ae7b-870101362d2a") + ) + (fp_line + (start 1.27 19.05) + (end -1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "7bc7f102-047d-4871-af1b-29f048c253f9") + ) + (fp_line + (start -1.27 19.05) + (end -1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "42ce4075-b197-4156-8021-68eb1cd457c9") + ) + (fp_text user "${REFERENCE}" + (at -3.81 0 0) + (layer "F.Fab") + (uuid "5250ebef-192f-4f9b-9d02-2b3d0ead9361") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 36 "/A0") + (pinfunction "Pin_1") + (pintype "passive") + (uuid "ab5edb62-6b7a-4380-aa3d-a85c95ee5a51") + ) + (pad "2" thru_hole oval + (at 0 2.54 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 37 "/A1") + (pinfunction "Pin_2") + (pintype "passive") + (uuid "15d35e36-f3d7-4e32-a38b-48c5421d1644") + ) + (pad "3" thru_hole oval + (at 0 5.08 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 38 "/A2") + (pinfunction "Pin_3") + (pintype "passive") + (uuid "08b5716e-e0c3-416c-83b9-e286208e4eea") + ) + (pad "4" thru_hole oval + (at 0 7.62 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 39 "/A3") + (pinfunction "Pin_4") + (pintype "passive") + (uuid "3f9f0a35-06f3-49ab-ad6b-dc3fb4816f06") + ) + (pad "5" thru_hole oval + (at 0 10.16 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 40 "/A4") + (pinfunction "Pin_5") + (pintype "passive") + (uuid "891740df-98c4-449e-b9ce-6207a70d928d") + ) + (pad "6" thru_hole oval + (at 0 12.7 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 41 "/A5") + (pinfunction "Pin_6") + (pintype "passive") + (uuid "461f5969-0e16-4b2a-825c-814dd9fae6a4") + ) + (pad "7" thru_hole oval + (at 0 15.24 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 42 "/A6") + (pinfunction "Pin_7") + (pintype "passive") + (uuid "575df2f8-94c5-4340-b5c7-5631a4362f81") + ) + (pad "8" thru_hole oval + (at 0 17.78 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 43 "/A7") + (pinfunction "Pin_8") + (pintype "passive") + (uuid "fd424d16-e60a-4ed6-af5d-36f4f7c9552a") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x08_P2.54mm_Vertical.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical" + (locked yes) + (layer "F.Cu") + (uuid "00000000-0000-0000-0000-0000551afd2a") + (at 173.66 97.46 90) + (descr "Through hole straight socket strip, 1x08, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x08 2.54mm single row") + (property "Reference" "J5" + (at 0 -2.77 90) + (layer "F.SilkS") + (hide yes) + (uuid "b9a8306e-a683-49c8-a511-80be1e5f71ea") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "Analog" + (at -3.81 8.89 180) + (layer "F.Fab") + (uuid "f2cc400e-1825-4060-8b40-26ee3cc3e1db") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "b97d9bec-669b-45a3-8695-10a017c753ac") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "27a598e3-c220-47a9-9082-fc5f46a979d0") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_1x??_*") + (path "/00000000-0000-0000-0000-000056d73a0e") + (sheetname "/") + (sheetfile "Arduino_Mega.kicad_sch") + (attr through_hole) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "6187f2ab-1de9-451b-a5bd-6de4ea378918") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e400876a-5e97-4e9e-983e-7d871bc95b8d") + ) + (fp_line + (start 1.33 1.27) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "a457ad01-ee27-4237-a863-38ea3a08eaf1") + ) + (fp_line + (start -1.33 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "df213809-67d2-4b99-a973-18f0c81e0a96") + ) + (fp_line + (start -1.33 1.27) + (end -1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "64d6a73a-a574-4d3f-9310-cc40f211a500") + ) + (fp_line + (start -1.33 19.11) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "279edc03-ba6d-4984-bba5-83880ba9827b") + ) + (fp_line + (start 1.75 -1.8) + (end 1.75 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "d1ae92ce-4985-4719-855e-fccf716e7c44") + ) + (fp_line + (start -1.8 -1.8) + (end 1.75 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "85d31441-6926-4289-ad0f-78dc524fa01f") + ) + (fp_line + (start 1.75 19.55) + (end -1.8 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "430904c0-a9e1-4f04-b03b-13deafbefed1") + ) + (fp_line + (start -1.8 19.55) + (end -1.8 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "99cbccee-d024-4645-be0e-1592881deaf6") + ) + (fp_line + (start 0.635 -1.27) + (end 1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "071020c4-7adb-4137-850e-41e0bf09f50d") + ) + (fp_line + (start -1.27 -1.27) + (end 0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "07d1e20e-9395-4ceb-9c9d-52ea2c1b4b00") + ) + (fp_line + (start 1.27 -0.635) + (end 1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "2647c734-5932-41b2-8746-14e2b6527e60") + ) + (fp_line + (start 1.27 19.05) + (end -1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "ed5656ac-3472-413d-b6c2-abe37b49c81a") + ) + (fp_line + (start -1.27 19.05) + (end -1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a3858547-7903-409b-bcc5-41dde0a901ef") + ) + (fp_text user "${REFERENCE}" + (at -3.81 0 0) + (layer "F.Fab") + (uuid "c8dbaaec-c69d-4126-bfa2-6e0bfa36d807") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 44 "/A8") + (pinfunction "Pin_1") + (pintype "passive") + (uuid "b8145c09-3e2b-4976-bd3d-b3c9dca55ee4") + ) + (pad "2" thru_hole oval + (at 0 2.54 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 45 "/A9") + (pinfunction "Pin_2") + (pintype "passive") + (uuid "de95750f-ea47-40da-90c9-a068bf29d4b2") + ) + (pad "3" thru_hole oval + (at 0 5.08 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 46 "/A10") + (pinfunction "Pin_3") + (pintype "passive") + (uuid "fe8b534b-4f50-4ac2-9130-a0d63cce2082") + ) + (pad "4" thru_hole oval + (at 0 7.62 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 47 "/A11") + (pinfunction "Pin_4") + (pintype "passive") + (uuid "483abeb0-52fc-4244-8404-b68123c185dc") + ) + (pad "5" thru_hole oval + (at 0 10.16 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 48 "/A12") + (pinfunction "Pin_5") + (pintype "passive") + (uuid "857e1608-447f-44a6-83a1-2cd2e8aca83a") + ) + (pad "6" thru_hole oval + (at 0 12.7 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 49 "/A13") + (pinfunction "Pin_6") + (pintype "passive") + (uuid "148327cb-4c41-42d8-b8b2-b74438f8ecfa") + ) + (pad "7" thru_hole oval + (at 0 15.24 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 50 "/A14") + (pinfunction "Pin_7") + (pintype "passive") + (uuid "1ef6ac8b-6ab0-474b-bb7c-35f93fee5078") + ) + (pad "8" thru_hole oval + (at 0 17.78 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 51 "/A15") + (pinfunction "Pin_8") + (pintype "passive") + (uuid "b10db2e9-eac4-46f5-a4fd-f2c9981e2669") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x08_P2.54mm_Vertical.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x10_P2.54mm_Vertical" + (locked yes) + (layer "F.Cu") + (uuid "00000000-0000-0000-0000-0000551afd43") + (at 118.796 49.2 90) + (descr "Through hole straight socket strip, 1x10, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x10 2.54mm single row") + (property "Reference" "J2" + (at 0 -2.77 90) + (layer "F.SilkS") + (hide yes) + (uuid "6310dc4e-6c49-4108-9e7f-ddf2c9da6511") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "PWM" + (at 3.81 11.43 180) + (layer "F.Fab") + (uuid "4a38b408-9d40-4440-b87a-828d59d3a2ef") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "1b8937df-39c4-441e-9c22-7f50c59c2871") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x10, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "c246a52f-e276-4a79-8264-0a327ce4b0af") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_1x??_*") + (path "/00000000-0000-0000-0000-000056d72368") + (sheetname "/") + (sheetfile "Arduino_Mega.kicad_sch") + (attr through_hole) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "cd4eaf54-2fa2-4255-a660-afd8058064b7") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "f6e2ae89-5aea-4669-8f30-a6e0e9c558f9") + ) + (fp_line + (start 1.33 1.27) + (end 1.33 24.19) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "bb8b7523-1d43-4ba6-96ae-ae5001548d27") + ) + (fp_line + (start -1.33 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2352cc50-e166-4add-8016-cc68f21edb42") + ) + (fp_line + (start -1.33 1.27) + (end -1.33 24.19) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "5bec4acd-b1dd-4a61-84ca-7d882610dafb") + ) + (fp_line + (start -1.33 24.19) + (end 1.33 24.19) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "ff124589-af27-4a93-9ec2-caf8dfc8be41") + ) + (fp_line + (start 1.75 -1.8) + (end 1.75 24.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "0a257dca-7f4c-4873-a094-4c535fa0f798") + ) + (fp_line + (start -1.8 -1.8) + (end 1.75 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "5fdfe957-695d-4e50-b931-71fb115eefcf") + ) + (fp_line + (start 1.75 24.6) + (end -1.8 24.6) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "a7673273-55cb-4d74-acc8-ac34e5502e4d") + ) + (fp_line + (start -1.8 24.6) + (end -1.8 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "472813db-bb77-4fae-9979-dd71ee720385") + ) + (fp_line + (start 0.635 -1.27) + (end 1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "c7978409-33ba-4d29-8c21-6513654dd02a") + ) + (fp_line + (start -1.27 -1.27) + (end 0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "4ce4a5dc-d7ae-4034-899b-ddd11fe311ba") + ) + (fp_line + (start 1.27 -0.635) + (end 1.27 24.13) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "9ad0d879-aca2-4e92-b6ca-73426cfaf862") + ) + (fp_line + (start 1.27 24.13) + (end -1.27 24.13) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "c30039a3-6d4e-4abc-ae9b-d5efe9e88235") + ) + (fp_line + (start -1.27 24.13) + (end -1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "55186617-72ad-4087-ac20-430463172f9d") + ) + (fp_text user "${REFERENCE}" + (at 3.81 0 0) + (layer "F.Fab") + (uuid "2dec9e06-6543-42b0-ae87-9e071f614461") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 75 "/SCL{slash}21") + (pinfunction "Pin_1") + (pintype "passive") + (uuid "b0dc7dda-00e9-4e1a-adfc-3951cbc4c107") + ) + (pad "2" thru_hole oval + (at 0 2.54 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 74 "/SDA{slash}20") + (pinfunction "Pin_2") + (pintype "passive") + (uuid "8ebd19d1-ad20-4c31-98d6-6a594fc18fcf") + ) + (pad "3" thru_hole oval + (at 0 5.08 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 52 "/AREF") + (pinfunction "Pin_3") + (pintype "passive") + (uuid "2bff0b07-d8bf-4b7f-96ed-e483736e1bf3") + ) + (pad "4" thru_hole oval + (at 0 7.62 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 1 "GND") + (pinfunction "Pin_4") + (pintype "passive") + (uuid "db229185-0b89-4d86-b740-3fcaf81450db") + ) + (pad "5" thru_hole oval + (at 0 10.16 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 53 "/*13") + (pinfunction "Pin_5") + (pintype "passive") + (uuid "4139157b-cbca-42e8-91e5-37d3f3adecc1") + ) + (pad "6" thru_hole oval + (at 0 12.7 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 54 "/*12") + (pinfunction "Pin_6") + (pintype "passive") + (uuid "a9d0d26c-ab48-4939-8dc7-08f1b4833300") + ) + (pad "7" thru_hole oval + (at 0 15.24 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 55 "/*11") + (pinfunction "Pin_7") + (pintype "passive") + (uuid "f72d8e93-35fe-4790-bc79-4cd2c995bd46") + ) + (pad "8" thru_hole oval + (at 0 17.78 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 56 "/*10") + (pinfunction "Pin_8") + (pintype "passive") + (uuid "ef94d7f2-874a-4351-9eae-15372ee03b79") + ) + (pad "9" thru_hole oval + (at 0 20.32 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 57 "/*9") + (pinfunction "Pin_9") + (pintype "passive") + (uuid "f0e0af03-0286-42b6-a107-457ab066840e") + ) + (pad "10" thru_hole oval + (at 0 22.86 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 58 "/*8") + (pinfunction "Pin_10") + (pintype "passive") + (uuid "d402663c-484e-4e83-99f8-2eee3846baee") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x10_P2.54mm_Vertical.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical" + (locked yes) + (layer "F.Cu") + (uuid "00000000-0000-0000-0000-0000551afd5a") + (at 145.72 49.2 90) + (descr "Through hole straight socket strip, 1x08, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x08 2.54mm single row") + (property "Reference" "J4" + (at 0 -2.77 90) + (layer "F.SilkS") + (hide yes) + (uuid "56b2a3aa-4f13-4018-a3e7-251a3736aded") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "PWM" + (at 3.81 8.89 180) + (layer "F.Fab") + (uuid "81a00a35-248f-4f57-b8f3-2058e907b27a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "855e62bc-9369-4347-b6b2-981b6d48d82b") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "37fca806-f56f-4302-8590-780b200335c7") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_1x??_*") + (path "/00000000-0000-0000-0000-000056d734d0") + (sheetname "/") + (sheetfile "Arduino_Mega.kicad_sch") + (attr through_hole) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "bc23a6b0-dd17-4580-b116-964e8cf21014") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "94c042e5-6825-4142-b803-cabe4d6120b5") + ) + (fp_line + (start 1.33 1.27) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "cb8a2dce-393c-458c-8f23-1d75de7ec05f") + ) + (fp_line + (start -1.33 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e2226efd-e4e9-4fef-9177-8715e06f2708") + ) + (fp_line + (start -1.33 1.27) + (end -1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "31a12d18-98c3-4852-bbd2-b24648b758d2") + ) + (fp_line + (start -1.33 19.11) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "b62581da-c148-4fcb-8b05-9a5736656ecd") + ) + (fp_line + (start 1.75 -1.8) + (end 1.75 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1e14a32e-d3ce-4778-bfb7-7f1e20ad8215") + ) + (fp_line + (start -1.8 -1.8) + (end 1.75 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "4ffeeff5-1e44-4c37-ac5a-4162a9aa6fb1") + ) + (fp_line + (start 1.75 19.55) + (end -1.8 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "4fe27148-c66f-4bd0-89af-713519a9823f") + ) + (fp_line + (start -1.8 19.55) + (end -1.8 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "91b26eab-016b-4b5b-ba1e-631cc3048010") + ) + (fp_line + (start 0.635 -1.27) + (end 1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "bcebf084-e58b-4e45-9aab-72c11e0f2f44") + ) + (fp_line + (start -1.27 -1.27) + (end 0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "0a91578b-37f3-4103-9202-1a18f480fa0b") + ) + (fp_line + (start 1.27 -0.635) + (end 1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "99d35358-125e-4645-8a54-8a230c1e7ebf") + ) + (fp_line + (start 1.27 19.05) + (end -1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "e896ab09-4a57-4c93-aa5c-938ba788687c") + ) + (fp_line + (start -1.27 19.05) + (end -1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "79e12e2a-1327-426c-82df-3ea349be98cc") + ) + (fp_text user "${REFERENCE}" + (at 3.81 0 0) + (layer "F.Fab") + (uuid "8a2c0ffe-af77-43c7-a9b7-4e8e59417dce") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 59 "/*7") + (pinfunction "Pin_1") + (pintype "passive") + (uuid "c70ebcf0-6156-49f7-a372-2fbd3b89442a") + ) + (pad "2" thru_hole oval + (at 0 2.54 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 60 "/*6") + (pinfunction "Pin_2") + (pintype "passive") + (uuid "5d36c6f9-1af3-4275-9ae7-9ef2e0635195") + ) + (pad "3" thru_hole oval + (at 0 5.08 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 61 "/*5") + (pinfunction "Pin_3") + (pintype "passive") + (uuid "8c7aab7f-1656-4344-ace8-660dfb889ae6") + ) + (pad "4" thru_hole oval + (at 0 7.62 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 62 "/*4") + (pinfunction "Pin_4") + (pintype "passive") + (uuid "9504b60b-f821-4553-8501-a4171921cbb9") + ) + (pad "5" thru_hole oval + (at 0 10.16 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 63 "/*3") + (pinfunction "Pin_5") + (pintype "passive") + (uuid "87ca5944-fe2d-496f-bc8b-7cb2f966e86c") + ) + (pad "6" thru_hole oval + (at 0 12.7 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 64 "/*2") + (pinfunction "Pin_6") + (pintype "passive") + (uuid "69c2501e-f81c-486c-8600-a9bd6f000014") + ) + (pad "7" thru_hole oval + (at 0 15.24 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 65 "/TX0{slash}1") + (pinfunction "Pin_7") + (pintype "passive") + (uuid "d68aea2a-6134-4022-a6d1-b3af156e5b86") + ) + (pad "8" thru_hole oval + (at 0 17.78 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 66 "/RX0{slash}0") + (pinfunction "Pin_8") + (pintype "passive") + (uuid "6af09e22-fe8c-42c2-809d-1976b2465e61") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x08_P2.54mm_Vertical.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical" + (locked yes) + (layer "F.Cu") + (uuid "00000000-0000-0000-0000-0000551afd71") + (at 168.58 49.2 90) + (descr "Through hole straight socket strip, 1x08, 2.54mm pitch, single row (from Kicad 4.0.7), script generated") + (tags "Through hole socket strip THT 1x08 2.54mm single row") + (property "Reference" "J6" + (at 0 -2.77 90) + (layer "F.SilkS") + (hide yes) + (uuid "51216344-1ddc-4679-98b1-a409a6c08270") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "Communication" + (at 3.81 8.89 180) + (layer "F.Fab") + (uuid "bd1b5a70-885c-4091-9f07-f510f4c5c724") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "b1ef8ae0-86d1-4ab2-a684-41194f4a1132") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "Generic connector, single row, 01x08, script generated (kicad-library-utils/schlib/autogen/connector/)" + (at 0 0 90) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "c0915efe-2218-4b88-a9df-67e2a9010137") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property ki_fp_filters "Connector*:*_1x??_*") + (path "/00000000-0000-0000-0000-000056d73f2c") + (sheetname "/") + (sheetfile "Arduino_Mega.kicad_sch") + (attr through_hole) + (fp_line + (start 1.33 -1.33) + (end 1.33 0) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "61eac035-3807-4299-b192-c9603fd616e3") + ) + (fp_line + (start 0 -1.33) + (end 1.33 -1.33) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "90c37ea6-c4a0-4be1-af6c-3139653b8f73") + ) + (fp_line + (start 1.33 1.27) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2ba7f3d6-3a95-46e8-bc32-28ef31638a34") + ) + (fp_line + (start -1.33 1.27) + (end 1.33 1.27) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "748c5a19-acbb-433a-988c-74edc4ea201d") + ) + (fp_line + (start -1.33 1.27) + (end -1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "da7068a4-1c09-4856-ae54-30e7373731de") + ) + (fp_line + (start -1.33 19.11) + (end 1.33 19.11) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "46a2bd12-38f6-47c9-a26c-5242aabf05a3") + ) + (fp_line + (start 1.75 -1.8) + (end 1.75 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "c59f385b-f591-4984-ac40-e20bc50911fc") + ) + (fp_line + (start -1.8 -1.8) + (end 1.75 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "ce15c29d-3a21-4ab1-b5ad-4a7b3768b204") + ) + (fp_line + (start 1.75 19.55) + (end -1.8 19.55) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "5c8712ed-f3c7-4bb1-b7c2-d957a7c9bc50") + ) + (fp_line + (start -1.8 19.55) + (end -1.8 -1.8) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "2d1d7597-aee3-4da8-a094-098753ce7d9e") + ) + (fp_line + (start 0.635 -1.27) + (end 1.27 -0.635) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "1c8f0e0a-475b-4e74-803e-1fc0580dd0ca") + ) + (fp_line + (start -1.27 -1.27) + (end 0.635 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "99605bdd-0c24-4931-adaa-891bbabbce5b") + ) + (fp_line + (start 1.27 -0.635) + (end 1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "ccfad85e-d146-40b6-908a-59eda2b73b28") + ) + (fp_line + (start 1.27 19.05) + (end -1.27 19.05) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "66bf3057-313a-4b30-a1a0-be9e4ea86953") + ) + (fp_line + (start -1.27 19.05) + (end -1.27 -1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "9146cccd-f896-4069-9c37-76c05e7cfbe9") + ) + (fp_text user "${REFERENCE}" + (at 3.81 0 0) + (layer "F.Fab") + (uuid "7971a57d-40ae-455a-aee4-4fd9a27480b6") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 68 "/TX3{slash}14") + (pinfunction "Pin_1") + (pintype "passive") + (uuid "51885a9c-d978-4c2d-ac57-2a48b0485fcb") + ) + (pad "2" thru_hole oval + (at 0 2.54 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 69 "/RX3{slash}15") + (pinfunction "Pin_2") + (pintype "passive") + (uuid "2785e4e8-d2df-4ce7-9d79-bafa2297d979") + ) + (pad "3" thru_hole oval + (at 0 5.08 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 70 "/TX2{slash}16") + (pinfunction "Pin_3") + (pintype "passive") + (uuid "ae310853-f22a-43aa-a944-3a350cb2f5b1") + ) + (pad "4" thru_hole oval + (at 0 7.62 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 71 "/RX2{slash}17") + (pinfunction "Pin_4") + (pintype "passive") + (uuid "55b70b5a-f2ea-4972-ad57-305794d2e592") + ) + (pad "5" thru_hole oval + (at 0 10.16 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 72 "/TX1{slash}18") + (pinfunction "Pin_5") + (pintype "passive") + (uuid "c6f12604-4171-4680-8e46-9ba3c2d31e20") + ) + (pad "6" thru_hole oval + (at 0 12.7 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 73 "/RX1{slash}19") + (pinfunction "Pin_6") + (pintype "passive") + (uuid "ee8c3716-e1ff-4e9e-836d-2a990f26df82") + ) + (pad "7" thru_hole oval + (at 0 15.24 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 74 "/SDA{slash}20") + (pinfunction "Pin_7") + (pintype "passive") + (uuid "01304f6d-0987-4405-bf5e-dff5d75414b2") + ) + (pad "8" thru_hole oval + (at 0 17.78 90) + (size 1.7 1.7) + (drill 1) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (remove_unused_layers no) + (net 75 "/SCL{slash}21") + (pinfunction "Pin_8") + (pintype "passive") + (uuid "a17830c4-1a80-49f4-bdc7-f1d8b2fd8bf0") + ) + (embedded_fonts no) + (model "${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x08_P2.54mm_Vertical.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Arduino_MountingHole:MountingHole_3.2mm" + (locked yes) + (layer "F.Cu") + (uuid "24dc01a2-0623-45f0-8a0c-38b379a55f5f") + (at 196.52 97.46) + (descr "Mounting Hole 3.2mm, no annular, M3") + (tags "mounting hole 3.2mm no annular m3") + (property "Reference" "MH6" + (at 0 -4.2 0) + (layer "F.SilkS") + (hide yes) + (uuid "2e9c51f2-4c9f-4daa-8b12-f17adf07fcd2") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "MountingHole_3.2mm" + (at 0 4.2 0) + (layer "F.Fab") + (hide yes) + (uuid "56340e02-99f6-419d-b320-d38289dc9571") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "12605ee2-ae78-425e-b8ea-8dd3947f58b1") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "0cec63ae-bd5e-4075-9e78-fc207c7d7744") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr board_only exclude_from_pos_files exclude_from_bom) + (fp_circle + (center 0 0) + (end 1.7 0) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "db5945a5-cd14-41da-8353-427bd76e640a") + ) + (fp_text user "${REFERENCE}" + (at 0.3 0 0) + (layer "F.Fab") + (hide yes) + (uuid "69819339-c0de-46a9-8bcd-75bb3718f477") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (uuid "b1d370b5-bc45-498c-9dd6-92b603d1691f") + ) + (embedded_fonts no) + ) + (footprint "Arduino_MountingHole:MountingHole_3.2mm" + (locked yes) + (layer "F.Cu") + (uuid "6e571799-0217-4b63-970e-fdbb6a7139e3") + (at 115.24 49.2) + (descr "Mounting Hole 3.2mm, no annular, M3") + (tags "mounting hole 3.2mm no annular m3") + (property "Reference" "MH1" + (at 0 -4.2 0) + (layer "F.SilkS") + (hide yes) + (uuid "1360f67a-ea54-4c27-a9c1-ff3ff07db6f2") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "MountingHole_3.2mm" + (at 0 4.2 0) + (layer "F.Fab") + (hide yes) + (uuid "a0ae54a3-3e69-4fe5-a9c8-404c4f9f609f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "c16acbeb-1dfd-44af-945c-0a7a0867cce8") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "eea9dd40-dcfc-4025-809b-2c5377c21dbb") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr board_only exclude_from_pos_files exclude_from_bom) + (fp_circle + (center 0 0) + (end 1.7 0) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "7a4fc985-d6de-4aee-935e-8d5cff34a4ff") + ) + (fp_text user "${REFERENCE}" + (at 0.3 0 0) + (layer "F.Fab") + (hide yes) + (uuid "4ac1f104-e2bf-44d7-b1a7-55f77636cecd") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (uuid "9c975850-0f66-4559-91ae-5e92d997f0e2") + ) + (embedded_fonts no) + ) + (footprint "Arduino_MountingHole:MountingHole_3.2mm" + (locked yes) + (layer "F.Cu") + (uuid "e37b79bf-98e8-4522-b749-f0e7c6a98bbc") + (at 113.97 97.46) + (descr "Mounting Hole 3.2mm, no annular, M3") + (tags "mounting hole 3.2mm no annular m3") + (property "Reference" "MH2" + (at 0 -4.2 0) + (layer "F.SilkS") + (hide yes) + (uuid "38c0566d-3ec4-4d94-8d90-1e1498eb52e4") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "MountingHole_3.2mm" + (at 0 4.2 0) + (layer "F.Fab") + (hide yes) + (uuid "e747e577-fbb6-4c51-ac59-c3bcb021aa37") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "225ec2c6-c576-42f9-812c-725b4843858a") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "31019312-5097-4706-b078-ba67141c1988") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr board_only exclude_from_pos_files exclude_from_bom) + (fp_circle + (center 0 0) + (end 1.7 0) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "49bb7137-bbb7-4995-a914-57456ebe4b70") + ) + (fp_text user "${REFERENCE}" + (at 0.3 0 0) + (layer "F.Fab") + (hide yes) + (uuid "a529725c-38b8-4416-8f99-f6a411793c10") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (uuid "351b5482-cbfd-4298-8fdb-bc8047a5c90b") + ) + (embedded_fonts no) + ) + (footprint "Arduino_MountingHole:MountingHole_3.2mm" + (locked yes) + (layer "F.Cu") + (uuid "e9ebf119-598a-41fd-98be-2dbed0b47309") + (at 166.04 64.44) + (descr "Mounting Hole 3.2mm, no annular, M3") + (tags "mounting hole 3.2mm no annular m3") + (property "Reference" "MH3" + (at 0 -4.2 0) + (layer "F.SilkS") + (hide yes) + (uuid "8c997364-489f-4014-95b2-c869d1ca5379") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "MountingHole_3.2mm" + (at 0 4.2 0) + (layer "F.Fab") + (hide yes) + (uuid "2fb12e89-47eb-4e6b-bdbf-37755495a231") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "34484e35-9c97-40f1-aeb7-d20ed621f5b6") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "facb5361-b8b2-40a6-84ff-d4ac597e9e14") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr board_only exclude_from_pos_files exclude_from_bom) + (fp_circle + (center 0 0) + (end 1.7 0) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "54d4b5a7-5a63-4e27-92b6-acee2802b0b8") + ) + (fp_text user "${REFERENCE}" + (at 0.3 0 0) + (layer "F.Fab") + (hide yes) + (uuid "d3732653-c282-478b-8492-04ef9a2ac467") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (uuid "0b6900e1-8303-4637-8565-4866c5913e4d") + ) + (embedded_fonts no) + ) + (footprint "Arduino_MountingHole:MountingHole_3.2mm" + (locked yes) + (layer "F.Cu") + (uuid "ee2daf16-2f42-4829-9824-10ca9836b9cd") + (at 166.04 92.38) + (descr "Mounting Hole 3.2mm, no annular, M3") + (tags "mounting hole 3.2mm no annular m3") + (property "Reference" "MH4" + (at 0 -4.2 0) + (layer "F.SilkS") + (hide yes) + (uuid "625856b8-7480-4a61-afbc-c7af8e5ff91c") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "MountingHole_3.2mm" + (at 0 4.2 0) + (layer "F.Fab") + (hide yes) + (uuid "9589e502-f89f-4c99-9ab3-a5f3511d2e14") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "54d693fa-b9ed-428d-a315-acc0e6d70bd0") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "c8a7119b-fe5e-4446-83eb-829869352dbf") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr board_only exclude_from_pos_files exclude_from_bom) + (fp_circle + (center 0 0) + (end 1.7 0) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "ceac8cad-a8e4-413e-9e6f-f38b41293e33") + ) + (fp_text user "${REFERENCE}" + (at 0.3 0 0) + (layer "F.Fab") + (hide yes) + (uuid "76e11c3a-d80c-4e7c-8f37-ac4b0a816eb3") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (uuid "e11ef65e-9a6c-437e-9fc6-bf0303cfe84a") + ) + (embedded_fonts no) + ) + (footprint "Arduino_MountingHole:MountingHole_3.2mm" + (locked yes) + (layer "F.Cu") + (uuid "f9b2a7ff-484c-463d-8b77-bd1c6dfdf012") + (at 190.17 49.2) + (descr "Mounting Hole 3.2mm, no annular, M3") + (tags "mounting hole 3.2mm no annular m3") + (property "Reference" "MH5" + (at 0 -4.2 0) + (layer "F.SilkS") + (hide yes) + (uuid "32fa3d1f-3d47-4575-b7f8-edd7fee8a397") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "MountingHole_3.2mm" + (at 0 4.2 0) + (layer "F.Fab") + (hide yes) + (uuid "dbea09d4-a273-4fd8-bfba-6ca46b653c3a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "f4569436-2edb-44d8-8eff-c501bf0fdaee") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "182ee220-3029-4a5d-ad7f-6f360b671272") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (attr board_only exclude_from_pos_files exclude_from_bom) + (fp_circle + (center 0 0) + (end 1.7 0) + (stroke + (width 0.05) + (type solid) + ) + (fill no) + (layer "F.CrtYd") + (uuid "89e72253-f1c5-46ea-94d2-49d16f07e404") + ) + (fp_text user "${REFERENCE}" + (at 0.3 0 0) + (layer "F.Fab") + (hide yes) + (uuid "490ee63a-f895-43d4-9659-9c4f471a6f66") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 0 0) + (size 3.2 3.2) + (drill 3.2) + (layers "*.Cu" "*.Mask" "In1.Cu" "In2.Cu" "In3.Cu" "In4.Cu" "In5.Cu" "In6.Cu" + "In7.Cu" "In8.Cu" "In9.Cu" "In10.Cu" "In11.Cu" "In12.Cu" "In13.Cu" "In14.Cu" + "In15.Cu" "In16.Cu" "In17.Cu" "In18.Cu" "In19.Cu" "In20.Cu" "In21.Cu" + "In22.Cu" "In23.Cu" "In24.Cu" "In25.Cu" "In26.Cu" "In27.Cu" "In28.Cu" + "In29.Cu" "In30.Cu" + ) + (uuid "869c4dc4-6712-4cdd-9a52-254806f97370") + ) + (embedded_fonts no) + ) + (gr_line + (start 98.095 96.825) + (end 98.095 87.935) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "53e4740d-8877-45f6-ab44-50ec12588509") + ) + (gr_line + (start 111.43 96.825) + (end 98.095 96.825) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "556cf23c-299b-4f67-9a25-a41fb8b5982d") + ) + (gr_rect + (start 162.357 68.25) + (end 167.437 75.87) + (stroke + (width 0.15) + (type solid) + ) + (fill no) + (locked yes) + (layer "Dwgs.User") + (uuid "58ce2ea3-aa66-45fe-b5e1-d11ebd935d6a") + ) + (gr_line + (start 98.095 87.935) + (end 111.43 87.935) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "77f9193c-b405-498d-930b-ec247e51bb7e") + ) + (gr_line + (start 93.65 67.615) + (end 93.65 56.185) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "886b3496-76f8-498c-900d-2acfeb3f3b58") + ) + (gr_line + (start 111.43 87.935) + (end 111.43 96.825) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "92b33026-7cad-45d2-b531-7f20adda205b") + ) + (gr_line + (start 109.525 56.185) + (end 109.525 67.615) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "bf6edab4-3acb-4a87-b344-4fa26a7ce1ab") + ) + (gr_line + (start 93.65 56.185) + (end 109.525 56.185) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "da3f2702-9f42-46a9-b5f9-abfc74e86759") + ) + (gr_line + (start 109.525 67.615) + (end 93.65 67.615) + (stroke + (width 0.15) + (type solid) + ) + (layer "Dwgs.User") + (uuid "fde342e7-23e6-43a1-9afe-f71547964d5d") + ) + (gr_line + (start 199.06 59.36) + (end 201.6 61.9) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "14983443-9435-48e9-8e51-6faf3f00bdfc") + ) + (gr_line + (start 100 99.238) + (end 100 47.422) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "16738e8d-f64a-4520-b480-307e17fc6e64") + ) + (gr_line + (start 201.6 61.9) + (end 201.6 96.19) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "58c6d72f-4bb9-4dd3-8643-c635155dbbd9") + ) + (gr_line + (start 198.298 100) + (end 100.762 100) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "63988798-ab74-4066-afcb-7d5e2915caca") + ) + (gr_line + (start 100.762 46.66) + (end 196.52 46.66) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "6fef40a2-9c09-4d46-b120-a8241120c43b") + ) + (gr_arc + (start 100.762 100) + (mid 100.223185 99.776815) + (end 100 99.238) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "814cca0a-9069-4535-992b-1bc51a8012a6") + ) + (gr_line + (start 201.6 96.19) + (end 199.06 98.73) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "93ebe48c-2f88-4531-a8a5-5f344455d694") + ) + (gr_line + (start 196.52 46.66) + (end 199.06 49.2) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "a1531b39-8dae-4637-9a8d-49791182f594") + ) + (gr_arc + (start 199.06 99.238) + (mid 198.836815 99.776815) + (end 198.298 100) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "b69d9560-b866-4a54-9fbe-fec8c982890e") + ) + (gr_line + (start 199.06 49.2) + (end 199.06 59.36) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "e462bc5f-271d-43fc-ab39-c424cc8a72ce") + ) + (gr_line + (start 199.06 98.73) + (end 199.06 99.238) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "ea66c48c-ef77-4435-9521-1af21d8c2327") + ) + (gr_arc + (start 100 47.422) + (mid 100.223185 46.883185) + (end 100.762 46.66) + (stroke + (width 0.15) + (type solid) + ) + (layer "Edge.Cuts") + (uuid "ef0ee1ce-7ed7-4e9c-abb9-dc0926a9353e") + ) + (gr_text "ICSP" + (at 164.897 72.06 90) + (layer "Dwgs.User") + (uuid "8a0ca77a-5f97-4d8b-bfbe-42a4f0eded41") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (embedded_fonts no) +) diff --git a/tests/fixtures/arduino_mega_routed.ses b/tests/fixtures/arduino_mega_routed.ses new file mode 100644 index 0000000..c8b3e47 --- /dev/null +++ b/tests/fixtures/arduino_mega_routed.ses @@ -0,0 +1,140 @@ +(session oracle + (base_design oracle) + (placement + (resolution um 10) + (component "Connector_PinSocket_2.54mm:PinSocket_2x18_P2.54mm_Vertical" + (place J7 1939800 -923800 front 180) + ) + (component "Connector_PinSocket_2.54mm:PinSocket_1x08_P2.54mm_Vertical" + (place J1 1279400 -974600 front 90) + (place J3 1508000 -974600 front 90) + (place J5 1736600 -974600 front 90) + (place J4 1457200 -492000 front 90) + (place J6 1685800 -492000 front 90) + ) + (component "Connector_PinSocket_2.54mm:PinSocket_1x10_P2.54mm_Vertical" + (place J2 1187960 -492000 front 90) + ) + (component "Arduino_MountingHole:MountingHole_3.2mm" + (place MH6 1965200 -974600 front 0) + (place MH1 1152400 -492000 front 0) + (place MH2 1139700 -974600 front 0) + (place MH3 1660400 -644400 front 0) + (place MH4 1660400 -923800 front 0) + (place MH5 1901700 -492000 front 0) + ) + ) + (was_is + ) + (routes + (resolution um 10) + (parser + (host_cad "KiCad's Pcbnew") + (host_version "10.0.4") + ) + (library_out + (padstack "Via[0-1]_600:300_um" + (shape + (circle F.Cu 6000 0 0) + ) + (shape + (circle B.Cu 6000 0 0) + ) + (attach off) + ) + (padstack "Via[0-1]_600:300_um" + (shape + (circle F.Cu 6000 0 0) + ) + (shape + (circle B.Cu 6000 0 0) + ) + (attach off) + ) + ) + (network_out + (net GND + (wire + (path F.Cu 2000 + 1965200 -923800 + 1939800 -923800 + ) + ) + (wire + (path F.Cu 2000 + 1939800 -923800 + 1928283 -923800 + ) + ) + (wire + (path F.Cu 2000 + 1431800 -974600 + 1443317 -974600 + ) + ) + (wire + (path F.Cu 2000 + 1443317 -974600 + 1443317 -971720 + 1451954 -963083 + 1889000 -963083 + 1928283 -923800 + ) + ) + (wire + (path F.Cu 2000 + 1431800 -974600 + 1406400 -974600 + ) + ) + (wire + (path B.Cu 2000 + 1406400 -974600 + 1406400 -963083 + ) + ) + (wire + (path B.Cu 2000 + 1264160 -492000 + 1264160 -820843 + 1406400 -963083 + ) + ) + ) + (net +5V + (wire + (path F.Cu 2000 + 1965200 -492000 + 1939800 -492000 + ) + ) + (wire + (path B.Cu 2000 + 1939800 -492000 + 1928283 -492000 + ) + ) + (wire + (path B.Cu 2000 + 1381000 -974600 + 1392517 -974600 + ) + ) + (wire + (path B.Cu 2000 + 1392517 -974600 + 1392517 -977479 + 1401428 -986390 + 1411199 -986390 + 1419100 -978489 + 1419100 -970794 + 1651108 -738786 + 1686270 -738786 + 1928283 -496773 + 1928283 -492000 + ) + ) + ) + ) + ) +) \ No newline at end of file diff --git a/tests/test_ses_apply.py b/tests/test_ses_apply.py new file mode 100644 index 0000000..ac645ef --- /dev/null +++ b/tests/test_ses_apply.py @@ -0,0 +1,262 @@ +"""Tests for the native SES -> .kicad_pcb applier.""" + +from pathlib import Path + +import pytest + +from mckicad.utils.ses_apply import ( + SesApplyError, + _fmt, + _padstack_dims, + _transform, + apply_ses_to_board, + build_net_map, + resolution_scale, +) +from mckicad.utils.sexp_tree import find, parse, parse_file + +FIXTURES = Path(__file__).parent / "fixtures" +BOARD = FIXTURES / "arduino_mega.kicad_pcb" +ROUTED_SES = FIXTURES / "arduino_mega_routed.ses" + +# A hand-built SES with a single-segment wire and one via, in um/10 units. +SMALL_SES = """\ +(session small + (routes + (resolution um 10) + (library_out + (padstack "Via[0-1]_600:300_um" + (shape (circle F.Cu 6000 0 0)) + (shape (circle B.Cu 6000 0 0)) + (attach off) + ) + ) + (network_out + (net GND + (wire + (path F.Cu 2000 + 1965200 -923800 + 1939800 -923800 + ) + ) + (via "Via[0-1]_600:300_um" 1928283 -923800) + ) + (net NO_SUCH_NET + (wire + (path B.Cu 2000 + 100000 -100000 + 200000 -100000 + ) + ) + ) + ) + ) +) +""" + + +# -------------------------------------------------------------------------- +# Resolution parsing / scaling +# -------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_resolution_scale_um_10(): + # (resolution um 10): 1 SES unit = 0.1 um = 1/10000 mm + assert resolution_scale("um", 10) == pytest.approx(1e-4) + + +@pytest.mark.unit +def test_resolution_scale_units(): + assert resolution_scale("mm", 1) == pytest.approx(1.0) + assert resolution_scale("um", 1) == pytest.approx(0.001) + assert resolution_scale("mil", 1) == pytest.approx(0.0254) + assert resolution_scale("inch", 1) == pytest.approx(25.4) + + +@pytest.mark.unit +def test_resolution_scale_rejects_bad_unit(): + with pytest.raises(SesApplyError): + resolution_scale("furlong", 10) + + +@pytest.mark.unit +def test_resolution_scale_rejects_zero(): + with pytest.raises(SesApplyError): + resolution_scale("um", 0) + + +# -------------------------------------------------------------------------- +# Coordinate transform (the de-risked J7 anchor) +# -------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_transform_j7_anchor(): + # SES (place J7 1939800 -923800) <-> board (at 193.98 92.38) + scale = resolution_scale("um", 10) + x, y = _transform(1939800, -923800, scale) + assert x == "193.98" + assert y == "92.38" + + +@pytest.mark.unit +def test_transform_y_axis_flip(): + scale = resolution_scale("um", 10) + # Positive SES y flips to negative KiCad y. + _, y = _transform(0, 100000, scale) + assert y == "-10" + # Origin stays clean (no "-0"). + assert _transform(0, 0, scale) == ("0", "0") + + +@pytest.mark.unit +def test_fmt_trims_trailing_zeros(): + assert _fmt(0.2) == "0.2" + assert _fmt(196.52) == "196.52" + assert _fmt(-0.0) == "0" + + +# -------------------------------------------------------------------------- +# Net-name -> number mapping +# -------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_build_net_map(): + root = parse_file(str(BOARD)) + net_map = build_net_map(root) + assert net_map["GND"] == 1 + assert net_map["+5V"] == 34 + assert net_map["VCC"] == 76 + # The empty net 0 is still present. + assert net_map[""] == 0 + + +# -------------------------------------------------------------------------- +# Padstack -> via geometry +# -------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_padstack_dims_from_name(): + # "600:300_um" -> 0.6 mm pad, 0.3 mm drill + size, drill = _padstack_dims("Via[0-1]_600:300_um", shape_diameter_mm=0.6) + assert size == pytest.approx(0.6) + assert drill == pytest.approx(0.3) + + +@pytest.mark.unit +def test_padstack_dims_fallback_to_shape_and_default(): + size, drill = _padstack_dims("MysteryPad", shape_diameter_mm=0.8) + assert size == pytest.approx(0.8) + assert drill == pytest.approx(0.3) # default drill + size, drill = _padstack_dims("MysteryPad", shape_diameter_mm=None) + assert size == pytest.approx(0.6) # default size + assert drill == pytest.approx(0.3) + + +# -------------------------------------------------------------------------- +# Small hand-built SES -> expected segment/via s-expr +# -------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_small_ses_emits_expected_segment_and_via(tmp_path): + ses = tmp_path / "small.ses" + ses.write_text(SMALL_SES) + out = tmp_path / "out.kicad_pcb" + + result = apply_ses_to_board(str(BOARD), str(ses), str(out)) + + # One GND wire (1 segment) + one via; NO_SUCH_NET skipped as unknown. + assert result["segments_added"] == 1 + assert result["vias_added"] == 1 + assert result["nets_routed"] == 1 + assert result["unknown_nets"] == ["NO_SUCH_NET"] + + root = parse_file(str(out)) + segments = find(root, "segment") + vias = find(root, "via") + assert len(segments) == 1 + assert len(vias) == 1 + + seg = segments[0] + + def child_vals(node, tag): + for c in node.children: + if c.tag == tag: + return c.values + return None + + assert child_vals(seg, "start") == ["196.52", "92.38"] + assert child_vals(seg, "end") == ["193.98", "92.38"] + assert child_vals(seg, "width") == ["0.2"] + assert child_vals(seg, "layer") == ["F.Cu"] + assert child_vals(seg, "net") == ["1"] # GND + + via = vias[0] + assert child_vals(via, "at") == ["192.8283", "92.38"] + assert child_vals(via, "size") == ["0.6"] + assert child_vals(via, "drill") == ["0.3"] + assert child_vals(via, "layers") == ["F.Cu", "B.Cu"] + assert child_vals(via, "net") == ["1"] + + +@pytest.mark.unit +def test_apply_preserves_original_board_bytes(tmp_path): + ses = tmp_path / "small.ses" + ses.write_text(SMALL_SES) + out = tmp_path / "out.kicad_pcb" + apply_ses_to_board(str(BOARD), str(ses), str(out)) + + original = BOARD.read_text() + produced = out.read_text() + # Everything up to the injected block is untouched. + insert = produced.index("\t(segment") + assert produced[:insert] == original[: len(produced[:insert])] + # The board still closes cleanly. + assert produced.rstrip().endswith(")") + + +# -------------------------------------------------------------------------- +# Integration: real routed SES applied to real board +# -------------------------------------------------------------------------- + + +@pytest.mark.integration +def test_apply_real_routed_ses(tmp_path): + out = tmp_path / "routed.kicad_pcb" + result = apply_ses_to_board(str(BOARD), str(ROUTED_SES), str(out)) + + # The oracle SES routes GND (11 segments) and +5V (12 segments), no vias. + assert result["segments_added"] == 23 + assert result["vias_added"] == 0 + assert result["nets_routed"] == 2 + assert result["unknown_nets"] == [] + assert out.exists() + + +@pytest.mark.integration +def test_applied_segments_reference_valid_nets(tmp_path): + out = tmp_path / "routed.kicad_pcb" + apply_ses_to_board(str(BOARD), str(ROUTED_SES), str(out)) + + root = parse_file(str(out)) + net_numbers = {int(n.values[0]) for n in find(root, "net") if n.values} + + segments = find(root, "segment") + assert len(segments) > 0 + for seg in segments: + net_child = next((c for c in seg.children if c.tag == "net"), None) + assert net_child is not None + assert int(net_child.values[0]) in net_numbers + + +@pytest.mark.integration +def test_applied_board_reparses(tmp_path): + out = tmp_path / "routed.kicad_pcb" + apply_ses_to_board(str(BOARD), str(ROUTED_SES), str(out)) + # The produced file must still be a single well-formed s-expression. + root = parse(out.read_text()) + assert root.tag == "kicad_pcb"