Initial commit

This commit is contained in:
jaseg 2023-07-05 17:29:05 +02:00
commit c9744004ea
21 changed files with 148418 additions and 0 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
venv
__pycache__
gerber

View file

@ -0,0 +1,41 @@
(footprint "bal-10x10mm" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at 0 -0.5 0 unlocked) (layer "F.SilkS") (tstamp 3359a3e4-31fb-47b9-b16b-0de58bdb9045)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "bal-10x10mm" (at 0 1 0 unlocked) (layer "F.Fab") (tstamp 64a76c86-9dcb-403b-9cc1-498db73315bd)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 447a31db-e46c-4599-80f8-8228935a2474)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp a78abcd1-67b1-46a6-9d26-349df0dd048a)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 9b04e6e6-2c0a-43b8-aace-405f3681e211)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_rect (start -5 -5) (end 5 5)
(stroke (width 0.05) (type default)) (fill none) (layer "F.CrtYd") (tstamp e638c5a1-c193-4c12-b8c5-fc574824dfad))
(fp_text user "${REFERENCE}" (at 0 2.5 0 unlocked) (layer "F.Fab") (tstamp 615c98ba-759a-478e-bee0-2f8fa8dbc4fb)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd circle (at 0 0) (size 10 10) (layers "F.Cu")
(tstamp 5a84eceb-f684-46f8-b85a-c96eb1f31ff5)
)
(zone (net 0) (net_name "") (layer "F.Cu") (tstamp ed385c04-3160-4b79-9161-5d0c0fd0b46f) (hatch edge 0.5)
(connect_pads (clearance 0))
(min_thickness 0.25) (filled_areas_thickness no)
(keepout (tracks not_allowed) (vias not_allowed) (pads not_allowed) (copperpour not_allowed) (footprints not_allowed))
(fill (thermal_gap 0.5) (thermal_bridge_width 0.5))
(polygon
(pts
(xy -5 -5)
(xy 5 -5)
(xy 5 5)
(xy -5 5)
)
)
)
)

View file

@ -0,0 +1,90 @@
(footprint "Bosch_BMI088_LGA" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at 0 14.5 0 unlocked) (layer "F.SilkS") (tstamp f97a3efe-8e1f-4684-abec-f09b41d0273a)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "Bosch_BMI088_LGA" (at 0 16 0 unlocked) (layer "F.Fab") (tstamp 507ecc84-52fd-413f-bbd7-488e6a6774d5)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 15 0 unlocked) (layer "F.Fab") hide (tstamp 86a561ab-f459-4896-a3fb-deffc38169af)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 15 0 unlocked) (layer "F.Fab") hide (tstamp 47e3ecba-bfc7-4cb8-aee6-a0c58e0d8f6c)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 15 0 unlocked) (layer "F.Fab") hide (tstamp 61b1f77d-fee5-4715-aefa-934b7eb8bf2d)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_rect (start -1.5 -2.25) (end 1.5 2.25)
(stroke (width 0.1) (type default)) (fill none) (layer "F.SilkS") (tstamp d4da083c-48cd-45d8-85d2-7ba5414f92c2))
(fp_rect (start -1.75 -2.5) (end 1.75 2.5)
(stroke (width 0.05) (type default)) (fill none) (layer "Margin") (tstamp d9afc9e9-a34c-49a9-a1ee-a81aa2657292))
(fp_text user "${REFERENCE}" (at 0 17.5 0 unlocked) (layer "F.Fab") (tstamp 05e60479-6332-49f4-8e05-9851167efb3f)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd rect (at 1.2625 -1.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 33e4075d-571a-440f-beb1-39b5fc17748f)
)
(pad "2" smd rect (at 1.2625 -1) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 445ee1e7-5125-4727-854a-238f96f6239c)
)
(pad "3" smd rect (at 1.2625 -0.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 2d4aee6a-bfa1-47b5-931c-d1e9a1e75a32)
)
(pad "4" smd rect (at 1.2625 0) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 095909e0-1173-47ef-8f60-91851bef766c)
)
(pad "5" smd rect (at 1.2625 0.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp c889a00c-1efd-42a7-9620-07b6e1ad38ad)
)
(pad "6" smd rect (at 1.2625 1) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp fd785a6e-a6e4-479e-a743-9436638169b2)
)
(pad "7" smd rect (at 1.2625 1.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 98826b32-2175-45f7-a2e9-f123abbc8058)
)
(pad "8" smd rect (at 0 2.0125 90) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 649df130-2925-4aa0-9c17-b33575023cb7)
)
(pad "9" smd rect (at -1.2625 1.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp a3b62a16-22dc-4c87-a4b5-a7392f718405)
)
(pad "10" smd rect (at -1.2625 1) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 5a8497c5-7b36-4416-969b-523e2ad81294)
)
(pad "11" smd rect (at -1.2625 0.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 8976fc4d-827c-4ce9-ba98-c3392b3fded9)
)
(pad "12" smd rect (at -1.2625 0) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp b589d726-1f22-4583-b98c-ead3ecd8bf5f)
)
(pad "13" smd rect (at -1.2625 -0.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp ee32064b-3874-4d43-abf6-1ad170bfec82)
)
(pad "14" smd rect (at -1.2625 -1) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp dd51ecf0-f3c8-4742-8fb4-d2754cab1b14)
)
(pad "15" smd rect (at -1.2625 -1.5) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 98c84001-0cd6-4ab7-83e0-c351f3810a71)
)
(pad "16" smd rect (at 0 -2.0125 90) (size 0.675 0.25) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 1560c8a5-30bb-4783-b4a2-a69f1b22772d)
)
)

View file

@ -0,0 +1,56 @@
(footprint "MTSM1346SMF1-100" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at 0 -3.5 0 unlocked) (layer "F.SilkS") (tstamp 94844c15-568c-4fa3-a607-69040e661d97)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "MTSM1346SMF1-100" (at 0 1 0 unlocked) (layer "F.Fab") (tstamp 6f1aa1c0-3c66-4205-b8f1-1964440b2a97)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp ecc39ab9-7bd3-435c-9592-2ed9167c0029)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 03e564f4-0f2c-4b49-b752-e767cfcf778d)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 1f41df07-2728-4aae-9b94-3e28ebeaefd7)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_line (start -0.25 0.6) (end -0.25 1.5)
(stroke (width 0.1) (type default)) (layer "F.SilkS") (tstamp 6600c07a-dc8f-4f4f-b698-4b36f01b7898))
(fp_line (start 0 0.6) (end -0.25 0.6)
(stroke (width 0.1) (type default)) (layer "F.SilkS") (tstamp 4acbf4c6-6d04-4e48-9b42-e9363a7f99e3))
(fp_line (start 1.45 0.6) (end 0 0.6)
(stroke (width 0.1) (type default)) (layer "F.SilkS") (tstamp 9b89d808-0216-4d0e-8369-486f19e4828a))
(fp_rect (start -1.5 -1.5) (end 1.5 1.5)
(stroke (width 0.1) (type default)) (fill none) (layer "F.SilkS") (tstamp 8b2f86fb-d332-4688-a68e-d12000493540))
(fp_rect (start -1.7 -1.7) (end 1.7 1.7)
(stroke (width 0.05) (type default)) (fill none) (layer "F.CrtYd") (tstamp 9780c955-5324-4f3a-a757-bafd450ff138))
(fp_text user "${REFERENCE}" (at 0 2.5 0 unlocked) (layer "F.Fab") (tstamp 76ae142d-c1dd-4fd1-8324-8892d6724e8e)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd roundrect (at 1.25 1.15 180) (size 2.5 0.7) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.4285714286)
(thermal_bridge_angle 45)
(tstamp 5314e829-2a31-47d2-8c38-725917263cbc)
)
(pad "2" smd rect (at 1.575 0 180) (size 1.85 0.7) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 1c32838c-a5f9-4403-9438-b3afde00faf9)
)
(pad "3" smd rect (at 1.575 -1.15 180) (size 1.85 0.7) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp f247bdbc-b440-4a5e-a621-e4c358d98147)
)
(pad "4" smd rect (at -1.575 -1.15 180) (size 1.85 0.7) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 522d816f-4c10-4df4-86fb-7a69840d426c)
)
(pad "5" smd rect (at -1.575 0 180) (size 1.85 0.7) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp d971adf6-52b5-4d64-a89a-8e23528e6ba5)
)
(pad "6" smd rect (at -1.575 1.15 180) (size 1.85 0.7) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 68ce1124-7c10-40b9-b5ba-823548e5189c)
)
)

View file

@ -0,0 +1,38 @@
(footprint "P16612-011CA" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at 0 -2.55 0 unlocked) (layer "F.SilkS") (tstamp c2276d27-16d8-4ad4-8bde-592813a4d3a8)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "P16612-011CA" (at 0 1 0 unlocked) (layer "F.Fab") (tstamp c17f9354-4dcd-427f-a0cd-3651420b79cd)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 65b5b503-94ba-469f-ac07-825c708743d5)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp c4b71734-68fe-44c7-a657-275085e813a7)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 4907b044-9154-4565-bbc3-4d78188ae664)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_line (start 0.75 -1.75) (end 1.8 -1.75)
(stroke (width 0.1) (type default)) (layer "F.SilkS") (tstamp 5bc9e9b8-c81f-4e2f-aeda-6038318a1525))
(fp_line (start 1.8 -1.75) (end 1.8 -0.8)
(stroke (width 0.1) (type default)) (layer "F.SilkS") (tstamp ef59ca4e-da2f-41c0-8fee-f72ca0a547ee))
(fp_rect (start -1.3 -1.3) (end 1.3 1.3)
(stroke (width 0.1) (type default)) (fill none) (layer "F.SilkS") (tstamp d519c4bb-87d6-401d-8dfe-10740fe38960))
(fp_rect (start -1.5 -1.5) (end 1.5 1.5)
(stroke (width 0.05) (type default)) (fill none) (layer "F.CrtYd") (tstamp 9e7fce77-0bdc-4c75-b86e-4d88362275b0))
(fp_text user "${REFERENCE}" (at 0 2.5 0 unlocked) (layer "F.Fab") (tstamp 76855fc3-1cfc-4e28-b002-8380fdafa654)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd rect (at 0.9 0 180) (size 1.3 3.1) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 3198d885-b53d-4ffb-96b6-184c86fac519)
)
(pad "2" smd rect (at -0.9 0 180) (size 1.3 3.1) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp 7295e3bf-5769-43de-a2ad-24d6cd74bcf1)
)
)

View file

@ -0,0 +1,38 @@
(footprint "VBPW34S" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at -1.6 -3 0 unlocked) (layer "F.SilkS") hide (tstamp 88390548-67d9-49ae-8e4c-db01d26978d2)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "VBPW34S" (at 0 1 0 unlocked) (layer "F.Fab") (tstamp 49bcfcc7-6ef0-4846-b5f7-960c636434bb)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp db2c230f-92ec-4075-9bd3-c08c516cad56)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp f9c53b5c-993a-4b69-8b9e-da34f17dd77b)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 4e42c3fd-b0f8-4932-8240-d6c55ea8e994)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_line (start -1.6 -1.95) (end -1.6 1.95)
(stroke (width 0.1) (type default)) (layer "F.SilkS") (tstamp a2f763ed-a004-441d-8244-eac6029b573e))
(fp_rect (start -2.2 -1.95) (end 2.2 1.95)
(stroke (width 0.1) (type default)) (fill none) (layer "F.SilkS") (tstamp 13d36aea-793c-41ad-904d-3542d7f1a2c4))
(fp_rect (start -1 -1) (end 1 1)
(stroke (width 0.1) (type dot)) (fill none) (layer "F.SilkS") (tstamp 93cc726b-eb93-4c74-875e-19bac486e589))
(fp_rect (start -3.4 -2.2) (end 3.4 2.2)
(stroke (width 0.05) (type default)) (fill none) (layer "Margin") (tstamp 35a10b49-2333-4ae0-ad4f-be7c11e460a8))
(fp_text user "${REFERENCE}" (at 0 2.5 0 unlocked) (layer "F.Fab") (tstamp 6da511a8-5272-4940-a236-8bdcca2bcba5)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd rect (at -3.575 0 90) (size 1.75 1.8) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp c26b90cf-eb56-4095-b993-a534163b7718)
)
(pad "2" smd rect (at 3.575 0 90) (size 1.75 1.8) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp e1b9bf11-3775-4900-ad1e-6eb4ef74afc1)
)
)

View file

@ -0,0 +1,40 @@
(footprint "VBPW34SR" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at -1.6 -3 0 unlocked) (layer "F.SilkS") hide (tstamp b09223af-b049-4a61-b9aa-5a8bddba26fd)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "VBPW34SR" (at 0 1 0 unlocked) (layer "F.Fab") (tstamp 916ac511-8dba-449e-af8b-b56f77084c5b)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 98d8ede5-a9e7-4027-a862-08ae5bb89b1b)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 3d72a385-02d0-4197-9835-027a41835154)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 73a86ea5-bdba-4bde-991b-98b412192463)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_line (start -1.6 -1.95) (end -1.6 1.95)
(stroke (width 0.1) (type default)) (layer "F.SilkS") (tstamp f03db372-3115-4690-9e13-0199284ffb8c))
(fp_rect (start -2.2 -1.95) (end 2.2 1.95)
(stroke (width 0.1) (type default)) (fill none) (layer "F.SilkS") (tstamp b173977a-593e-4cb3-8763-3ea91ef7fc7b))
(fp_rect (start -1.68 -1.5) (end 1.32 1.5)
(stroke (width 0.1) (type dot)) (fill none) (layer "F.SilkS") (tstamp 42b9372a-e36b-4210-a75a-de580540d86e))
(fp_rect (start -1.98 -1.8) (end 1.62 1.8)
(stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp dad98ac0-65e9-41f5-8e7c-1f1f5eed6e44))
(fp_rect (start -3.4 -2.2) (end 3.4 2.2)
(stroke (width 0.05) (type default)) (fill none) (layer "Margin") (tstamp 7fe3bec6-3955-4c21-ae6d-44ba50829f15))
(fp_text user "${REFERENCE}" (at 0 2.5 0 unlocked) (layer "F.Fab") (tstamp 733f454d-fa09-4888-9ea7-47aa0099102d)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd rect (at -3.575 0 90) (size 1.75 1.8) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp a01d329c-5bba-43ac-a2c0-8a89e3e4d16b)
)
(pad "2" smd rect (at 3.575 0 90) (size 1.75 1.8) (layers "F.Cu" "F.Paste" "F.Mask")
(thermal_bridge_angle 45)
(tstamp fb8a214a-920d-478a-b94c-cae1c738661a)
)
)

View file

@ -0,0 +1,548 @@
(footprint "coil_rx" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at 0 -0.5 0 unlocked) (layer "F.SilkS") hide (tstamp a1cfaab7-dc54-48c5-ba8c-a23b49020a51)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "coil_rx" (at 0 1 0 unlocked) (layer "F.Fab") hide (tstamp 3e6b6586-c676-486b-bc5d-08fb92b33e36)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 6a949703-cc2e-4e6d-a727-55482d808100)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp c8122c05-2772-430f-b597-c294324e5263)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 60dc2314-287c-486d-a4a2-f8571d1f9802)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_line (start -11.871582 -3.404121) (end -12.015771 -3.445467)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp a3993b40-9ae0-4444-8152-592b0245c1d9))
(fp_line (start -11.282286 5.023198) (end -11.419318 5.084208)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 32687b92-84a7-44af-bf93-9bc11cd73187))
(fp_line (start -7.545904 2.163753) (end -7.401715 2.122408)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 33bd81b4-ca32-4c13-b2ea-34faac4ffc87))
(fp_line (start -7.171332 -3.192883) (end -7.0343 -3.131872)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp c7431749-d259-48f2-b444-10e4d4826004))
(fp_line (start -6.906032 -10.238614) (end -6.989911 -10.36297)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ba908801-2714-4f46-a292-68f50f5c064f))
(fp_line (start -5.413884 11.100106) (end -5.479639 11.234926)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp aa3da8e1-edfa-46ac-9a9b-4cb12e928566))
(fp_line (start -4.389664 6.507945) (end -4.305785 6.383589)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp a19fc8cf-253f-4a4e-8b75-36153f812188))
(fp_line (start -3.441214 -7.055533) (end -3.375458 -6.920714)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 0c23c8e9-1aa6-4864-b166-67800816cbcc))
(fp_line (start 0.820548 7.806997) (end 0.804869 7.657819)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e73721af-d29c-472a-9bb6-2e55c3a5a759))
(fp_line (start 1.290927 -12.282345) (end 1.306606 -12.431524)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp cb45bab2-6f09-429c-bd33-4d3d5322736d))
(fp_line (start 1.899087 -7.616821) (end 1.862799 -7.471277)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 36944a4a-e788-4261-9a8d-bab0c7c21f75))
(fp_line (start 2.987735 11.983152) (end 3.024024 12.128697)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 51006d3d-a7ec-4331-960d-ed9836d8f340))
(fp_line (start 5.646817 5.453068) (end 5.538916 5.348869)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp c43990b6-c00e-49e3-be82-b669c7758ef8))
(fp_line (start 6.350783 -4.614114) (end 6.229431 -4.525946)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 353bfd0c-72d6-43f0-89f8-cea3be2d4867))
(fp_line (start 7.830878 0.547588) (end 7.681243 0.537125)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp be88ce0f-6ec7-4e3b-8f4c-15e42b71abb8))
(fp_line (start 8.883847 -8.579031) (end 8.991748 -8.68323)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5779e245-5454-48b0-a228-4985eb5f8ba3))
(fp_line (start 9.99136 7.259148) (end 10.112712 7.347316)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 43acd05b-779f-4094-8773-2e6960fe48f8))
(fp_line (start 12.319916 -0.861492) (end 12.469551 -0.871956)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp bd37c49d-985c-402f-8376-a33b72e5677f))
(fp_arc (start -11.871582 3.404121) (mid -12.35 0) (end -11.871582 -3.404121)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 3648bf77-57f2-4fee-b75f-547ce5620bd9))
(fp_arc (start -11.390951 -3.266303) (mid -11.36977 -4.146801) (end -11.282286 -5.023198)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp a9249ba7-9079-4b67-a5e8-823c71ba4ce5))
(fp_arc (start -11.390951 3.266303) (mid -11.85 0) (end -11.390951 -3.266303)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 385ba1ee-4942-4514-89be-99a74df92460))
(fp_arc (start -11.282286 -5.023198) (mid -9.460649 -7.938427) (end -6.906032 -10.238614)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ebb25c0f-b242-4961-b6a9-292df3ee8cc6))
(fp_arc (start -10.91032 -3.128484) (mid -10.900016 -3.975766) (end -10.825514 -4.819829)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 49f94a42-8263-49de-80e5-f20dcf05b374))
(fp_arc (start -10.91032 3.128484) (mid -11.35 0) (end -10.91032 -3.128484)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ba021543-0107-4d9f-95c6-3af389ff0dea))
(fp_arc (start -10.825514 -4.819829) (mid -9.077627 -7.617033) (end -6.626436 -9.824095)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp bb348e7e-6805-4d4d-a320-002a91414e94))
(fp_arc (start -10.825514 4.819829) (mid -11.375259 4.131712) (end -11.871582 3.404121)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp f1c56ac4-ba21-4589-bb7a-946f1cfc1a6f))
(fp_arc (start -10.429689 -2.990665) (mid -10.430278 -3.804727) (end -10.368741 -4.616461)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 811cc591-8b80-4077-a4f5-80806de34220))
(fp_arc (start -10.429689 2.990665) (mid -10.85 0) (end -10.429689 -2.990665)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 676b7dc7-37fe-4390-988e-2a10a3f9a431))
(fp_arc (start -10.368741 -4.616461) (mid -8.694604 -7.29564) (end -6.346839 -9.409576)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 9dcc55aa-e9f3-4178-bc78-c504fe75ac79))
(fp_arc (start -10.368741 4.616461) (mid -10.905473 3.960784) (end -11.390951 3.266303)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 33248033-f66e-4145-be89-f6ba445ac51f))
(fp_arc (start -9.949059 -2.852847) (mid -9.96055 -3.633684) (end -9.911968 -4.413093)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 68e42fba-1df4-436c-83aa-f63dc90ff702))
(fp_arc (start -9.949059 2.852847) (mid -10.350001 0) (end -9.949059 -2.852847)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp d97ce90f-8c82-470e-aa1b-e0987ef9d100))
(fp_arc (start -9.911968 -4.413093) (mid -8.311582 -6.974246) (end -6.067243 -8.995058)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 61197733-d706-41f0-a59d-1783feb93b5f))
(fp_arc (start -9.911968 4.413093) (mid -10.43569 3.789865) (end -10.91032 3.128484)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 9c8246b0-c80d-4cbb-932d-81b68cb2f93e))
(fp_arc (start -9.468428 -2.715028) (mid -9.490826 -3.462633) (end -9.455195 -4.209724)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 95ed9fc1-4012-462c-adf2-12950772f7f5))
(fp_arc (start -9.468428 2.715028) (mid -9.85 0) (end -9.468428 -2.715028)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp fd455d44-9537-4150-87ed-dd0c69e97421))
(fp_arc (start -9.455195 -4.209724) (mid -7.92856 -6.652852) (end -5.787647 -8.580539)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ed8f9fa7-4ae5-4a51-ac24-ab93a00168fc))
(fp_arc (start -9.455195 4.209724) (mid -9.96591 3.618954) (end -10.429689 2.990665)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp eb3b707b-9c8d-4c49-bade-34ac793be7e1))
(fp_arc (start -8.998423 -4.006356) (mid -7.545538 -6.331458) (end -5.50805 -8.16602)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e4907387-702a-40a2-810c-88ab04bc923b))
(fp_arc (start -8.998423 4.006356) (mid -9.496132 3.448054) (end -9.949059 2.852847)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 26b269ae-f9d0-421c-b4ba-b12e42f88917))
(fp_arc (start -8.987797 -2.577209) (mid -9.021114 -3.291574) (end -8.998423 -4.006356)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp b2c131ee-c2fa-490b-94f1-d492751d0d84))
(fp_arc (start -8.987797 2.577209) (mid -9.35 0) (end -8.987797 -2.577209)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 52dde411-a618-47e1-b304-5b00ae620871))
(fp_arc (start -8.54165 -3.802988) (mid -7.162516 -6.010064) (end -5.228454 -7.751501)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 1b1aa203-794f-4507-aaf8-3a3ae8768e4b))
(fp_arc (start -8.54165 3.802988) (mid -9.026357 3.277168) (end -9.468428 2.715028)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 9fe0ec90-ff32-4fef-898b-42650c76d335))
(fp_arc (start -8.507166 -2.439391) (mid -8.551412 -3.120507) (end -8.54165 -3.802988)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 60a72548-91b2-45d9-bdac-92998649240a))
(fp_arc (start -8.507166 2.439391) (mid -8.85 0) (end -8.507166 -2.439391)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 4943ede4-e827-4fad-af71-71dc7a3a3947))
(fp_arc (start -8.084877 -3.599619) (mid -6.779492 -5.68867) (end -4.948857 -7.336983)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp cb64f833-9707-4adc-8b61-704801d2c2e6))
(fp_arc (start -8.084877 3.599619) (mid -8.556585 3.106295) (end -8.987797 2.577209)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ab7b53d7-e4eb-4027-a145-97797de72c6b))
(fp_arc (start -8.026535 -2.301572) (mid -8.081723 -2.949426) (end -8.084877 -3.599619)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp aa6d1787-8372-49d2-b4b9-d1ad690708cc))
(fp_arc (start -8.026535 2.301572) (mid -8.35 0) (end -8.026535 -2.301572)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e967f264-484f-4294-82c6-485b3c59e242))
(fp_arc (start -7.628105 -3.396251) (mid -6.396471 -5.367277) (end -4.669261 -6.922464)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 400860d2-0b83-4069-930d-908a7b4577b6))
(fp_arc (start -7.628105 3.396251) (mid -8.086813 2.93544) (end -8.507166 2.439391)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 31a64cd0-368e-4dc6-9a56-4d4dd24cf42b))
(fp_arc (start -7.545904 -2.163753) (mid -7.612046 -2.778332) (end -7.628105 -3.396251)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 2ffbe47e-3093-4b34-bcdc-7e74b1480d6e))
(fp_arc (start -7.545904 2.163753) (mid -7.85 0) (end -7.545904 -2.163753)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp dc1bf59e-b3b9-4b1f-9b4b-edc27e6af2b3))
(fp_arc (start -7.171332 -3.192883) (mid -6.013449 -5.045883) (end -4.389664 -6.507945)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp cdf66c4a-5e93-41f0-9a44-df65dc052cad))
(fp_arc (start -7.171332 3.192883) (mid -7.617043 2.764603) (end -8.026535 2.301572)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp df9aaf7a-881d-4e73-a144-d2e8340db53d))
(fp_arc (start -6.906032 10.238614) (mid -9.460649 7.938427) (end -11.282286 5.023198)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5dd3f70c-6c61-496a-9ca1-3d532ff63f9b))
(fp_arc (start -6.626436 -9.824095) (mid -6.044232 -10.484975) (end -5.413884 -11.100106)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 748ba3cf-f2d7-4fea-8dff-f0da6e807bfc))
(fp_arc (start -6.626436 9.824095) (mid -9.077627 7.617033) (end -10.825514 4.819829)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 00453789-6b23-448c-a210-17c630dde33f))
(fp_arc (start -6.346839 -9.409576) (mid -5.794327 -10.052012) (end -5.194698 -10.650709)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 653cbfd8-5c19-4878-8c39-fd533f2b7554))
(fp_arc (start -6.346839 9.409576) (mid -8.694604 7.295639) (end -10.368741 4.616461)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 25c3a7fa-68bb-47a4-bd8e-098e3971bf5e))
(fp_arc (start -6.067243 -8.995058) (mid -5.544429 -9.619048) (end -4.975513 -10.201312)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 97c1eb75-c8be-4bd8-952d-b03d47d7b3e1))
(fp_arc (start -6.067243 8.995058) (mid -8.311582 6.974246) (end -9.911968 4.413093)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp fa358037-7694-47ee-af78-1faf84663432))
(fp_arc (start -5.787647 -8.580539) (mid -5.294535 -9.186079) (end -4.756327 -9.751915)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ea450c28-c5e0-4317-9847-7509b0ade0ce))
(fp_arc (start -5.787647 8.580539) (mid -7.92856 6.652852) (end -9.455195 4.209724)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 400e9034-47c9-458d-9f1d-15230984d131))
(fp_arc (start -5.50805 -8.16602) (mid -5.044656 -8.753115) (end -4.537141 -9.302518)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp f5fdb948-3f4a-4e53-aa20-c8e4e1ec9276))
(fp_arc (start -5.50805 8.16602) (mid -7.545538 6.331458) (end -8.998423 4.006356)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp aa9f5989-eee2-4908-8ce0-fab3d7b870f8))
(fp_arc (start -5.413884 -11.100106) (mid -2.144555 -12.162376) (end 1.290927 -12.282345)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 904c0cbe-7edf-4d0c-9d16-39872e270bbf))
(fp_arc (start -5.228454 -7.751501) (mid -4.794794 -8.320154) (end -4.317956 -8.853121)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 11036d1a-9f61-47a7-90d3-1ae34e54a09e))
(fp_arc (start -5.228454 7.751501) (mid -7.162516 6.010064) (end -8.54165 3.802988)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp c1b15131-c0f8-46ae-9edc-14aaf0e41b47))
(fp_arc (start -5.194698 -10.650709) (mid -2.057731 -11.669972) (end 1.238662 -11.785084)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp fd2ea3e7-3b7e-44d2-9767-690f51898f3b))
(fp_arc (start -5.194698 10.650709) (mid -6.05814 10.47695) (end -6.906032 10.238614)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 2995d48b-a5f0-4f9f-8665-2ba62f20c9f0))
(fp_arc (start -4.975513 -10.201312) (mid -1.970907 -11.177568) (end 1.186398 -11.287824)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp c03bd4f0-1fa1-4a2b-a6e2-7facedaa888f))
(fp_arc (start -4.975513 10.201312) (mid -5.808134 10.04404) (end -6.626436 9.824095)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e3bb4c68-7ade-4c97-9ba7-c1d2e6245da5))
(fp_arc (start -4.948857 -7.336983) (mid -4.544938 -7.887188) (end -4.09877 -8.403724)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 3fb83447-231c-47da-859a-171d04898144))
(fp_arc (start -4.948857 7.336983) (mid -6.779493 5.68867) (end -8.084877 3.599619)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 7809e31e-4232-4b05-9084-25a8554896a7))
(fp_arc (start -4.756327 -9.751915) (mid -1.884083 -10.685164) (end 1.134134 -10.790563)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 39d782d9-1b35-4771-9f21-beaee87c9a04))
(fp_arc (start -4.756327 9.751915) (mid -5.558124 9.611137) (end -6.346839 9.409576)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 2dd27eb3-2fdd-4ef9-a275-127097054637))
(fp_arc (start -4.669261 -6.922464) (mid -4.295102 -7.454221) (end -3.879585 -7.954327)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 8a49a4f2-3b8d-4a7b-83d2-1fbb1901de6d))
(fp_arc (start -4.669261 6.922464) (mid -6.396471 5.367277) (end -7.628105 3.396251)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 1bafdad7-a484-4b02-8479-05e803b0ae75))
(fp_arc (start -4.537141 -9.302518) (mid -1.797258 -10.19276) (end 1.08187 -10.293302)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp f9a234a0-0c9b-4c66-b0d1-c7bf46a66ff6))
(fp_arc (start -4.537141 9.302518) (mid -5.308111 9.178243) (end -6.067243 8.995058)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 0510de1b-0407-450f-928e-0d7f510a61fb))
(fp_arc (start -4.389664 -6.507945) (mid -4.04529 -7.021257) (end -3.660399 -7.50493)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 421d5cd8-e181-4c3e-8ac0-ec19c02f95c7))
(fp_arc (start -4.389664 6.507945) (mid -6.013449 5.045883) (end -7.171332 3.192883)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 1e8cff37-3d03-4e46-92b3-7fc7cbaa446f))
(fp_arc (start -4.317956 -8.853121) (mid -1.710435 -9.700356) (end 1.029605 -9.796041)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 0415432a-e8c0-40aa-8433-a3d1f52b568e))
(fp_arc (start -4.317956 8.853121) (mid -5.058093 8.74536) (end -5.787647 8.580539)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 32c8a720-ce51-4fbc-9ef0-020168b9a7fc))
(fp_arc (start -4.09877 -8.403724) (mid -1.62361 -9.207952) (end 0.977341 -9.29878)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 3d666f1a-4f33-4085-8925-a9816821d422))
(fp_arc (start -4.09877 8.403724) (mid -4.808068 8.312487) (end -5.50805 8.16602)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 4cba87ef-12ab-4212-997e-ce13e9a09c70))
(fp_arc (start -3.879585 -7.954327) (mid -1.536787 -8.715549) (end 0.925077 -8.801519)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e257df78-e740-4d05-8039-80378b54e733))
(fp_arc (start -3.879585 7.954327) (mid -4.558036 7.879627) (end -5.228454 7.751501)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 1ef0a1bb-4f60-4224-8f6b-5b70e6d58d2a))
(fp_arc (start -3.660399 -7.50493) (mid -1.449962 -8.223145) (end 0.872813 -8.304258)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp d2338715-9b46-4b69-b2fe-2be409fbb6ca))
(fp_arc (start -3.660399 7.50493) (mid -4.307994 7.44678) (end -4.948857 7.336983)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp f4a2f86b-4151-4c17-862f-b43de1c497e5))
(fp_arc (start -3.441214 -7.055533) (mid -1.363139 -7.730741) (end 0.820548 -7.806997)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp c8836614-d220-4126-8413-eda002c2d6ac))
(fp_arc (start -3.441214 7.055533) (mid -4.057941 7.01395) (end -4.669261 6.922464)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 32d0e30c-a704-4867-8ca2-c5094b990922))
(fp_arc (start 0.820548 -7.806997) (mid 1.414305 -7.978852) (end 2.020048 -8.101969)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 58afbadc-36d0-4b8b-b0d7-7019527c54e0))
(fp_arc (start 0.820548 7.806997) (mid -1.363139 7.730741) (end -3.441214 7.055533)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp b8fd4170-6b91-4c66-a3fd-ee36ae280a5a))
(fp_arc (start 0.872813 -8.304258) (mid 1.501241 -8.47111) (end 2.141009 -8.587117)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 080070bb-1be4-4813-bcc7-4dcc4e3936e8))
(fp_arc (start 0.872813 8.304258) (mid -1.449962 8.223145) (end -3.660399 7.50493)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 49a766a6-1f21-4c3b-93a0-d7eaa4ae879c))
(fp_arc (start 0.925077 -8.801519) (mid 1.588161 -8.96337) (end 2.26197 -9.072265)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 05b08cc2-c7e1-47f5-8958-9968b689fbe4))
(fp_arc (start 0.925077 8.801519) (mid -1.536787 8.715549) (end -3.879585 7.954327)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 30d15fad-0828-4aff-8da5-5d9d015e9d4e))
(fp_arc (start 0.977341 -9.29878) (mid 1.675069 -9.455635) (end 2.382931 -9.557413)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 62a7d764-5b9d-41df-8132-ae7d554d9dba))
(fp_arc (start 0.977341 9.29878) (mid -1.62361 9.207952) (end -4.09877 8.403724)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 6570655d-4a75-4419-a52d-8760e3817097))
(fp_arc (start 1.029605 -9.796041) (mid 1.761964 -9.947915) (end 2.503892 -10.042561)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e2f8dfac-3a0a-4d7c-a898-5424c7b80b4a))
(fp_arc (start 1.029605 9.796041) (mid -1.710435 9.700356) (end -4.317956 8.853121)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 78f4c75e-2203-4f98-815e-0b4480e6f333))
(fp_arc (start 1.08187 -10.293302) (mid 1.848849 -10.440206) (end 2.624853 -10.527709)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5fe83780-a27c-4afc-b6d2-519b9fbc0a33))
(fp_arc (start 1.08187 10.293302) (mid -1.797258 10.19276) (end -4.537141 9.302518)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 42ae2590-bb35-47d2-999b-6a9f685ffc3c))
(fp_arc (start 1.134134 -10.790563) (mid 1.935726 -10.932506) (end 2.745814 -11.012856)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 4eeba512-26a9-4dd0-8bec-6a2947564cf0))
(fp_arc (start 1.134134 10.790563) (mid -1.884083 10.685164) (end -4.756327 9.751915)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 0af2f51b-b40f-4f51-a0d4-cc216bd46b84))
(fp_arc (start 1.186398 -11.287824) (mid 2.022597 -11.42481) (end 2.866774 -11.498004)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ede62406-68a2-49e2-931a-5f2e4cb621de))
(fp_arc (start 1.186398 11.287824) (mid -1.970907 11.177568) (end -4.975513 10.201312)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp b77af2a3-9e46-4f59-b4ae-93e3adbfab07))
(fp_arc (start 1.238662 -11.785084) (mid 2.109461 -11.917119) (end 2.987735 -11.983152)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 8cb800c9-7948-46a3-9170-6d13ec4b986d))
(fp_arc (start 1.238662 11.785084) (mid -2.057731 11.669972) (end -5.194698 10.650709)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp a546a25a-a6f1-4bc8-8baa-8273324c4915))
(fp_arc (start 1.290927 12.282345) (mid -2.144555 12.162376) (end -5.413884 11.100106)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e4d757cf-683e-4ab6-b68d-046b27c35d77))
(fp_arc (start 1.899087 -7.616821) (mid 3.925 -6.798299) (end 5.646817 -5.453068)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp a26830cc-ebe0-41c6-aee2-2ddc85afdebf))
(fp_arc (start 1.899087 7.616821) (mid 1.399917 7.981391) (end 0.872813 8.304258)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp adf8011d-009b-4cbf-87b4-1c2704f34b07))
(fp_arc (start 2.020048 -8.101969) (mid 4.174999 -7.231311) (end 6.006487 -5.800397)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 0522bd0f-24e9-42af-81ba-eb5c7856f54b))
(fp_arc (start 2.020048 8.101969) (mid 1.486583 8.47369) (end 0.925077 8.801519)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 95b0b474-9997-4afc-828a-8059e450a1f7))
(fp_arc (start 2.141009 -8.587117) (mid 4.425 -7.664325) (end 6.366157 -6.147727)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 0635ed25-25c3-48ed-866d-4c9b07cf5f0a))
(fp_arc (start 2.141009 8.587117) (mid 1.573269 8.965993) (end 0.977341 9.29878)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 30cfa8c1-6bac-4e68-b5fb-853320cb91d6))
(fp_arc (start 2.26197 -9.072265) (mid 4.675 -8.097338) (end 6.725827 -6.495056)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 7f1b48b3-e496-4e92-86a6-5f1ba113509a))
(fp_arc (start 2.26197 9.072265) (mid 1.65997 9.458301) (end 1.029605 9.796041)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 9ed32220-0a7e-4470-84e0-4a241433df65))
(fp_arc (start 2.382931 -9.557413) (mid 4.925 -8.53035) (end 7.085497 -6.842385)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp ab70f786-ff1a-4cb0-b35d-7131c9ae8ae0))
(fp_arc (start 2.382931 9.557413) (mid 1.746685 9.950613) (end 1.08187 10.293302)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 3b1500fe-837c-402a-8090-798fe80e30e7))
(fp_arc (start 2.503892 -10.042561) (mid 5.175 -8.963363) (end 7.445167 -7.189714)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 56301a3d-fa6a-4c36-88d6-1434293a2d56))
(fp_arc (start 2.503892 10.042561) (mid 1.833412 10.44293) (end 1.134134 10.790563)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp dd9499e7-bfb2-4118-a31b-6d99624c1a73))
(fp_arc (start 2.624853 -10.527709) (mid 5.425001 -9.396376) (end 7.804837 -7.537043)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5ddba821-10d9-4548-a6d6-76e0ca8e71b4))
(fp_arc (start 2.624853 10.527709) (mid 1.920149 10.935251) (end 1.186398 11.287824)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 81ee4c17-c659-4ddf-aa0a-e2c05b7526ea))
(fp_arc (start 2.745814 -11.012856) (mid 5.675 -9.829388) (end 8.164507 -7.884373)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 7ad99fd6-befc-4888-94ef-bdb9d4370493))
(fp_arc (start 2.745814 11.012856) (mid 2.006896 11.427577) (end 1.238662 11.785084)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp a1af5f11-a905-43b5-9a09-688dd8efb40b))
(fp_arc (start 2.866774 -11.498004) (mid 5.925 -10.262401) (end 8.524177 -8.231702)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 2dbd5f16-a54f-4209-9cf2-5513e703eeda))
(fp_arc (start 2.866774 11.498004) (mid 2.093649 11.919907) (end 1.290927 12.282345)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 4eaa680e-bd2a-4b27-9aff-9f32fe107d56))
(fp_arc (start 2.987735 -11.983152) (mid 6.175 -10.695413) (end 8.883847 -8.579031)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 28cace0f-0e39-41b5-a0f6-29503fc7e109))
(fp_arc (start 5.646817 -5.453068) (mid 6.212129 -5.20306) (end 6.755292 -4.908007)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 1e627c0c-fe8f-4c89-a162-78dcc59274ea))
(fp_arc (start 5.646817 5.453068) (mid 3.925 6.798299) (end 1.899087 7.616821)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp db065c7f-eb5d-46be-8965-d229ddb14abb))
(fp_arc (start 6.006487 -5.800397) (mid 6.59514 -5.524265) (end 7.1598 -5.201899)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 4255f015-055b-4a34-aea0-f3f854383eb0))
(fp_arc (start 6.006487 5.800397) (mid 4.175 7.231312) (end 2.020048 8.101969)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 8bf2f2a8-094b-4462-883e-6d65f7036809))
(fp_arc (start 6.350783 -4.614114) (mid 7.376587 -2.684858) (end 7.830878 -0.547588)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp b7d55476-36cb-429d-a94e-3eaa456cdf08))
(fp_arc (start 6.350783 4.614114) (mid 6.202738 5.214251) (end 6.006487 5.800397)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 84e4a8f7-28d0-4275-a664-c98f75e47676))
(fp_arc (start 6.366157 -6.147727) (mid 6.978144 -5.845488) (end 7.564309 -5.495792)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 20420b3c-4a69-4c18-a8ca-afd34f83e3b5))
(fp_arc (start 6.366157 6.147727) (mid 4.425 7.664325) (end 2.141009 8.587117)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e493dcd8-2b40-4be4-8aa1-54d56777fec7))
(fp_arc (start 6.725827 -6.495056) (mid 7.361144 -6.166727) (end 7.968817 -5.789685)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 40b56914-472f-4907-bb29-9397caedffcb))
(fp_arc (start 6.725827 6.495056) (mid 4.675 8.097338) (end 2.26197 9.072265)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 722081df-22e2-4c12-a4ab-4c5fbd33a754))
(fp_arc (start 6.755292 -4.908007) (mid 7.846433 -2.855868) (end 8.32966 -0.582467)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 1666794c-36b9-4ccd-96ed-113f531910dd))
(fp_arc (start 6.755292 4.908007) (mid 6.585571 5.535666) (end 6.366157 6.147727)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 50cffe0f-3ce2-4c34-a345-6b230fbc94ff))
(fp_arc (start 7.085497 -6.842385) (mid 7.74414 -6.487978) (end 8.373326 -6.083577)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 07ae52d6-3860-4d06-b689-e87dbd9d4a76))
(fp_arc (start 7.085497 6.842385) (mid 4.925 8.53035) (end 2.382931 9.557413)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5b9b3220-e7a8-4536-b98d-268654e7d176))
(fp_arc (start 7.1598 -5.201899) (mid 8.316279 -3.026878) (end 8.828442 -0.617345)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 478983ab-639d-433f-b435-98675b54f4c6))
(fp_arc (start 7.1598 5.201899) (mid 6.968422 5.857072) (end 6.725827 6.495056)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp d4d1bace-8bb7-4ac9-829c-00e426f04f92))
(fp_arc (start 7.445167 -7.189714) (mid 8.127138 -6.809248) (end 8.777834 -6.37747)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 27fff3c2-4f42-406e-a2b8-154f97adc093))
(fp_arc (start 7.445167 7.189714) (mid 5.175 8.963363) (end 2.503892 10.042561)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp c1da1655-2454-431b-8922-6d8343bfba4e))
(fp_arc (start 7.564309 -5.495792) (mid 8.786126 -3.197888) (end 9.327224 -0.652223)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 6ba57556-b139-4619-b93a-0f298e4a80ee))
(fp_arc (start 7.564309 5.495792) (mid 7.351289 6.178471) (end 7.085497 6.842385)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 299377fd-ec65-461a-88a8-608bd0e8d270))
(fp_arc (start 7.804837 -7.537043) (mid 8.51013 -7.130523) (end 9.182343 -6.671363)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 1db3418e-9374-409f-b8b7-a2f1e42b99a7))
(fp_arc (start 7.804837 7.537043) (mid 5.425 9.396375) (end 2.624853 10.527709)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5b9a80b0-77fe-45ab-b490-53cc9b2bb9d3))
(fp_arc (start 7.830878 -0.547588) (mid 8.103227 0.007306) (end 8.32966 0.582467)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 20f1ea7e-47c5-4bcd-97bf-6018093f0ffb))
(fp_arc (start 7.830878 0.547588) (mid 7.376587 2.684858) (end 6.350783 4.614114)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 92b0fc81-15d2-4e36-85e2-c97d6db35647))
(fp_arc (start 7.968817 -5.789685) (mid 9.255972 -3.368898) (end 9.826006 -0.687101)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp bfcd8ed8-700d-469b-b952-bebebfd5dec7))
(fp_arc (start 7.968817 5.789685) (mid 7.734169 6.499865) (end 7.445167 7.189714)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 17c5c843-9d5d-4802-b669-9643cd60c6f9))
(fp_arc (start 8.164507 -7.884373) (mid 8.893125 -7.451812) (end 9.586851 -6.965255)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 6a671f88-eb75-409f-8869-5f6e95fb23d5))
(fp_arc (start 8.164507 7.884373) (mid 5.675 9.829388) (end 2.745814 11.012856)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp f994c6d8-59ef-42f1-abb3-22a50e6588bf))
(fp_arc (start 8.32966 -0.582467) (mid 8.603095 0.007443) (end 8.828442 0.617345)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp decd2c18-79b9-4e22-bda2-9b79ea5244f4))
(fp_arc (start 8.32966 0.582467) (mid 7.846433 2.855868) (end 6.755292 4.908007)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 58a8c6b9-f70e-40d1-b4d2-9ccfe33a201c))
(fp_arc (start 8.373326 -6.083577) (mid 9.725818 -3.539909) (end 10.324788 -0.72198)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 10043c7e-2aa4-48c6-8622-0e6e5b990e9e))
(fp_arc (start 8.373326 6.083577) (mid 8.117061 6.821254) (end 7.804837 7.537043)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e18de31d-79bf-46dd-9e75-7a532f703e8c))
(fp_arc (start 8.524177 -8.231702) (mid 9.276118 -7.773108) (end 9.99136 -7.259148)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 8c0c56f3-842e-4848-92aa-ffee2881faae))
(fp_arc (start 8.524177 8.231702) (mid 5.925 10.262402) (end 2.866774 11.498004)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 047cb941-bf8d-422f-bda3-dc288a194e86))
(fp_arc (start 8.777834 -6.37747) (mid 10.195665 -3.710919) (end 10.82357 -0.756858)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp f2ddad53-1063-4c37-ac37-ae19f645fc20))
(fp_arc (start 8.777834 6.37747) (mid 8.499963 7.14264) (end 8.164507 7.884373)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5ea726b9-f086-40fa-8b97-138d4550e249))
(fp_arc (start 8.828442 -0.617345) (mid 9.102971 0.007563) (end 9.327224 0.652223)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp f9a61d9a-4bfe-4783-b914-ad05ae5d6b94))
(fp_arc (start 8.828442 0.617345) (mid 8.31628 3.026878) (end 7.1598 5.201899)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 02379b64-2304-40c8-9412-6f69bd99f38e))
(fp_arc (start 8.883847 8.579031) (mid 6.175 10.695414) (end 2.987735 11.983152)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp fbe23968-3de7-40b6-b07b-09d29a05a4cb))
(fp_arc (start 9.182343 -6.671363) (mid 10.665511 -3.881929) (end 11.322352 -0.791736)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 914b190a-77ad-49f4-bfe8-9151376a1a6d))
(fp_arc (start 9.182343 6.671363) (mid 8.882876 7.464025) (end 8.524177 8.231702)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp af70cf0b-6afb-4f4f-b9dc-32c7c7b867b0))
(fp_arc (start 9.327224 -0.652223) (mid 9.602857 0.007666) (end 9.826006 0.687101)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 50db6715-71d0-4cb6-a9ac-c0d1f2fe8ef0))
(fp_arc (start 9.327224 0.652223) (mid 8.786126 3.197888) (end 7.564309 5.495792)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 82b70219-a76c-4efe-8b57-23e41036b6f8))
(fp_arc (start 9.586851 -6.965255) (mid 11.135358 -4.052939) (end 11.821134 -0.826614)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 9409874d-a1e6-4dcd-ac39-c06f864babf4))
(fp_arc (start 9.586851 6.965255) (mid 9.265797 7.785407) (end 8.883847 8.579031)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 04501c67-90d2-4d15-8902-7b5b0e333ea1))
(fp_arc (start 9.826006 -0.687101) (mid 10.102752 0.007757) (end 10.324788 0.72198)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp b512dde2-9609-4bb1-8ce4-3882fa550493))
(fp_arc (start 9.826006 0.687101) (mid 9.255972 3.368898) (end 7.968817 5.789685)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 7a9e210e-12fa-4a00-bae9-a6f9df50486f))
(fp_arc (start 9.99136 -7.259148) (mid 11.605204 -4.223949) (end 12.319916 -0.861492)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 3309510a-73c2-42e0-b0bd-46a0848e44d5))
(fp_arc (start 10.324788 -0.72198) (mid 10.602647 0.007837) (end 10.82357 0.756858)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 5bd9c743-6d02-4144-993d-ea03ff11e32c))
(fp_arc (start 10.324788 0.72198) (mid 9.725819 3.539909) (end 8.373326 6.083577)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 969bd48d-a9a3-4d7a-b185-c41f7e92e3d1))
(fp_arc (start 10.82357 -0.756858) (mid 11.102551 0.007908) (end 11.322352 0.791736)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 66395571-98e3-47da-b960-607a95a94b5b))
(fp_arc (start 10.82357 0.756858) (mid 10.195665 3.710919) (end 8.777834 6.37747)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp a4af5201-f383-46b7-b6ba-23aad6c71a35))
(fp_arc (start 11.322352 -0.791736) (mid 11.602459 0.007972) (end 11.821134 0.826614)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp e2b7346e-a4e2-43ae-8a89-72fd4f776625))
(fp_arc (start 11.322352 0.791736) (mid 10.665511 3.881929) (end 9.182343 6.671363)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 89f5c538-dbcd-4c87-b722-61b203af05fd))
(fp_arc (start 11.821134 -0.826614) (mid 12.102375 0.008028) (end 12.319916 0.861492)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp af2d3eab-eae3-43e9-a0d7-1ae3de8c499c))
(fp_arc (start 11.821134 0.826614) (mid 11.135359 4.052939) (end 9.586851 6.965255)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 948b8c10-7e47-4e6d-9fb4-6f743723c834))
(fp_arc (start 12.319916 0.861492) (mid 11.605204 4.223949) (end 9.99136 7.259148)
(stroke (width 0.3) (type default)) (layer "F.Cu") (tstamp 526189a3-d46d-48a5-87ce-45177210d49d))
(fp_line (start -12.015771 -3.445467) (end -7.0343 -3.131872)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp 4dfb6faa-f1dd-4c13-9a19-6e8ca2965d77))
(fp_line (start -11.419318 5.084208) (end -7.401715 2.122408)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp af26be84-9b91-4ce0-a95e-6fe8a4e8bea9))
(fp_line (start -6.989911 -10.36297) (end -3.375458 -6.920714)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp 6b6125ce-027b-4338-83c0-2ef34516dd75))
(fp_line (start -5.479639 11.234926) (end -4.305785 6.383589)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp 404f11b1-2c42-4644-96e7-bd01958ab1f7))
(fp_line (start 1.306606 -12.431524) (end 1.862799 -7.471277)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp e8feae16-6377-4993-b776-3333f3942231))
(fp_line (start 3.024024 12.128697) (end 0.804869 7.657819)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp dcced2eb-3e6e-4d8a-bd7d-b0c1da05bff1))
(fp_line (start 8.991748 -8.68323) (end 6.229431 -4.525946)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp 536e70fe-196b-4b65-ae1d-2595ce932c4f))
(fp_line (start 10.112712 7.347316) (end 5.538916 5.348869)
(stroke (width 0.3) (type default)) (layer "B.Cu") (tstamp 858b212a-2abb-46f5-a21f-203f9d406e87))
(fp_text user "${REFERENCE}" (at 0 2.5 0 unlocked) (layer "F.Fab") (tstamp 6c8fa2a5-a478-40a9-97f4-50b5aacc217f)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd circle (at 12.469551 -0.871956) (size 0.3 0.3) (layers "F.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 8cd0bf25-35de-4228-8d90-937ff64879a6)
)
(pad "2" smd circle (at 7.681243 0.537125) (size 0.3 0.3) (layers "F.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 663fd2a9-ccdb-4dc3-98e5-f920ac0c88da)
)
(pad "NC" thru_hole circle (at -12.015771 -3.445467) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 744de119-b4e2-4891-9b87-86e3e7e0d541)
)
(pad "NC" thru_hole circle (at -11.419318 5.084208) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp baf93bf6-3fdb-42cd-ad23-17b834c8835a)
)
(pad "NC" thru_hole circle (at -7.401715 2.122408) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 343c8edf-267c-40e8-8f34-9beb07bfcd41)
)
(pad "NC" thru_hole circle (at -7.0343 -3.131872) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 3a346c83-8adc-4449-9a6b-c2a39d4a5bc0)
)
(pad "NC" thru_hole circle (at -6.989911 -10.36297) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp a8b1a947-293e-451e-8aeb-4828cf1483bb)
)
(pad "NC" thru_hole circle (at -5.479639 11.234926) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 71debb63-2e1d-4be0-af77-4260bbd93d82)
)
(pad "NC" thru_hole circle (at -4.305785 6.383589) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 07ccdd0f-3e24-49e5-9806-8c824a100ae6)
)
(pad "NC" thru_hole circle (at -3.375458 -6.920714) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 32fdf4e8-94fd-48f3-b6fa-5674e2eb9af3)
)
(pad "NC" thru_hole circle (at 0.804869 7.657819) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 863582ff-e798-4af4-8fbc-29f6c60c4211)
)
(pad "NC" thru_hole circle (at 1.306606 -12.431524) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp e33f711b-d661-4ff3-966c-ab759c06c9cc)
)
(pad "NC" thru_hole circle (at 1.862799 -7.471277) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp f668767f-8e19-4ef3-a930-6599dfe74a74)
)
(pad "NC" thru_hole circle (at 3.024024 12.128697) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 21973359-2fa3-4372-8ed5-181dd8be354c)
)
(pad "NC" thru_hole circle (at 5.538916 5.348869) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp c5fdedcc-1674-4281-846d-859f55a930f0)
)
(pad "NC" thru_hole circle (at 6.229431 -4.525946) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp f5d1a3b8-b172-4dea-8e73-13349916ff99)
)
(pad "NC" thru_hole circle (at 7.681243 0.537125) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 09f1ae60-b808-40b6-a8d2-a6f37b291817)
)
(pad "NC" thru_hole circle (at 8.991748 -8.68323) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp 3d0dd932-1ee3-46a9-b70a-28f48cbb9e2f)
)
(pad "NC" thru_hole circle (at 10.112712 7.347316) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp c0b6b4f7-d31a-4ab5-827a-0b44f28b9e2e)
)
(pad "NC" thru_hole circle (at 12.469551 -0.871956) (size 0.6 0.6) (drill 0.3) (layers "F&B.Cu")
(clearance 0.2) (zone_connect 0) (thermal_bridge_width 0.5)
(tstamp c53d3ffe-86b8-448d-9350-320dd3b757fd)
)
(zone (net 0) (net_name "") (layers "*.Cu") (tstamp df7e1b52-b61b-4b2f-9f2b-b72795adae37) (hatch edge 0.5)
(connect_pads (clearance 0))
(min_thickness 0.254) (filled_areas_thickness no)
(keepout (tracks allowed) (vias allowed) (pads allowed) (copperpour not_allowed) (footprints allowed))
(fill (thermal_gap 0.508) (thermal_bridge_width 0.508))
(polygon
(pts
(xy 17.5 0)
(xy 17.304539 2.60824)
(xy 16.722524 5.158216)
(xy 15.766955 7.592965)
(xy 14.459179 9.858101)
(xy 12.828408 11.903023)
(xy 10.911072 13.682051)
(xy 8.75 15.155445)
(xy 6.393468 16.290291)
(xy 3.894116 17.061238)
(xy 1.307777 17.451066)
(xy -1.307777 17.451066)
(xy -3.894116 17.061238)
(xy -6.393468 16.290291)
(xy -8.75 15.155445)
(xy -10.911072 13.682051)
(xy -12.828408 11.903023)
(xy -14.459179 9.858101)
(xy -15.766955 7.592965)
(xy -16.722524 5.158216)
(xy -17.304539 2.60824)
(xy -17.5 0)
(xy -17.304539 -2.60824)
(xy -16.722524 -5.158216)
(xy -15.766955 -7.592965)
(xy -14.459179 -9.858101)
(xy -12.828408 -11.903023)
(xy -10.911072 -13.682051)
(xy -8.75 -15.155445)
(xy -6.393468 -16.290291)
(xy -3.894116 -17.061238)
(xy -1.307777 -17.451066)
(xy 1.307777 -17.451066)
(xy 3.894116 -17.061238)
(xy 6.393468 -16.290291)
(xy 8.75 -15.155445)
(xy 10.911072 -13.682051)
(xy 12.828408 -11.903023)
(xy 14.459179 -9.858101)
(xy 15.766955 -7.592965)
(xy 16.722524 -5.158216)
(xy 17.304539 -2.60824)
)
)
)
)

View file

@ -0,0 +1,34 @@
(footprint "mesh_conn" (version 20230620) (generator pcbnew)
(layer "F.Cu")
(property "Reference" "REF**" (at 0 -2.25 0 unlocked) (layer "F.SilkS") hide (tstamp ad4f86a6-c40a-45de-9755-536816782561)
(effects (font (size 1 1) (thickness 0.1)))
)
(property "Value" "mesh_conn" (at 0 1 0 unlocked) (layer "F.Fab") (tstamp e87da325-b358-40c2-9a7c-2bf2cb54bc3f)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 1a4151b5-9c45-483f-b7de-b3c48b0e0373)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 3a2afd89-4c34-4a0b-a3cc-24800fe97f31)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 5f1f1696-4799-4134-b64d-57be44267fde)
(effects (font (size 1 1) (thickness 0.15)))
)
(attr smd)
(fp_text user "${REFERENCE}" (at 0 2.5 0 unlocked) (layer "F.Fab") (tstamp f741b3b8-fc10-442d-8f89-4dd2860f992f)
(effects (font (size 1 1) (thickness 0.15)))
)
(pad "1" smd circle (at 0 -0.45) (size 0.15 0.15) (layers "F.Cu")
(tstamp e65c026b-a582-481d-aa0f-83da4e05e52b)
)
(pad "2" smd circle (at 0 -0.15) (size 0.15 0.15) (layers "F.Cu")
(tstamp 4adac25c-6de4-4cdf-b81d-79aadd631463)
)
(pad "3" smd circle (at 0 0.15) (size 0.15 0.15) (layers "F.Cu")
(tstamp 80b9cf1e-76d6-499a-8d4a-c27e4b29a23a)
)
(pad "4" smd circle (at 0 0.45) (size 0.15 0.15) (layers "F.Cu")
(tstamp 6911242a-667c-4407-8e79-6ac9c5f4704c)
)
)

88516
fp-info-cache Normal file

File diff suppressed because it is too large Load diff

7
fp-lib-table Normal file
View file

@ -0,0 +1,7 @@
(fp_lib_table
(version 7)
(lib (name "footprints")(type "KiCad")(uri "${KIPRJMOD}/footprints.pretty")(options "")(descr ""))
(lib (name "Package_CSP")(type "KiCad")(uri "/home/jaseg/ref/kicad-footprint-generator/scripts/Packages/Package_BGA/Package_CSP.pretty")(options "")(descr ""))
(lib (name "Package_BGA")(type "KiCad")(uri "/home/jaseg/ref/kicad-footprint-generator/scripts/Packages/Package_BGA/Package_BGA.pretty")(options "")(descr ""))
(lib (name "balancing-footprints")(type "KiCad")(uri "${KIPRJMOD}/balancing-footprints.pretty")(options "")(descr ""))
)

43
layout_radial.py Normal file
View file

@ -0,0 +1,43 @@
#!/usr/bin/env python3
import re
import math
import gerbonara.cad.kicad.pcb as pcb
r = 85
cx, cy = 150, 100
si_prefixes = {'k': 1e3, 'M': 1e6, 'G': 1e9, 'm': 1e-3, 'u': 1e-6, 'µ': 1e-6, 'n': 1e-9, 'p': 1e-12, '.': 1, 'r': 1}
def parse_si(s, unit=''):
if not (match := re.fullmatch(f'([0-9]*)(([.pPnNuUµmrRkKMgG])([0-9]*))?([pPnNuUµmrRkKMgG]?)({unit})?', s)):
raise ValueError(f'{s} is not a valid number with an SI prefix')
left, _1, dot, right, prefix, _unit = match.groups()
prefix = prefix or dot or '.'
multiplier = si_prefixes.get(prefix, si_prefixes.get(prefix.upper(), si_prefixes.get(prefix.lower())))
return float(f'{left}.{right or ""}0') * multiplier
b = pcb.Board.open('self-balancing-test-a.kicad_pcb.bak')
matches = list(b.find_footprints(name='Package_TO_SOT_SMD:SOT-23', sheetfile='resistor_bank.kicad_sch'))
for i, fp in enumerate(matches):
alpha = 2*math.pi * i/len(matches)
fp.at.x, fp.at.y = cx+r, cy
fp.rotate(alpha, cx, cy)
res1, res2 = fp.pads_by_number[3].find_connected(name='Resistor_SMD.*')
if parse_si(res1.property_value('Value')) > parse_si(res2.property_value('Value')):
res1, res2 = res2, res1
res1.at.x, res1.at.y = cx+r+5, cy+2
res2.at.x, res2.at.y = cx+r+5, cy-2
res1.rotate(alpha, cx, cy)
res2.rotate(alpha, cx, cy)
b.write('self-balancing-test-a.testout.kicad_pcb')

324
moment_of_inertia.py Normal file
View file

@ -0,0 +1,324 @@
#!/usr/bin/env python3
import re
import math
import shutil
import subprocess
import tempfile
from pathlib import Path
from gerbonara import LayerStack
from gerbonara.utils import setup_svg, Tag, MM, rotate_point
import gerbonara.cad.kicad.pcb as pcb
from PIL import Image
import click
import shapely
import numpy as np
from scipy.optimize import minimize
# Default density according to https://www.avx.com/docs/techinfo/CeramicCapacitors/yngsmodu.pdf
density_x7r = 5.8 # g/cm^3
# Default density according to https://en.wikipedia.org/wiki/FR-4
density_fr4 = 1.850 # g/cm^3
density_copper = 8.96 # g/cm^3
def volume_mass(w:'mm', l:'mm', density:'g/cm^3', thickness:'mm'=None):
""" Calculate approximate mass of a component of a given size. When no thickness is given, thickness = width is
assumed. Lengths are in mm, density in g/cm^3 and the result will be in mg. """
thickness = thickness or w
return w*l*thickness * 1e-3 * density * 1e3
# masses for some common components in mg
# approximate! Especially for capacitors, there can be significant differences between component height (and thus mass)
# for parts with the same footprint.
common_masses = {
'C_0201_0603Metric': volume_mass(0.3, 0.6, density_x7r),
'C_0402_1005Metric': volume_mass(0.5, 1.0, density_x7r),
'C_0603_1608Metric': volume_mass(0.8, 1.5, density_x7r),
'C_0805_2012Metric': volume_mass(1.3, 2.0, density_x7r),
'C_1206_3216Metric': volume_mass(1.5, 3.0, density_x7r),
'C_1210_3225Metric': volume_mass(2.5, 3.2, density_x7r),
# Resistor masses from https://www.vishay.com/docs/20035/dcrcwe3.pdf
'R_0402_1005Metric': 0.65,
'R_0603_1608Metric': 2.0,
'R_0805_2012Metric': 5.5,
'R_1206_3216Metric': 10,
}
def angle_difference(a, b):
return (b - a) % (2*math.pi) - math.pi
def parse_mass(s):
if not (m := re.match(r'^([0-9.,]*)([mkuµ]?)[g]?', s)):
raise ValueError(f'Invalid mass "{s}"')
si_prefix = {'m': 1e-3, 'u': 1e-6, 'µ': 1e-6, 'k': 1e3}
return float(m.group(1)) * si_prefix.get(m.group(2), 1)
def get_pixel_size(img, phys_w, phys_h):
px_w, px_h = img.size
pixel_size_x, pixel_size_y = phys_w/px_w, phys_h/px_h
assert math.isclose(pixel_size_x, pixel_size_y, rel_tol=1e-2, abs_tol=0.05)
return (pixel_size_x + pixel_size_y) / 2
def pixel_inertia(svg, phys_w, phys_h, phys_x0, phys_y0, area_density):
with tempfile.NamedTemporaryFile(suffix='.png') as tmp_png:
tmp_png = Path(tmp_png.name)
subprocess.run(['resvg', '--background', 'white', str(svg), str(tmp_png)], check=True)
with Image.open(tmp_png) as img:
pixel_size = get_pixel_size(img, phys_w, phys_h) # [m]
px_w, px_h = img.size
img = 1 - np.array(img.convert('L'), dtype=float) / 255
pixel_weight = pixel_size**2 * area_density # [g]
img *= pixel_weight # [g]
tens_y = np.zeros(shape=(px_h, 3, 3))
tens_x = np.zeros(shape=(px_w, 3, 3))
mass_y = np.zeros(px_h)
mass_x = np.zeros(px_w)
com_y = np.zeros(shape=(px_h, 2))
com_x = np.zeros(shape=(px_w, 2))
for y in range(px_h):
for x in range(px_w):
m = img[y, x]
x_phys = (x + 0.5) * pixel_size - phys_x0 # [m]
y_phys = (y + 0.5) * pixel_size - phys_y0 # [m]
tens_x[x][0,0] = m * y_phys**2
tens_x[x][1,1] = m * x_phys**2
tens_x[x][2,2] = m * x_phys**2 + y_phys**2
tens_x[x][0,1] = tens_x[x][1,0] = m * x_phys * y_phys
mass_x[x] = m
com_x[x] = (x_phys*m, y_phys*m)
tens_y[y] = tens_x.sum(axis=0)
mass_y[y] = mass_x.sum()
com_y[y] = com_x.sum(axis=0)
tens_solder = tens_y.sum(axis=0)
mass_solder = mass_y.sum()
center_of_mass = com_y.sum(axis=0) / mass_solder
return mass_solder, center_of_mass, tens_solder
@click.command()
@click.argument('kicad_pcb', type=click.Path(file_okay=True, dir_okay=False, path_type=Path))
@click.argument('gerber', type=click.Path(file_okay=False, dir_okay=True, path_type=Path))
@click.argument('pcb_out', required=False, type=click.Path(file_okay=True, dir_okay=False, path_type=Path))
@click.option('--board-thickness', type=float, default=0.75, help='PCB thickness in mm')
@click.option('--fr4-density', type=float, default=density_fr4, help='FR-4 density in g/cm^3')
@click.option('--stencil-thickness', type=float, default=0.125, help='Stencil thickness in mm')
@click.option('--copper-thickness', type=float, default=35, help='Stencil thickness in µm')
# Default solder paste density from:
# - https://www.kester.com/Portals/0/Documents/Knowledge%20Base/Calculating%20Solder%20Paste%20Volume%20Percent.pdf
# - http://www.chipquik.com/datasheets/SMD291SNL10.pdf
@click.option('--solder-paste-density', type=float, default=4.2, help='Solder paste density in g/cm^3')
@click.option('--solder-paste-metal-content', type=float, default=87.0, help='Solder paste metal content by weight in percent. The default value is for Chipquik SMD291SNL lead-free SAC305 solder paste.')
def analyze_board(kicad_pcb, gerber, pcb_out, board_thickness, fr4_density, stencil_thickness, copper_thickness, solder_paste_density, solder_paste_metal_content):
board = pcb.Board.open(kicad_pcb)
stack = LayerStack.open(gerber)
print()
(min_x, min_y), (max_x, max_y) = bounds = stack.outline.bounding_box(MM, default=((0, 0), (0, 0)))
phys_w, phys_h = (max_x-min_x)/1e3, (max_y-min_y)/1e3 # [m]
# Gerber flips the image Y axis compared to pillow and other modern computer graphics
phys_x0, phys_y0 = -min_x/1e3, max_y/1e3 # [m]
stencil_thickness /= 1e3 # [m]
solder_paste_density *= 1e6 / 1e3 # [kg/m^3]
solder_paste_metal_content /= 100 # [1]
board_thickness /= 1e3 # [m]
copper_thickness /= 1e6 # [m]
fr4_density *= 1e6 / 1e3 # [kg/m^3]
with tempfile.NamedTemporaryFile(suffix='.svg') as tmp_svg:
tmp_svg = Path(tmp_svg.name)
tmp_svg.write_text(str(stack['top paste'].to_svg(force_bounds=bounds)))
area_density = stencil_thickness * solder_paste_density * solder_paste_metal_content # [kg/m^2]
solder_mass, solder_center_of_mass, solder_tens = pixel_inertia(tmp_svg, phys_w, phys_h, phys_x0, phys_y0, area_density)
print(f'Solder mass: {solder_mass*1e6:.3f} mg')
print(f'Solder inertia:\n', solder_tens)
print(f'Solder center of mass: {solder_center_of_mass[0]*1e3:.3f}, {solder_center_of_mass[1]*1e3:.3f} mm')
print()
with tempfile.NamedTemporaryFile(suffix='.svg') as tmp_svg:
tmp_svg = Path(tmp_svg.name)
volume_density = density_copper * 1e6 / 1e3 # [kg/m^3]
area_density = copper_thickness * volume_density # [kg/m^2]
tmp_svg.write_text(str(stack['top copper'].to_svg(force_bounds=bounds)))
top_copper_mass, top_copper_center_of_mass, top_copper_tens = pixel_inertia(tmp_svg, phys_w, phys_h, phys_x0, phys_y0, area_density)
tmp_svg.write_text(str(stack['bottom copper'].to_svg(force_bounds=bounds)))
bottom_copper_mass, bottom_copper_center_of_mass, bottom_copper_tens = pixel_inertia(tmp_svg, phys_w, phys_h, phys_x0, phys_y0, area_density)
copper_mass = top_copper_mass + bottom_copper_mass
copper_center_of_mass = (top_copper_center_of_mass * top_copper_mass +
bottom_copper_center_of_mass * bottom_copper_mass) / copper_mass
copper_tens = top_copper_tens + bottom_copper_tens
print(f'Copper mass: {copper_mass*1e3:.3f} g')
print(f'Copper inertia:\n', copper_tens)
print(f'Copper center of mass: {copper_center_of_mass[0]*1e3:.3f}, {copper_center_of_mass[1]*1e3:.3f} mm')
print()
with tempfile.NamedTemporaryFile(suffix='.svg') as tmp_svg:
tmp_svg = Path(tmp_svg.name)
path = Tag('path', d=stack.outline_svg_d(), fill='black')
tmp_svg.write_text(str(setup_svg([path], bounds)))
area_density = board_thickness * fr4_density # [kg/m^2]
fr4_mass, fr4_center_of_mass, fr4_tens = pixel_inertia(tmp_svg, phys_w, phys_h, phys_x0, phys_y0, area_density)
print(f'FR-4 mass: {fr4_mass*1e3:.3f} g')
print(f'FR-4 inertia:\n', fr4_tens)
print(f'FR-4 center of mass: {fr4_center_of_mass[0]*1e3:.3f}, {fr4_center_of_mass[1]*1e3:.3f} mm')
print()
component_mass = np.zeros(len(board.footprints))
component_tens = np.zeros(shape=(len(board.footprints), 3, 3))
component_com = np.zeros(shape=(len(board.footprints), 2))
for i, fp in enumerate(board.footprints):
if (m := fp.property_value('mass', None)):
m = parse_mass(m) / 1e3
else:
for key, value in common_masses.items():
if key in fp.name:
m = value/1e6 # [kg]
break
else:
m = 0
x, y = fp.at.x, fp.at.y # [mm]
x -= board.setup.aux_axis_origin.x
y -= board.setup.aux_axis_origin.y
x, y = x*1e-3, y*1e-3 # [m]
component_tens[i][0,0] = m * y**2
component_tens[i][1,1] = m * x**2
component_tens[i][2,2] = m * x**2 + y**2
component_tens[i][0,1] = component_tens[i][1,0] = m * x * y
component_mass[i] = m
component_com[i] = (m*x, m*y)
component_mass = component_mass.sum()
component_tens = component_tens.sum(axis=0)
component_center_of_mass = component_com.sum(axis=0) / component_mass
print(f'Component mass: {component_mass*1e3:.3f} g')
print(f'Component inertia:\n', component_tens)
print(f'Component center of mass: {component_center_of_mass[0]*1e3:.3f}, {component_center_of_mass[1]*1e3:.3f} mm')
print()
total_mass = fr4_mass + solder_mass + component_mass + copper_mass
total_tens = fr4_tens + solder_tens + component_tens + copper_tens
total_center_of_mass = (
fr4_center_of_mass * fr4_mass +
solder_center_of_mass * solder_mass +
component_center_of_mass * component_mass +
copper_center_of_mass * copper_mass) / total_mass
imbalance_angle = math.atan2(*total_center_of_mass[::-1])
print(f'Total mass: {total_mass*1e3:.3f} g')
print(f'Total inertia:\n', total_tens)
print(f'Total center of mass: {total_center_of_mass[0]*1e3:.3f}, {total_center_of_mass[1]*1e3:.3f} mm')
print(f'Imbalance angle: {math.degrees(imbalance_angle):.2f} °')
print(f'Imbalance radius: {math.hypot(*total_center_of_mass)*1e3:.2f} mm')
print()
if not pcb_out: # No auto-balancing requested
return
volume_density = density_copper * 1e6 / 1e3 # [kg/m^3]
area_density = copper_thickness * volume_density # [kg/m^2]
balancing_pads = []
for fp in board.footprints:
if not fp.name.startswith('balancing-footprints:bal-'):
continue
fp_x, fp_y = fp.at.x - board.setup.aux_axis_origin.x, fp.at.y - board.setup.aux_axis_origin.y
fp_x, fp_y = fp_x*1e-3, fp_y*1e-3 # [m]
fp_rot = math.radians(fp.at.rotation or 0)
for pad in fp.pads:
if pad.shape not in (pcb.Atom.rect, pcb.Atom.circle):
print(f'Pad {pad.numebr} of balancing footprint {fp.get_property("Reference")} has unsupported pad shape {pad.shape}. Ignoring.')
continue
x, y = pad.at.x, pad.at.y
x, y = x*1e-3, y*1e-3 # [m]
x, y = rotate_point(x, y, -fp_rot)
x, y = x+fp_x, y+fp_y
a = math.atan2(y, x)
a_diff = angle_difference(imbalance_angle, a)
w, h = pad.size.x*1e-3, pad.size.y*1e-3 # [m]
if pad.shape == pcb.Atom.rect:
m = w*h*area_density
else:
m = max(w, h)**2 / 4 * math.pi * area_density
balancing_pads.append((pad, a, a_diff, x, y, w, h, m))
if not balancing_pads:
print('Error: Cannot balance board: No balancing footprint instances found.')
return
com_wo_bal_fps = total_center_of_mass * total_mass
m_tot = total_mass
for i, (pad, a, a_diff, x, y, w, h, m) in enumerate(balancing_pads):
#print(f'Balancing footprint {i} at {x*1e3:.1f}, {y*1e3:.1f} mm')
#print(f' angle: {math.degrees(a):.2f} °')
#print(f' angle difference: {math.degrees(a_diff):.2f} °')
#print(f' radius: {math.hypot(x, y)*1e3:.1f} mm')
#print(f' weight: {m*1e6:.0f} mg')
#print()
com_wo_bal_fps -= np.array([x, y]) * m
m_tot -= m
com_wo_bal_fps /= m_tot
def objective_function(x):
xs = x
total_com, m_bal = com_wo_bal_fps*m_tot, 0
for i, (pad, a, a_diff, x, y, w, h, m) in enumerate(balancing_pads):
m *= xs[i]
total_com += np.array([x, y])*m
m_bal += m
total_com /= (m_tot + m_bal)
r = math.hypot(*total_com)
#mean_change = 1 - xs.mean()
return r #+ mean_change * 1e-3
x0 = np.ones(len(balancing_pads))
res = minimize(objective_function, x0, bounds=[(0.005, 1.0)]*len(x0), tol=1e-12)
print(res)
print(f'Residual imbalance radius: {objective_function(res.x)*1e3:.2f} mm')
print('Adjusting balancing footprints:')
for i, (pad, a, a_diff, x, y, w, h, m) in enumerate(balancing_pads):
f = math.sqrt(res.x[i])
pad.size.x *= f
pad.size.y *= f
print(f'[{i:> 3}] by {100-res.x[i]*100:> 6.2f} %', end=('\n' if i%4 == 3 else ' '))
board.write(pcb_out)
if __name__ == '__main__':
analyze_board()

1849
pd_tia.kicad_sch Normal file

File diff suppressed because it is too large Load diff

2021
resistor_bank.kicad_sch Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,77 @@
{
"board": {
"active_layer": 0,
"active_layer_preset": "All Layers",
"auto_track_width": true,
"hidden_netclasses": [],
"hidden_nets": [],
"high_contrast_mode": 0,
"net_color_mode": 1,
"opacity": {
"images": 0.6,
"pads": 1.0,
"tracks": 1.0,
"vias": 1.0,
"zones": 0.6
},
"selection_filter": {
"dimensions": true,
"footprints": true,
"graphics": true,
"keepouts": true,
"lockedItems": false,
"otherItems": true,
"pads": true,
"text": true,
"tracks": true,
"vias": true,
"zones": true
},
"visible_items": [
0,
1,
2,
3,
4,
5,
8,
9,
10,
11,
12,
13,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
32,
33,
34,
35,
36,
39,
40
],
"visible_layers": "fffffff_ffffffff",
"zone_display_mode": 0
},
"meta": {
"filename": "self-balancing-test-a.kicad_prl",
"version": 3
},
"project": {
"files": []
}
}

View file

@ -0,0 +1,604 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"board_outline_line_width": 0.09999999999999999,
"copper_line_width": 0.19999999999999998,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.09999999999999999,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.15,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 0.762,
"height": 1.524,
"width": 1.524
},
"silk_line_width": 0.15,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15,
"silk_text_upright": false,
"zones": {
"min_clearance": 0.25
}
},
"diff_pair_dimensions": [],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_type_mismatch": "ignore",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "warning",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.0,
"min_hole_clearance": 0.25,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.0,
"min_via_annular_width": 0.09999999999999999,
"min_via_diameter": 0.5,
"solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_on_pad_in_zone": false,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [],
"via_dimensions": [],
"zones_allow_external_fillets": false
},
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [
"footprints"
],
"pinned_symbol_libs": [
"symbols"
]
},
"meta": {
"filename": "self-balancing-test-a.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.25,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"specctra_dsn": "",
"step": "",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"bom_fmt_presets": [],
"bom_fmt_settings": {
"field_delimiter": ",",
"keep_line_breaks": false,
"keep_tabs": false,
"name": "CSV",
"ref_delimiter": ",",
"ref_range_delimiter": "",
"string_delimiter": "\""
},
"bom_presets": [],
"bom_settings": {
"exclude_dnp": false,
"fields_ordered": [
{
"group_by": false,
"label": "Reference",
"name": "Reference",
"show": true
},
{
"group_by": true,
"label": "Value",
"name": "Value",
"show": true
},
{
"group_by": false,
"label": "Datasheet",
"name": "Datasheet",
"show": true
},
{
"group_by": false,
"label": "Footprint",
"name": "Footprint",
"show": true
},
{
"group_by": false,
"label": "Qty",
"name": "Quantity",
"show": true
},
{
"group_by": false,
"label": "Description",
"name": "Description",
"show": false
},
{
"group_by": false,
"label": "DNP",
"name": "DNP",
"show": false
},
{
"group_by": false,
"label": "LCSC",
"name": "LCSC",
"show": false
},
{
"group_by": false,
"label": "digikey",
"name": "digikey",
"show": false
},
{
"group_by": false,
"label": "mass",
"name": "mass",
"show": true
},
{
"group_by": false,
"label": "mass_ref",
"name": "mass_ref",
"show": true
}
],
"filter_string": "",
"group_symbols": true,
"name": "",
"sort_asc": true,
"sort_field": "Reference"
},
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"operating_point_overlay_i_precision": 3,
"operating_point_overlay_i_range": "~A",
"operating_point_overlay_v_precision": 3,
"operating_point_overlay_v_range": "~V",
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"page_layout_descr_file": "",
"plot_directory": "",
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_dissipations": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"3046137d-98ba-4fe6-98da-3a8a74d99ad5",
""
],
[
"d9dd8301-3c73-4baa-ad63-b060d8ba6e6d",
"PD_TIA"
],
[
"9caf2a35-027f-42fd-9c5b-33991635f950",
"PD_TIA2"
],
[
"21ab36d5-c2b4-4e3c-9f31-39e788fe5b7f",
"resistor_bank"
],
[
"5efc82a9-23f3-49dc-b9bd-0d4e6ccdbeff",
"resistor_bank1"
],
[
"9165aeea-e5c9-4847-b386-ddb52c57fdca",
"resistor_bank2"
],
[
"91df35e2-6076-4ca0-8a79-437a67d41236",
"resistor_bank3"
],
[
"3618f925-efd9-4896-ac69-1f98eb774124",
"resistor_bank4"
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load diff

4
sym-lib-table Normal file
View file

@ -0,0 +1,4 @@
(sym_lib_table
(version 7)
(lib (name "symbols")(type "KiCad")(uri "${KIPRJMOD}/symbols.kicad_sym")(options "")(descr ""))
)

1457
symbols.kicad_sym Normal file

File diff suppressed because it is too large Load diff