Initial commit
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,67 @@
|
|||||||
|
# This file is part of the faebryk project
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from enum import Enum, StrEnum
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import faebryk.library._F as F
|
||||||
|
from faebryk.core.module import Module
|
||||||
|
from faebryk.libs.iso_metric_screw_thread import Iso262_MetricScrewThreadSizes
|
||||||
|
from faebryk.libs.library import L
|
||||||
|
from faebryk.libs.part_lifecycle import PartLifecycle
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class MountingHole(Module):
|
||||||
|
class PadType(StrEnum):
|
||||||
|
NoPad = ""
|
||||||
|
Pad = "Pad"
|
||||||
|
Pad_TopBottom = "Pad_TopBottom"
|
||||||
|
Pad_TopOnly = "Pad_TopOnly"
|
||||||
|
Pad_Via = "Pad_Via"
|
||||||
|
|
||||||
|
# We currently only have footprints for these sizes
|
||||||
|
class SupportedMetricScrewSizes(Enum):
|
||||||
|
M2 = Iso262_MetricScrewThreadSizes.M2.value
|
||||||
|
M2_5 = Iso262_MetricScrewThreadSizes.M2_5.value
|
||||||
|
M3 = Iso262_MetricScrewThreadSizes.M3.value
|
||||||
|
M4 = Iso262_MetricScrewThreadSizes.M4.value
|
||||||
|
M5 = Iso262_MetricScrewThreadSizes.M5.value
|
||||||
|
M6 = Iso262_MetricScrewThreadSizes.M6.value
|
||||||
|
M8 = Iso262_MetricScrewThreadSizes.M8.value
|
||||||
|
|
||||||
|
contact: F.Electrical
|
||||||
|
|
||||||
|
attach_to_footprint: F.can_attach_to_footprint_symmetrically
|
||||||
|
designator_prefix = L.f_field(F.has_designator_prefix)(
|
||||||
|
F.has_designator_prefix.Prefix.H
|
||||||
|
)
|
||||||
|
|
||||||
|
def footprint_name(self) -> str:
|
||||||
|
# e.g. MountingHole_2.7mm_M2.5_Pad_TopOnly
|
||||||
|
size_metric = self._metric_screw_size
|
||||||
|
size_mm = f"{size_metric.value}mm"
|
||||||
|
padtype_name = self._pad_type.value
|
||||||
|
if padtype_name:
|
||||||
|
padtype_name = f"_{padtype_name}"
|
||||||
|
|
||||||
|
return f"MountingHole_{size_mm}_{size_metric.name}{padtype_name}"
|
||||||
|
|
||||||
|
def __init__(self, metric_screw_size: SupportedMetricScrewSizes, pad_type: PadType):
|
||||||
|
super().__init__()
|
||||||
|
self._metric_screw_size = metric_screw_size
|
||||||
|
self._pad_type = pad_type
|
||||||
|
|
||||||
|
def __preinit__(self):
|
||||||
|
fp_name = self.footprint_name()
|
||||||
|
fp_lib_name = "MountingHole"
|
||||||
|
fp_dir = Path(__file__).parent / "footprints" / fp_lib_name
|
||||||
|
fp_path = fp_dir / f"{fp_name}.kicad_mod"
|
||||||
|
|
||||||
|
fp = F.KicadFootprint.from_path(fp_path, lib_name=fp_lib_name)
|
||||||
|
self.get_trait(F.can_attach_to_footprint).attach(fp)
|
||||||
|
|
||||||
|
lifecycle = PartLifecycle.singleton()
|
||||||
|
lifecycle.library._insert_fp_lib(fp_lib_name, fp_dir)
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Mounting Holes
|
||||||
|
|
||||||
|
Various mounting holes.
|
||||||
|
|
||||||
|
Supported Sizes:
|
||||||
|
|
||||||
|
- M2
|
||||||
|
- M2_5
|
||||||
|
- M3
|
||||||
|
- M4
|
||||||
|
- M5
|
||||||
|
- M6
|
||||||
|
- M8
|
||||||
|
|
||||||
|
Supported Pad Types:
|
||||||
|
|
||||||
|
- NoPad
|
||||||
|
- Pad
|
||||||
|
- Pad_TopOnly
|
||||||
|
- Pad_Via
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ato
|
||||||
|
#pragma experiment("MODULE_TEMPLATING")
|
||||||
|
from "atopile/mounting_holes/MountingHole.py" import MountingHole
|
||||||
|
|
||||||
|
module Usage:
|
||||||
|
"""
|
||||||
|
Example of using mounting holes
|
||||||
|
"""
|
||||||
|
|
||||||
|
m2_with_pad = new MountingHole<metric_screw_size="M3", pad_type="Pad">
|
||||||
|
m6_no_pad = new MountingHole<metric_screw_size="M6", pad_type="NoPad">
|
||||||
|
m3_top_pad = new MountingHole<metric_screw_size="M3", pad_type="Pad_TopOnly">
|
||||||
|
m4_pad_with_vias = new MountingHole<metric_screw_size="M4", pad_type="Pad_Via">
|
||||||
|
|
||||||
|
m2_with_pad.contact ~ m3_top_pad.contact
|
||||||
|
m3_top_pad.contact ~ m4_pad_with_vias.contact
|
||||||
|
# m6_no_pad has no contact
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions to this package are welcome via pull requests on the GitHub repository.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This atopile package is provided under the [MIT License](https://opensource.org/license/mit/).
|
||||||
Binary file not shown.
@@ -0,0 +1,20 @@
|
|||||||
|
requires-atopile: ^0.10.14
|
||||||
|
|
||||||
|
paths:
|
||||||
|
src: .
|
||||||
|
layout: ./layouts
|
||||||
|
|
||||||
|
builds:
|
||||||
|
usage:
|
||||||
|
entry: usage.ato:Usage
|
||||||
|
hide_designators: true
|
||||||
|
|
||||||
|
package:
|
||||||
|
identifier: atopile/mounting-holes
|
||||||
|
repository: https://github.com/atopile/packages
|
||||||
|
version: 0.1.0
|
||||||
|
authors:
|
||||||
|
- name: atopile
|
||||||
|
email: hi@atopile.com
|
||||||
|
summary: Various mounting holes
|
||||||
|
license: MIT
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
(footprint "MountingHole_2.2mm_M2"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.2mm, M2, no annular, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.2mm_M2"
|
||||||
|
(at 0 3.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "" np_thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 2.2 2.2)
|
||||||
|
(drill 2.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
(footprint "MountingHole_2.2mm_M2_Pad"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.2mm, M2, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.2mm_M2_Pad"
|
||||||
|
(at 0 3.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.4 4.4)
|
||||||
|
(drill 2.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
(footprint "MountingHole_2.2mm_M2_Pad_TopBottom"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.2mm, M2, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.2mm_M2_Pad_TopBottom"
|
||||||
|
(at 0 3.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 2.6 2.6)
|
||||||
|
(drill 2.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.4 4.4)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.4 4.4)
|
||||||
|
(layers "B.Cu" "B.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
(footprint "MountingHole_2.2mm_M2_Pad_TopOnly"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.2mm, M2, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.2mm_M2_Pad_TopOnly"
|
||||||
|
(at 0 3.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 2.6 2.6)
|
||||||
|
(drill 2.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.4 4.4)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
(footprint "MountingHole_2.2mm_M2_Pad_Via"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.2mm, M2, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.2mm_M2_Pad_Via"
|
||||||
|
(at 0 3.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -1.65 0)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -1.166726 -1.166726)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -1.166726 1.166726)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -1.65)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.4 4.4)
|
||||||
|
(drill 2.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 1.65)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 1.166726 -1.166726)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 1.166726 1.166726)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 1.65 0)
|
||||||
|
(size 0.7 0.7)
|
||||||
|
(drill 0.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
(footprint "MountingHole_2.7mm_M2.5"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.7mm, M2.5, no annular, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2.5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.65 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.7mm_M2.5"
|
||||||
|
(at 0 3.65 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.7 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.95 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "" np_thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 2.7 2.7)
|
||||||
|
(drill 2.7)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
(footprint "MountingHole_2.7mm_M2.5_Pad"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.7mm, M2.5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2.5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.65 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.7mm_M2.5_Pad"
|
||||||
|
(at 0 3.65 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.7 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.95 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.4 5.4)
|
||||||
|
(drill 2.7)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
(footprint "MountingHole_2.7mm_M2.5_Pad_TopBottom"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.7mm, M2.5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2.5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.65 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.7mm_M2.5_Pad_TopBottom"
|
||||||
|
(at 0 3.65 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.7 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.95 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 3.1 3.1)
|
||||||
|
(drill 2.7)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.4 5.4)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.4 5.4)
|
||||||
|
(layers "B.Cu" "B.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
(footprint "MountingHole_2.7mm_M2.5_Pad_TopOnly"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.7mm, M2.5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2.5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.65 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.7mm_M2.5_Pad_TopOnly"
|
||||||
|
(at 0 3.65 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.7 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.95 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 3.1 3.1)
|
||||||
|
(drill 2.7)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.4 5.4)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
(footprint "MountingHole_2.7mm_M2.5_Pad_Via"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 2.7mm, M2.5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M2.5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -3.65 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_2.7mm_M2.5_Pad_Via"
|
||||||
|
(at 0 3.65 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.7 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 2.95 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.025 0)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -1.431891 -1.431891)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -1.431891 1.431891)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -2.025)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.4 5.4)
|
||||||
|
(drill 2.7)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 2.025)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 1.431891 -1.431891)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 1.431891 1.431891)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.025 0)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
(footprint "MountingHole_3.2mm_M3"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 3.2mm, M3, no annular, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M3")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -4.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_3.2mm_M3"
|
||||||
|
(at 0 4.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(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")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
(footprint "MountingHole_3.2mm_M3_Pad"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 3.2mm, M3, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M3")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -4.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_3.2mm_M3_Pad"
|
||||||
|
(at 0 4.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(drill 3.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
(footprint "MountingHole_3.2mm_M3_Pad_TopBottom"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 3.2mm, M3, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M3")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -4.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_3.2mm_M3_Pad_TopBottom"
|
||||||
|
(at 0 4.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 3.6 3.6)
|
||||||
|
(drill 3.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(layers "B.Cu" "B.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
(footprint "MountingHole_3.2mm_M3_Pad_TopOnly"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 3.2mm, M3, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M3")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -4.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_3.2mm_M3_Pad_TopOnly"
|
||||||
|
(at 0 4.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 3.6 3.6)
|
||||||
|
(drill 3.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
(footprint "MountingHole_3.2mm_M3_Pad_Via"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 3.2mm, M3, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M3")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -4.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_3.2mm_M3_Pad_Via"
|
||||||
|
(at 0 4.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.4 0)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -1.697056 -1.697056)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -1.697056 1.697056)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -2.4)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(drill 3.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 2.4)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 1.697056 -1.697056)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 1.697056 1.697056)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.4 0)
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(drill 0.5)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
(footprint "MountingHole_4.3mm_M4"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 4.3mm, M4, no annular, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M4")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -5.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_4.3mm_M4"
|
||||||
|
(at 0 5.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "" np_thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.3 4.3)
|
||||||
|
(drill 4.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
(footprint "MountingHole_4.3mm_M4_Pad"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 4.3mm, M4, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M4")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -5.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_4.3mm_M4_Pad"
|
||||||
|
(at 0 5.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.6 8.6)
|
||||||
|
(drill 4.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
(footprint "MountingHole_4.3mm_M4_Pad_TopBottom"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 4.3mm, M4, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M4")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -5.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_4.3mm_M4_Pad_TopBottom"
|
||||||
|
(at 0 5.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.7 4.7)
|
||||||
|
(drill 4.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.6 8.6)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.6 8.6)
|
||||||
|
(layers "B.Cu" "B.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
(footprint "MountingHole_4.3mm_M4_Pad_TopOnly"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 4.3mm, M4, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M4")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -5.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_4.3mm_M4_Pad_TopOnly"
|
||||||
|
(at 0 5.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 4.7 4.7)
|
||||||
|
(drill 4.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.6 8.6)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
(footprint "MountingHole_4.3mm_M4_Pad_Via"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 4.3mm, M4, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M4")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -5.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_4.3mm_M4_Pad_Via"
|
||||||
|
(at 0 5.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -3.225 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.280419 -2.280419)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.280419 2.280419)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -3.225)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.6 8.6)
|
||||||
|
(drill 4.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 3.225)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.280419 -2.280419)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.280419 2.280419)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 3.225 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
(footprint "MountingHole_5.3mm_M5"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 5.3mm, M5, no annular, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -6.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_5.3mm_M5"
|
||||||
|
(at 0 6.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "" np_thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.3 5.3)
|
||||||
|
(drill 5.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
(footprint "MountingHole_5.3mm_M5_Pad"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 5.3mm, M5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -6.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_5.3mm_M5_Pad"
|
||||||
|
(at 0 6.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 10.6 10.6)
|
||||||
|
(drill 5.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
(footprint "MountingHole_5.3mm_M5_Pad_TopBottom"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 5.3mm, M5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -6.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_5.3mm_M5_Pad_TopBottom"
|
||||||
|
(at 0 6.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.7 5.7)
|
||||||
|
(drill 5.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 10.6 10.6)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 10.6 10.6)
|
||||||
|
(layers "B.Cu" "B.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
(footprint "MountingHole_5.3mm_M5_Pad_TopOnly"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 5.3mm, M5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -6.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_5.3mm_M5_Pad_TopOnly"
|
||||||
|
(at 0 6.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 5.7 5.7)
|
||||||
|
(drill 5.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 10.6 10.6)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
(footprint "MountingHole_5.3mm_M5_Pad_Via"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 5.3mm, M5, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M5")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -6.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_5.3mm_M5_Pad_Via"
|
||||||
|
(at 0 6.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 5.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -3.975 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.810749 -2.810749)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.810749 2.810749)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -3.975)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 10.6 10.6)
|
||||||
|
(drill 5.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 3.975)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.810749 -2.810749)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.810749 2.810749)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 3.975 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
(footprint "MountingHole_6.4mm_M6"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 6.4mm, M6, no annular, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M6")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -7.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_6.4mm_M6"
|
||||||
|
(at 0 7.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "" np_thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(drill 6.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
(footprint "MountingHole_6.4mm_M6_Pad"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 6.4mm, M6, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M6")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -7.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_6.4mm_M6_Pad"
|
||||||
|
(at 0 7.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 12.8 12.8)
|
||||||
|
(drill 6.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
(footprint "MountingHole_6.4mm_M6_Pad_TopBottom"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 6.4mm, M6, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M6")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -7.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_6.4mm_M6_Pad_TopBottom"
|
||||||
|
(at 0 7.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.8 6.8)
|
||||||
|
(drill 6.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 12.8 12.8)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 12.8 12.8)
|
||||||
|
(layers "B.Cu" "B.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
(footprint "MountingHole_6.4mm_M6_Pad_TopOnly"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 6.4mm, M6, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M6")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -7.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_6.4mm_M6_Pad_TopOnly"
|
||||||
|
(at 0 7.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 6.8 6.8)
|
||||||
|
(drill 6.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 12.8 12.8)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
(footprint "MountingHole_6.4mm_M6_Pad_Via"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 6.4mm, M6, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M6")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -7.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_6.4mm_M6_Pad_Via"
|
||||||
|
(at 0 7.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -4.8 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -3.394113 -3.394113)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -3.394113 3.394113)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -4.8)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 12.8 12.8)
|
||||||
|
(drill 6.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 4.8)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 3.394113 -3.394113)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 3.394113 3.394113)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 4.8 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
(footprint "MountingHole_8.4mm_M8"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 8.4mm, M8, no annular, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M8")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -9.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_8.4mm_M8"
|
||||||
|
(at 0 9.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "" np_thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.4 8.4)
|
||||||
|
(drill 8.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+67
@@ -0,0 +1,67 @@
|
|||||||
|
(footprint "MountingHole_8.4mm_M8_Pad"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 8.4mm, M8, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M8")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -9.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_8.4mm_M8_Pad"
|
||||||
|
(at 0 9.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 16.8 16.8)
|
||||||
|
(drill 8.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
(footprint "MountingHole_8.4mm_M8_Pad_TopBottom"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 8.4mm, M8, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M8")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -9.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_8.4mm_M8_Pad_TopBottom"
|
||||||
|
(at 0 9.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.8 8.8)
|
||||||
|
(drill 8.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 16.8 16.8)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 16.8 16.8)
|
||||||
|
(layers "B.Cu" "B.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+73
@@ -0,0 +1,73 @@
|
|||||||
|
(footprint "MountingHole_8.4mm_M8_Pad_TopOnly"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 8.4mm, M8, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M8")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -9.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_8.4mm_M8_Pad_TopOnly"
|
||||||
|
(at 0 9.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 8.8 8.8)
|
||||||
|
(drill 8.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 16.8 16.8)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
+131
@@ -0,0 +1,131 @@
|
|||||||
|
(footprint "MountingHole_8.4mm_M8_Pad_Via"
|
||||||
|
(version 20241229)
|
||||||
|
(generator "kicad-footprint-generator")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Mounting Hole 8.4mm, M8, generated by kicad-footprint-generator mountinghole.py")
|
||||||
|
(tags "mountinghole M8")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -9.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "MountingHole_8.4mm_M8_Pad_Via"
|
||||||
|
(at 0 9.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 8.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -6.3 0)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -4.454773 -4.454773)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -4.454773 4.454773)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -6.3)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0)
|
||||||
|
(size 16.8 16.8)
|
||||||
|
(drill 8.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 6.3)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 4.454773 -4.454773)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 4.454773 4.454773)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 6.3 0)
|
||||||
|
(size 1.1 1.1)
|
||||||
|
(drill 0.8)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(zone_connect 2)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
(fp_lib_table
|
||||||
|
(version 7)
|
||||||
|
(lib
|
||||||
|
(name "MountingHole")
|
||||||
|
(type "KiCad")
|
||||||
|
(uri "${KIPRJMOD}/../../footprints/MountingHole")
|
||||||
|
(options "")
|
||||||
|
(descr "atopile: part lib: MountingHole")
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,667 @@
|
|||||||
|
(kicad_pcb
|
||||||
|
(version 20241229)
|
||||||
|
(generator "pcbnew")
|
||||||
|
(generator_version "9.0")
|
||||||
|
(general
|
||||||
|
(thickness 1.6)
|
||||||
|
(legacy_teardrops no)
|
||||||
|
)
|
||||||
|
(paper "A4")
|
||||||
|
(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)
|
||||||
|
(39 "User.1" user)
|
||||||
|
(41 "User.2" user)
|
||||||
|
(43 "User.3" user)
|
||||||
|
(45 "User.4" user)
|
||||||
|
(47 "User.5" user)
|
||||||
|
(49 "User.6" user)
|
||||||
|
(51 "User.7" user)
|
||||||
|
(53 "User.8" user)
|
||||||
|
(55 "User.9" user)
|
||||||
|
)
|
||||||
|
(setup
|
||||||
|
(pad_to_mask_clearance 0)
|
||||||
|
(allow_soldermask_bridges_in_footprints no)
|
||||||
|
(tenting front back)
|
||||||
|
(pcbplotparams
|
||||||
|
(layerselection 0x00000000_00000000_000010fc_ffffffff)
|
||||||
|
(plot_on_all_layers_selection 0x00000000_00000000_00000000_00000000)
|
||||||
|
(disableapertmacros no)
|
||||||
|
(usegerberextensions no)
|
||||||
|
(usegerberattributes yes)
|
||||||
|
(usegerberadvancedattributes yes)
|
||||||
|
(creategerberjobfile yes)
|
||||||
|
(dashed_line_dash_ratio 12)
|
||||||
|
(dashed_line_gap_ratio 3)
|
||||||
|
(svgprecision 4)
|
||||||
|
(plotframeref no)
|
||||||
|
(mode 1)
|
||||||
|
(useauxorigin no)
|
||||||
|
(hpglpennumber 1)
|
||||||
|
(hpglpenspeed 20)
|
||||||
|
(hpglpendiameter 15)
|
||||||
|
(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)
|
||||||
|
(plotreference yes)
|
||||||
|
(plotvalue yes)
|
||||||
|
(plotpadnumbers no)
|
||||||
|
(hidednponfab no)
|
||||||
|
(sketchdnponfab yes)
|
||||||
|
(crossoutdnponfab yes)
|
||||||
|
(plotfptext yes)
|
||||||
|
(subtractmaskfromsilk no)
|
||||||
|
(outputformat 1)
|
||||||
|
(mirror no)
|
||||||
|
(drillshape 1)
|
||||||
|
(scaleselection 1)
|
||||||
|
(outputdirectory "")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(net 0 "")
|
||||||
|
(net 2 "m6_no_pad-contact")
|
||||||
|
(net 3 "-contact")
|
||||||
|
(footprint "MountingHole:MountingHole_3.2mm_M3_Pad"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "a07a1889-e241-4ac7-a5cf-69fb4642524b")
|
||||||
|
(at 0 0 0)
|
||||||
|
(property "Reference" "H1"
|
||||||
|
(at 0 -4.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "3b949f8f-6bfd-4467-84db-7d63bcc09471")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" ""
|
||||||
|
(at 0 4.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "2b0beb9b-77b0-4c96-b917-6f1157dbe77a")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "7e9369ec-0737-48df-9de4-e63dfb0d93c5")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Description" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "7942844a-742c-4e59-b8f3-55746a4a045d")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "23b13d3b-fddd-b8dd-7eda-d437c621d9a3"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "91332477-9bcc-43a8-a1aa-0f4e4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "m2_with_pad"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "97a17606-e2b1-4a43-b155-83e74642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
(uuid "8c989a4e-20dd-45e4-84cd-4de6d6521afb")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "d24ab101-0dfc-4acb-ac01-6b3acf0061ea")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "380aef9d-3e46-4e7e-ba1a-1e93c6362e75")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(drill 3.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "bf8204e0-a0fd-4a28-bc1e-25fa2742355c")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
|
(footprint "MountingHole:MountingHole_3.2mm_M3_Pad_TopOnly"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "e4ba9788-4470-4f00-88e6-80cf4642524b")
|
||||||
|
(at 12.5 0 0)
|
||||||
|
(property "Reference" "H2"
|
||||||
|
(at 0 -4.15 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "5ae6fbdb-cc3f-4032-a1ad-7a18945f23a5")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" ""
|
||||||
|
(at 0 4.15 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "b39bf6d1-da0e-4c71-a436-6591127ae92f")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "265a5539-afaf-419b-adae-ccd567afe58b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Description" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "afe4c710-01a7-44b9-a082-9d3d2bee9e75")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "0e2df9a7-f003-e7bc-4806-191246315f3e"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "6ac3fa54-d3e1-4a73-bb96-9f544642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "m3_top_pad"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "c2d3fe19-2164-4c8a-954f-e16c4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.2 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
(uuid "2d817407-8161-483f-a36f-9280b69fb0c6")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 3.45 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "6167c7d9-6697-4acb-ba58-97e5f0260ddf")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "9a00d168-7832-41a7-a54c-263050ef5f91")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0 0)
|
||||||
|
(size 3.6 3.6)
|
||||||
|
(drill 3.2)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "b913393a-20d5-4621-8a82-9d188b29693c")
|
||||||
|
)
|
||||||
|
(pad "1" connect circle
|
||||||
|
(at 0 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(layers "F.Cu" "F.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(uuid "09483d31-bac6-46f9-b2ce-de880b6b9173")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
|
(footprint "MountingHole:MountingHole_6.4mm_M6"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "fb44f55e-fe10-4ef5-b8dd-0a4a4642524b")
|
||||||
|
(at 12.5 -12.5 0)
|
||||||
|
(property "Reference" "H4"
|
||||||
|
(at 0 -7.35 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "056af5e4-2448-47f8-80df-b0c514bde29f")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" ""
|
||||||
|
(at 0 7.35 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "a969ea1b-a5ea-4000-9a7f-912459a1d707")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "7102c11d-71b0-41af-9013-76ad1807d1fe")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Description" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "7c3a7634-cb75-4283-b364-a3b1cd6d306b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "a6b9f9b9-1f95-c001-fc48-f79413a9af43"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "8996193d-0a34-45cf-b494-09304642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "m6_no_pad"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "98ff6ce6-78cd-483a-a4bb-43814642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.4 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
(uuid "06623040-7e80-475d-9fd9-b88021f7e4ad")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 6.65 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "6548589a-2b38-44c2-8ae3-e3d9bb26d55e")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "29a23d63-8212-4030-983f-b1b221d0e011")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "" np_thru_hole circle
|
||||||
|
(at 0 0 0)
|
||||||
|
(size 6.4 6.4)
|
||||||
|
(drill 6.4)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(net 2 "m6_no_pad-contact")
|
||||||
|
(uuid "d4191163-0427-4f3f-8fce-9806147899b7")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
|
(footprint "MountingHole:MountingHole_4.3mm_M4_Pad_Via"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "b21cb18f-d852-4ee2-b06d-325b4642524b")
|
||||||
|
(at 0 0 0)
|
||||||
|
(property "Reference" "H3"
|
||||||
|
(at 0 -5.25 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "9afee134-7211-46dc-b9fd-cef8ab5add60")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" ""
|
||||||
|
(at 0 5.25 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "a841cfa9-6c1b-4b74-88f1-d71b559202d6")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "63830893-3649-1544-e78f-a1469191398b"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "a10b1359-62ca-4200-9137-334a4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "m4_pad_with_vias"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "3ed93f35-7e49-4aaf-bf4e-fff54642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr exclude_from_pos_files exclude_from_bom)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.3 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Cmts.User")
|
||||||
|
(uuid "99dcaa89-25a0-4262-a8c4-9cdf213b4907")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 4.55 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "c3662997-0e67-4695-917c-0eb38b8e0749")
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "68c0a66a-7cda-48a0-8f09-33af9283d7e9")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -3.225 0 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "c417a11f-bf1c-4c84-b994-070f3f66bce9")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.280419 -2.280419 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "77802c07-fa0f-4bee-92e9-3a89030bef6d")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at -2.280419 2.280419 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "c5858578-0405-480e-a262-f8098837f25a")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 -3.225 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "1c395b59-12f5-4470-ae61-bff84d7a783a")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 0 0)
|
||||||
|
(size 8.6 8.6)
|
||||||
|
(drill 4.3)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "6d2991ba-3da4-49d2-b8d5-9429e8902183")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 0 3.225 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "2bc99776-823c-41f6-94ab-4295e3f9ceb9")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.280419 -2.280419 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "5ca8f1a4-1563-41bc-8dc8-827f900d3c8a")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 2.280419 2.280419 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "ee2df947-627f-4ac1-a7fb-0173c69c70eb")
|
||||||
|
)
|
||||||
|
(pad "1" thru_hole circle
|
||||||
|
(at 3.225 0 0)
|
||||||
|
(size 0.9 0.9)
|
||||||
|
(drill 0.6)
|
||||||
|
(layers "*.Cu" "*.Mask")
|
||||||
|
(zone_connect 2)
|
||||||
|
(net 3 "-contact")
|
||||||
|
(remove_unused_layers no)
|
||||||
|
(uuid "6fb181bc-d16c-441d-989a-71968b0506c8")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
(segment
|
||||||
|
(start 0 -12.5)
|
||||||
|
(end 0 0)
|
||||||
|
(width 0.2)
|
||||||
|
(net 0)
|
||||||
|
(uuid "20876398-3d3b-446a-8ba8-b31fe85e4d96")
|
||||||
|
(layer "F.Cu")
|
||||||
|
)
|
||||||
|
(segment
|
||||||
|
(start 0 0)
|
||||||
|
(end 12.5 0)
|
||||||
|
(width 0.2)
|
||||||
|
(net 0)
|
||||||
|
(uuid "34b28c28-e8a3-48b9-aba1-baf219a5a2d0")
|
||||||
|
(layer "F.Cu")
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,284 @@
|
|||||||
|
{
|
||||||
|
"board": {
|
||||||
|
"3dviewports": [],
|
||||||
|
"design_settings": {
|
||||||
|
"defaults": {
|
||||||
|
"apply_defaults_to_fp_fields": false,
|
||||||
|
"apply_defaults_to_fp_shapes": false,
|
||||||
|
"apply_defaults_to_fp_text": false,
|
||||||
|
"board_outline_line_width": 0.05,
|
||||||
|
"copper_line_width": 0.2,
|
||||||
|
"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.05,
|
||||||
|
"dimension_precision": 4,
|
||||||
|
"dimension_units": 3,
|
||||||
|
"dimensions": {
|
||||||
|
"arrow_length": 1270000,
|
||||||
|
"extension_offset": 500000,
|
||||||
|
"keep_text_aligned": true,
|
||||||
|
"suppress_zeroes": true,
|
||||||
|
"text_position": 0,
|
||||||
|
"units_format": 0
|
||||||
|
},
|
||||||
|
"fab_line_width": 0.1,
|
||||||
|
"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.1,
|
||||||
|
"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.8,
|
||||||
|
"height": 1.27,
|
||||||
|
"width": 2.54
|
||||||
|
},
|
||||||
|
"silk_line_width": 0.1,
|
||||||
|
"silk_text_italic": false,
|
||||||
|
"silk_text_size_h": 1.0,
|
||||||
|
"silk_text_size_v": 1.0,
|
||||||
|
"silk_text_thickness": 0.1,
|
||||||
|
"silk_text_upright": false,
|
||||||
|
"zones": {
|
||||||
|
"min_clearance": 0.5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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",
|
||||||
|
"creepage": "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_filters_mismatch": "ignore",
|
||||||
|
"footprint_symbol_mismatch": "warning",
|
||||||
|
"footprint_type_mismatch": "ignore",
|
||||||
|
"hole_clearance": "error",
|
||||||
|
"hole_to_hole": "warning",
|
||||||
|
"holes_co_located": "warning",
|
||||||
|
"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",
|
||||||
|
"mirrored_text_on_front_layer": "warning",
|
||||||
|
"missing_courtyard": "ignore",
|
||||||
|
"missing_footprint": "warning",
|
||||||
|
"net_conflict": "warning",
|
||||||
|
"nonmirrored_text_on_back_layer": "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_on_edge_cuts": "error",
|
||||||
|
"text_thickness": "warning",
|
||||||
|
"through_hole_pad_without_hole": "error",
|
||||||
|
"too_many_vias": "error",
|
||||||
|
"track_angle": "error",
|
||||||
|
"track_dangling": "warning",
|
||||||
|
"track_segment_length": "error",
|
||||||
|
"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.5,
|
||||||
|
"min_groove_width": 0.0,
|
||||||
|
"min_hole_clearance": 0.25,
|
||||||
|
"min_hole_to_hole": 0.25,
|
||||||
|
"min_microvia_diameter": 0.2,
|
||||||
|
"min_microvia_drill": 0.1,
|
||||||
|
"min_resolved_spokes": 2,
|
||||||
|
"min_silk_clearance": 0.0,
|
||||||
|
"min_text_height": 0.8,
|
||||||
|
"min_text_thickness": 0.08,
|
||||||
|
"min_through_hole_diameter": 0.3,
|
||||||
|
"min_track_width": 0.0,
|
||||||
|
"min_via_annular_width": 0.1,
|
||||||
|
"min_via_diameter": 0.5,
|
||||||
|
"solder_mask_to_copper_clearance": 0.0,
|
||||||
|
"use_height_for_length_calcs": true
|
||||||
|
},
|
||||||
|
"teardrop_options": [
|
||||||
|
{
|
||||||
|
"td_onpthpad": true,
|
||||||
|
"td_onroundshapesonly": false,
|
||||||
|
"td_onsmdpad": true,
|
||||||
|
"td_ontrackend": false,
|
||||||
|
"td_onvia": 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": [],
|
||||||
|
"tuning_pattern_settings": {
|
||||||
|
"diff_pair_defaults": {
|
||||||
|
"corner_radius_percentage": 80,
|
||||||
|
"corner_style": 1,
|
||||||
|
"max_amplitude": 1.0,
|
||||||
|
"min_amplitude": 0.2,
|
||||||
|
"single_sided": false,
|
||||||
|
"spacing": 1.0
|
||||||
|
},
|
||||||
|
"diff_pair_skew_defaults": {
|
||||||
|
"corner_radius_percentage": 80,
|
||||||
|
"corner_style": 1,
|
||||||
|
"max_amplitude": 1.0,
|
||||||
|
"min_amplitude": 0.2,
|
||||||
|
"single_sided": false,
|
||||||
|
"spacing": 0.6
|
||||||
|
},
|
||||||
|
"single_track_defaults": {
|
||||||
|
"corner_radius_percentage": 80,
|
||||||
|
"corner_style": 1,
|
||||||
|
"max_amplitude": 1.0,
|
||||||
|
"min_amplitude": 0.2,
|
||||||
|
"single_sided": false,
|
||||||
|
"spacing": 0.6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"via_dimensions": [],
|
||||||
|
"zones_allow_external_fillets": false
|
||||||
|
},
|
||||||
|
"ipc2581": {
|
||||||
|
"dist": "",
|
||||||
|
"distpn": "",
|
||||||
|
"internal_id": "",
|
||||||
|
"mfg": "",
|
||||||
|
"mpn": ""
|
||||||
|
},
|
||||||
|
"layer_pairs": [],
|
||||||
|
"layer_presets": [],
|
||||||
|
"viewports": []
|
||||||
|
},
|
||||||
|
"boards": [],
|
||||||
|
"cvpcb": {
|
||||||
|
"equivalence_files": []
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"pinned_footprint_libs": [],
|
||||||
|
"pinned_symbol_libs": []
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"filename": "usage.kicad_pro",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"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)",
|
||||||
|
"priority": 2147483647,
|
||||||
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
|
"track_width": 0.2,
|
||||||
|
"via_diameter": 0.6,
|
||||||
|
"via_drill": 0.3,
|
||||||
|
"wire_width": 6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"version": 4
|
||||||
|
},
|
||||||
|
"net_colors": null,
|
||||||
|
"netclass_assignments": null,
|
||||||
|
"netclass_patterns": []
|
||||||
|
},
|
||||||
|
"pcbnew": {
|
||||||
|
"last_paths": {
|
||||||
|
"gencad": "",
|
||||||
|
"idf": "",
|
||||||
|
"netlist": "",
|
||||||
|
"plot": "",
|
||||||
|
"pos_files": "",
|
||||||
|
"specctra_dsn": "",
|
||||||
|
"step": "",
|
||||||
|
"svg": "",
|
||||||
|
"vrml": ""
|
||||||
|
},
|
||||||
|
"page_layout_descr_file": ""
|
||||||
|
},
|
||||||
|
"schematic": {
|
||||||
|
"legacy_lib_dir": "",
|
||||||
|
"legacy_lib_list": []
|
||||||
|
},
|
||||||
|
"sheets": [],
|
||||||
|
"text_variables": {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma experiment("MODULE_TEMPLATING")
|
||||||
|
from "MountingHole.py" import MountingHole
|
||||||
|
|
||||||
|
module Usage:
|
||||||
|
"""
|
||||||
|
Example of using mounting holes
|
||||||
|
"""
|
||||||
|
|
||||||
|
m2_with_pad = new MountingHole<metric_screw_size="M3", pad_type="Pad">
|
||||||
|
m6_no_pad = new MountingHole<metric_screw_size="M6", pad_type="NoPad">
|
||||||
|
m3_top_pad = new MountingHole<metric_screw_size="M3", pad_type="Pad_TopOnly">
|
||||||
|
m4_pad_with_vias = new MountingHole<metric_screw_size="M4", pad_type="Pad_Via">
|
||||||
|
|
||||||
|
m2_with_pad.contact ~ m3_top_pad.contact
|
||||||
|
m3_top_pad.contact ~ m4_pad_with_vias.contact
|
||||||
|
# m6_no_pad has no contact
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"atopile": {
|
||||||
|
"command": "/home/martin/.config/Code/User/globalStorage/atopile.atopile/uv-bin/uv",
|
||||||
|
"args": [
|
||||||
|
"tool",
|
||||||
|
"run",
|
||||||
|
"-p",
|
||||||
|
"3.13",
|
||||||
|
"--from",
|
||||||
|
"atopile",
|
||||||
|
"ato",
|
||||||
|
"mcp",
|
||||||
|
"start",
|
||||||
|
"--no-http"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,714 @@
|
|||||||
|
---
|
||||||
|
description: ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
globs: *.ato, ato.yaml
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
It is part of the atopile project.
|
||||||
|
Atopile is run by the vscode/cursor/windsurf extension.
|
||||||
|
The CLI (which is invoked by the extension) actually builds the project.
|
||||||
|
|
||||||
|
# Not available in ato
|
||||||
|
|
||||||
|
- if statements
|
||||||
|
- while loops
|
||||||
|
- functions (calls or definitions)
|
||||||
|
- classes
|
||||||
|
- objects
|
||||||
|
- exceptions
|
||||||
|
- generators
|
||||||
|
|
||||||
|
|
||||||
|
# Ato Syntax
|
||||||
|
|
||||||
|
ato sytax is heavily inspired by Python, but fully declarative.
|
||||||
|
ato thus has no procedural code, and no side effects.
|
||||||
|
|
||||||
|
## Examples of syntax
|
||||||
|
|
||||||
|
```ato
|
||||||
|
#pragma text
|
||||||
|
#pragma func("X")
|
||||||
|
# enable for loop syntax feature:
|
||||||
|
#pragma experiment("FOR_LOOP)
|
||||||
|
|
||||||
|
# --- Imports ---
|
||||||
|
# Standard import (newline terminated)
|
||||||
|
import ModuleName
|
||||||
|
|
||||||
|
# Import with multiple modules (newline terminated)
|
||||||
|
import Module1, Module2.Submodule
|
||||||
|
|
||||||
|
# Import from a specific file/source (newline terminated)
|
||||||
|
from "path/to/source.ato" import SpecificModule
|
||||||
|
|
||||||
|
# Multiple imports on one line (semicolon separated)
|
||||||
|
import AnotherModule; from "another/source.ato" import AnotherSpecific
|
||||||
|
|
||||||
|
# Deprecated import form (newline terminated)
|
||||||
|
# TODO: remove when unsupported
|
||||||
|
import DeprecatedModule from "other/source.ato"
|
||||||
|
|
||||||
|
# --- Top-level Definitions and Statements ---
|
||||||
|
|
||||||
|
pass
|
||||||
|
pass;
|
||||||
|
|
||||||
|
"docstring-like statement"
|
||||||
|
"docstring-like statement";
|
||||||
|
|
||||||
|
top_level_var = 123
|
||||||
|
|
||||||
|
# Compound statement
|
||||||
|
pass; another_var = 456; "another docstring"
|
||||||
|
|
||||||
|
# Block definitions
|
||||||
|
component MyComponent:
|
||||||
|
# Simple statement inside block (newline terminated)
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Multiple simple statements on one line (semicolon separated)
|
||||||
|
pass; internal_flag = True
|
||||||
|
|
||||||
|
module AnotherBaseModule:
|
||||||
|
pin base_pin
|
||||||
|
base_param = 10
|
||||||
|
|
||||||
|
interface MyInterface:
|
||||||
|
pin io
|
||||||
|
|
||||||
|
module DemoModule from AnotherBaseModule:
|
||||||
|
# --- Declarations ---
|
||||||
|
pin p1 # Pin declaration with name
|
||||||
|
pin 1 # Pin declaration with number
|
||||||
|
pin "GND" # Pin declaration with string
|
||||||
|
signal my_signal # Signal definition
|
||||||
|
a_field: AnotherBaseModule # Field declaration with type hint
|
||||||
|
|
||||||
|
# --- Assignments ---
|
||||||
|
# Newline terminated:
|
||||||
|
internal_variable = 123
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
var_a = 1; var_b = "string"
|
||||||
|
|
||||||
|
# Cumulative assignment (+=, -=) - Newline terminated
|
||||||
|
value = 1
|
||||||
|
value += 1; value -= 1
|
||||||
|
|
||||||
|
# Set assignment (|=, &=) - Newline terminated
|
||||||
|
flags |= 1; flags &= 2
|
||||||
|
|
||||||
|
# --- Connections ---
|
||||||
|
p1 ~ base_pin
|
||||||
|
mif ~> bridge
|
||||||
|
mif ~> bridge ~> bridge
|
||||||
|
mif ~> bridge ~> bridge ~> mif
|
||||||
|
bridge ~> mif
|
||||||
|
mif <~ bridge
|
||||||
|
mif <~ bridge <~ bridge
|
||||||
|
mif <~ bridge <~ bridge <~ mif
|
||||||
|
bridge <~ mif
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
p_multi1 ~ my_signal; p_multi2 ~ sig_multi1
|
||||||
|
|
||||||
|
# --- Retyping ---
|
||||||
|
instance.x -> AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Instantiation ---
|
||||||
|
instance = new MyComponent
|
||||||
|
container = new MyComponent[10]
|
||||||
|
templated_instance_a = new MyComponent
|
||||||
|
templated_instance_b = new MyComponent<int_=1>
|
||||||
|
templated_instance_c = new MyComponent<float_=2.5>
|
||||||
|
templated_instance_d = new MyComponent<string_="hello">
|
||||||
|
templated_instance_e = new MyComponent<int_=1, float_=2.5, string_="hello">
|
||||||
|
templated_instance_f = new MyComponent<int_=1, float_=2.5, string_="hello", bool_=True>
|
||||||
|
|
||||||
|
# Semicolon separated instantiations (via assignment):
|
||||||
|
inst_a = new MyComponent; inst_b = new AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Traits ---
|
||||||
|
trait trait_name
|
||||||
|
trait trait_name<int_=1>
|
||||||
|
trait trait_name<float_=2.5>
|
||||||
|
trait trait_name<string_="hello">
|
||||||
|
trait trait_name<bool_=True>
|
||||||
|
trait trait_name::constructor
|
||||||
|
trait trait_name::constructor<int_=1>
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
trait TraitA; trait TraitB::constructor; trait TraitC<arg_=1>
|
||||||
|
|
||||||
|
# --- Assertions ---
|
||||||
|
assert x > 5V
|
||||||
|
assert x < 10V
|
||||||
|
assert 5V < x < 10V
|
||||||
|
assert x >= 5V
|
||||||
|
assert x <= 10V
|
||||||
|
assert current within 1A +/- 10mA
|
||||||
|
assert voltage within 1V +/- 10%
|
||||||
|
assert resistance is 1kohm to 1.1kohm
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
assert x is 1V; assert another_param is 2V
|
||||||
|
|
||||||
|
# --- Loops ---
|
||||||
|
for item in container:
|
||||||
|
item ~ p1
|
||||||
|
|
||||||
|
# For loop iterating over a slice
|
||||||
|
for item in container[0:4]:
|
||||||
|
pass
|
||||||
|
item.value = 1; pass
|
||||||
|
|
||||||
|
# For loop iterating over a list literal of field references
|
||||||
|
for ref in [p1, x.1, x.GND]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# --- References and Indexing ---
|
||||||
|
# Reference with array index assignment
|
||||||
|
array_element = container[3]
|
||||||
|
|
||||||
|
# --- Literals and Expressions ---
|
||||||
|
# Integer
|
||||||
|
int_val = 100
|
||||||
|
neg_int_val = -50
|
||||||
|
hex_val = 0xF1
|
||||||
|
bin_val = 0b10
|
||||||
|
oct_val = 0o10
|
||||||
|
# Float
|
||||||
|
float_val = 3.14
|
||||||
|
# Physical quantities
|
||||||
|
voltage: V = 5V
|
||||||
|
resistance: ohm = 10kohm
|
||||||
|
capacitance: F = 100nF
|
||||||
|
# Bilateral tolerance
|
||||||
|
tolerance_val = 1kohm +/- 10%
|
||||||
|
tolerance_abs = 5V +/- 500mV
|
||||||
|
tolerance_explicit_unit = 10A +/- 1A
|
||||||
|
# Bounded quantity (range)
|
||||||
|
voltage_range = 3V to 3.6V
|
||||||
|
# Boolean
|
||||||
|
is_enabled = True
|
||||||
|
is_active = False
|
||||||
|
# String
|
||||||
|
message = "Hello inside module"
|
||||||
|
|
||||||
|
# Arithmetic expressions
|
||||||
|
sum_val = 1 + 2
|
||||||
|
diff_val = 10 - 3ohm
|
||||||
|
prod_val = 5 * 2mA
|
||||||
|
div_val = 10V / 2kohm # Results in current
|
||||||
|
power_val = 2**3
|
||||||
|
complex_expr = (5 + 3) * 2 - 1
|
||||||
|
flag_check = state | MASK_VALUE
|
||||||
|
|
||||||
|
# Comparisons
|
||||||
|
assert voltage within voltage_range
|
||||||
|
assert length <= 5mm
|
||||||
|
assert height >= 2mm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --- Multi-line variations ---
|
||||||
|
pass; nested_var=1; another=2
|
||||||
|
|
||||||
|
complex_assignment = (
|
||||||
|
voltage + resistance
|
||||||
|
* capacitance
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## G4 Grammar
|
||||||
|
|
||||||
|
```g4
|
||||||
|
parser grammar AtoParser;
|
||||||
|
|
||||||
|
options {
|
||||||
|
superClass = AtoParserBase;
|
||||||
|
tokenVocab = AtoLexer;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_input: (NEWLINE | stmt)* EOF;
|
||||||
|
|
||||||
|
pragma_stmt: PRAGMA;
|
||||||
|
|
||||||
|
stmt: simple_stmts | compound_stmt | pragma_stmt;
|
||||||
|
simple_stmts:
|
||||||
|
simple_stmt (SEMI_COLON simple_stmt)* SEMI_COLON? NEWLINE;
|
||||||
|
simple_stmt:
|
||||||
|
import_stmt
|
||||||
|
| dep_import_stmt
|
||||||
|
| assign_stmt
|
||||||
|
| cum_assign_stmt
|
||||||
|
| set_assign_stmt
|
||||||
|
| connect_stmt
|
||||||
|
| directed_connect_stmt
|
||||||
|
| retype_stmt
|
||||||
|
| pin_declaration
|
||||||
|
| signaldef_stmt
|
||||||
|
| assert_stmt
|
||||||
|
| declaration_stmt
|
||||||
|
| string_stmt
|
||||||
|
| pass_stmt
|
||||||
|
| trait_stmt;
|
||||||
|
|
||||||
|
compound_stmt: blockdef | for_stmt;
|
||||||
|
|
||||||
|
blockdef: blocktype name blockdef_super? COLON block;
|
||||||
|
// TODO @v0.4 consider ()
|
||||||
|
blockdef_super: FROM type_reference;
|
||||||
|
// TODO @v0.4 consider removing component (or more explicit code-as-data)
|
||||||
|
blocktype: (COMPONENT | MODULE | INTERFACE);
|
||||||
|
block: simple_stmts | NEWLINE INDENT stmt+ DEDENT;
|
||||||
|
|
||||||
|
// TODO: @v0.4 remove the deprecated import form
|
||||||
|
dep_import_stmt: IMPORT type_reference FROM string;
|
||||||
|
import_stmt: (FROM string)? IMPORT type_reference (
|
||||||
|
COMMA type_reference
|
||||||
|
)*;
|
||||||
|
|
||||||
|
declaration_stmt: field_reference type_info;
|
||||||
|
field_reference_or_declaration:
|
||||||
|
field_reference
|
||||||
|
| declaration_stmt;
|
||||||
|
assign_stmt: field_reference_or_declaration '=' assignable;
|
||||||
|
cum_assign_stmt:
|
||||||
|
field_reference_or_declaration cum_operator cum_assignable;
|
||||||
|
// TODO: consider sets cum operator
|
||||||
|
set_assign_stmt:
|
||||||
|
field_reference_or_declaration (OR_ASSIGN | AND_ASSIGN) cum_assignable;
|
||||||
|
cum_operator: ADD_ASSIGN | SUB_ASSIGN;
|
||||||
|
cum_assignable: literal_physical | arithmetic_expression;
|
||||||
|
|
||||||
|
assignable:
|
||||||
|
string
|
||||||
|
| new_stmt
|
||||||
|
| literal_physical
|
||||||
|
| arithmetic_expression
|
||||||
|
| boolean_;
|
||||||
|
|
||||||
|
retype_stmt: field_reference ARROW type_reference;
|
||||||
|
|
||||||
|
directed_connect_stmt
|
||||||
|
: bridgeable ((SPERM | LSPERM) bridgeable)+; // only one type of SPERM per stmt allowed. both here for better error messages
|
||||||
|
connect_stmt: mif WIRE mif;
|
||||||
|
bridgeable: connectable;
|
||||||
|
mif: connectable;
|
||||||
|
connectable: field_reference | signaldef_stmt | pindef_stmt;
|
||||||
|
|
||||||
|
signaldef_stmt: SIGNAL name;
|
||||||
|
pindef_stmt: pin_stmt;
|
||||||
|
pin_declaration: pin_stmt;
|
||||||
|
pin_stmt: PIN (name | number_hint_natural | string);
|
||||||
|
|
||||||
|
new_stmt: NEW type_reference ('[' new_count ']')? template?;
|
||||||
|
new_count: number_hint_natural;
|
||||||
|
|
||||||
|
string_stmt:
|
||||||
|
string; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
pass_stmt:
|
||||||
|
PASS; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
list_literal_of_field_references:
|
||||||
|
'[' (field_reference (COMMA field_reference)* COMMA?)? ']';
|
||||||
|
|
||||||
|
iterable_references:
|
||||||
|
field_reference slice?
|
||||||
|
| list_literal_of_field_references;
|
||||||
|
|
||||||
|
for_stmt: FOR name IN iterable_references COLON block;
|
||||||
|
|
||||||
|
assert_stmt: ASSERT comparison;
|
||||||
|
|
||||||
|
trait_stmt
|
||||||
|
: TRAIT type_reference (DOUBLE_COLON constructor)? template?; // TODO: move namespacing to type_reference
|
||||||
|
constructor: name;
|
||||||
|
template: '<' (template_arg (COMMA template_arg)* COMMA?)? '>';
|
||||||
|
template_arg: name ASSIGN literal;
|
||||||
|
|
||||||
|
// Comparison operators --------------------
|
||||||
|
comparison: arithmetic_expression compare_op_pair+;
|
||||||
|
|
||||||
|
compare_op_pair:
|
||||||
|
lt_arithmetic_or
|
||||||
|
| gt_arithmetic_or
|
||||||
|
| lt_eq_arithmetic_or
|
||||||
|
| gt_eq_arithmetic_or
|
||||||
|
| in_arithmetic_or
|
||||||
|
| is_arithmetic_or;
|
||||||
|
|
||||||
|
lt_arithmetic_or: LESS_THAN arithmetic_expression;
|
||||||
|
gt_arithmetic_or: GREATER_THAN arithmetic_expression;
|
||||||
|
lt_eq_arithmetic_or: LT_EQ arithmetic_expression;
|
||||||
|
gt_eq_arithmetic_or: GT_EQ arithmetic_expression;
|
||||||
|
in_arithmetic_or: WITHIN arithmetic_expression;
|
||||||
|
is_arithmetic_or: IS arithmetic_expression;
|
||||||
|
|
||||||
|
// Arithmetic operators --------------------
|
||||||
|
|
||||||
|
arithmetic_expression:
|
||||||
|
arithmetic_expression (OR_OP | AND_OP) sum
|
||||||
|
| sum;
|
||||||
|
|
||||||
|
sum: sum (PLUS | MINUS) term | term;
|
||||||
|
|
||||||
|
term: term (STAR | DIV) power | power;
|
||||||
|
|
||||||
|
power: functional (POWER functional)?;
|
||||||
|
|
||||||
|
functional: bound | name '(' bound+ ')';
|
||||||
|
|
||||||
|
bound: atom;
|
||||||
|
|
||||||
|
// Primary elements ----------------
|
||||||
|
|
||||||
|
slice:
|
||||||
|
'[' (slice_start? COLON slice_stop? (COLON slice_step?)?)? ']'
|
||||||
|
// else [::step] wouldn't match
|
||||||
|
| '[' ( DOUBLE_COLON slice_step?) ']';
|
||||||
|
slice_start: number_hint_integer;
|
||||||
|
slice_stop: number_hint_integer;
|
||||||
|
slice_step: number_hint_integer;
|
||||||
|
|
||||||
|
atom: field_reference | literal_physical | arithmetic_group;
|
||||||
|
|
||||||
|
arithmetic_group: '(' arithmetic_expression ')';
|
||||||
|
|
||||||
|
literal_physical:
|
||||||
|
bound_quantity
|
||||||
|
| bilateral_quantity
|
||||||
|
| quantity;
|
||||||
|
|
||||||
|
bound_quantity: quantity TO quantity;
|
||||||
|
bilateral_quantity: quantity PLUS_OR_MINUS bilateral_tolerance;
|
||||||
|
quantity: number name?;
|
||||||
|
bilateral_tolerance: number_signless (PERCENT | name)?;
|
||||||
|
|
||||||
|
key: number_hint_integer;
|
||||||
|
array_index: '[' key ']';
|
||||||
|
|
||||||
|
// backwards compatibility for A.1
|
||||||
|
pin_reference_end: DOT number_hint_natural;
|
||||||
|
field_reference_part: name array_index?;
|
||||||
|
field_reference:
|
||||||
|
field_reference_part (DOT field_reference_part)* pin_reference_end?;
|
||||||
|
type_reference: name (DOT name)*;
|
||||||
|
// TODO better unit
|
||||||
|
unit: name;
|
||||||
|
type_info: COLON unit;
|
||||||
|
name: NAME;
|
||||||
|
|
||||||
|
// Literals
|
||||||
|
literal: string | boolean_ | number;
|
||||||
|
|
||||||
|
string: STRING;
|
||||||
|
boolean_: TRUE | FALSE;
|
||||||
|
number_hint_natural: number_signless;
|
||||||
|
number_hint_integer: number;
|
||||||
|
number: (PLUS | MINUS)? number_signless;
|
||||||
|
number_signless: NUMBER;
|
||||||
|
```
|
||||||
|
|
||||||
|
# Most used library modules/interfaces (api of them)
|
||||||
|
|
||||||
|
```ato
|
||||||
|
interface Electrical:
|
||||||
|
pass
|
||||||
|
|
||||||
|
interface ElectricPower:
|
||||||
|
hv = new Electrical
|
||||||
|
lv = new Electrical
|
||||||
|
|
||||||
|
module Resistor:
|
||||||
|
resistance: ohm
|
||||||
|
max_power: W
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
module Capacitor:
|
||||||
|
capacitance: F
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
interface I2C:
|
||||||
|
scl = new ElectricLogic
|
||||||
|
sda = new ElectricLogic
|
||||||
|
frequency: Hz
|
||||||
|
address: dimensionless
|
||||||
|
|
||||||
|
interface ElectricLogic:
|
||||||
|
line = new Electrical
|
||||||
|
reference = new ElectricPower
|
||||||
|
```
|
||||||
|
|
||||||
|
For the rest use the atopile MCP server
|
||||||
|
- `get_library_interfaces` to list interfaces
|
||||||
|
- `get_library_modules` to list modules
|
||||||
|
- `inspect_library_module_or_interface` to inspect the code
|
||||||
|
|
||||||
|
# Ato language features
|
||||||
|
|
||||||
|
## experimental features
|
||||||
|
|
||||||
|
Enable with `#pragma experiment("BRIDGE_CONNECT")`
|
||||||
|
BRIDGE_CONNECT: enables `p1 ~> resistor ~> p2` syntax
|
||||||
|
FOR_LOOP: enables `for item in container: pass` syntax
|
||||||
|
TRAITS: enables `trait trait_name` syntax
|
||||||
|
MODULE_TEMPLATING: enables `new MyComponent<param=literal>` syntax
|
||||||
|
|
||||||
|
## modules, interfaces, parameters, traits
|
||||||
|
|
||||||
|
A block is either a module, interface or component.
|
||||||
|
Components are just modules for code-as-data.
|
||||||
|
Interfaces describe a connectable interface (e.g Electrical, ElectricPower, I2C, etc).
|
||||||
|
A module is a block that can be instantiated.
|
||||||
|
Think of it as the ato equivalent of a class.
|
||||||
|
Parameters are variables for numbers and they work with constraints.
|
||||||
|
E.g `resistance: ohm` is a parameter.
|
||||||
|
Constrain with `assert resistance within 10kohm +/- 10%`.
|
||||||
|
It's very important to use toleranced values for parameters.
|
||||||
|
If you constrain a resistor.resistance to 10kohm there won't be a single part found because that's a tolerance of 0%.
|
||||||
|
|
||||||
|
Traits mark a module to have some kind of functionality that can be used in other modules.
|
||||||
|
E.g `trait has_designator_prefix` is the way to mark a module to have a specific designator prefix that will be used in the designator field in the footprint.
|
||||||
|
|
||||||
|
## connecting
|
||||||
|
|
||||||
|
You can only connect interfaces of the same type.
|
||||||
|
`resistor0.unnamed[0] ~ resistor0.unnamed[0]` is the way to connect two resistors in series.
|
||||||
|
If a module has the `can_bridge` trait you can use the sperm operator `~>` to bridge the module.
|
||||||
|
`led.anode ~> resistor ~> power.hv` connects the anode in series with the resistor and then the resistor in series with the high voltage power supply.
|
||||||
|
|
||||||
|
## for loop syntax
|
||||||
|
|
||||||
|
`for item in container: pass` is the way to iterate over a container.
|
||||||
|
|
||||||
|
# Ato CLI
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
You run ato commands through the MCP tool.
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
|
||||||
|
Packages can be found on the ato registry.
|
||||||
|
To install a package you need to run `ato add <PACKAGE_NAME>`.
|
||||||
|
e.g `ato install atopile/addressable-leds`
|
||||||
|
And then can be imported with `from "atopile/addressable-leds/sk6805-ec20.ato" import SK6805_EC20_driver`.
|
||||||
|
And used like this:
|
||||||
|
|
||||||
|
```ato
|
||||||
|
module MyModule:
|
||||||
|
led = new SK6805_EC20_driver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Footprints & Part picking
|
||||||
|
|
||||||
|
Footprint selection is done through the part choice (`ato create part` auto-generates ato code for the part).
|
||||||
|
The `pin` keyword is used to build footprint pinmaps so avoid using it outside of `component` blocks.
|
||||||
|
Preferrably use `Electrical` interface for electrical interfaces.
|
||||||
|
A lot of times it's actually `ElectricLogic` for things like GPIOs etc or `ElectricPower` for power supplies.
|
||||||
|
|
||||||
|
Passive modules (Resistors, Capacitors) are picked automatically by the constraints on their parameters.
|
||||||
|
To constrain the package do e.g `package = "0402"`.
|
||||||
|
To explictly pick a part for a module use `lcsc = "<LCSC_PART_NUMBER>"`.
|
||||||
|
|
||||||
|
|
||||||
|
# Creating a package
|
||||||
|
|
||||||
|
Package generation process:
|
||||||
|
|
||||||
|
Review structure of other pacakges.
|
||||||
|
|
||||||
|
1. Create new Directory in 'packages/packages' with naming convention '<vendor>-<device>' eg 'adi-adau145x'
|
||||||
|
2. create an ato.yaml file in the new directory with the following content:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
requires-atopile: '^0.9.0'
|
||||||
|
|
||||||
|
paths:
|
||||||
|
src: '.'
|
||||||
|
layout: ./layouts
|
||||||
|
|
||||||
|
builds:
|
||||||
|
default:
|
||||||
|
entry: <device>.ato:<device>_driver
|
||||||
|
example:
|
||||||
|
entry: <device>.ato:Example
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create part using tool call 'search_and_install_jlcpcb_part'
|
||||||
|
4. Import the part into the <device>.ato file
|
||||||
|
5. Read the datasheet for the device
|
||||||
|
6. Find common interfaces in the part eg I2C, I2S, SPI, Power
|
||||||
|
|
||||||
|
7. Create interfaces and connect them
|
||||||
|
|
||||||
|
power interfaces:
|
||||||
|
power*<name> = new ElectricPower
|
||||||
|
power*<name>.required = True # If critical to the device
|
||||||
|
assert power\*<name>.voltage within <minimum*operating_voltage>V to <maximum_operating_voltage>V
|
||||||
|
power*<name>.vcc ~ <device>.<vcc pin>
|
||||||
|
power\_<name>.gnd ~ <device>.<gnd pin>
|
||||||
|
|
||||||
|
i2c interfaces:
|
||||||
|
i2c = new I2C
|
||||||
|
i2c.scl.line ~ <device>.<i2c scl pin>
|
||||||
|
i2c.sda.line ~ <device>.<i2c sda pin>
|
||||||
|
|
||||||
|
spi interfaces:
|
||||||
|
spi = new SPI
|
||||||
|
spi.sclk.line ~ <device>.<spi sclk pin>
|
||||||
|
spi.mosi.line ~ <device>.<spi mosi pin>
|
||||||
|
spi.miso.line ~ <device>.<spi miso pin>
|
||||||
|
|
||||||
|
8. Add decoupling capacitors
|
||||||
|
|
||||||
|
looking at the datasheet, determine the required decoupling capacitors
|
||||||
|
|
||||||
|
eg: 2x 100nF 0402:
|
||||||
|
|
||||||
|
power_3v3 = new ElectricPower
|
||||||
|
|
||||||
|
# Decoupling power_3v3
|
||||||
|
|
||||||
|
power_3v3_caps = new Capacitor[2]
|
||||||
|
for capacitor in power_3v3_caps:
|
||||||
|
capacitor.capacitance = 100nF +/- 20%
|
||||||
|
capacitor.package = "0402"
|
||||||
|
power_3v3.hv ~> capacitor ~> power_3v3.lv
|
||||||
|
|
||||||
|
9. If device has pin configurable i2c addresses
|
||||||
|
|
||||||
|
If format is: <n x fixed address bits><m x pin configured address bits>
|
||||||
|
use addressor module:
|
||||||
|
|
||||||
|
- Use `Addressor<address_bits=N>` where **N = number of address pins**.
|
||||||
|
- Connect each `address_lines[i].line` to the corresponding pin, and its `.reference` to a local power rail.
|
||||||
|
- Set `addressor.base` to the lowest possible address and `assert addressor.address is i2c.address`.
|
||||||
|
|
||||||
|
10. Create a README.md
|
||||||
|
|
||||||
|
# <Manufacturer> <Manufacturer part number> <Short description>
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ato
|
||||||
|
<copy in example>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions to this package are welcome via pull requests on the GitHub repository.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This atopile package is provided under the [MIT License](https://opensource.org/license/mit/).
|
||||||
|
|
||||||
|
11. Connect high level interfaces directly in example:
|
||||||
|
|
||||||
|
eg:
|
||||||
|
|
||||||
|
i2c = new I2C
|
||||||
|
power = new ElectricPower
|
||||||
|
sensor = new Sensor
|
||||||
|
|
||||||
|
i2c ~ sensor.i2c
|
||||||
|
power ~ sensor.power_3v3
|
||||||
|
|
||||||
|
# Additional Notes & Gotchas (generic)
|
||||||
|
|
||||||
|
- Multi-rail devices (VDD / VDDIO, AVDD / DVDD, etc.)
|
||||||
|
|
||||||
|
- Model separate `ElectricPower` interfaces for each rail (e.g. `power_core`, `power_io`).
|
||||||
|
- Mark each `.required = True` if the device cannot function without it, and add voltage assertions per datasheet.
|
||||||
|
|
||||||
|
- Optional interfaces (SPI vs I²C)
|
||||||
|
|
||||||
|
- If the device supports multiple buses, pick one for the initial driver. Leave unused bus pins as `ElectricLogic` lines or expose a second interface module later.
|
||||||
|
|
||||||
|
- Decoupling guidance
|
||||||
|
|
||||||
|
- If the datasheet shows multiple caps, model the **minimum required** set so the build passes; you can refine values/packages later.
|
||||||
|
|
||||||
|
- File / directory layout recap
|
||||||
|
- `<vendor>-<device>/` – package root
|
||||||
|
- `ato.yaml` – build manifest (include `default` **and** `example` targets)
|
||||||
|
- `<device>.ato` – driver + optional example module
|
||||||
|
- `parts/<MANUFACTURER_PARTNO>/` – atomic part + footprint/symbol/step files
|
||||||
|
|
||||||
|
These tips should prevent common "footprint not found", "pin X missing", and build-time path errors when you add new devices.
|
||||||
|
|
||||||
|
|
||||||
|
# Vibe coding a project
|
||||||
|
|
||||||
|
If the user gives you high level description of the project, use the following guide:
|
||||||
|
|
||||||
|
# How LLMs can design electronics:
|
||||||
|
|
||||||
|
#1 Rule: USE THE TOOLS. If the tools dont work, dont freak out, you are probably using them wrong. Ask for help if you get stuck.
|
||||||
|
|
||||||
|
Top level design
|
||||||
|
|
||||||
|
1. Research available packages relevant to the user requests using 'find_packages'
|
||||||
|
2. Inspect promising packages using 'inspect_package'
|
||||||
|
3. Propose packages to use for project and architucture to user, revise if needed
|
||||||
|
4. Install needed packages using 'install_package'
|
||||||
|
5. Import packages into main file
|
||||||
|
6. Create instances of packages in main module
|
||||||
|
|
||||||
|
## Power
|
||||||
|
|
||||||
|
1. Review for each package the required voltage and current (current may not be provided, use judement if nessesary)
|
||||||
|
2. Determine the power rails that need to be generated and a suitable tollerance (typically ~3-5% is acceptable)
|
||||||
|
3. Determine the input power source, typically a battery, USB connector or other power connector (eg XT30) and install relevant package
|
||||||
|
4. Find suitable regulators:
|
||||||
|
a) if input voltage > required voltage and current is low, use an LDO package
|
||||||
|
b) if input voltage > required voltage and current is high, use buck converter
|
||||||
|
c) if input votlage < required voltage, use a boost converter
|
||||||
|
d) if input voltage can be both less than or greater than input voltage, use buck boost (eg battery powered device that needs 3v3)
|
||||||
|
5. If battery powered, add charger package
|
||||||
|
|
||||||
|
Typical power architucture example with LDO:
|
||||||
|
|
||||||
|
- USB input power
|
||||||
|
- Low current output (eg microcontroller)
|
||||||
|
|
||||||
|
from "atopile/ti-tlv75901/ti-tlv75901.ato" import TLV75901_driver
|
||||||
|
from "atopile/usb-connectors/usb-connectors.ato" import USBCConn
|
||||||
|
|
||||||
|
module App:
|
||||||
|
|
||||||
|
# Rails
|
||||||
|
power_5v = new Power
|
||||||
|
power_3v3 = new Power
|
||||||
|
|
||||||
|
# Components
|
||||||
|
ldo = new TLV75901_driver
|
||||||
|
usb_connector = new USBCConn
|
||||||
|
|
||||||
|
# Connections
|
||||||
|
usb_connector.power ~ power_vbus
|
||||||
|
power_vbus ~> ldo ~> power_3v3
|
||||||
|
|
||||||
|
## Communicaions
|
||||||
|
|
||||||
|
1. Review packages required interfaces, typically i2c, spi or ElectricLogics
|
||||||
|
2. Find suitable pins on the controller, typically a microcontroller or Linux SOC
|
||||||
|
3. Connect interfaces eg micro.i2c[0] ~ sensor.i2c
|
||||||
|
|
||||||
|
## Development process notes
|
||||||
|
|
||||||
|
- After making changes, be sure to use 'build_project' to update the PCB
|
||||||
|
- Builds will often generate errors/warnings, these should be reviewed and fixed
|
||||||
|
- Prioritize pacakges from 'atopile' over other packages
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"atopile": {
|
||||||
|
"command": "/home/martin/.config/Code/User/globalStorage/atopile.atopile/uv-bin/uv",
|
||||||
|
"args": [
|
||||||
|
"tool",
|
||||||
|
"run",
|
||||||
|
"-p",
|
||||||
|
"3.13",
|
||||||
|
"--from",
|
||||||
|
"atopile",
|
||||||
|
"ato",
|
||||||
|
"mcp",
|
||||||
|
"start",
|
||||||
|
"--no-http"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,713 @@
|
|||||||
|
---
|
||||||
|
description: ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
applyTo: *.ato, ato.yaml
|
||||||
|
---
|
||||||
|
|
||||||
|
ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
It is part of the atopile project.
|
||||||
|
Atopile is run by the vscode/cursor/windsurf extension.
|
||||||
|
The CLI (which is invoked by the extension) actually builds the project.
|
||||||
|
|
||||||
|
# Not available in ato
|
||||||
|
|
||||||
|
- if statements
|
||||||
|
- while loops
|
||||||
|
- functions (calls or definitions)
|
||||||
|
- classes
|
||||||
|
- objects
|
||||||
|
- exceptions
|
||||||
|
- generators
|
||||||
|
|
||||||
|
|
||||||
|
# Ato Syntax
|
||||||
|
|
||||||
|
ato sytax is heavily inspired by Python, but fully declarative.
|
||||||
|
ato thus has no procedural code, and no side effects.
|
||||||
|
|
||||||
|
## Examples of syntax
|
||||||
|
|
||||||
|
```ato
|
||||||
|
#pragma text
|
||||||
|
#pragma func("X")
|
||||||
|
# enable for loop syntax feature:
|
||||||
|
#pragma experiment("FOR_LOOP)
|
||||||
|
|
||||||
|
# --- Imports ---
|
||||||
|
# Standard import (newline terminated)
|
||||||
|
import ModuleName
|
||||||
|
|
||||||
|
# Import with multiple modules (newline terminated)
|
||||||
|
import Module1, Module2.Submodule
|
||||||
|
|
||||||
|
# Import from a specific file/source (newline terminated)
|
||||||
|
from "path/to/source.ato" import SpecificModule
|
||||||
|
|
||||||
|
# Multiple imports on one line (semicolon separated)
|
||||||
|
import AnotherModule; from "another/source.ato" import AnotherSpecific
|
||||||
|
|
||||||
|
# Deprecated import form (newline terminated)
|
||||||
|
# TODO: remove when unsupported
|
||||||
|
import DeprecatedModule from "other/source.ato"
|
||||||
|
|
||||||
|
# --- Top-level Definitions and Statements ---
|
||||||
|
|
||||||
|
pass
|
||||||
|
pass;
|
||||||
|
|
||||||
|
"docstring-like statement"
|
||||||
|
"docstring-like statement";
|
||||||
|
|
||||||
|
top_level_var = 123
|
||||||
|
|
||||||
|
# Compound statement
|
||||||
|
pass; another_var = 456; "another docstring"
|
||||||
|
|
||||||
|
# Block definitions
|
||||||
|
component MyComponent:
|
||||||
|
# Simple statement inside block (newline terminated)
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Multiple simple statements on one line (semicolon separated)
|
||||||
|
pass; internal_flag = True
|
||||||
|
|
||||||
|
module AnotherBaseModule:
|
||||||
|
pin base_pin
|
||||||
|
base_param = 10
|
||||||
|
|
||||||
|
interface MyInterface:
|
||||||
|
pin io
|
||||||
|
|
||||||
|
module DemoModule from AnotherBaseModule:
|
||||||
|
# --- Declarations ---
|
||||||
|
pin p1 # Pin declaration with name
|
||||||
|
pin 1 # Pin declaration with number
|
||||||
|
pin "GND" # Pin declaration with string
|
||||||
|
signal my_signal # Signal definition
|
||||||
|
a_field: AnotherBaseModule # Field declaration with type hint
|
||||||
|
|
||||||
|
# --- Assignments ---
|
||||||
|
# Newline terminated:
|
||||||
|
internal_variable = 123
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
var_a = 1; var_b = "string"
|
||||||
|
|
||||||
|
# Cumulative assignment (+=, -=) - Newline terminated
|
||||||
|
value = 1
|
||||||
|
value += 1; value -= 1
|
||||||
|
|
||||||
|
# Set assignment (|=, &=) - Newline terminated
|
||||||
|
flags |= 1; flags &= 2
|
||||||
|
|
||||||
|
# --- Connections ---
|
||||||
|
p1 ~ base_pin
|
||||||
|
mif ~> bridge
|
||||||
|
mif ~> bridge ~> bridge
|
||||||
|
mif ~> bridge ~> bridge ~> mif
|
||||||
|
bridge ~> mif
|
||||||
|
mif <~ bridge
|
||||||
|
mif <~ bridge <~ bridge
|
||||||
|
mif <~ bridge <~ bridge <~ mif
|
||||||
|
bridge <~ mif
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
p_multi1 ~ my_signal; p_multi2 ~ sig_multi1
|
||||||
|
|
||||||
|
# --- Retyping ---
|
||||||
|
instance.x -> AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Instantiation ---
|
||||||
|
instance = new MyComponent
|
||||||
|
container = new MyComponent[10]
|
||||||
|
templated_instance_a = new MyComponent
|
||||||
|
templated_instance_b = new MyComponent<int_=1>
|
||||||
|
templated_instance_c = new MyComponent<float_=2.5>
|
||||||
|
templated_instance_d = new MyComponent<string_="hello">
|
||||||
|
templated_instance_e = new MyComponent<int_=1, float_=2.5, string_="hello">
|
||||||
|
templated_instance_f = new MyComponent<int_=1, float_=2.5, string_="hello", bool_=True>
|
||||||
|
|
||||||
|
# Semicolon separated instantiations (via assignment):
|
||||||
|
inst_a = new MyComponent; inst_b = new AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Traits ---
|
||||||
|
trait trait_name
|
||||||
|
trait trait_name<int_=1>
|
||||||
|
trait trait_name<float_=2.5>
|
||||||
|
trait trait_name<string_="hello">
|
||||||
|
trait trait_name<bool_=True>
|
||||||
|
trait trait_name::constructor
|
||||||
|
trait trait_name::constructor<int_=1>
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
trait TraitA; trait TraitB::constructor; trait TraitC<arg_=1>
|
||||||
|
|
||||||
|
# --- Assertions ---
|
||||||
|
assert x > 5V
|
||||||
|
assert x < 10V
|
||||||
|
assert 5V < x < 10V
|
||||||
|
assert x >= 5V
|
||||||
|
assert x <= 10V
|
||||||
|
assert current within 1A +/- 10mA
|
||||||
|
assert voltage within 1V +/- 10%
|
||||||
|
assert resistance is 1kohm to 1.1kohm
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
assert x is 1V; assert another_param is 2V
|
||||||
|
|
||||||
|
# --- Loops ---
|
||||||
|
for item in container:
|
||||||
|
item ~ p1
|
||||||
|
|
||||||
|
# For loop iterating over a slice
|
||||||
|
for item in container[0:4]:
|
||||||
|
pass
|
||||||
|
item.value = 1; pass
|
||||||
|
|
||||||
|
# For loop iterating over a list literal of field references
|
||||||
|
for ref in [p1, x.1, x.GND]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# --- References and Indexing ---
|
||||||
|
# Reference with array index assignment
|
||||||
|
array_element = container[3]
|
||||||
|
|
||||||
|
# --- Literals and Expressions ---
|
||||||
|
# Integer
|
||||||
|
int_val = 100
|
||||||
|
neg_int_val = -50
|
||||||
|
hex_val = 0xF1
|
||||||
|
bin_val = 0b10
|
||||||
|
oct_val = 0o10
|
||||||
|
# Float
|
||||||
|
float_val = 3.14
|
||||||
|
# Physical quantities
|
||||||
|
voltage: V = 5V
|
||||||
|
resistance: ohm = 10kohm
|
||||||
|
capacitance: F = 100nF
|
||||||
|
# Bilateral tolerance
|
||||||
|
tolerance_val = 1kohm +/- 10%
|
||||||
|
tolerance_abs = 5V +/- 500mV
|
||||||
|
tolerance_explicit_unit = 10A +/- 1A
|
||||||
|
# Bounded quantity (range)
|
||||||
|
voltage_range = 3V to 3.6V
|
||||||
|
# Boolean
|
||||||
|
is_enabled = True
|
||||||
|
is_active = False
|
||||||
|
# String
|
||||||
|
message = "Hello inside module"
|
||||||
|
|
||||||
|
# Arithmetic expressions
|
||||||
|
sum_val = 1 + 2
|
||||||
|
diff_val = 10 - 3ohm
|
||||||
|
prod_val = 5 * 2mA
|
||||||
|
div_val = 10V / 2kohm # Results in current
|
||||||
|
power_val = 2**3
|
||||||
|
complex_expr = (5 + 3) * 2 - 1
|
||||||
|
flag_check = state | MASK_VALUE
|
||||||
|
|
||||||
|
# Comparisons
|
||||||
|
assert voltage within voltage_range
|
||||||
|
assert length <= 5mm
|
||||||
|
assert height >= 2mm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --- Multi-line variations ---
|
||||||
|
pass; nested_var=1; another=2
|
||||||
|
|
||||||
|
complex_assignment = (
|
||||||
|
voltage + resistance
|
||||||
|
* capacitance
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## G4 Grammar
|
||||||
|
|
||||||
|
```g4
|
||||||
|
parser grammar AtoParser;
|
||||||
|
|
||||||
|
options {
|
||||||
|
superClass = AtoParserBase;
|
||||||
|
tokenVocab = AtoLexer;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_input: (NEWLINE | stmt)* EOF;
|
||||||
|
|
||||||
|
pragma_stmt: PRAGMA;
|
||||||
|
|
||||||
|
stmt: simple_stmts | compound_stmt | pragma_stmt;
|
||||||
|
simple_stmts:
|
||||||
|
simple_stmt (SEMI_COLON simple_stmt)* SEMI_COLON? NEWLINE;
|
||||||
|
simple_stmt:
|
||||||
|
import_stmt
|
||||||
|
| dep_import_stmt
|
||||||
|
| assign_stmt
|
||||||
|
| cum_assign_stmt
|
||||||
|
| set_assign_stmt
|
||||||
|
| connect_stmt
|
||||||
|
| directed_connect_stmt
|
||||||
|
| retype_stmt
|
||||||
|
| pin_declaration
|
||||||
|
| signaldef_stmt
|
||||||
|
| assert_stmt
|
||||||
|
| declaration_stmt
|
||||||
|
| string_stmt
|
||||||
|
| pass_stmt
|
||||||
|
| trait_stmt;
|
||||||
|
|
||||||
|
compound_stmt: blockdef | for_stmt;
|
||||||
|
|
||||||
|
blockdef: blocktype name blockdef_super? COLON block;
|
||||||
|
// TODO @v0.4 consider ()
|
||||||
|
blockdef_super: FROM type_reference;
|
||||||
|
// TODO @v0.4 consider removing component (or more explicit code-as-data)
|
||||||
|
blocktype: (COMPONENT | MODULE | INTERFACE);
|
||||||
|
block: simple_stmts | NEWLINE INDENT stmt+ DEDENT;
|
||||||
|
|
||||||
|
// TODO: @v0.4 remove the deprecated import form
|
||||||
|
dep_import_stmt: IMPORT type_reference FROM string;
|
||||||
|
import_stmt: (FROM string)? IMPORT type_reference (
|
||||||
|
COMMA type_reference
|
||||||
|
)*;
|
||||||
|
|
||||||
|
declaration_stmt: field_reference type_info;
|
||||||
|
field_reference_or_declaration:
|
||||||
|
field_reference
|
||||||
|
| declaration_stmt;
|
||||||
|
assign_stmt: field_reference_or_declaration '=' assignable;
|
||||||
|
cum_assign_stmt:
|
||||||
|
field_reference_or_declaration cum_operator cum_assignable;
|
||||||
|
// TODO: consider sets cum operator
|
||||||
|
set_assign_stmt:
|
||||||
|
field_reference_or_declaration (OR_ASSIGN | AND_ASSIGN) cum_assignable;
|
||||||
|
cum_operator: ADD_ASSIGN | SUB_ASSIGN;
|
||||||
|
cum_assignable: literal_physical | arithmetic_expression;
|
||||||
|
|
||||||
|
assignable:
|
||||||
|
string
|
||||||
|
| new_stmt
|
||||||
|
| literal_physical
|
||||||
|
| arithmetic_expression
|
||||||
|
| boolean_;
|
||||||
|
|
||||||
|
retype_stmt: field_reference ARROW type_reference;
|
||||||
|
|
||||||
|
directed_connect_stmt
|
||||||
|
: bridgeable ((SPERM | LSPERM) bridgeable)+; // only one type of SPERM per stmt allowed. both here for better error messages
|
||||||
|
connect_stmt: mif WIRE mif;
|
||||||
|
bridgeable: connectable;
|
||||||
|
mif: connectable;
|
||||||
|
connectable: field_reference | signaldef_stmt | pindef_stmt;
|
||||||
|
|
||||||
|
signaldef_stmt: SIGNAL name;
|
||||||
|
pindef_stmt: pin_stmt;
|
||||||
|
pin_declaration: pin_stmt;
|
||||||
|
pin_stmt: PIN (name | number_hint_natural | string);
|
||||||
|
|
||||||
|
new_stmt: NEW type_reference ('[' new_count ']')? template?;
|
||||||
|
new_count: number_hint_natural;
|
||||||
|
|
||||||
|
string_stmt:
|
||||||
|
string; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
pass_stmt:
|
||||||
|
PASS; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
list_literal_of_field_references:
|
||||||
|
'[' (field_reference (COMMA field_reference)* COMMA?)? ']';
|
||||||
|
|
||||||
|
iterable_references:
|
||||||
|
field_reference slice?
|
||||||
|
| list_literal_of_field_references;
|
||||||
|
|
||||||
|
for_stmt: FOR name IN iterable_references COLON block;
|
||||||
|
|
||||||
|
assert_stmt: ASSERT comparison;
|
||||||
|
|
||||||
|
trait_stmt
|
||||||
|
: TRAIT type_reference (DOUBLE_COLON constructor)? template?; // TODO: move namespacing to type_reference
|
||||||
|
constructor: name;
|
||||||
|
template: '<' (template_arg (COMMA template_arg)* COMMA?)? '>';
|
||||||
|
template_arg: name ASSIGN literal;
|
||||||
|
|
||||||
|
// Comparison operators --------------------
|
||||||
|
comparison: arithmetic_expression compare_op_pair+;
|
||||||
|
|
||||||
|
compare_op_pair:
|
||||||
|
lt_arithmetic_or
|
||||||
|
| gt_arithmetic_or
|
||||||
|
| lt_eq_arithmetic_or
|
||||||
|
| gt_eq_arithmetic_or
|
||||||
|
| in_arithmetic_or
|
||||||
|
| is_arithmetic_or;
|
||||||
|
|
||||||
|
lt_arithmetic_or: LESS_THAN arithmetic_expression;
|
||||||
|
gt_arithmetic_or: GREATER_THAN arithmetic_expression;
|
||||||
|
lt_eq_arithmetic_or: LT_EQ arithmetic_expression;
|
||||||
|
gt_eq_arithmetic_or: GT_EQ arithmetic_expression;
|
||||||
|
in_arithmetic_or: WITHIN arithmetic_expression;
|
||||||
|
is_arithmetic_or: IS arithmetic_expression;
|
||||||
|
|
||||||
|
// Arithmetic operators --------------------
|
||||||
|
|
||||||
|
arithmetic_expression:
|
||||||
|
arithmetic_expression (OR_OP | AND_OP) sum
|
||||||
|
| sum;
|
||||||
|
|
||||||
|
sum: sum (PLUS | MINUS) term | term;
|
||||||
|
|
||||||
|
term: term (STAR | DIV) power | power;
|
||||||
|
|
||||||
|
power: functional (POWER functional)?;
|
||||||
|
|
||||||
|
functional: bound | name '(' bound+ ')';
|
||||||
|
|
||||||
|
bound: atom;
|
||||||
|
|
||||||
|
// Primary elements ----------------
|
||||||
|
|
||||||
|
slice:
|
||||||
|
'[' (slice_start? COLON slice_stop? (COLON slice_step?)?)? ']'
|
||||||
|
// else [::step] wouldn't match
|
||||||
|
| '[' ( DOUBLE_COLON slice_step?) ']';
|
||||||
|
slice_start: number_hint_integer;
|
||||||
|
slice_stop: number_hint_integer;
|
||||||
|
slice_step: number_hint_integer;
|
||||||
|
|
||||||
|
atom: field_reference | literal_physical | arithmetic_group;
|
||||||
|
|
||||||
|
arithmetic_group: '(' arithmetic_expression ')';
|
||||||
|
|
||||||
|
literal_physical:
|
||||||
|
bound_quantity
|
||||||
|
| bilateral_quantity
|
||||||
|
| quantity;
|
||||||
|
|
||||||
|
bound_quantity: quantity TO quantity;
|
||||||
|
bilateral_quantity: quantity PLUS_OR_MINUS bilateral_tolerance;
|
||||||
|
quantity: number name?;
|
||||||
|
bilateral_tolerance: number_signless (PERCENT | name)?;
|
||||||
|
|
||||||
|
key: number_hint_integer;
|
||||||
|
array_index: '[' key ']';
|
||||||
|
|
||||||
|
// backwards compatibility for A.1
|
||||||
|
pin_reference_end: DOT number_hint_natural;
|
||||||
|
field_reference_part: name array_index?;
|
||||||
|
field_reference:
|
||||||
|
field_reference_part (DOT field_reference_part)* pin_reference_end?;
|
||||||
|
type_reference: name (DOT name)*;
|
||||||
|
// TODO better unit
|
||||||
|
unit: name;
|
||||||
|
type_info: COLON unit;
|
||||||
|
name: NAME;
|
||||||
|
|
||||||
|
// Literals
|
||||||
|
literal: string | boolean_ | number;
|
||||||
|
|
||||||
|
string: STRING;
|
||||||
|
boolean_: TRUE | FALSE;
|
||||||
|
number_hint_natural: number_signless;
|
||||||
|
number_hint_integer: number;
|
||||||
|
number: (PLUS | MINUS)? number_signless;
|
||||||
|
number_signless: NUMBER;
|
||||||
|
```
|
||||||
|
|
||||||
|
# Most used library modules/interfaces (api of them)
|
||||||
|
|
||||||
|
```ato
|
||||||
|
interface Electrical:
|
||||||
|
pass
|
||||||
|
|
||||||
|
interface ElectricPower:
|
||||||
|
hv = new Electrical
|
||||||
|
lv = new Electrical
|
||||||
|
|
||||||
|
module Resistor:
|
||||||
|
resistance: ohm
|
||||||
|
max_power: W
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
module Capacitor:
|
||||||
|
capacitance: F
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
interface I2C:
|
||||||
|
scl = new ElectricLogic
|
||||||
|
sda = new ElectricLogic
|
||||||
|
frequency: Hz
|
||||||
|
address: dimensionless
|
||||||
|
|
||||||
|
interface ElectricLogic:
|
||||||
|
line = new Electrical
|
||||||
|
reference = new ElectricPower
|
||||||
|
```
|
||||||
|
|
||||||
|
For the rest use the atopile MCP server
|
||||||
|
- `get_library_interfaces` to list interfaces
|
||||||
|
- `get_library_modules` to list modules
|
||||||
|
- `inspect_library_module_or_interface` to inspect the code
|
||||||
|
|
||||||
|
# Ato language features
|
||||||
|
|
||||||
|
## experimental features
|
||||||
|
|
||||||
|
Enable with `#pragma experiment("BRIDGE_CONNECT")`
|
||||||
|
BRIDGE_CONNECT: enables `p1 ~> resistor ~> p2` syntax
|
||||||
|
FOR_LOOP: enables `for item in container: pass` syntax
|
||||||
|
TRAITS: enables `trait trait_name` syntax
|
||||||
|
MODULE_TEMPLATING: enables `new MyComponent<param=literal>` syntax
|
||||||
|
|
||||||
|
## modules, interfaces, parameters, traits
|
||||||
|
|
||||||
|
A block is either a module, interface or component.
|
||||||
|
Components are just modules for code-as-data.
|
||||||
|
Interfaces describe a connectable interface (e.g Electrical, ElectricPower, I2C, etc).
|
||||||
|
A module is a block that can be instantiated.
|
||||||
|
Think of it as the ato equivalent of a class.
|
||||||
|
Parameters are variables for numbers and they work with constraints.
|
||||||
|
E.g `resistance: ohm` is a parameter.
|
||||||
|
Constrain with `assert resistance within 10kohm +/- 10%`.
|
||||||
|
It's very important to use toleranced values for parameters.
|
||||||
|
If you constrain a resistor.resistance to 10kohm there won't be a single part found because that's a tolerance of 0%.
|
||||||
|
|
||||||
|
Traits mark a module to have some kind of functionality that can be used in other modules.
|
||||||
|
E.g `trait has_designator_prefix` is the way to mark a module to have a specific designator prefix that will be used in the designator field in the footprint.
|
||||||
|
|
||||||
|
## connecting
|
||||||
|
|
||||||
|
You can only connect interfaces of the same type.
|
||||||
|
`resistor0.unnamed[0] ~ resistor0.unnamed[0]` is the way to connect two resistors in series.
|
||||||
|
If a module has the `can_bridge` trait you can use the sperm operator `~>` to bridge the module.
|
||||||
|
`led.anode ~> resistor ~> power.hv` connects the anode in series with the resistor and then the resistor in series with the high voltage power supply.
|
||||||
|
|
||||||
|
## for loop syntax
|
||||||
|
|
||||||
|
`for item in container: pass` is the way to iterate over a container.
|
||||||
|
|
||||||
|
# Ato CLI
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
You run ato commands through the MCP tool.
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
|
||||||
|
Packages can be found on the ato registry.
|
||||||
|
To install a package you need to run `ato add <PACKAGE_NAME>`.
|
||||||
|
e.g `ato install atopile/addressable-leds`
|
||||||
|
And then can be imported with `from "atopile/addressable-leds/sk6805-ec20.ato" import SK6805_EC20_driver`.
|
||||||
|
And used like this:
|
||||||
|
|
||||||
|
```ato
|
||||||
|
module MyModule:
|
||||||
|
led = new SK6805_EC20_driver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Footprints & Part picking
|
||||||
|
|
||||||
|
Footprint selection is done through the part choice (`ato create part` auto-generates ato code for the part).
|
||||||
|
The `pin` keyword is used to build footprint pinmaps so avoid using it outside of `component` blocks.
|
||||||
|
Preferrably use `Electrical` interface for electrical interfaces.
|
||||||
|
A lot of times it's actually `ElectricLogic` for things like GPIOs etc or `ElectricPower` for power supplies.
|
||||||
|
|
||||||
|
Passive modules (Resistors, Capacitors) are picked automatically by the constraints on their parameters.
|
||||||
|
To constrain the package do e.g `package = "0402"`.
|
||||||
|
To explictly pick a part for a module use `lcsc = "<LCSC_PART_NUMBER>"`.
|
||||||
|
|
||||||
|
|
||||||
|
# Creating a package
|
||||||
|
|
||||||
|
Package generation process:
|
||||||
|
|
||||||
|
Review structure of other pacakges.
|
||||||
|
|
||||||
|
1. Create new Directory in 'packages/packages' with naming convention '<vendor>-<device>' eg 'adi-adau145x'
|
||||||
|
2. create an ato.yaml file in the new directory with the following content:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
requires-atopile: '^0.9.0'
|
||||||
|
|
||||||
|
paths:
|
||||||
|
src: '.'
|
||||||
|
layout: ./layouts
|
||||||
|
|
||||||
|
builds:
|
||||||
|
default:
|
||||||
|
entry: <device>.ato:<device>_driver
|
||||||
|
example:
|
||||||
|
entry: <device>.ato:Example
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create part using tool call 'search_and_install_jlcpcb_part'
|
||||||
|
4. Import the part into the <device>.ato file
|
||||||
|
5. Read the datasheet for the device
|
||||||
|
6. Find common interfaces in the part eg I2C, I2S, SPI, Power
|
||||||
|
|
||||||
|
7. Create interfaces and connect them
|
||||||
|
|
||||||
|
power interfaces:
|
||||||
|
power*<name> = new ElectricPower
|
||||||
|
power*<name>.required = True # If critical to the device
|
||||||
|
assert power\*<name>.voltage within <minimum*operating_voltage>V to <maximum_operating_voltage>V
|
||||||
|
power*<name>.vcc ~ <device>.<vcc pin>
|
||||||
|
power\_<name>.gnd ~ <device>.<gnd pin>
|
||||||
|
|
||||||
|
i2c interfaces:
|
||||||
|
i2c = new I2C
|
||||||
|
i2c.scl.line ~ <device>.<i2c scl pin>
|
||||||
|
i2c.sda.line ~ <device>.<i2c sda pin>
|
||||||
|
|
||||||
|
spi interfaces:
|
||||||
|
spi = new SPI
|
||||||
|
spi.sclk.line ~ <device>.<spi sclk pin>
|
||||||
|
spi.mosi.line ~ <device>.<spi mosi pin>
|
||||||
|
spi.miso.line ~ <device>.<spi miso pin>
|
||||||
|
|
||||||
|
8. Add decoupling capacitors
|
||||||
|
|
||||||
|
looking at the datasheet, determine the required decoupling capacitors
|
||||||
|
|
||||||
|
eg: 2x 100nF 0402:
|
||||||
|
|
||||||
|
power_3v3 = new ElectricPower
|
||||||
|
|
||||||
|
# Decoupling power_3v3
|
||||||
|
|
||||||
|
power_3v3_caps = new Capacitor[2]
|
||||||
|
for capacitor in power_3v3_caps:
|
||||||
|
capacitor.capacitance = 100nF +/- 20%
|
||||||
|
capacitor.package = "0402"
|
||||||
|
power_3v3.hv ~> capacitor ~> power_3v3.lv
|
||||||
|
|
||||||
|
9. If device has pin configurable i2c addresses
|
||||||
|
|
||||||
|
If format is: <n x fixed address bits><m x pin configured address bits>
|
||||||
|
use addressor module:
|
||||||
|
|
||||||
|
- Use `Addressor<address_bits=N>` where **N = number of address pins**.
|
||||||
|
- Connect each `address_lines[i].line` to the corresponding pin, and its `.reference` to a local power rail.
|
||||||
|
- Set `addressor.base` to the lowest possible address and `assert addressor.address is i2c.address`.
|
||||||
|
|
||||||
|
10. Create a README.md
|
||||||
|
|
||||||
|
# <Manufacturer> <Manufacturer part number> <Short description>
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ato
|
||||||
|
<copy in example>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions to this package are welcome via pull requests on the GitHub repository.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This atopile package is provided under the [MIT License](https://opensource.org/license/mit/).
|
||||||
|
|
||||||
|
11. Connect high level interfaces directly in example:
|
||||||
|
|
||||||
|
eg:
|
||||||
|
|
||||||
|
i2c = new I2C
|
||||||
|
power = new ElectricPower
|
||||||
|
sensor = new Sensor
|
||||||
|
|
||||||
|
i2c ~ sensor.i2c
|
||||||
|
power ~ sensor.power_3v3
|
||||||
|
|
||||||
|
# Additional Notes & Gotchas (generic)
|
||||||
|
|
||||||
|
- Multi-rail devices (VDD / VDDIO, AVDD / DVDD, etc.)
|
||||||
|
|
||||||
|
- Model separate `ElectricPower` interfaces for each rail (e.g. `power_core`, `power_io`).
|
||||||
|
- Mark each `.required = True` if the device cannot function without it, and add voltage assertions per datasheet.
|
||||||
|
|
||||||
|
- Optional interfaces (SPI vs I²C)
|
||||||
|
|
||||||
|
- If the device supports multiple buses, pick one for the initial driver. Leave unused bus pins as `ElectricLogic` lines or expose a second interface module later.
|
||||||
|
|
||||||
|
- Decoupling guidance
|
||||||
|
|
||||||
|
- If the datasheet shows multiple caps, model the **minimum required** set so the build passes; you can refine values/packages later.
|
||||||
|
|
||||||
|
- File / directory layout recap
|
||||||
|
- `<vendor>-<device>/` – package root
|
||||||
|
- `ato.yaml` – build manifest (include `default` **and** `example` targets)
|
||||||
|
- `<device>.ato` – driver + optional example module
|
||||||
|
- `parts/<MANUFACTURER_PARTNO>/` – atomic part + footprint/symbol/step files
|
||||||
|
|
||||||
|
These tips should prevent common "footprint not found", "pin X missing", and build-time path errors when you add new devices.
|
||||||
|
|
||||||
|
|
||||||
|
# Vibe coding a project
|
||||||
|
|
||||||
|
If the user gives you high level description of the project, use the following guide:
|
||||||
|
|
||||||
|
# How LLMs can design electronics:
|
||||||
|
|
||||||
|
#1 Rule: USE THE TOOLS. If the tools dont work, dont freak out, you are probably using them wrong. Ask for help if you get stuck.
|
||||||
|
|
||||||
|
Top level design
|
||||||
|
|
||||||
|
1. Research available packages relevant to the user requests using 'find_packages'
|
||||||
|
2. Inspect promising packages using 'inspect_package'
|
||||||
|
3. Propose packages to use for project and architucture to user, revise if needed
|
||||||
|
4. Install needed packages using 'install_package'
|
||||||
|
5. Import packages into main file
|
||||||
|
6. Create instances of packages in main module
|
||||||
|
|
||||||
|
## Power
|
||||||
|
|
||||||
|
1. Review for each package the required voltage and current (current may not be provided, use judement if nessesary)
|
||||||
|
2. Determine the power rails that need to be generated and a suitable tollerance (typically ~3-5% is acceptable)
|
||||||
|
3. Determine the input power source, typically a battery, USB connector or other power connector (eg XT30) and install relevant package
|
||||||
|
4. Find suitable regulators:
|
||||||
|
a) if input voltage > required voltage and current is low, use an LDO package
|
||||||
|
b) if input voltage > required voltage and current is high, use buck converter
|
||||||
|
c) if input votlage < required voltage, use a boost converter
|
||||||
|
d) if input voltage can be both less than or greater than input voltage, use buck boost (eg battery powered device that needs 3v3)
|
||||||
|
5. If battery powered, add charger package
|
||||||
|
|
||||||
|
Typical power architucture example with LDO:
|
||||||
|
|
||||||
|
- USB input power
|
||||||
|
- Low current output (eg microcontroller)
|
||||||
|
|
||||||
|
from "atopile/ti-tlv75901/ti-tlv75901.ato" import TLV75901_driver
|
||||||
|
from "atopile/usb-connectors/usb-connectors.ato" import USBCConn
|
||||||
|
|
||||||
|
module App:
|
||||||
|
|
||||||
|
# Rails
|
||||||
|
power_5v = new Power
|
||||||
|
power_3v3 = new Power
|
||||||
|
|
||||||
|
# Components
|
||||||
|
ldo = new TLV75901_driver
|
||||||
|
usb_connector = new USBCConn
|
||||||
|
|
||||||
|
# Connections
|
||||||
|
usb_connector.power ~ power_vbus
|
||||||
|
power_vbus ~> ldo ~> power_3v3
|
||||||
|
|
||||||
|
## Communicaions
|
||||||
|
|
||||||
|
1. Review packages required interfaces, typically i2c, spi or ElectricLogics
|
||||||
|
2. Find suitable pins on the controller, typically a microcontroller or Linux SOC
|
||||||
|
3. Connect interfaces eg micro.i2c[0] ~ sensor.i2c
|
||||||
|
|
||||||
|
## Development process notes
|
||||||
|
|
||||||
|
- After making changes, be sure to use 'build_project' to update the PCB
|
||||||
|
- Builds will often generate errors/warnings, these should be reviewed and fixed
|
||||||
|
- Prioritize pacakges from 'atopile' over other packages
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"atopile": {
|
||||||
|
"command": "/home/martin/.config/Code/User/globalStorage/atopile.atopile/uv-bin/uv",
|
||||||
|
"args": [
|
||||||
|
"tool",
|
||||||
|
"run",
|
||||||
|
"-p",
|
||||||
|
"3.13",
|
||||||
|
"--from",
|
||||||
|
"atopile",
|
||||||
|
"ato",
|
||||||
|
"mcp",
|
||||||
|
"start",
|
||||||
|
"--no-http"
|
||||||
|
],
|
||||||
|
"env": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,714 @@
|
|||||||
|
---
|
||||||
|
description: ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
globs: *.ato, ato.yaml
|
||||||
|
alwaysApply: true
|
||||||
|
---
|
||||||
|
|
||||||
|
ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
It is part of the atopile project.
|
||||||
|
Atopile is run by the vscode/cursor/windsurf extension.
|
||||||
|
The CLI (which is invoked by the extension) actually builds the project.
|
||||||
|
|
||||||
|
# Not available in ato
|
||||||
|
|
||||||
|
- if statements
|
||||||
|
- while loops
|
||||||
|
- functions (calls or definitions)
|
||||||
|
- classes
|
||||||
|
- objects
|
||||||
|
- exceptions
|
||||||
|
- generators
|
||||||
|
|
||||||
|
|
||||||
|
# Ato Syntax
|
||||||
|
|
||||||
|
ato sytax is heavily inspired by Python, but fully declarative.
|
||||||
|
ato thus has no procedural code, and no side effects.
|
||||||
|
|
||||||
|
## Examples of syntax
|
||||||
|
|
||||||
|
```ato
|
||||||
|
#pragma text
|
||||||
|
#pragma func("X")
|
||||||
|
# enable for loop syntax feature:
|
||||||
|
#pragma experiment("FOR_LOOP)
|
||||||
|
|
||||||
|
# --- Imports ---
|
||||||
|
# Standard import (newline terminated)
|
||||||
|
import ModuleName
|
||||||
|
|
||||||
|
# Import with multiple modules (newline terminated)
|
||||||
|
import Module1, Module2.Submodule
|
||||||
|
|
||||||
|
# Import from a specific file/source (newline terminated)
|
||||||
|
from "path/to/source.ato" import SpecificModule
|
||||||
|
|
||||||
|
# Multiple imports on one line (semicolon separated)
|
||||||
|
import AnotherModule; from "another/source.ato" import AnotherSpecific
|
||||||
|
|
||||||
|
# Deprecated import form (newline terminated)
|
||||||
|
# TODO: remove when unsupported
|
||||||
|
import DeprecatedModule from "other/source.ato"
|
||||||
|
|
||||||
|
# --- Top-level Definitions and Statements ---
|
||||||
|
|
||||||
|
pass
|
||||||
|
pass;
|
||||||
|
|
||||||
|
"docstring-like statement"
|
||||||
|
"docstring-like statement";
|
||||||
|
|
||||||
|
top_level_var = 123
|
||||||
|
|
||||||
|
# Compound statement
|
||||||
|
pass; another_var = 456; "another docstring"
|
||||||
|
|
||||||
|
# Block definitions
|
||||||
|
component MyComponent:
|
||||||
|
# Simple statement inside block (newline terminated)
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Multiple simple statements on one line (semicolon separated)
|
||||||
|
pass; internal_flag = True
|
||||||
|
|
||||||
|
module AnotherBaseModule:
|
||||||
|
pin base_pin
|
||||||
|
base_param = 10
|
||||||
|
|
||||||
|
interface MyInterface:
|
||||||
|
pin io
|
||||||
|
|
||||||
|
module DemoModule from AnotherBaseModule:
|
||||||
|
# --- Declarations ---
|
||||||
|
pin p1 # Pin declaration with name
|
||||||
|
pin 1 # Pin declaration with number
|
||||||
|
pin "GND" # Pin declaration with string
|
||||||
|
signal my_signal # Signal definition
|
||||||
|
a_field: AnotherBaseModule # Field declaration with type hint
|
||||||
|
|
||||||
|
# --- Assignments ---
|
||||||
|
# Newline terminated:
|
||||||
|
internal_variable = 123
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
var_a = 1; var_b = "string"
|
||||||
|
|
||||||
|
# Cumulative assignment (+=, -=) - Newline terminated
|
||||||
|
value = 1
|
||||||
|
value += 1; value -= 1
|
||||||
|
|
||||||
|
# Set assignment (|=, &=) - Newline terminated
|
||||||
|
flags |= 1; flags &= 2
|
||||||
|
|
||||||
|
# --- Connections ---
|
||||||
|
p1 ~ base_pin
|
||||||
|
mif ~> bridge
|
||||||
|
mif ~> bridge ~> bridge
|
||||||
|
mif ~> bridge ~> bridge ~> mif
|
||||||
|
bridge ~> mif
|
||||||
|
mif <~ bridge
|
||||||
|
mif <~ bridge <~ bridge
|
||||||
|
mif <~ bridge <~ bridge <~ mif
|
||||||
|
bridge <~ mif
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
p_multi1 ~ my_signal; p_multi2 ~ sig_multi1
|
||||||
|
|
||||||
|
# --- Retyping ---
|
||||||
|
instance.x -> AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Instantiation ---
|
||||||
|
instance = new MyComponent
|
||||||
|
container = new MyComponent[10]
|
||||||
|
templated_instance_a = new MyComponent
|
||||||
|
templated_instance_b = new MyComponent<int_=1>
|
||||||
|
templated_instance_c = new MyComponent<float_=2.5>
|
||||||
|
templated_instance_d = new MyComponent<string_="hello">
|
||||||
|
templated_instance_e = new MyComponent<int_=1, float_=2.5, string_="hello">
|
||||||
|
templated_instance_f = new MyComponent<int_=1, float_=2.5, string_="hello", bool_=True>
|
||||||
|
|
||||||
|
# Semicolon separated instantiations (via assignment):
|
||||||
|
inst_a = new MyComponent; inst_b = new AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Traits ---
|
||||||
|
trait trait_name
|
||||||
|
trait trait_name<int_=1>
|
||||||
|
trait trait_name<float_=2.5>
|
||||||
|
trait trait_name<string_="hello">
|
||||||
|
trait trait_name<bool_=True>
|
||||||
|
trait trait_name::constructor
|
||||||
|
trait trait_name::constructor<int_=1>
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
trait TraitA; trait TraitB::constructor; trait TraitC<arg_=1>
|
||||||
|
|
||||||
|
# --- Assertions ---
|
||||||
|
assert x > 5V
|
||||||
|
assert x < 10V
|
||||||
|
assert 5V < x < 10V
|
||||||
|
assert x >= 5V
|
||||||
|
assert x <= 10V
|
||||||
|
assert current within 1A +/- 10mA
|
||||||
|
assert voltage within 1V +/- 10%
|
||||||
|
assert resistance is 1kohm to 1.1kohm
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
assert x is 1V; assert another_param is 2V
|
||||||
|
|
||||||
|
# --- Loops ---
|
||||||
|
for item in container:
|
||||||
|
item ~ p1
|
||||||
|
|
||||||
|
# For loop iterating over a slice
|
||||||
|
for item in container[0:4]:
|
||||||
|
pass
|
||||||
|
item.value = 1; pass
|
||||||
|
|
||||||
|
# For loop iterating over a list literal of field references
|
||||||
|
for ref in [p1, x.1, x.GND]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# --- References and Indexing ---
|
||||||
|
# Reference with array index assignment
|
||||||
|
array_element = container[3]
|
||||||
|
|
||||||
|
# --- Literals and Expressions ---
|
||||||
|
# Integer
|
||||||
|
int_val = 100
|
||||||
|
neg_int_val = -50
|
||||||
|
hex_val = 0xF1
|
||||||
|
bin_val = 0b10
|
||||||
|
oct_val = 0o10
|
||||||
|
# Float
|
||||||
|
float_val = 3.14
|
||||||
|
# Physical quantities
|
||||||
|
voltage: V = 5V
|
||||||
|
resistance: ohm = 10kohm
|
||||||
|
capacitance: F = 100nF
|
||||||
|
# Bilateral tolerance
|
||||||
|
tolerance_val = 1kohm +/- 10%
|
||||||
|
tolerance_abs = 5V +/- 500mV
|
||||||
|
tolerance_explicit_unit = 10A +/- 1A
|
||||||
|
# Bounded quantity (range)
|
||||||
|
voltage_range = 3V to 3.6V
|
||||||
|
# Boolean
|
||||||
|
is_enabled = True
|
||||||
|
is_active = False
|
||||||
|
# String
|
||||||
|
message = "Hello inside module"
|
||||||
|
|
||||||
|
# Arithmetic expressions
|
||||||
|
sum_val = 1 + 2
|
||||||
|
diff_val = 10 - 3ohm
|
||||||
|
prod_val = 5 * 2mA
|
||||||
|
div_val = 10V / 2kohm # Results in current
|
||||||
|
power_val = 2**3
|
||||||
|
complex_expr = (5 + 3) * 2 - 1
|
||||||
|
flag_check = state | MASK_VALUE
|
||||||
|
|
||||||
|
# Comparisons
|
||||||
|
assert voltage within voltage_range
|
||||||
|
assert length <= 5mm
|
||||||
|
assert height >= 2mm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --- Multi-line variations ---
|
||||||
|
pass; nested_var=1; another=2
|
||||||
|
|
||||||
|
complex_assignment = (
|
||||||
|
voltage + resistance
|
||||||
|
* capacitance
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## G4 Grammar
|
||||||
|
|
||||||
|
```g4
|
||||||
|
parser grammar AtoParser;
|
||||||
|
|
||||||
|
options {
|
||||||
|
superClass = AtoParserBase;
|
||||||
|
tokenVocab = AtoLexer;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_input: (NEWLINE | stmt)* EOF;
|
||||||
|
|
||||||
|
pragma_stmt: PRAGMA;
|
||||||
|
|
||||||
|
stmt: simple_stmts | compound_stmt | pragma_stmt;
|
||||||
|
simple_stmts:
|
||||||
|
simple_stmt (SEMI_COLON simple_stmt)* SEMI_COLON? NEWLINE;
|
||||||
|
simple_stmt:
|
||||||
|
import_stmt
|
||||||
|
| dep_import_stmt
|
||||||
|
| assign_stmt
|
||||||
|
| cum_assign_stmt
|
||||||
|
| set_assign_stmt
|
||||||
|
| connect_stmt
|
||||||
|
| directed_connect_stmt
|
||||||
|
| retype_stmt
|
||||||
|
| pin_declaration
|
||||||
|
| signaldef_stmt
|
||||||
|
| assert_stmt
|
||||||
|
| declaration_stmt
|
||||||
|
| string_stmt
|
||||||
|
| pass_stmt
|
||||||
|
| trait_stmt;
|
||||||
|
|
||||||
|
compound_stmt: blockdef | for_stmt;
|
||||||
|
|
||||||
|
blockdef: blocktype name blockdef_super? COLON block;
|
||||||
|
// TODO @v0.4 consider ()
|
||||||
|
blockdef_super: FROM type_reference;
|
||||||
|
// TODO @v0.4 consider removing component (or more explicit code-as-data)
|
||||||
|
blocktype: (COMPONENT | MODULE | INTERFACE);
|
||||||
|
block: simple_stmts | NEWLINE INDENT stmt+ DEDENT;
|
||||||
|
|
||||||
|
// TODO: @v0.4 remove the deprecated import form
|
||||||
|
dep_import_stmt: IMPORT type_reference FROM string;
|
||||||
|
import_stmt: (FROM string)? IMPORT type_reference (
|
||||||
|
COMMA type_reference
|
||||||
|
)*;
|
||||||
|
|
||||||
|
declaration_stmt: field_reference type_info;
|
||||||
|
field_reference_or_declaration:
|
||||||
|
field_reference
|
||||||
|
| declaration_stmt;
|
||||||
|
assign_stmt: field_reference_or_declaration '=' assignable;
|
||||||
|
cum_assign_stmt:
|
||||||
|
field_reference_or_declaration cum_operator cum_assignable;
|
||||||
|
// TODO: consider sets cum operator
|
||||||
|
set_assign_stmt:
|
||||||
|
field_reference_or_declaration (OR_ASSIGN | AND_ASSIGN) cum_assignable;
|
||||||
|
cum_operator: ADD_ASSIGN | SUB_ASSIGN;
|
||||||
|
cum_assignable: literal_physical | arithmetic_expression;
|
||||||
|
|
||||||
|
assignable:
|
||||||
|
string
|
||||||
|
| new_stmt
|
||||||
|
| literal_physical
|
||||||
|
| arithmetic_expression
|
||||||
|
| boolean_;
|
||||||
|
|
||||||
|
retype_stmt: field_reference ARROW type_reference;
|
||||||
|
|
||||||
|
directed_connect_stmt
|
||||||
|
: bridgeable ((SPERM | LSPERM) bridgeable)+; // only one type of SPERM per stmt allowed. both here for better error messages
|
||||||
|
connect_stmt: mif WIRE mif;
|
||||||
|
bridgeable: connectable;
|
||||||
|
mif: connectable;
|
||||||
|
connectable: field_reference | signaldef_stmt | pindef_stmt;
|
||||||
|
|
||||||
|
signaldef_stmt: SIGNAL name;
|
||||||
|
pindef_stmt: pin_stmt;
|
||||||
|
pin_declaration: pin_stmt;
|
||||||
|
pin_stmt: PIN (name | number_hint_natural | string);
|
||||||
|
|
||||||
|
new_stmt: NEW type_reference ('[' new_count ']')? template?;
|
||||||
|
new_count: number_hint_natural;
|
||||||
|
|
||||||
|
string_stmt:
|
||||||
|
string; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
pass_stmt:
|
||||||
|
PASS; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
list_literal_of_field_references:
|
||||||
|
'[' (field_reference (COMMA field_reference)* COMMA?)? ']';
|
||||||
|
|
||||||
|
iterable_references:
|
||||||
|
field_reference slice?
|
||||||
|
| list_literal_of_field_references;
|
||||||
|
|
||||||
|
for_stmt: FOR name IN iterable_references COLON block;
|
||||||
|
|
||||||
|
assert_stmt: ASSERT comparison;
|
||||||
|
|
||||||
|
trait_stmt
|
||||||
|
: TRAIT type_reference (DOUBLE_COLON constructor)? template?; // TODO: move namespacing to type_reference
|
||||||
|
constructor: name;
|
||||||
|
template: '<' (template_arg (COMMA template_arg)* COMMA?)? '>';
|
||||||
|
template_arg: name ASSIGN literal;
|
||||||
|
|
||||||
|
// Comparison operators --------------------
|
||||||
|
comparison: arithmetic_expression compare_op_pair+;
|
||||||
|
|
||||||
|
compare_op_pair:
|
||||||
|
lt_arithmetic_or
|
||||||
|
| gt_arithmetic_or
|
||||||
|
| lt_eq_arithmetic_or
|
||||||
|
| gt_eq_arithmetic_or
|
||||||
|
| in_arithmetic_or
|
||||||
|
| is_arithmetic_or;
|
||||||
|
|
||||||
|
lt_arithmetic_or: LESS_THAN arithmetic_expression;
|
||||||
|
gt_arithmetic_or: GREATER_THAN arithmetic_expression;
|
||||||
|
lt_eq_arithmetic_or: LT_EQ arithmetic_expression;
|
||||||
|
gt_eq_arithmetic_or: GT_EQ arithmetic_expression;
|
||||||
|
in_arithmetic_or: WITHIN arithmetic_expression;
|
||||||
|
is_arithmetic_or: IS arithmetic_expression;
|
||||||
|
|
||||||
|
// Arithmetic operators --------------------
|
||||||
|
|
||||||
|
arithmetic_expression:
|
||||||
|
arithmetic_expression (OR_OP | AND_OP) sum
|
||||||
|
| sum;
|
||||||
|
|
||||||
|
sum: sum (PLUS | MINUS) term | term;
|
||||||
|
|
||||||
|
term: term (STAR | DIV) power | power;
|
||||||
|
|
||||||
|
power: functional (POWER functional)?;
|
||||||
|
|
||||||
|
functional: bound | name '(' bound+ ')';
|
||||||
|
|
||||||
|
bound: atom;
|
||||||
|
|
||||||
|
// Primary elements ----------------
|
||||||
|
|
||||||
|
slice:
|
||||||
|
'[' (slice_start? COLON slice_stop? (COLON slice_step?)?)? ']'
|
||||||
|
// else [::step] wouldn't match
|
||||||
|
| '[' ( DOUBLE_COLON slice_step?) ']';
|
||||||
|
slice_start: number_hint_integer;
|
||||||
|
slice_stop: number_hint_integer;
|
||||||
|
slice_step: number_hint_integer;
|
||||||
|
|
||||||
|
atom: field_reference | literal_physical | arithmetic_group;
|
||||||
|
|
||||||
|
arithmetic_group: '(' arithmetic_expression ')';
|
||||||
|
|
||||||
|
literal_physical:
|
||||||
|
bound_quantity
|
||||||
|
| bilateral_quantity
|
||||||
|
| quantity;
|
||||||
|
|
||||||
|
bound_quantity: quantity TO quantity;
|
||||||
|
bilateral_quantity: quantity PLUS_OR_MINUS bilateral_tolerance;
|
||||||
|
quantity: number name?;
|
||||||
|
bilateral_tolerance: number_signless (PERCENT | name)?;
|
||||||
|
|
||||||
|
key: number_hint_integer;
|
||||||
|
array_index: '[' key ']';
|
||||||
|
|
||||||
|
// backwards compatibility for A.1
|
||||||
|
pin_reference_end: DOT number_hint_natural;
|
||||||
|
field_reference_part: name array_index?;
|
||||||
|
field_reference:
|
||||||
|
field_reference_part (DOT field_reference_part)* pin_reference_end?;
|
||||||
|
type_reference: name (DOT name)*;
|
||||||
|
// TODO better unit
|
||||||
|
unit: name;
|
||||||
|
type_info: COLON unit;
|
||||||
|
name: NAME;
|
||||||
|
|
||||||
|
// Literals
|
||||||
|
literal: string | boolean_ | number;
|
||||||
|
|
||||||
|
string: STRING;
|
||||||
|
boolean_: TRUE | FALSE;
|
||||||
|
number_hint_natural: number_signless;
|
||||||
|
number_hint_integer: number;
|
||||||
|
number: (PLUS | MINUS)? number_signless;
|
||||||
|
number_signless: NUMBER;
|
||||||
|
```
|
||||||
|
|
||||||
|
# Most used library modules/interfaces (api of them)
|
||||||
|
|
||||||
|
```ato
|
||||||
|
interface Electrical:
|
||||||
|
pass
|
||||||
|
|
||||||
|
interface ElectricPower:
|
||||||
|
hv = new Electrical
|
||||||
|
lv = new Electrical
|
||||||
|
|
||||||
|
module Resistor:
|
||||||
|
resistance: ohm
|
||||||
|
max_power: W
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
module Capacitor:
|
||||||
|
capacitance: F
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
interface I2C:
|
||||||
|
scl = new ElectricLogic
|
||||||
|
sda = new ElectricLogic
|
||||||
|
frequency: Hz
|
||||||
|
address: dimensionless
|
||||||
|
|
||||||
|
interface ElectricLogic:
|
||||||
|
line = new Electrical
|
||||||
|
reference = new ElectricPower
|
||||||
|
```
|
||||||
|
|
||||||
|
For the rest use the atopile MCP server
|
||||||
|
- `get_library_interfaces` to list interfaces
|
||||||
|
- `get_library_modules` to list modules
|
||||||
|
- `inspect_library_module_or_interface` to inspect the code
|
||||||
|
|
||||||
|
# Ato language features
|
||||||
|
|
||||||
|
## experimental features
|
||||||
|
|
||||||
|
Enable with `#pragma experiment("BRIDGE_CONNECT")`
|
||||||
|
BRIDGE_CONNECT: enables `p1 ~> resistor ~> p2` syntax
|
||||||
|
FOR_LOOP: enables `for item in container: pass` syntax
|
||||||
|
TRAITS: enables `trait trait_name` syntax
|
||||||
|
MODULE_TEMPLATING: enables `new MyComponent<param=literal>` syntax
|
||||||
|
|
||||||
|
## modules, interfaces, parameters, traits
|
||||||
|
|
||||||
|
A block is either a module, interface or component.
|
||||||
|
Components are just modules for code-as-data.
|
||||||
|
Interfaces describe a connectable interface (e.g Electrical, ElectricPower, I2C, etc).
|
||||||
|
A module is a block that can be instantiated.
|
||||||
|
Think of it as the ato equivalent of a class.
|
||||||
|
Parameters are variables for numbers and they work with constraints.
|
||||||
|
E.g `resistance: ohm` is a parameter.
|
||||||
|
Constrain with `assert resistance within 10kohm +/- 10%`.
|
||||||
|
It's very important to use toleranced values for parameters.
|
||||||
|
If you constrain a resistor.resistance to 10kohm there won't be a single part found because that's a tolerance of 0%.
|
||||||
|
|
||||||
|
Traits mark a module to have some kind of functionality that can be used in other modules.
|
||||||
|
E.g `trait has_designator_prefix` is the way to mark a module to have a specific designator prefix that will be used in the designator field in the footprint.
|
||||||
|
|
||||||
|
## connecting
|
||||||
|
|
||||||
|
You can only connect interfaces of the same type.
|
||||||
|
`resistor0.unnamed[0] ~ resistor0.unnamed[0]` is the way to connect two resistors in series.
|
||||||
|
If a module has the `can_bridge` trait you can use the sperm operator `~>` to bridge the module.
|
||||||
|
`led.anode ~> resistor ~> power.hv` connects the anode in series with the resistor and then the resistor in series with the high voltage power supply.
|
||||||
|
|
||||||
|
## for loop syntax
|
||||||
|
|
||||||
|
`for item in container: pass` is the way to iterate over a container.
|
||||||
|
|
||||||
|
# Ato CLI
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
You run ato commands through the MCP tool.
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
|
||||||
|
Packages can be found on the ato registry.
|
||||||
|
To install a package you need to run `ato add <PACKAGE_NAME>`.
|
||||||
|
e.g `ato install atopile/addressable-leds`
|
||||||
|
And then can be imported with `from "atopile/addressable-leds/sk6805-ec20.ato" import SK6805_EC20_driver`.
|
||||||
|
And used like this:
|
||||||
|
|
||||||
|
```ato
|
||||||
|
module MyModule:
|
||||||
|
led = new SK6805_EC20_driver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Footprints & Part picking
|
||||||
|
|
||||||
|
Footprint selection is done through the part choice (`ato create part` auto-generates ato code for the part).
|
||||||
|
The `pin` keyword is used to build footprint pinmaps so avoid using it outside of `component` blocks.
|
||||||
|
Preferrably use `Electrical` interface for electrical interfaces.
|
||||||
|
A lot of times it's actually `ElectricLogic` for things like GPIOs etc or `ElectricPower` for power supplies.
|
||||||
|
|
||||||
|
Passive modules (Resistors, Capacitors) are picked automatically by the constraints on their parameters.
|
||||||
|
To constrain the package do e.g `package = "0402"`.
|
||||||
|
To explictly pick a part for a module use `lcsc = "<LCSC_PART_NUMBER>"`.
|
||||||
|
|
||||||
|
|
||||||
|
# Creating a package
|
||||||
|
|
||||||
|
Package generation process:
|
||||||
|
|
||||||
|
Review structure of other pacakges.
|
||||||
|
|
||||||
|
1. Create new Directory in 'packages/packages' with naming convention '<vendor>-<device>' eg 'adi-adau145x'
|
||||||
|
2. create an ato.yaml file in the new directory with the following content:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
requires-atopile: '^0.9.0'
|
||||||
|
|
||||||
|
paths:
|
||||||
|
src: '.'
|
||||||
|
layout: ./layouts
|
||||||
|
|
||||||
|
builds:
|
||||||
|
default:
|
||||||
|
entry: <device>.ato:<device>_driver
|
||||||
|
example:
|
||||||
|
entry: <device>.ato:Example
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create part using tool call 'search_and_install_jlcpcb_part'
|
||||||
|
4. Import the part into the <device>.ato file
|
||||||
|
5. Read the datasheet for the device
|
||||||
|
6. Find common interfaces in the part eg I2C, I2S, SPI, Power
|
||||||
|
|
||||||
|
7. Create interfaces and connect them
|
||||||
|
|
||||||
|
power interfaces:
|
||||||
|
power*<name> = new ElectricPower
|
||||||
|
power*<name>.required = True # If critical to the device
|
||||||
|
assert power\*<name>.voltage within <minimum*operating_voltage>V to <maximum_operating_voltage>V
|
||||||
|
power*<name>.vcc ~ <device>.<vcc pin>
|
||||||
|
power\_<name>.gnd ~ <device>.<gnd pin>
|
||||||
|
|
||||||
|
i2c interfaces:
|
||||||
|
i2c = new I2C
|
||||||
|
i2c.scl.line ~ <device>.<i2c scl pin>
|
||||||
|
i2c.sda.line ~ <device>.<i2c sda pin>
|
||||||
|
|
||||||
|
spi interfaces:
|
||||||
|
spi = new SPI
|
||||||
|
spi.sclk.line ~ <device>.<spi sclk pin>
|
||||||
|
spi.mosi.line ~ <device>.<spi mosi pin>
|
||||||
|
spi.miso.line ~ <device>.<spi miso pin>
|
||||||
|
|
||||||
|
8. Add decoupling capacitors
|
||||||
|
|
||||||
|
looking at the datasheet, determine the required decoupling capacitors
|
||||||
|
|
||||||
|
eg: 2x 100nF 0402:
|
||||||
|
|
||||||
|
power_3v3 = new ElectricPower
|
||||||
|
|
||||||
|
# Decoupling power_3v3
|
||||||
|
|
||||||
|
power_3v3_caps = new Capacitor[2]
|
||||||
|
for capacitor in power_3v3_caps:
|
||||||
|
capacitor.capacitance = 100nF +/- 20%
|
||||||
|
capacitor.package = "0402"
|
||||||
|
power_3v3.hv ~> capacitor ~> power_3v3.lv
|
||||||
|
|
||||||
|
9. If device has pin configurable i2c addresses
|
||||||
|
|
||||||
|
If format is: <n x fixed address bits><m x pin configured address bits>
|
||||||
|
use addressor module:
|
||||||
|
|
||||||
|
- Use `Addressor<address_bits=N>` where **N = number of address pins**.
|
||||||
|
- Connect each `address_lines[i].line` to the corresponding pin, and its `.reference` to a local power rail.
|
||||||
|
- Set `addressor.base` to the lowest possible address and `assert addressor.address is i2c.address`.
|
||||||
|
|
||||||
|
10. Create a README.md
|
||||||
|
|
||||||
|
# <Manufacturer> <Manufacturer part number> <Short description>
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ato
|
||||||
|
<copy in example>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions to this package are welcome via pull requests on the GitHub repository.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This atopile package is provided under the [MIT License](https://opensource.org/license/mit/).
|
||||||
|
|
||||||
|
11. Connect high level interfaces directly in example:
|
||||||
|
|
||||||
|
eg:
|
||||||
|
|
||||||
|
i2c = new I2C
|
||||||
|
power = new ElectricPower
|
||||||
|
sensor = new Sensor
|
||||||
|
|
||||||
|
i2c ~ sensor.i2c
|
||||||
|
power ~ sensor.power_3v3
|
||||||
|
|
||||||
|
# Additional Notes & Gotchas (generic)
|
||||||
|
|
||||||
|
- Multi-rail devices (VDD / VDDIO, AVDD / DVDD, etc.)
|
||||||
|
|
||||||
|
- Model separate `ElectricPower` interfaces for each rail (e.g. `power_core`, `power_io`).
|
||||||
|
- Mark each `.required = True` if the device cannot function without it, and add voltage assertions per datasheet.
|
||||||
|
|
||||||
|
- Optional interfaces (SPI vs I²C)
|
||||||
|
|
||||||
|
- If the device supports multiple buses, pick one for the initial driver. Leave unused bus pins as `ElectricLogic` lines or expose a second interface module later.
|
||||||
|
|
||||||
|
- Decoupling guidance
|
||||||
|
|
||||||
|
- If the datasheet shows multiple caps, model the **minimum required** set so the build passes; you can refine values/packages later.
|
||||||
|
|
||||||
|
- File / directory layout recap
|
||||||
|
- `<vendor>-<device>/` – package root
|
||||||
|
- `ato.yaml` – build manifest (include `default` **and** `example` targets)
|
||||||
|
- `<device>.ato` – driver + optional example module
|
||||||
|
- `parts/<MANUFACTURER_PARTNO>/` – atomic part + footprint/symbol/step files
|
||||||
|
|
||||||
|
These tips should prevent common "footprint not found", "pin X missing", and build-time path errors when you add new devices.
|
||||||
|
|
||||||
|
|
||||||
|
# Vibe coding a project
|
||||||
|
|
||||||
|
If the user gives you high level description of the project, use the following guide:
|
||||||
|
|
||||||
|
# How LLMs can design electronics:
|
||||||
|
|
||||||
|
#1 Rule: USE THE TOOLS. If the tools dont work, dont freak out, you are probably using them wrong. Ask for help if you get stuck.
|
||||||
|
|
||||||
|
Top level design
|
||||||
|
|
||||||
|
1. Research available packages relevant to the user requests using 'find_packages'
|
||||||
|
2. Inspect promising packages using 'inspect_package'
|
||||||
|
3. Propose packages to use for project and architucture to user, revise if needed
|
||||||
|
4. Install needed packages using 'install_package'
|
||||||
|
5. Import packages into main file
|
||||||
|
6. Create instances of packages in main module
|
||||||
|
|
||||||
|
## Power
|
||||||
|
|
||||||
|
1. Review for each package the required voltage and current (current may not be provided, use judement if nessesary)
|
||||||
|
2. Determine the power rails that need to be generated and a suitable tollerance (typically ~3-5% is acceptable)
|
||||||
|
3. Determine the input power source, typically a battery, USB connector or other power connector (eg XT30) and install relevant package
|
||||||
|
4. Find suitable regulators:
|
||||||
|
a) if input voltage > required voltage and current is low, use an LDO package
|
||||||
|
b) if input voltage > required voltage and current is high, use buck converter
|
||||||
|
c) if input votlage < required voltage, use a boost converter
|
||||||
|
d) if input voltage can be both less than or greater than input voltage, use buck boost (eg battery powered device that needs 3v3)
|
||||||
|
5. If battery powered, add charger package
|
||||||
|
|
||||||
|
Typical power architucture example with LDO:
|
||||||
|
|
||||||
|
- USB input power
|
||||||
|
- Low current output (eg microcontroller)
|
||||||
|
|
||||||
|
from "atopile/ti-tlv75901/ti-tlv75901.ato" import TLV75901_driver
|
||||||
|
from "atopile/usb-connectors/usb-connectors.ato" import USBCConn
|
||||||
|
|
||||||
|
module App:
|
||||||
|
|
||||||
|
# Rails
|
||||||
|
power_5v = new Power
|
||||||
|
power_3v3 = new Power
|
||||||
|
|
||||||
|
# Components
|
||||||
|
ldo = new TLV75901_driver
|
||||||
|
usb_connector = new USBCConn
|
||||||
|
|
||||||
|
# Connections
|
||||||
|
usb_connector.power ~ power_vbus
|
||||||
|
power_vbus ~> ldo ~> power_3v3
|
||||||
|
|
||||||
|
## Communicaions
|
||||||
|
|
||||||
|
1. Review packages required interfaces, typically i2c, spi or ElectricLogics
|
||||||
|
2. Find suitable pins on the controller, typically a microcontroller or Linux SOC
|
||||||
|
3. Connect interfaces eg micro.i2c[0] ~ sensor.i2c
|
||||||
|
|
||||||
|
## Development process notes
|
||||||
|
|
||||||
|
- After making changes, be sure to use 'build_project' to update the PCB
|
||||||
|
- Builds will often generate errors/warnings, these should be reviewed and fixed
|
||||||
|
- Prioritize pacakges from 'atopile' over other packages
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,710 @@
|
|||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
It is part of the atopile project.
|
||||||
|
Atopile is run by the vscode/cursor/windsurf extension.
|
||||||
|
The CLI (which is invoked by the extension) actually builds the project.
|
||||||
|
|
||||||
|
# Not available in ato
|
||||||
|
|
||||||
|
- if statements
|
||||||
|
- while loops
|
||||||
|
- functions (calls or definitions)
|
||||||
|
- classes
|
||||||
|
- objects
|
||||||
|
- exceptions
|
||||||
|
- generators
|
||||||
|
|
||||||
|
|
||||||
|
# Ato Syntax
|
||||||
|
|
||||||
|
ato sytax is heavily inspired by Python, but fully declarative.
|
||||||
|
ato thus has no procedural code, and no side effects.
|
||||||
|
|
||||||
|
## Examples of syntax
|
||||||
|
|
||||||
|
```ato
|
||||||
|
#pragma text
|
||||||
|
#pragma func("X")
|
||||||
|
# enable for loop syntax feature:
|
||||||
|
#pragma experiment("FOR_LOOP)
|
||||||
|
|
||||||
|
# --- Imports ---
|
||||||
|
# Standard import (newline terminated)
|
||||||
|
import ModuleName
|
||||||
|
|
||||||
|
# Import with multiple modules (newline terminated)
|
||||||
|
import Module1, Module2.Submodule
|
||||||
|
|
||||||
|
# Import from a specific file/source (newline terminated)
|
||||||
|
from "path/to/source.ato" import SpecificModule
|
||||||
|
|
||||||
|
# Multiple imports on one line (semicolon separated)
|
||||||
|
import AnotherModule; from "another/source.ato" import AnotherSpecific
|
||||||
|
|
||||||
|
# Deprecated import form (newline terminated)
|
||||||
|
# TODO: remove when unsupported
|
||||||
|
import DeprecatedModule from "other/source.ato"
|
||||||
|
|
||||||
|
# --- Top-level Definitions and Statements ---
|
||||||
|
|
||||||
|
pass
|
||||||
|
pass;
|
||||||
|
|
||||||
|
"docstring-like statement"
|
||||||
|
"docstring-like statement";
|
||||||
|
|
||||||
|
top_level_var = 123
|
||||||
|
|
||||||
|
# Compound statement
|
||||||
|
pass; another_var = 456; "another docstring"
|
||||||
|
|
||||||
|
# Block definitions
|
||||||
|
component MyComponent:
|
||||||
|
# Simple statement inside block (newline terminated)
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Multiple simple statements on one line (semicolon separated)
|
||||||
|
pass; internal_flag = True
|
||||||
|
|
||||||
|
module AnotherBaseModule:
|
||||||
|
pin base_pin
|
||||||
|
base_param = 10
|
||||||
|
|
||||||
|
interface MyInterface:
|
||||||
|
pin io
|
||||||
|
|
||||||
|
module DemoModule from AnotherBaseModule:
|
||||||
|
# --- Declarations ---
|
||||||
|
pin p1 # Pin declaration with name
|
||||||
|
pin 1 # Pin declaration with number
|
||||||
|
pin "GND" # Pin declaration with string
|
||||||
|
signal my_signal # Signal definition
|
||||||
|
a_field: AnotherBaseModule # Field declaration with type hint
|
||||||
|
|
||||||
|
# --- Assignments ---
|
||||||
|
# Newline terminated:
|
||||||
|
internal_variable = 123
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
var_a = 1; var_b = "string"
|
||||||
|
|
||||||
|
# Cumulative assignment (+=, -=) - Newline terminated
|
||||||
|
value = 1
|
||||||
|
value += 1; value -= 1
|
||||||
|
|
||||||
|
# Set assignment (|=, &=) - Newline terminated
|
||||||
|
flags |= 1; flags &= 2
|
||||||
|
|
||||||
|
# --- Connections ---
|
||||||
|
p1 ~ base_pin
|
||||||
|
mif ~> bridge
|
||||||
|
mif ~> bridge ~> bridge
|
||||||
|
mif ~> bridge ~> bridge ~> mif
|
||||||
|
bridge ~> mif
|
||||||
|
mif <~ bridge
|
||||||
|
mif <~ bridge <~ bridge
|
||||||
|
mif <~ bridge <~ bridge <~ mif
|
||||||
|
bridge <~ mif
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
p_multi1 ~ my_signal; p_multi2 ~ sig_multi1
|
||||||
|
|
||||||
|
# --- Retyping ---
|
||||||
|
instance.x -> AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Instantiation ---
|
||||||
|
instance = new MyComponent
|
||||||
|
container = new MyComponent[10]
|
||||||
|
templated_instance_a = new MyComponent
|
||||||
|
templated_instance_b = new MyComponent<int_=1>
|
||||||
|
templated_instance_c = new MyComponent<float_=2.5>
|
||||||
|
templated_instance_d = new MyComponent<string_="hello">
|
||||||
|
templated_instance_e = new MyComponent<int_=1, float_=2.5, string_="hello">
|
||||||
|
templated_instance_f = new MyComponent<int_=1, float_=2.5, string_="hello", bool_=True>
|
||||||
|
|
||||||
|
# Semicolon separated instantiations (via assignment):
|
||||||
|
inst_a = new MyComponent; inst_b = new AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Traits ---
|
||||||
|
trait trait_name
|
||||||
|
trait trait_name<int_=1>
|
||||||
|
trait trait_name<float_=2.5>
|
||||||
|
trait trait_name<string_="hello">
|
||||||
|
trait trait_name<bool_=True>
|
||||||
|
trait trait_name::constructor
|
||||||
|
trait trait_name::constructor<int_=1>
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
trait TraitA; trait TraitB::constructor; trait TraitC<arg_=1>
|
||||||
|
|
||||||
|
# --- Assertions ---
|
||||||
|
assert x > 5V
|
||||||
|
assert x < 10V
|
||||||
|
assert 5V < x < 10V
|
||||||
|
assert x >= 5V
|
||||||
|
assert x <= 10V
|
||||||
|
assert current within 1A +/- 10mA
|
||||||
|
assert voltage within 1V +/- 10%
|
||||||
|
assert resistance is 1kohm to 1.1kohm
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
assert x is 1V; assert another_param is 2V
|
||||||
|
|
||||||
|
# --- Loops ---
|
||||||
|
for item in container:
|
||||||
|
item ~ p1
|
||||||
|
|
||||||
|
# For loop iterating over a slice
|
||||||
|
for item in container[0:4]:
|
||||||
|
pass
|
||||||
|
item.value = 1; pass
|
||||||
|
|
||||||
|
# For loop iterating over a list literal of field references
|
||||||
|
for ref in [p1, x.1, x.GND]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# --- References and Indexing ---
|
||||||
|
# Reference with array index assignment
|
||||||
|
array_element = container[3]
|
||||||
|
|
||||||
|
# --- Literals and Expressions ---
|
||||||
|
# Integer
|
||||||
|
int_val = 100
|
||||||
|
neg_int_val = -50
|
||||||
|
hex_val = 0xF1
|
||||||
|
bin_val = 0b10
|
||||||
|
oct_val = 0o10
|
||||||
|
# Float
|
||||||
|
float_val = 3.14
|
||||||
|
# Physical quantities
|
||||||
|
voltage: V = 5V
|
||||||
|
resistance: ohm = 10kohm
|
||||||
|
capacitance: F = 100nF
|
||||||
|
# Bilateral tolerance
|
||||||
|
tolerance_val = 1kohm +/- 10%
|
||||||
|
tolerance_abs = 5V +/- 500mV
|
||||||
|
tolerance_explicit_unit = 10A +/- 1A
|
||||||
|
# Bounded quantity (range)
|
||||||
|
voltage_range = 3V to 3.6V
|
||||||
|
# Boolean
|
||||||
|
is_enabled = True
|
||||||
|
is_active = False
|
||||||
|
# String
|
||||||
|
message = "Hello inside module"
|
||||||
|
|
||||||
|
# Arithmetic expressions
|
||||||
|
sum_val = 1 + 2
|
||||||
|
diff_val = 10 - 3ohm
|
||||||
|
prod_val = 5 * 2mA
|
||||||
|
div_val = 10V / 2kohm # Results in current
|
||||||
|
power_val = 2**3
|
||||||
|
complex_expr = (5 + 3) * 2 - 1
|
||||||
|
flag_check = state | MASK_VALUE
|
||||||
|
|
||||||
|
# Comparisons
|
||||||
|
assert voltage within voltage_range
|
||||||
|
assert length <= 5mm
|
||||||
|
assert height >= 2mm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --- Multi-line variations ---
|
||||||
|
pass; nested_var=1; another=2
|
||||||
|
|
||||||
|
complex_assignment = (
|
||||||
|
voltage + resistance
|
||||||
|
* capacitance
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## G4 Grammar
|
||||||
|
|
||||||
|
```g4
|
||||||
|
parser grammar AtoParser;
|
||||||
|
|
||||||
|
options {
|
||||||
|
superClass = AtoParserBase;
|
||||||
|
tokenVocab = AtoLexer;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_input: (NEWLINE | stmt)* EOF;
|
||||||
|
|
||||||
|
pragma_stmt: PRAGMA;
|
||||||
|
|
||||||
|
stmt: simple_stmts | compound_stmt | pragma_stmt;
|
||||||
|
simple_stmts:
|
||||||
|
simple_stmt (SEMI_COLON simple_stmt)* SEMI_COLON? NEWLINE;
|
||||||
|
simple_stmt:
|
||||||
|
import_stmt
|
||||||
|
| dep_import_stmt
|
||||||
|
| assign_stmt
|
||||||
|
| cum_assign_stmt
|
||||||
|
| set_assign_stmt
|
||||||
|
| connect_stmt
|
||||||
|
| directed_connect_stmt
|
||||||
|
| retype_stmt
|
||||||
|
| pin_declaration
|
||||||
|
| signaldef_stmt
|
||||||
|
| assert_stmt
|
||||||
|
| declaration_stmt
|
||||||
|
| string_stmt
|
||||||
|
| pass_stmt
|
||||||
|
| trait_stmt;
|
||||||
|
|
||||||
|
compound_stmt: blockdef | for_stmt;
|
||||||
|
|
||||||
|
blockdef: blocktype name blockdef_super? COLON block;
|
||||||
|
// TODO @v0.4 consider ()
|
||||||
|
blockdef_super: FROM type_reference;
|
||||||
|
// TODO @v0.4 consider removing component (or more explicit code-as-data)
|
||||||
|
blocktype: (COMPONENT | MODULE | INTERFACE);
|
||||||
|
block: simple_stmts | NEWLINE INDENT stmt+ DEDENT;
|
||||||
|
|
||||||
|
// TODO: @v0.4 remove the deprecated import form
|
||||||
|
dep_import_stmt: IMPORT type_reference FROM string;
|
||||||
|
import_stmt: (FROM string)? IMPORT type_reference (
|
||||||
|
COMMA type_reference
|
||||||
|
)*;
|
||||||
|
|
||||||
|
declaration_stmt: field_reference type_info;
|
||||||
|
field_reference_or_declaration:
|
||||||
|
field_reference
|
||||||
|
| declaration_stmt;
|
||||||
|
assign_stmt: field_reference_or_declaration '=' assignable;
|
||||||
|
cum_assign_stmt:
|
||||||
|
field_reference_or_declaration cum_operator cum_assignable;
|
||||||
|
// TODO: consider sets cum operator
|
||||||
|
set_assign_stmt:
|
||||||
|
field_reference_or_declaration (OR_ASSIGN | AND_ASSIGN) cum_assignable;
|
||||||
|
cum_operator: ADD_ASSIGN | SUB_ASSIGN;
|
||||||
|
cum_assignable: literal_physical | arithmetic_expression;
|
||||||
|
|
||||||
|
assignable:
|
||||||
|
string
|
||||||
|
| new_stmt
|
||||||
|
| literal_physical
|
||||||
|
| arithmetic_expression
|
||||||
|
| boolean_;
|
||||||
|
|
||||||
|
retype_stmt: field_reference ARROW type_reference;
|
||||||
|
|
||||||
|
directed_connect_stmt
|
||||||
|
: bridgeable ((SPERM | LSPERM) bridgeable)+; // only one type of SPERM per stmt allowed. both here for better error messages
|
||||||
|
connect_stmt: mif WIRE mif;
|
||||||
|
bridgeable: connectable;
|
||||||
|
mif: connectable;
|
||||||
|
connectable: field_reference | signaldef_stmt | pindef_stmt;
|
||||||
|
|
||||||
|
signaldef_stmt: SIGNAL name;
|
||||||
|
pindef_stmt: pin_stmt;
|
||||||
|
pin_declaration: pin_stmt;
|
||||||
|
pin_stmt: PIN (name | number_hint_natural | string);
|
||||||
|
|
||||||
|
new_stmt: NEW type_reference ('[' new_count ']')? template?;
|
||||||
|
new_count: number_hint_natural;
|
||||||
|
|
||||||
|
string_stmt:
|
||||||
|
string; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
pass_stmt:
|
||||||
|
PASS; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
list_literal_of_field_references:
|
||||||
|
'[' (field_reference (COMMA field_reference)* COMMA?)? ']';
|
||||||
|
|
||||||
|
iterable_references:
|
||||||
|
field_reference slice?
|
||||||
|
| list_literal_of_field_references;
|
||||||
|
|
||||||
|
for_stmt: FOR name IN iterable_references COLON block;
|
||||||
|
|
||||||
|
assert_stmt: ASSERT comparison;
|
||||||
|
|
||||||
|
trait_stmt
|
||||||
|
: TRAIT type_reference (DOUBLE_COLON constructor)? template?; // TODO: move namespacing to type_reference
|
||||||
|
constructor: name;
|
||||||
|
template: '<' (template_arg (COMMA template_arg)* COMMA?)? '>';
|
||||||
|
template_arg: name ASSIGN literal;
|
||||||
|
|
||||||
|
// Comparison operators --------------------
|
||||||
|
comparison: arithmetic_expression compare_op_pair+;
|
||||||
|
|
||||||
|
compare_op_pair:
|
||||||
|
lt_arithmetic_or
|
||||||
|
| gt_arithmetic_or
|
||||||
|
| lt_eq_arithmetic_or
|
||||||
|
| gt_eq_arithmetic_or
|
||||||
|
| in_arithmetic_or
|
||||||
|
| is_arithmetic_or;
|
||||||
|
|
||||||
|
lt_arithmetic_or: LESS_THAN arithmetic_expression;
|
||||||
|
gt_arithmetic_or: GREATER_THAN arithmetic_expression;
|
||||||
|
lt_eq_arithmetic_or: LT_EQ arithmetic_expression;
|
||||||
|
gt_eq_arithmetic_or: GT_EQ arithmetic_expression;
|
||||||
|
in_arithmetic_or: WITHIN arithmetic_expression;
|
||||||
|
is_arithmetic_or: IS arithmetic_expression;
|
||||||
|
|
||||||
|
// Arithmetic operators --------------------
|
||||||
|
|
||||||
|
arithmetic_expression:
|
||||||
|
arithmetic_expression (OR_OP | AND_OP) sum
|
||||||
|
| sum;
|
||||||
|
|
||||||
|
sum: sum (PLUS | MINUS) term | term;
|
||||||
|
|
||||||
|
term: term (STAR | DIV) power | power;
|
||||||
|
|
||||||
|
power: functional (POWER functional)?;
|
||||||
|
|
||||||
|
functional: bound | name '(' bound+ ')';
|
||||||
|
|
||||||
|
bound: atom;
|
||||||
|
|
||||||
|
// Primary elements ----------------
|
||||||
|
|
||||||
|
slice:
|
||||||
|
'[' (slice_start? COLON slice_stop? (COLON slice_step?)?)? ']'
|
||||||
|
// else [::step] wouldn't match
|
||||||
|
| '[' ( DOUBLE_COLON slice_step?) ']';
|
||||||
|
slice_start: number_hint_integer;
|
||||||
|
slice_stop: number_hint_integer;
|
||||||
|
slice_step: number_hint_integer;
|
||||||
|
|
||||||
|
atom: field_reference | literal_physical | arithmetic_group;
|
||||||
|
|
||||||
|
arithmetic_group: '(' arithmetic_expression ')';
|
||||||
|
|
||||||
|
literal_physical:
|
||||||
|
bound_quantity
|
||||||
|
| bilateral_quantity
|
||||||
|
| quantity;
|
||||||
|
|
||||||
|
bound_quantity: quantity TO quantity;
|
||||||
|
bilateral_quantity: quantity PLUS_OR_MINUS bilateral_tolerance;
|
||||||
|
quantity: number name?;
|
||||||
|
bilateral_tolerance: number_signless (PERCENT | name)?;
|
||||||
|
|
||||||
|
key: number_hint_integer;
|
||||||
|
array_index: '[' key ']';
|
||||||
|
|
||||||
|
// backwards compatibility for A.1
|
||||||
|
pin_reference_end: DOT number_hint_natural;
|
||||||
|
field_reference_part: name array_index?;
|
||||||
|
field_reference:
|
||||||
|
field_reference_part (DOT field_reference_part)* pin_reference_end?;
|
||||||
|
type_reference: name (DOT name)*;
|
||||||
|
// TODO better unit
|
||||||
|
unit: name;
|
||||||
|
type_info: COLON unit;
|
||||||
|
name: NAME;
|
||||||
|
|
||||||
|
// Literals
|
||||||
|
literal: string | boolean_ | number;
|
||||||
|
|
||||||
|
string: STRING;
|
||||||
|
boolean_: TRUE | FALSE;
|
||||||
|
number_hint_natural: number_signless;
|
||||||
|
number_hint_integer: number;
|
||||||
|
number: (PLUS | MINUS)? number_signless;
|
||||||
|
number_signless: NUMBER;
|
||||||
|
```
|
||||||
|
|
||||||
|
# Most used library modules/interfaces (api of them)
|
||||||
|
|
||||||
|
```ato
|
||||||
|
interface Electrical:
|
||||||
|
pass
|
||||||
|
|
||||||
|
interface ElectricPower:
|
||||||
|
hv = new Electrical
|
||||||
|
lv = new Electrical
|
||||||
|
|
||||||
|
module Resistor:
|
||||||
|
resistance: ohm
|
||||||
|
max_power: W
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
module Capacitor:
|
||||||
|
capacitance: F
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
interface I2C:
|
||||||
|
scl = new ElectricLogic
|
||||||
|
sda = new ElectricLogic
|
||||||
|
frequency: Hz
|
||||||
|
address: dimensionless
|
||||||
|
|
||||||
|
interface ElectricLogic:
|
||||||
|
line = new Electrical
|
||||||
|
reference = new ElectricPower
|
||||||
|
```
|
||||||
|
|
||||||
|
For the rest use the atopile MCP server
|
||||||
|
- `get_library_interfaces` to list interfaces
|
||||||
|
- `get_library_modules` to list modules
|
||||||
|
- `inspect_library_module_or_interface` to inspect the code
|
||||||
|
|
||||||
|
# Ato language features
|
||||||
|
|
||||||
|
## experimental features
|
||||||
|
|
||||||
|
Enable with `#pragma experiment("BRIDGE_CONNECT")`
|
||||||
|
BRIDGE_CONNECT: enables `p1 ~> resistor ~> p2` syntax
|
||||||
|
FOR_LOOP: enables `for item in container: pass` syntax
|
||||||
|
TRAITS: enables `trait trait_name` syntax
|
||||||
|
MODULE_TEMPLATING: enables `new MyComponent<param=literal>` syntax
|
||||||
|
|
||||||
|
## modules, interfaces, parameters, traits
|
||||||
|
|
||||||
|
A block is either a module, interface or component.
|
||||||
|
Components are just modules for code-as-data.
|
||||||
|
Interfaces describe a connectable interface (e.g Electrical, ElectricPower, I2C, etc).
|
||||||
|
A module is a block that can be instantiated.
|
||||||
|
Think of it as the ato equivalent of a class.
|
||||||
|
Parameters are variables for numbers and they work with constraints.
|
||||||
|
E.g `resistance: ohm` is a parameter.
|
||||||
|
Constrain with `assert resistance within 10kohm +/- 10%`.
|
||||||
|
It's very important to use toleranced values for parameters.
|
||||||
|
If you constrain a resistor.resistance to 10kohm there won't be a single part found because that's a tolerance of 0%.
|
||||||
|
|
||||||
|
Traits mark a module to have some kind of functionality that can be used in other modules.
|
||||||
|
E.g `trait has_designator_prefix` is the way to mark a module to have a specific designator prefix that will be used in the designator field in the footprint.
|
||||||
|
|
||||||
|
## connecting
|
||||||
|
|
||||||
|
You can only connect interfaces of the same type.
|
||||||
|
`resistor0.unnamed[0] ~ resistor0.unnamed[0]` is the way to connect two resistors in series.
|
||||||
|
If a module has the `can_bridge` trait you can use the sperm operator `~>` to bridge the module.
|
||||||
|
`led.anode ~> resistor ~> power.hv` connects the anode in series with the resistor and then the resistor in series with the high voltage power supply.
|
||||||
|
|
||||||
|
## for loop syntax
|
||||||
|
|
||||||
|
`for item in container: pass` is the way to iterate over a container.
|
||||||
|
|
||||||
|
# Ato CLI
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
You run ato commands through the MCP tool.
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
|
||||||
|
Packages can be found on the ato registry.
|
||||||
|
To install a package you need to run `ato add <PACKAGE_NAME>`.
|
||||||
|
e.g `ato install atopile/addressable-leds`
|
||||||
|
And then can be imported with `from "atopile/addressable-leds/sk6805-ec20.ato" import SK6805_EC20_driver`.
|
||||||
|
And used like this:
|
||||||
|
|
||||||
|
```ato
|
||||||
|
module MyModule:
|
||||||
|
led = new SK6805_EC20_driver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Footprints & Part picking
|
||||||
|
|
||||||
|
Footprint selection is done through the part choice (`ato create part` auto-generates ato code for the part).
|
||||||
|
The `pin` keyword is used to build footprint pinmaps so avoid using it outside of `component` blocks.
|
||||||
|
Preferrably use `Electrical` interface for electrical interfaces.
|
||||||
|
A lot of times it's actually `ElectricLogic` for things like GPIOs etc or `ElectricPower` for power supplies.
|
||||||
|
|
||||||
|
Passive modules (Resistors, Capacitors) are picked automatically by the constraints on their parameters.
|
||||||
|
To constrain the package do e.g `package = "0402"`.
|
||||||
|
To explictly pick a part for a module use `lcsc = "<LCSC_PART_NUMBER>"`.
|
||||||
|
|
||||||
|
|
||||||
|
# Creating a package
|
||||||
|
|
||||||
|
Package generation process:
|
||||||
|
|
||||||
|
Review structure of other pacakges.
|
||||||
|
|
||||||
|
1. Create new Directory in 'packages/packages' with naming convention '<vendor>-<device>' eg 'adi-adau145x'
|
||||||
|
2. create an ato.yaml file in the new directory with the following content:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
requires-atopile: '^0.9.0'
|
||||||
|
|
||||||
|
paths:
|
||||||
|
src: '.'
|
||||||
|
layout: ./layouts
|
||||||
|
|
||||||
|
builds:
|
||||||
|
default:
|
||||||
|
entry: <device>.ato:<device>_driver
|
||||||
|
example:
|
||||||
|
entry: <device>.ato:Example
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create part using tool call 'search_and_install_jlcpcb_part'
|
||||||
|
4. Import the part into the <device>.ato file
|
||||||
|
5. Read the datasheet for the device
|
||||||
|
6. Find common interfaces in the part eg I2C, I2S, SPI, Power
|
||||||
|
|
||||||
|
7. Create interfaces and connect them
|
||||||
|
|
||||||
|
power interfaces:
|
||||||
|
power*<name> = new ElectricPower
|
||||||
|
power*<name>.required = True # If critical to the device
|
||||||
|
assert power\*<name>.voltage within <minimum*operating_voltage>V to <maximum_operating_voltage>V
|
||||||
|
power*<name>.vcc ~ <device>.<vcc pin>
|
||||||
|
power\_<name>.gnd ~ <device>.<gnd pin>
|
||||||
|
|
||||||
|
i2c interfaces:
|
||||||
|
i2c = new I2C
|
||||||
|
i2c.scl.line ~ <device>.<i2c scl pin>
|
||||||
|
i2c.sda.line ~ <device>.<i2c sda pin>
|
||||||
|
|
||||||
|
spi interfaces:
|
||||||
|
spi = new SPI
|
||||||
|
spi.sclk.line ~ <device>.<spi sclk pin>
|
||||||
|
spi.mosi.line ~ <device>.<spi mosi pin>
|
||||||
|
spi.miso.line ~ <device>.<spi miso pin>
|
||||||
|
|
||||||
|
8. Add decoupling capacitors
|
||||||
|
|
||||||
|
looking at the datasheet, determine the required decoupling capacitors
|
||||||
|
|
||||||
|
eg: 2x 100nF 0402:
|
||||||
|
|
||||||
|
power_3v3 = new ElectricPower
|
||||||
|
|
||||||
|
# Decoupling power_3v3
|
||||||
|
|
||||||
|
power_3v3_caps = new Capacitor[2]
|
||||||
|
for capacitor in power_3v3_caps:
|
||||||
|
capacitor.capacitance = 100nF +/- 20%
|
||||||
|
capacitor.package = "0402"
|
||||||
|
power_3v3.hv ~> capacitor ~> power_3v3.lv
|
||||||
|
|
||||||
|
9. If device has pin configurable i2c addresses
|
||||||
|
|
||||||
|
If format is: <n x fixed address bits><m x pin configured address bits>
|
||||||
|
use addressor module:
|
||||||
|
|
||||||
|
- Use `Addressor<address_bits=N>` where **N = number of address pins**.
|
||||||
|
- Connect each `address_lines[i].line` to the corresponding pin, and its `.reference` to a local power rail.
|
||||||
|
- Set `addressor.base` to the lowest possible address and `assert addressor.address is i2c.address`.
|
||||||
|
|
||||||
|
10. Create a README.md
|
||||||
|
|
||||||
|
# <Manufacturer> <Manufacturer part number> <Short description>
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ato
|
||||||
|
<copy in example>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions to this package are welcome via pull requests on the GitHub repository.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This atopile package is provided under the [MIT License](https://opensource.org/license/mit/).
|
||||||
|
|
||||||
|
11. Connect high level interfaces directly in example:
|
||||||
|
|
||||||
|
eg:
|
||||||
|
|
||||||
|
i2c = new I2C
|
||||||
|
power = new ElectricPower
|
||||||
|
sensor = new Sensor
|
||||||
|
|
||||||
|
i2c ~ sensor.i2c
|
||||||
|
power ~ sensor.power_3v3
|
||||||
|
|
||||||
|
# Additional Notes & Gotchas (generic)
|
||||||
|
|
||||||
|
- Multi-rail devices (VDD / VDDIO, AVDD / DVDD, etc.)
|
||||||
|
|
||||||
|
- Model separate `ElectricPower` interfaces for each rail (e.g. `power_core`, `power_io`).
|
||||||
|
- Mark each `.required = True` if the device cannot function without it, and add voltage assertions per datasheet.
|
||||||
|
|
||||||
|
- Optional interfaces (SPI vs I²C)
|
||||||
|
|
||||||
|
- If the device supports multiple buses, pick one for the initial driver. Leave unused bus pins as `ElectricLogic` lines or expose a second interface module later.
|
||||||
|
|
||||||
|
- Decoupling guidance
|
||||||
|
|
||||||
|
- If the datasheet shows multiple caps, model the **minimum required** set so the build passes; you can refine values/packages later.
|
||||||
|
|
||||||
|
- File / directory layout recap
|
||||||
|
- `<vendor>-<device>/` – package root
|
||||||
|
- `ato.yaml` – build manifest (include `default` **and** `example` targets)
|
||||||
|
- `<device>.ato` – driver + optional example module
|
||||||
|
- `parts/<MANUFACTURER_PARTNO>/` – atomic part + footprint/symbol/step files
|
||||||
|
|
||||||
|
These tips should prevent common "footprint not found", "pin X missing", and build-time path errors when you add new devices.
|
||||||
|
|
||||||
|
|
||||||
|
# Vibe coding a project
|
||||||
|
|
||||||
|
If the user gives you high level description of the project, use the following guide:
|
||||||
|
|
||||||
|
# How LLMs can design electronics:
|
||||||
|
|
||||||
|
#1 Rule: USE THE TOOLS. If the tools dont work, dont freak out, you are probably using them wrong. Ask for help if you get stuck.
|
||||||
|
|
||||||
|
Top level design
|
||||||
|
|
||||||
|
1. Research available packages relevant to the user requests using 'find_packages'
|
||||||
|
2. Inspect promising packages using 'inspect_package'
|
||||||
|
3. Propose packages to use for project and architucture to user, revise if needed
|
||||||
|
4. Install needed packages using 'install_package'
|
||||||
|
5. Import packages into main file
|
||||||
|
6. Create instances of packages in main module
|
||||||
|
|
||||||
|
## Power
|
||||||
|
|
||||||
|
1. Review for each package the required voltage and current (current may not be provided, use judement if nessesary)
|
||||||
|
2. Determine the power rails that need to be generated and a suitable tollerance (typically ~3-5% is acceptable)
|
||||||
|
3. Determine the input power source, typically a battery, USB connector or other power connector (eg XT30) and install relevant package
|
||||||
|
4. Find suitable regulators:
|
||||||
|
a) if input voltage > required voltage and current is low, use an LDO package
|
||||||
|
b) if input voltage > required voltage and current is high, use buck converter
|
||||||
|
c) if input votlage < required voltage, use a boost converter
|
||||||
|
d) if input voltage can be both less than or greater than input voltage, use buck boost (eg battery powered device that needs 3v3)
|
||||||
|
5. If battery powered, add charger package
|
||||||
|
|
||||||
|
Typical power architucture example with LDO:
|
||||||
|
|
||||||
|
- USB input power
|
||||||
|
- Low current output (eg microcontroller)
|
||||||
|
|
||||||
|
from "atopile/ti-tlv75901/ti-tlv75901.ato" import TLV75901_driver
|
||||||
|
from "atopile/usb-connectors/usb-connectors.ato" import USBCConn
|
||||||
|
|
||||||
|
module App:
|
||||||
|
|
||||||
|
# Rails
|
||||||
|
power_5v = new Power
|
||||||
|
power_3v3 = new Power
|
||||||
|
|
||||||
|
# Components
|
||||||
|
ldo = new TLV75901_driver
|
||||||
|
usb_connector = new USBCConn
|
||||||
|
|
||||||
|
# Connections
|
||||||
|
usb_connector.power ~ power_vbus
|
||||||
|
power_vbus ~> ldo ~> power_3v3
|
||||||
|
|
||||||
|
## Communicaions
|
||||||
|
|
||||||
|
1. Review packages required interfaces, typically i2c, spi or ElectricLogics
|
||||||
|
2. Find suitable pins on the controller, typically a microcontroller or Linux SOC
|
||||||
|
3. Connect interfaces eg micro.i2c[0] ~ sensor.i2c
|
||||||
|
|
||||||
|
## Development process notes
|
||||||
|
|
||||||
|
- After making changes, be sure to use 'build_project' to update the PCB
|
||||||
|
- Builds will often generate errors/warnings, these should be reviewed and fixed
|
||||||
|
- Prioritize pacakges from 'atopile' over other packages
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,710 @@
|
|||||||
|
# GEMINI.md
|
||||||
|
|
||||||
|
ato is a declarative DSL to design electronics (PCBs) with.
|
||||||
|
It is part of the atopile project.
|
||||||
|
Atopile is run by the vscode/cursor/windsurf extension.
|
||||||
|
The CLI (which is invoked by the extension) actually builds the project.
|
||||||
|
|
||||||
|
# Not available in ato
|
||||||
|
|
||||||
|
- if statements
|
||||||
|
- while loops
|
||||||
|
- functions (calls or definitions)
|
||||||
|
- classes
|
||||||
|
- objects
|
||||||
|
- exceptions
|
||||||
|
- generators
|
||||||
|
|
||||||
|
|
||||||
|
# Ato Syntax
|
||||||
|
|
||||||
|
ato sytax is heavily inspired by Python, but fully declarative.
|
||||||
|
ato thus has no procedural code, and no side effects.
|
||||||
|
|
||||||
|
## Examples of syntax
|
||||||
|
|
||||||
|
```ato
|
||||||
|
#pragma text
|
||||||
|
#pragma func("X")
|
||||||
|
# enable for loop syntax feature:
|
||||||
|
#pragma experiment("FOR_LOOP)
|
||||||
|
|
||||||
|
# --- Imports ---
|
||||||
|
# Standard import (newline terminated)
|
||||||
|
import ModuleName
|
||||||
|
|
||||||
|
# Import with multiple modules (newline terminated)
|
||||||
|
import Module1, Module2.Submodule
|
||||||
|
|
||||||
|
# Import from a specific file/source (newline terminated)
|
||||||
|
from "path/to/source.ato" import SpecificModule
|
||||||
|
|
||||||
|
# Multiple imports on one line (semicolon separated)
|
||||||
|
import AnotherModule; from "another/source.ato" import AnotherSpecific
|
||||||
|
|
||||||
|
# Deprecated import form (newline terminated)
|
||||||
|
# TODO: remove when unsupported
|
||||||
|
import DeprecatedModule from "other/source.ato"
|
||||||
|
|
||||||
|
# --- Top-level Definitions and Statements ---
|
||||||
|
|
||||||
|
pass
|
||||||
|
pass;
|
||||||
|
|
||||||
|
"docstring-like statement"
|
||||||
|
"docstring-like statement";
|
||||||
|
|
||||||
|
top_level_var = 123
|
||||||
|
|
||||||
|
# Compound statement
|
||||||
|
pass; another_var = 456; "another docstring"
|
||||||
|
|
||||||
|
# Block definitions
|
||||||
|
component MyComponent:
|
||||||
|
# Simple statement inside block (newline terminated)
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Multiple simple statements on one line (semicolon separated)
|
||||||
|
pass; internal_flag = True
|
||||||
|
|
||||||
|
module AnotherBaseModule:
|
||||||
|
pin base_pin
|
||||||
|
base_param = 10
|
||||||
|
|
||||||
|
interface MyInterface:
|
||||||
|
pin io
|
||||||
|
|
||||||
|
module DemoModule from AnotherBaseModule:
|
||||||
|
# --- Declarations ---
|
||||||
|
pin p1 # Pin declaration with name
|
||||||
|
pin 1 # Pin declaration with number
|
||||||
|
pin "GND" # Pin declaration with string
|
||||||
|
signal my_signal # Signal definition
|
||||||
|
a_field: AnotherBaseModule # Field declaration with type hint
|
||||||
|
|
||||||
|
# --- Assignments ---
|
||||||
|
# Newline terminated:
|
||||||
|
internal_variable = 123
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
var_a = 1; var_b = "string"
|
||||||
|
|
||||||
|
# Cumulative assignment (+=, -=) - Newline terminated
|
||||||
|
value = 1
|
||||||
|
value += 1; value -= 1
|
||||||
|
|
||||||
|
# Set assignment (|=, &=) - Newline terminated
|
||||||
|
flags |= 1; flags &= 2
|
||||||
|
|
||||||
|
# --- Connections ---
|
||||||
|
p1 ~ base_pin
|
||||||
|
mif ~> bridge
|
||||||
|
mif ~> bridge ~> bridge
|
||||||
|
mif ~> bridge ~> bridge ~> mif
|
||||||
|
bridge ~> mif
|
||||||
|
mif <~ bridge
|
||||||
|
mif <~ bridge <~ bridge
|
||||||
|
mif <~ bridge <~ bridge <~ mif
|
||||||
|
bridge <~ mif
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
p_multi1 ~ my_signal; p_multi2 ~ sig_multi1
|
||||||
|
|
||||||
|
# --- Retyping ---
|
||||||
|
instance.x -> AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Instantiation ---
|
||||||
|
instance = new MyComponent
|
||||||
|
container = new MyComponent[10]
|
||||||
|
templated_instance_a = new MyComponent
|
||||||
|
templated_instance_b = new MyComponent<int_=1>
|
||||||
|
templated_instance_c = new MyComponent<float_=2.5>
|
||||||
|
templated_instance_d = new MyComponent<string_="hello">
|
||||||
|
templated_instance_e = new MyComponent<int_=1, float_=2.5, string_="hello">
|
||||||
|
templated_instance_f = new MyComponent<int_=1, float_=2.5, string_="hello", bool_=True>
|
||||||
|
|
||||||
|
# Semicolon separated instantiations (via assignment):
|
||||||
|
inst_a = new MyComponent; inst_b = new AnotherBaseModule
|
||||||
|
|
||||||
|
# --- Traits ---
|
||||||
|
trait trait_name
|
||||||
|
trait trait_name<int_=1>
|
||||||
|
trait trait_name<float_=2.5>
|
||||||
|
trait trait_name<string_="hello">
|
||||||
|
trait trait_name<bool_=True>
|
||||||
|
trait trait_name::constructor
|
||||||
|
trait trait_name::constructor<int_=1>
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
trait TraitA; trait TraitB::constructor; trait TraitC<arg_=1>
|
||||||
|
|
||||||
|
# --- Assertions ---
|
||||||
|
assert x > 5V
|
||||||
|
assert x < 10V
|
||||||
|
assert 5V < x < 10V
|
||||||
|
assert x >= 5V
|
||||||
|
assert x <= 10V
|
||||||
|
assert current within 1A +/- 10mA
|
||||||
|
assert voltage within 1V +/- 10%
|
||||||
|
assert resistance is 1kohm to 1.1kohm
|
||||||
|
|
||||||
|
# Semicolon separated on one line:
|
||||||
|
assert x is 1V; assert another_param is 2V
|
||||||
|
|
||||||
|
# --- Loops ---
|
||||||
|
for item in container:
|
||||||
|
item ~ p1
|
||||||
|
|
||||||
|
# For loop iterating over a slice
|
||||||
|
for item in container[0:4]:
|
||||||
|
pass
|
||||||
|
item.value = 1; pass
|
||||||
|
|
||||||
|
# For loop iterating over a list literal of field references
|
||||||
|
for ref in [p1, x.1, x.GND]:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# --- References and Indexing ---
|
||||||
|
# Reference with array index assignment
|
||||||
|
array_element = container[3]
|
||||||
|
|
||||||
|
# --- Literals and Expressions ---
|
||||||
|
# Integer
|
||||||
|
int_val = 100
|
||||||
|
neg_int_val = -50
|
||||||
|
hex_val = 0xF1
|
||||||
|
bin_val = 0b10
|
||||||
|
oct_val = 0o10
|
||||||
|
# Float
|
||||||
|
float_val = 3.14
|
||||||
|
# Physical quantities
|
||||||
|
voltage: V = 5V
|
||||||
|
resistance: ohm = 10kohm
|
||||||
|
capacitance: F = 100nF
|
||||||
|
# Bilateral tolerance
|
||||||
|
tolerance_val = 1kohm +/- 10%
|
||||||
|
tolerance_abs = 5V +/- 500mV
|
||||||
|
tolerance_explicit_unit = 10A +/- 1A
|
||||||
|
# Bounded quantity (range)
|
||||||
|
voltage_range = 3V to 3.6V
|
||||||
|
# Boolean
|
||||||
|
is_enabled = True
|
||||||
|
is_active = False
|
||||||
|
# String
|
||||||
|
message = "Hello inside module"
|
||||||
|
|
||||||
|
# Arithmetic expressions
|
||||||
|
sum_val = 1 + 2
|
||||||
|
diff_val = 10 - 3ohm
|
||||||
|
prod_val = 5 * 2mA
|
||||||
|
div_val = 10V / 2kohm # Results in current
|
||||||
|
power_val = 2**3
|
||||||
|
complex_expr = (5 + 3) * 2 - 1
|
||||||
|
flag_check = state | MASK_VALUE
|
||||||
|
|
||||||
|
# Comparisons
|
||||||
|
assert voltage within voltage_range
|
||||||
|
assert length <= 5mm
|
||||||
|
assert height >= 2mm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --- Multi-line variations ---
|
||||||
|
pass; nested_var=1; another=2
|
||||||
|
|
||||||
|
complex_assignment = (
|
||||||
|
voltage + resistance
|
||||||
|
* capacitance
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## G4 Grammar
|
||||||
|
|
||||||
|
```g4
|
||||||
|
parser grammar AtoParser;
|
||||||
|
|
||||||
|
options {
|
||||||
|
superClass = AtoParserBase;
|
||||||
|
tokenVocab = AtoLexer;
|
||||||
|
}
|
||||||
|
|
||||||
|
file_input: (NEWLINE | stmt)* EOF;
|
||||||
|
|
||||||
|
pragma_stmt: PRAGMA;
|
||||||
|
|
||||||
|
stmt: simple_stmts | compound_stmt | pragma_stmt;
|
||||||
|
simple_stmts:
|
||||||
|
simple_stmt (SEMI_COLON simple_stmt)* SEMI_COLON? NEWLINE;
|
||||||
|
simple_stmt:
|
||||||
|
import_stmt
|
||||||
|
| dep_import_stmt
|
||||||
|
| assign_stmt
|
||||||
|
| cum_assign_stmt
|
||||||
|
| set_assign_stmt
|
||||||
|
| connect_stmt
|
||||||
|
| directed_connect_stmt
|
||||||
|
| retype_stmt
|
||||||
|
| pin_declaration
|
||||||
|
| signaldef_stmt
|
||||||
|
| assert_stmt
|
||||||
|
| declaration_stmt
|
||||||
|
| string_stmt
|
||||||
|
| pass_stmt
|
||||||
|
| trait_stmt;
|
||||||
|
|
||||||
|
compound_stmt: blockdef | for_stmt;
|
||||||
|
|
||||||
|
blockdef: blocktype name blockdef_super? COLON block;
|
||||||
|
// TODO @v0.4 consider ()
|
||||||
|
blockdef_super: FROM type_reference;
|
||||||
|
// TODO @v0.4 consider removing component (or more explicit code-as-data)
|
||||||
|
blocktype: (COMPONENT | MODULE | INTERFACE);
|
||||||
|
block: simple_stmts | NEWLINE INDENT stmt+ DEDENT;
|
||||||
|
|
||||||
|
// TODO: @v0.4 remove the deprecated import form
|
||||||
|
dep_import_stmt: IMPORT type_reference FROM string;
|
||||||
|
import_stmt: (FROM string)? IMPORT type_reference (
|
||||||
|
COMMA type_reference
|
||||||
|
)*;
|
||||||
|
|
||||||
|
declaration_stmt: field_reference type_info;
|
||||||
|
field_reference_or_declaration:
|
||||||
|
field_reference
|
||||||
|
| declaration_stmt;
|
||||||
|
assign_stmt: field_reference_or_declaration '=' assignable;
|
||||||
|
cum_assign_stmt:
|
||||||
|
field_reference_or_declaration cum_operator cum_assignable;
|
||||||
|
// TODO: consider sets cum operator
|
||||||
|
set_assign_stmt:
|
||||||
|
field_reference_or_declaration (OR_ASSIGN | AND_ASSIGN) cum_assignable;
|
||||||
|
cum_operator: ADD_ASSIGN | SUB_ASSIGN;
|
||||||
|
cum_assignable: literal_physical | arithmetic_expression;
|
||||||
|
|
||||||
|
assignable:
|
||||||
|
string
|
||||||
|
| new_stmt
|
||||||
|
| literal_physical
|
||||||
|
| arithmetic_expression
|
||||||
|
| boolean_;
|
||||||
|
|
||||||
|
retype_stmt: field_reference ARROW type_reference;
|
||||||
|
|
||||||
|
directed_connect_stmt
|
||||||
|
: bridgeable ((SPERM | LSPERM) bridgeable)+; // only one type of SPERM per stmt allowed. both here for better error messages
|
||||||
|
connect_stmt: mif WIRE mif;
|
||||||
|
bridgeable: connectable;
|
||||||
|
mif: connectable;
|
||||||
|
connectable: field_reference | signaldef_stmt | pindef_stmt;
|
||||||
|
|
||||||
|
signaldef_stmt: SIGNAL name;
|
||||||
|
pindef_stmt: pin_stmt;
|
||||||
|
pin_declaration: pin_stmt;
|
||||||
|
pin_stmt: PIN (name | number_hint_natural | string);
|
||||||
|
|
||||||
|
new_stmt: NEW type_reference ('[' new_count ']')? template?;
|
||||||
|
new_count: number_hint_natural;
|
||||||
|
|
||||||
|
string_stmt:
|
||||||
|
string; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
pass_stmt:
|
||||||
|
PASS; // the unbound string is a statement used to add doc-strings
|
||||||
|
|
||||||
|
list_literal_of_field_references:
|
||||||
|
'[' (field_reference (COMMA field_reference)* COMMA?)? ']';
|
||||||
|
|
||||||
|
iterable_references:
|
||||||
|
field_reference slice?
|
||||||
|
| list_literal_of_field_references;
|
||||||
|
|
||||||
|
for_stmt: FOR name IN iterable_references COLON block;
|
||||||
|
|
||||||
|
assert_stmt: ASSERT comparison;
|
||||||
|
|
||||||
|
trait_stmt
|
||||||
|
: TRAIT type_reference (DOUBLE_COLON constructor)? template?; // TODO: move namespacing to type_reference
|
||||||
|
constructor: name;
|
||||||
|
template: '<' (template_arg (COMMA template_arg)* COMMA?)? '>';
|
||||||
|
template_arg: name ASSIGN literal;
|
||||||
|
|
||||||
|
// Comparison operators --------------------
|
||||||
|
comparison: arithmetic_expression compare_op_pair+;
|
||||||
|
|
||||||
|
compare_op_pair:
|
||||||
|
lt_arithmetic_or
|
||||||
|
| gt_arithmetic_or
|
||||||
|
| lt_eq_arithmetic_or
|
||||||
|
| gt_eq_arithmetic_or
|
||||||
|
| in_arithmetic_or
|
||||||
|
| is_arithmetic_or;
|
||||||
|
|
||||||
|
lt_arithmetic_or: LESS_THAN arithmetic_expression;
|
||||||
|
gt_arithmetic_or: GREATER_THAN arithmetic_expression;
|
||||||
|
lt_eq_arithmetic_or: LT_EQ arithmetic_expression;
|
||||||
|
gt_eq_arithmetic_or: GT_EQ arithmetic_expression;
|
||||||
|
in_arithmetic_or: WITHIN arithmetic_expression;
|
||||||
|
is_arithmetic_or: IS arithmetic_expression;
|
||||||
|
|
||||||
|
// Arithmetic operators --------------------
|
||||||
|
|
||||||
|
arithmetic_expression:
|
||||||
|
arithmetic_expression (OR_OP | AND_OP) sum
|
||||||
|
| sum;
|
||||||
|
|
||||||
|
sum: sum (PLUS | MINUS) term | term;
|
||||||
|
|
||||||
|
term: term (STAR | DIV) power | power;
|
||||||
|
|
||||||
|
power: functional (POWER functional)?;
|
||||||
|
|
||||||
|
functional: bound | name '(' bound+ ')';
|
||||||
|
|
||||||
|
bound: atom;
|
||||||
|
|
||||||
|
// Primary elements ----------------
|
||||||
|
|
||||||
|
slice:
|
||||||
|
'[' (slice_start? COLON slice_stop? (COLON slice_step?)?)? ']'
|
||||||
|
// else [::step] wouldn't match
|
||||||
|
| '[' ( DOUBLE_COLON slice_step?) ']';
|
||||||
|
slice_start: number_hint_integer;
|
||||||
|
slice_stop: number_hint_integer;
|
||||||
|
slice_step: number_hint_integer;
|
||||||
|
|
||||||
|
atom: field_reference | literal_physical | arithmetic_group;
|
||||||
|
|
||||||
|
arithmetic_group: '(' arithmetic_expression ')';
|
||||||
|
|
||||||
|
literal_physical:
|
||||||
|
bound_quantity
|
||||||
|
| bilateral_quantity
|
||||||
|
| quantity;
|
||||||
|
|
||||||
|
bound_quantity: quantity TO quantity;
|
||||||
|
bilateral_quantity: quantity PLUS_OR_MINUS bilateral_tolerance;
|
||||||
|
quantity: number name?;
|
||||||
|
bilateral_tolerance: number_signless (PERCENT | name)?;
|
||||||
|
|
||||||
|
key: number_hint_integer;
|
||||||
|
array_index: '[' key ']';
|
||||||
|
|
||||||
|
// backwards compatibility for A.1
|
||||||
|
pin_reference_end: DOT number_hint_natural;
|
||||||
|
field_reference_part: name array_index?;
|
||||||
|
field_reference:
|
||||||
|
field_reference_part (DOT field_reference_part)* pin_reference_end?;
|
||||||
|
type_reference: name (DOT name)*;
|
||||||
|
// TODO better unit
|
||||||
|
unit: name;
|
||||||
|
type_info: COLON unit;
|
||||||
|
name: NAME;
|
||||||
|
|
||||||
|
// Literals
|
||||||
|
literal: string | boolean_ | number;
|
||||||
|
|
||||||
|
string: STRING;
|
||||||
|
boolean_: TRUE | FALSE;
|
||||||
|
number_hint_natural: number_signless;
|
||||||
|
number_hint_integer: number;
|
||||||
|
number: (PLUS | MINUS)? number_signless;
|
||||||
|
number_signless: NUMBER;
|
||||||
|
```
|
||||||
|
|
||||||
|
# Most used library modules/interfaces (api of them)
|
||||||
|
|
||||||
|
```ato
|
||||||
|
interface Electrical:
|
||||||
|
pass
|
||||||
|
|
||||||
|
interface ElectricPower:
|
||||||
|
hv = new Electrical
|
||||||
|
lv = new Electrical
|
||||||
|
|
||||||
|
module Resistor:
|
||||||
|
resistance: ohm
|
||||||
|
max_power: W
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
module Capacitor:
|
||||||
|
capacitance: F
|
||||||
|
max_voltage: V
|
||||||
|
unnamed = new Electrical[2]
|
||||||
|
|
||||||
|
interface I2C:
|
||||||
|
scl = new ElectricLogic
|
||||||
|
sda = new ElectricLogic
|
||||||
|
frequency: Hz
|
||||||
|
address: dimensionless
|
||||||
|
|
||||||
|
interface ElectricLogic:
|
||||||
|
line = new Electrical
|
||||||
|
reference = new ElectricPower
|
||||||
|
```
|
||||||
|
|
||||||
|
For the rest use the atopile MCP server
|
||||||
|
- `get_library_interfaces` to list interfaces
|
||||||
|
- `get_library_modules` to list modules
|
||||||
|
- `inspect_library_module_or_interface` to inspect the code
|
||||||
|
|
||||||
|
# Ato language features
|
||||||
|
|
||||||
|
## experimental features
|
||||||
|
|
||||||
|
Enable with `#pragma experiment("BRIDGE_CONNECT")`
|
||||||
|
BRIDGE_CONNECT: enables `p1 ~> resistor ~> p2` syntax
|
||||||
|
FOR_LOOP: enables `for item in container: pass` syntax
|
||||||
|
TRAITS: enables `trait trait_name` syntax
|
||||||
|
MODULE_TEMPLATING: enables `new MyComponent<param=literal>` syntax
|
||||||
|
|
||||||
|
## modules, interfaces, parameters, traits
|
||||||
|
|
||||||
|
A block is either a module, interface or component.
|
||||||
|
Components are just modules for code-as-data.
|
||||||
|
Interfaces describe a connectable interface (e.g Electrical, ElectricPower, I2C, etc).
|
||||||
|
A module is a block that can be instantiated.
|
||||||
|
Think of it as the ato equivalent of a class.
|
||||||
|
Parameters are variables for numbers and they work with constraints.
|
||||||
|
E.g `resistance: ohm` is a parameter.
|
||||||
|
Constrain with `assert resistance within 10kohm +/- 10%`.
|
||||||
|
It's very important to use toleranced values for parameters.
|
||||||
|
If you constrain a resistor.resistance to 10kohm there won't be a single part found because that's a tolerance of 0%.
|
||||||
|
|
||||||
|
Traits mark a module to have some kind of functionality that can be used in other modules.
|
||||||
|
E.g `trait has_designator_prefix` is the way to mark a module to have a specific designator prefix that will be used in the designator field in the footprint.
|
||||||
|
|
||||||
|
## connecting
|
||||||
|
|
||||||
|
You can only connect interfaces of the same type.
|
||||||
|
`resistor0.unnamed[0] ~ resistor0.unnamed[0]` is the way to connect two resistors in series.
|
||||||
|
If a module has the `can_bridge` trait you can use the sperm operator `~>` to bridge the module.
|
||||||
|
`led.anode ~> resistor ~> power.hv` connects the anode in series with the resistor and then the resistor in series with the high voltage power supply.
|
||||||
|
|
||||||
|
## for loop syntax
|
||||||
|
|
||||||
|
`for item in container: pass` is the way to iterate over a container.
|
||||||
|
|
||||||
|
# Ato CLI
|
||||||
|
|
||||||
|
## How to run
|
||||||
|
|
||||||
|
You run ato commands through the MCP tool.
|
||||||
|
|
||||||
|
## Packages
|
||||||
|
|
||||||
|
Packages can be found on the ato registry.
|
||||||
|
To install a package you need to run `ato add <PACKAGE_NAME>`.
|
||||||
|
e.g `ato install atopile/addressable-leds`
|
||||||
|
And then can be imported with `from "atopile/addressable-leds/sk6805-ec20.ato" import SK6805_EC20_driver`.
|
||||||
|
And used like this:
|
||||||
|
|
||||||
|
```ato
|
||||||
|
module MyModule:
|
||||||
|
led = new SK6805_EC20_driver
|
||||||
|
```
|
||||||
|
|
||||||
|
## Footprints & Part picking
|
||||||
|
|
||||||
|
Footprint selection is done through the part choice (`ato create part` auto-generates ato code for the part).
|
||||||
|
The `pin` keyword is used to build footprint pinmaps so avoid using it outside of `component` blocks.
|
||||||
|
Preferrably use `Electrical` interface for electrical interfaces.
|
||||||
|
A lot of times it's actually `ElectricLogic` for things like GPIOs etc or `ElectricPower` for power supplies.
|
||||||
|
|
||||||
|
Passive modules (Resistors, Capacitors) are picked automatically by the constraints on their parameters.
|
||||||
|
To constrain the package do e.g `package = "0402"`.
|
||||||
|
To explictly pick a part for a module use `lcsc = "<LCSC_PART_NUMBER>"`.
|
||||||
|
|
||||||
|
|
||||||
|
# Creating a package
|
||||||
|
|
||||||
|
Package generation process:
|
||||||
|
|
||||||
|
Review structure of other pacakges.
|
||||||
|
|
||||||
|
1. Create new Directory in 'packages/packages' with naming convention '<vendor>-<device>' eg 'adi-adau145x'
|
||||||
|
2. create an ato.yaml file in the new directory with the following content:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
requires-atopile: '^0.9.0'
|
||||||
|
|
||||||
|
paths:
|
||||||
|
src: '.'
|
||||||
|
layout: ./layouts
|
||||||
|
|
||||||
|
builds:
|
||||||
|
default:
|
||||||
|
entry: <device>.ato:<device>_driver
|
||||||
|
example:
|
||||||
|
entry: <device>.ato:Example
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Create part using tool call 'search_and_install_jlcpcb_part'
|
||||||
|
4. Import the part into the <device>.ato file
|
||||||
|
5. Read the datasheet for the device
|
||||||
|
6. Find common interfaces in the part eg I2C, I2S, SPI, Power
|
||||||
|
|
||||||
|
7. Create interfaces and connect them
|
||||||
|
|
||||||
|
power interfaces:
|
||||||
|
power*<name> = new ElectricPower
|
||||||
|
power*<name>.required = True # If critical to the device
|
||||||
|
assert power\*<name>.voltage within <minimum*operating_voltage>V to <maximum_operating_voltage>V
|
||||||
|
power*<name>.vcc ~ <device>.<vcc pin>
|
||||||
|
power\_<name>.gnd ~ <device>.<gnd pin>
|
||||||
|
|
||||||
|
i2c interfaces:
|
||||||
|
i2c = new I2C
|
||||||
|
i2c.scl.line ~ <device>.<i2c scl pin>
|
||||||
|
i2c.sda.line ~ <device>.<i2c sda pin>
|
||||||
|
|
||||||
|
spi interfaces:
|
||||||
|
spi = new SPI
|
||||||
|
spi.sclk.line ~ <device>.<spi sclk pin>
|
||||||
|
spi.mosi.line ~ <device>.<spi mosi pin>
|
||||||
|
spi.miso.line ~ <device>.<spi miso pin>
|
||||||
|
|
||||||
|
8. Add decoupling capacitors
|
||||||
|
|
||||||
|
looking at the datasheet, determine the required decoupling capacitors
|
||||||
|
|
||||||
|
eg: 2x 100nF 0402:
|
||||||
|
|
||||||
|
power_3v3 = new ElectricPower
|
||||||
|
|
||||||
|
# Decoupling power_3v3
|
||||||
|
|
||||||
|
power_3v3_caps = new Capacitor[2]
|
||||||
|
for capacitor in power_3v3_caps:
|
||||||
|
capacitor.capacitance = 100nF +/- 20%
|
||||||
|
capacitor.package = "0402"
|
||||||
|
power_3v3.hv ~> capacitor ~> power_3v3.lv
|
||||||
|
|
||||||
|
9. If device has pin configurable i2c addresses
|
||||||
|
|
||||||
|
If format is: <n x fixed address bits><m x pin configured address bits>
|
||||||
|
use addressor module:
|
||||||
|
|
||||||
|
- Use `Addressor<address_bits=N>` where **N = number of address pins**.
|
||||||
|
- Connect each `address_lines[i].line` to the corresponding pin, and its `.reference` to a local power rail.
|
||||||
|
- Set `addressor.base` to the lowest possible address and `assert addressor.address is i2c.address`.
|
||||||
|
|
||||||
|
10. Create a README.md
|
||||||
|
|
||||||
|
# <Manufacturer> <Manufacturer part number> <Short description>
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```ato
|
||||||
|
<copy in example>
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions to this package are welcome via pull requests on the GitHub repository.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This atopile package is provided under the [MIT License](https://opensource.org/license/mit/).
|
||||||
|
|
||||||
|
11. Connect high level interfaces directly in example:
|
||||||
|
|
||||||
|
eg:
|
||||||
|
|
||||||
|
i2c = new I2C
|
||||||
|
power = new ElectricPower
|
||||||
|
sensor = new Sensor
|
||||||
|
|
||||||
|
i2c ~ sensor.i2c
|
||||||
|
power ~ sensor.power_3v3
|
||||||
|
|
||||||
|
# Additional Notes & Gotchas (generic)
|
||||||
|
|
||||||
|
- Multi-rail devices (VDD / VDDIO, AVDD / DVDD, etc.)
|
||||||
|
|
||||||
|
- Model separate `ElectricPower` interfaces for each rail (e.g. `power_core`, `power_io`).
|
||||||
|
- Mark each `.required = True` if the device cannot function without it, and add voltage assertions per datasheet.
|
||||||
|
|
||||||
|
- Optional interfaces (SPI vs I²C)
|
||||||
|
|
||||||
|
- If the device supports multiple buses, pick one for the initial driver. Leave unused bus pins as `ElectricLogic` lines or expose a second interface module later.
|
||||||
|
|
||||||
|
- Decoupling guidance
|
||||||
|
|
||||||
|
- If the datasheet shows multiple caps, model the **minimum required** set so the build passes; you can refine values/packages later.
|
||||||
|
|
||||||
|
- File / directory layout recap
|
||||||
|
- `<vendor>-<device>/` – package root
|
||||||
|
- `ato.yaml` – build manifest (include `default` **and** `example` targets)
|
||||||
|
- `<device>.ato` – driver + optional example module
|
||||||
|
- `parts/<MANUFACTURER_PARTNO>/` – atomic part + footprint/symbol/step files
|
||||||
|
|
||||||
|
These tips should prevent common "footprint not found", "pin X missing", and build-time path errors when you add new devices.
|
||||||
|
|
||||||
|
|
||||||
|
# Vibe coding a project
|
||||||
|
|
||||||
|
If the user gives you high level description of the project, use the following guide:
|
||||||
|
|
||||||
|
# How LLMs can design electronics:
|
||||||
|
|
||||||
|
#1 Rule: USE THE TOOLS. If the tools dont work, dont freak out, you are probably using them wrong. Ask for help if you get stuck.
|
||||||
|
|
||||||
|
Top level design
|
||||||
|
|
||||||
|
1. Research available packages relevant to the user requests using 'find_packages'
|
||||||
|
2. Inspect promising packages using 'inspect_package'
|
||||||
|
3. Propose packages to use for project and architucture to user, revise if needed
|
||||||
|
4. Install needed packages using 'install_package'
|
||||||
|
5. Import packages into main file
|
||||||
|
6. Create instances of packages in main module
|
||||||
|
|
||||||
|
## Power
|
||||||
|
|
||||||
|
1. Review for each package the required voltage and current (current may not be provided, use judement if nessesary)
|
||||||
|
2. Determine the power rails that need to be generated and a suitable tollerance (typically ~3-5% is acceptable)
|
||||||
|
3. Determine the input power source, typically a battery, USB connector or other power connector (eg XT30) and install relevant package
|
||||||
|
4. Find suitable regulators:
|
||||||
|
a) if input voltage > required voltage and current is low, use an LDO package
|
||||||
|
b) if input voltage > required voltage and current is high, use buck converter
|
||||||
|
c) if input votlage < required voltage, use a boost converter
|
||||||
|
d) if input voltage can be both less than or greater than input voltage, use buck boost (eg battery powered device that needs 3v3)
|
||||||
|
5. If battery powered, add charger package
|
||||||
|
|
||||||
|
Typical power architucture example with LDO:
|
||||||
|
|
||||||
|
- USB input power
|
||||||
|
- Low current output (eg microcontroller)
|
||||||
|
|
||||||
|
from "atopile/ti-tlv75901/ti-tlv75901.ato" import TLV75901_driver
|
||||||
|
from "atopile/usb-connectors/usb-connectors.ato" import USBCConn
|
||||||
|
|
||||||
|
module App:
|
||||||
|
|
||||||
|
# Rails
|
||||||
|
power_5v = new Power
|
||||||
|
power_3v3 = new Power
|
||||||
|
|
||||||
|
# Components
|
||||||
|
ldo = new TLV75901_driver
|
||||||
|
usb_connector = new USBCConn
|
||||||
|
|
||||||
|
# Connections
|
||||||
|
usb_connector.power ~ power_vbus
|
||||||
|
power_vbus ~> ldo ~> power_3v3
|
||||||
|
|
||||||
|
## Communicaions
|
||||||
|
|
||||||
|
1. Review packages required interfaces, typically i2c, spi or ElectricLogics
|
||||||
|
2. Find suitable pins on the controller, typically a microcontroller or Linux SOC
|
||||||
|
3. Connect interfaces eg micro.i2c[0] ~ sensor.i2c
|
||||||
|
|
||||||
|
## Development process notes
|
||||||
|
|
||||||
|
- After making changes, be sure to use 'build_project' to update the PCB
|
||||||
|
- Builds will often generate errors/warnings, these should be reviewed and fixed
|
||||||
|
- Prioritize pacakges from 'atopile' over other packages
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# DFPlayer Motherboard for Atopile
|
||||||
|
|
||||||
|
A compact, SMD-based motherboard for the popular [DFPlayer Mini[(https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299)]) MP3 module, designed using the atopile hardware description language.
|
||||||
|
|
||||||
|
This board serves as a carrier for the DFPlayer, providing stable power, protection, and convenient interfaces for audio input and output. It is designed to be easily integrated into larger audio projects.
|
||||||
|
|
||||||
|
 <!-- TODO: Replace with an actual image of your board -->
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* **Power Supply:** On-board diode is used to drop the input voltage to a DFPlayer-safe ~4.3V. An electrolytic capacitor is included for power supply filtering, ensuring smooth operation.
|
||||||
|
* **All SMD Components:** Designed for a low-profile, surface-mount assembly, making it suitable for compact enclosures.
|
||||||
|
* **Simple Interfaces:** Utilizes standard JST and 3.5mm connectors for power, data input, speaker output, and stereo line-level output.
|
||||||
|
* **Compact Design:** A small footprint carrier board for the 2x8 pin DFPlayer Mini module.
|
||||||
|
|
||||||
|
## Interfaces
|
||||||
|
|
||||||
|
### Input
|
||||||
|
|
||||||
|
* **Connector:** 4-pin JST PH 2.0mm
|
||||||
|
* **Signals:**
|
||||||
|
* `+5V`: Power input
|
||||||
|
* `GND`: Ground
|
||||||
|
* `TX`: Serial Transmit (connects to DFPlayer RX) protected by the 1kΩ resistor
|
||||||
|
* `RX`: Serial Receive (connects to DFPlayer TX)
|
||||||
|
* **Description:** This interface provides both power and UART serial communication to the DFPlayer module. It is important to note that the DFPlayer's RX pin is not 5V tolerant, so a 1kΩ series resistor is included on the board for protection.
|
||||||
|
|
||||||
|
### Outputs
|
||||||
|
|
||||||
|
#### 1. Speaker (Mono)
|
||||||
|
|
||||||
|
* **Connector:** 2-pin JST PH 2.0mm
|
||||||
|
* **Signals:**
|
||||||
|
* `SPK+`
|
||||||
|
* `SPK-`
|
||||||
|
* **Description:** A direct, amplified mono output for a small speaker (up to 3W). This connects directly to the `SPK1` and `SPK2` pins of the DFPlayer.
|
||||||
|
|
||||||
|
#### 2. Stereo Line Out
|
||||||
|
|
||||||
|
* **Connector:** 3.5mm Stereo Audio Jack (SMD)
|
||||||
|
* **Signals:**
|
||||||
|
* `L`: Left Audio Channel
|
||||||
|
* `R`: Right Audio Channel
|
||||||
|
* `GND`: Ground
|
||||||
|
* **Description:** A line-level stereo output suitable for headphones, external amplifiers, or other audio equipment. This connects to the `DAC_R`, `DAC_L`, and `GND` pins of the DFPlayer.
|
||||||
|
|
||||||
|
## Power Supply Circuit
|
||||||
|
|
||||||
|
The motherboard is designed to be powered by a standard +5V source. To ensure the DFPlayer module receives a safe operating voltage (typically 3.2V to 5.0V, with 4.2V being ideal), the following components are included:
|
||||||
|
|
||||||
|
* **Voltage Drop Diode:** A standard silicon diode (e.g., a 1N4001 SMD equivalent) is placed in series with the power input. This provides a forward voltage drop of approximately 0.7V, effectively reducing the 5V input to a safer ~4.3V for the DFPlayer.
|
||||||
|
* **Filtering Capacitor:** An electrolytic capacitor (e.g., 470µF, 10V) is placed across the DFPlayer's power pins (`VCC` and `GND`). This smooths the power supply and filters out noise, which is crucial for clean audio playback.
|
||||||
|
|
||||||
|
## Mechanical Design
|
||||||
|
|
||||||
|
* **Mounting Holes:** The board includes four mounting holes, one in each corner.
|
||||||
|
* **Hole Diameter:** 3.2mm, providing clearance for standard M3 screws.
|
||||||
|
* **Compatibility:** Designed for use with M3 nylon or brass standoffs for easy mounting.
|
||||||
|
|
||||||
|
## Bill of Materials
|
||||||
|
|
||||||
|
| Component | Qty | KiCad footprint | LCSC Part # |
|
||||||
|
| ------------------------------------ | --- | -------------------------------------------- | -------------------------- |
|
||||||
|
| Female 8-Pin Header | 2 | PinSocket_1x08_P2.54mm_Vertical_SMD_Pin1Left | C48641756 |
|
||||||
|
| Diode | 1 | D_SMA | C18199093 |
|
||||||
|
| Electrolytic Capacitor | 1 | EEEFK1A471AP (470µF/10V), for power filtering | C178529 |
|
||||||
|
| UART Connector | 1 | JST_PH_B4B-PH-SM4-TB_1x04-1MP_P2.00mm_Vertical | C160354 |
|
||||||
|
| Speaker Connector | 1 | JST_PH_B2B-PH-SM4-TB_1x02-1MP_P2.00mm_Vertical | C265003 |
|
||||||
|
| Audio Jack | 1 | Jack_3.5mm_PJ320D_Horizontal | C22459515 |
|
||||||
|
| Resistor | 1 | 1kΩ, 0805 SMD (for UART RX line) | C17513 |
|
||||||
|
|
||||||
|
## Assembly
|
||||||
|
|
||||||
|
This project is intended to be built with surface-mount components. A soldering iron with a fine tip, solder paste, and a hot air rework station are the recommended tools for a clean assembly.
|
||||||
|
|
||||||
|
## How to Use
|
||||||
|
|
||||||
|
1. **Prepare an SD Card:** Format a microSD card (up to 32GB) to FAT16 or FAT32. Copy your MP3 or WAV files onto the card.
|
||||||
|
2. **Insert SD Card:** Place the microSD card into the DFPlayer module's slot.
|
||||||
|
3. **Connect DFPlayer:** Carefully plug the DFPlayer Mini module into the female socket headers on the motherboard. Ensure the orientation is correct.
|
||||||
|
4. **Connect Interfaces:**
|
||||||
|
* Plug in your +5V power source and UART controller (like an Arduino or FTDI adapter) to the 4-pin JST connector.
|
||||||
|
* Connect a speaker (e.g., 8Ω, 1W) to the 2-pin JST connector.
|
||||||
|
* (Optional) Connect headphones or an amplifier to the 3.5mm audio jack.
|
||||||
|
5. **Power On:** Apply power to the board and begin sending serial commands to control the DFPlayer.
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
requires-atopile: ^0.10.0
|
||||||
|
|
||||||
|
paths:
|
||||||
|
src: ./
|
||||||
|
layout: ./layout
|
||||||
|
|
||||||
|
builds:
|
||||||
|
default:
|
||||||
|
entry: main.ato:DFPlayerCarrierBoard
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- type: registry
|
||||||
|
identifier: atopile/mounting-holes
|
||||||
|
release: 0.1.0
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
(kicad_pcb
|
||||||
|
(version 20241229)
|
||||||
|
(generator "atopile")
|
||||||
|
(generator_version "0.12.4")
|
||||||
|
(general
|
||||||
|
(thickness 1.6)
|
||||||
|
(legacy_teardrops no)
|
||||||
|
)
|
||||||
|
(paper "A4")
|
||||||
|
(layers
|
||||||
|
(0 "F.Cu" signal)
|
||||||
|
(31 "B.Cu" signal)
|
||||||
|
(32 "B.Adhes" user "B.Adhesive")
|
||||||
|
(33 "F.Adhes" user "F.Adhesive")
|
||||||
|
(34 "B.Paste" user)
|
||||||
|
(35 "F.Paste" user)
|
||||||
|
(36 "B.SilkS" user "B.Silkscreen")
|
||||||
|
(37 "F.SilkS" user "F.Silkscreen")
|
||||||
|
(38 "B.Mask" user)
|
||||||
|
(39 "F.Mask" user)
|
||||||
|
(40 "Dwgs.User" user "User.Drawings")
|
||||||
|
(41 "Cmts.User" user "User.Comments")
|
||||||
|
(42 "Eco1.User" user "User.Eco1")
|
||||||
|
(43 "Eco2.User" user "User.Eco2")
|
||||||
|
(44 "Edge.Cuts" user)
|
||||||
|
(45 "Margin" user)
|
||||||
|
(46 "B.CrtYd" user "B.Courtyard")
|
||||||
|
(47 "F.CrtYd" user "F.Courtyard")
|
||||||
|
(48 "B.Fab" user)
|
||||||
|
(49 "F.Fab" user)
|
||||||
|
(50 "User.1" user)
|
||||||
|
(51 "User.2" user)
|
||||||
|
(52 "User.3" user)
|
||||||
|
(53 "User.4" user)
|
||||||
|
(54 "User.5" user)
|
||||||
|
(55 "User.6" user)
|
||||||
|
(56 "User.7" user)
|
||||||
|
(57 "User.8" user)
|
||||||
|
(58 "User.9" user)
|
||||||
|
)
|
||||||
|
(setup
|
||||||
|
(pad_to_mask_clearance 0)
|
||||||
|
(allow_soldermask_bridges_in_footprints no)
|
||||||
|
(pcbplotparams
|
||||||
|
(layerselection 0x00010fc_ffffffff)
|
||||||
|
(plot_on_all_layers_selection 0x0000000_00000000)
|
||||||
|
(disableapertmacros no)
|
||||||
|
(usegerberextensions no)
|
||||||
|
(usegerberattributes yes)
|
||||||
|
(usegerberadvancedattributes yes)
|
||||||
|
(creategerberjobfile yes)
|
||||||
|
(dashed_line_dash_ratio 12)
|
||||||
|
(dashed_line_gap_ratio 3)
|
||||||
|
(svgprecision 4)
|
||||||
|
(plotframeref no)
|
||||||
|
(mode 1)
|
||||||
|
(useauxorigin no)
|
||||||
|
(hpglpennumber 1)
|
||||||
|
(hpglpenspeed 20)
|
||||||
|
(hpglpendiameter 15)
|
||||||
|
(pdf_front_fp_property_popups yes)
|
||||||
|
(pdf_back_fp_property_popups yes)
|
||||||
|
(dxfpolygonmode yes)
|
||||||
|
(dxfimperialunits yes)
|
||||||
|
(dxfusepcbnewfont yes)
|
||||||
|
(psnegative no)
|
||||||
|
(psa4output no)
|
||||||
|
(plot_black_and_white yes)
|
||||||
|
(plotinvisibletext no)
|
||||||
|
(sketchpadsonfab no)
|
||||||
|
(plotreference yes)
|
||||||
|
(plotvalue yes)
|
||||||
|
(plotpadnumbers no)
|
||||||
|
(hidednponfab no)
|
||||||
|
(sketchdnponfab yes)
|
||||||
|
(crossoutdnponfab yes)
|
||||||
|
(plotfptext yes)
|
||||||
|
(subtractmaskfromsilk no)
|
||||||
|
(outputformat 1)
|
||||||
|
(mirror no)
|
||||||
|
(drillshape 1)
|
||||||
|
(scaleselection 1)
|
||||||
|
(outputdirectory "")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(net 0 "")
|
||||||
|
)
|
||||||
@@ -0,0 +1,360 @@
|
|||||||
|
(kicad_pcb
|
||||||
|
(version 20241229)
|
||||||
|
(generator "atopile")
|
||||||
|
(generator_version "0.12.4")
|
||||||
|
(general
|
||||||
|
(thickness 1.6)
|
||||||
|
(legacy_teardrops no)
|
||||||
|
)
|
||||||
|
(paper "A4")
|
||||||
|
(layers
|
||||||
|
(0 "F.Cu" signal)
|
||||||
|
(31 "B.Cu" signal)
|
||||||
|
(32 "B.Adhes" user "B.Adhesive")
|
||||||
|
(33 "F.Adhes" user "F.Adhesive")
|
||||||
|
(34 "B.Paste" user)
|
||||||
|
(35 "F.Paste" user)
|
||||||
|
(36 "B.SilkS" user "B.Silkscreen")
|
||||||
|
(37 "F.SilkS" user "F.Silkscreen")
|
||||||
|
(38 "B.Mask" user)
|
||||||
|
(39 "F.Mask" user)
|
||||||
|
(40 "Dwgs.User" user "User.Drawings")
|
||||||
|
(41 "Cmts.User" user "User.Comments")
|
||||||
|
(42 "Eco1.User" user "User.Eco1")
|
||||||
|
(43 "Eco2.User" user "User.Eco2")
|
||||||
|
(44 "Edge.Cuts" user)
|
||||||
|
(45 "Margin" user)
|
||||||
|
(46 "B.CrtYd" user "B.Courtyard")
|
||||||
|
(47 "F.CrtYd" user "F.Courtyard")
|
||||||
|
(48 "B.Fab" user)
|
||||||
|
(49 "F.Fab" user)
|
||||||
|
(50 "User.1" user)
|
||||||
|
(51 "User.2" user)
|
||||||
|
(52 "User.3" user)
|
||||||
|
(53 "User.4" user)
|
||||||
|
(54 "User.5" user)
|
||||||
|
(55 "User.6" user)
|
||||||
|
(56 "User.7" user)
|
||||||
|
(57 "User.8" user)
|
||||||
|
(58 "User.9" user)
|
||||||
|
)
|
||||||
|
(setup
|
||||||
|
(pad_to_mask_clearance 0)
|
||||||
|
(allow_soldermask_bridges_in_footprints no)
|
||||||
|
(pcbplotparams
|
||||||
|
(layerselection 0x00010fc_ffffffff)
|
||||||
|
(plot_on_all_layers_selection 0x0000000_00000000)
|
||||||
|
(disableapertmacros no)
|
||||||
|
(usegerberextensions no)
|
||||||
|
(usegerberattributes yes)
|
||||||
|
(usegerberadvancedattributes yes)
|
||||||
|
(creategerberjobfile yes)
|
||||||
|
(dashed_line_dash_ratio 12)
|
||||||
|
(dashed_line_gap_ratio 3)
|
||||||
|
(svgprecision 4)
|
||||||
|
(plotframeref no)
|
||||||
|
(mode 1)
|
||||||
|
(useauxorigin no)
|
||||||
|
(hpglpennumber 1)
|
||||||
|
(hpglpenspeed 20)
|
||||||
|
(hpglpendiameter 15)
|
||||||
|
(pdf_front_fp_property_popups yes)
|
||||||
|
(pdf_back_fp_property_popups yes)
|
||||||
|
(dxfpolygonmode yes)
|
||||||
|
(dxfimperialunits yes)
|
||||||
|
(dxfusepcbnewfont yes)
|
||||||
|
(psnegative no)
|
||||||
|
(psa4output no)
|
||||||
|
(plot_black_and_white yes)
|
||||||
|
(plotinvisibletext no)
|
||||||
|
(sketchpadsonfab no)
|
||||||
|
(plotreference yes)
|
||||||
|
(plotvalue yes)
|
||||||
|
(plotpadnumbers no)
|
||||||
|
(hidednponfab no)
|
||||||
|
(sketchdnponfab yes)
|
||||||
|
(crossoutdnponfab yes)
|
||||||
|
(plotfptext yes)
|
||||||
|
(subtractmaskfromsilk no)
|
||||||
|
(outputformat 1)
|
||||||
|
(mirror no)
|
||||||
|
(drillshape 1)
|
||||||
|
(scaleselection 1)
|
||||||
|
(outputdirectory "")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(net 0 "")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(footprint "UNI_ROYAL_0603WAF1000T5E:R0603"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "3786f3ed-0717-40b7-878c-fb2e4642524b")
|
||||||
|
(at 0 0 0)
|
||||||
|
(property "Reference" "R1"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide no)
|
||||||
|
(uuid "d7fe1c4f-20c3-488c-938e-63059e57cf7d")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "100Ω ±1% 100mW"
|
||||||
|
(at 0 4 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "02502b2e-91fa-4a57-8145-690da2230101")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "checksum" "9f0edff8584ef1f6e252deba1c2e1eab5521058f7419b1975bdf335f15ce252d"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide no)
|
||||||
|
(uuid "2fd07936-2e44-4ea4-a84a-88f7cc9e50c2")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "bd45e32e-084b-fdad-c4cc-c7bffc907c58"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "82d72459-c0fa-4617-8fd9-69fe4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "LCSC" "C22775"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "09a3d748-723f-497c-b808-a6e94642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Manufacturer" "UNI-ROYAL(Uniroyal Elec)"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "1925f3ba-5569-4353-83e2-ed744642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Partnumber" "0603WAF1000T5E"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "bdaf9cd6-1532-4adc-95ad-9ea14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_power" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 0.1, \"max\": 0.1}}]}}, \"unit\": \"watt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "f44a19a0-9a0e-4b1c-82a7-1d954642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_voltage" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 75.0, \"max\": 75.0}}]}}, \"unit\": \"volt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "71ce1f69-2f47-4075-8b6b-28514642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_resistance" "{\"type\": \"Quantity_Interval_Disjoint\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 99.00000002235174, \"max\": 100.99999997764826}}]}}, \"unit\": \"ohm\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "8787dca7-1715-43a7-ac17-397a4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "https://www.lcsc.com/datasheet/lcsc_datasheet_2411221126_UNI-ROYAL-Uniroyal-Elec-0603WAF1000T5E_C22775.pdf"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "fca7427a-a81f-4bc7-8763-b7774642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "r1"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "61c60446-608d-45d8-9ad5-1ce14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr smd)
|
||||||
|
(fp_line
|
||||||
|
(start 0.43 0.66)
|
||||||
|
(end 1.39 0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "8da42f97-a5db-450c-98db-a60d42e8b82d")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 1.39 0.66)
|
||||||
|
(end 1.39 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "ef2e69e8-ee38-472a-a059-e942fe03d49b")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 1.39 -0.66)
|
||||||
|
(end 0.43 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "123c2608-6054-430c-be5d-48a9ed6cc2ac")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -0.43 0.66)
|
||||||
|
(end -1.39 0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "0fa5038f-89cc-48f6-bc2c-4718477aa29d")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -1.39 0.66)
|
||||||
|
(end -1.39 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "3c887a04-476a-4606-8644-e9716b8f2ca8")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -1.39 -0.66)
|
||||||
|
(end -0.43 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "09f4e01b-b2c4-4f77-952d-50a4de23a12f")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center -0.8 0.4)
|
||||||
|
(end -0.77 0.4)
|
||||||
|
(stroke
|
||||||
|
(width 0.06)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "a7a3c355-2e7b-49b7-a670-aa353a65a73d")
|
||||||
|
)
|
||||||
|
(fp_text user "%R"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "18695cf3-7c0f-4534-bfd4-715ba8289283")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "d7fe1c4f-20c3-488c-938e-63059e57cf7d")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "2" smd rect
|
||||||
|
(at 0.75 0 0)
|
||||||
|
(size 0.81 0.86)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(uuid "02a0cb42-9654-4f20-968c-49555b0a6dfe")
|
||||||
|
)
|
||||||
|
(pad "1" smd rect
|
||||||
|
(at -0.75 0 0)
|
||||||
|
(size 0.81 0.86)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(uuid "e6c5c5f1-8325-4851-983b-4aefae95396f")
|
||||||
|
)
|
||||||
|
(model "${KIPRJMOD}/../../parts/UNI_ROYAL_0603WAF1000T5E/R0603.STEP"
|
||||||
|
(offset
|
||||||
|
(xyz 0 0 0)
|
||||||
|
)
|
||||||
|
(scale
|
||||||
|
(xyz 1 1 1)
|
||||||
|
)
|
||||||
|
(rotate
|
||||||
|
(xyz 0 0 270)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,360 @@
|
|||||||
|
(kicad_pcb
|
||||||
|
(version 20241229)
|
||||||
|
(generator "atopile")
|
||||||
|
(generator_version "0.12.4")
|
||||||
|
(general
|
||||||
|
(thickness 1.6)
|
||||||
|
(legacy_teardrops no)
|
||||||
|
)
|
||||||
|
(paper "A4")
|
||||||
|
(layers
|
||||||
|
(0 "F.Cu" signal)
|
||||||
|
(31 "B.Cu" signal)
|
||||||
|
(32 "B.Adhes" user "B.Adhesive")
|
||||||
|
(33 "F.Adhes" user "F.Adhesive")
|
||||||
|
(34 "B.Paste" user)
|
||||||
|
(35 "F.Paste" user)
|
||||||
|
(36 "B.SilkS" user "B.Silkscreen")
|
||||||
|
(37 "F.SilkS" user "F.Silkscreen")
|
||||||
|
(38 "B.Mask" user)
|
||||||
|
(39 "F.Mask" user)
|
||||||
|
(40 "Dwgs.User" user "User.Drawings")
|
||||||
|
(41 "Cmts.User" user "User.Comments")
|
||||||
|
(42 "Eco1.User" user "User.Eco1")
|
||||||
|
(43 "Eco2.User" user "User.Eco2")
|
||||||
|
(44 "Edge.Cuts" user)
|
||||||
|
(45 "Margin" user)
|
||||||
|
(46 "B.CrtYd" user "B.Courtyard")
|
||||||
|
(47 "F.CrtYd" user "F.Courtyard")
|
||||||
|
(48 "B.Fab" user)
|
||||||
|
(49 "F.Fab" user)
|
||||||
|
(50 "User.1" user)
|
||||||
|
(51 "User.2" user)
|
||||||
|
(52 "User.3" user)
|
||||||
|
(53 "User.4" user)
|
||||||
|
(54 "User.5" user)
|
||||||
|
(55 "User.6" user)
|
||||||
|
(56 "User.7" user)
|
||||||
|
(57 "User.8" user)
|
||||||
|
(58 "User.9" user)
|
||||||
|
)
|
||||||
|
(setup
|
||||||
|
(pad_to_mask_clearance 0)
|
||||||
|
(allow_soldermask_bridges_in_footprints no)
|
||||||
|
(pcbplotparams
|
||||||
|
(layerselection 0x00010fc_ffffffff)
|
||||||
|
(plot_on_all_layers_selection 0x0000000_00000000)
|
||||||
|
(disableapertmacros no)
|
||||||
|
(usegerberextensions no)
|
||||||
|
(usegerberattributes yes)
|
||||||
|
(usegerberadvancedattributes yes)
|
||||||
|
(creategerberjobfile yes)
|
||||||
|
(dashed_line_dash_ratio 12)
|
||||||
|
(dashed_line_gap_ratio 3)
|
||||||
|
(svgprecision 4)
|
||||||
|
(plotframeref no)
|
||||||
|
(mode 1)
|
||||||
|
(useauxorigin no)
|
||||||
|
(hpglpennumber 1)
|
||||||
|
(hpglpenspeed 20)
|
||||||
|
(hpglpendiameter 15)
|
||||||
|
(pdf_front_fp_property_popups yes)
|
||||||
|
(pdf_back_fp_property_popups yes)
|
||||||
|
(dxfpolygonmode yes)
|
||||||
|
(dxfimperialunits yes)
|
||||||
|
(dxfusepcbnewfont yes)
|
||||||
|
(psnegative no)
|
||||||
|
(psa4output no)
|
||||||
|
(plot_black_and_white yes)
|
||||||
|
(plotinvisibletext no)
|
||||||
|
(sketchpadsonfab no)
|
||||||
|
(plotreference yes)
|
||||||
|
(plotvalue yes)
|
||||||
|
(plotpadnumbers no)
|
||||||
|
(hidednponfab no)
|
||||||
|
(sketchdnponfab yes)
|
||||||
|
(crossoutdnponfab yes)
|
||||||
|
(plotfptext yes)
|
||||||
|
(subtractmaskfromsilk no)
|
||||||
|
(outputformat 1)
|
||||||
|
(mirror no)
|
||||||
|
(drillshape 1)
|
||||||
|
(scaleselection 1)
|
||||||
|
(outputdirectory "")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(net 0 "")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(footprint "UNI_ROYAL_0603WAF1000T5E:R0603"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "3786f3ed-0717-40b7-878c-fb2e4642524b")
|
||||||
|
(at 0 0 0)
|
||||||
|
(property "Reference" "R1"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide no)
|
||||||
|
(uuid "d7fe1c4f-20c3-488c-938e-63059e57cf7d")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "100Ω ±1% 100mW"
|
||||||
|
(at 0 4 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "02502b2e-91fa-4a57-8145-690da2230101")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "checksum" "9f0edff8584ef1f6e252deba1c2e1eab5521058f7419b1975bdf335f15ce252d"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide no)
|
||||||
|
(uuid "2fd07936-2e44-4ea4-a84a-88f7cc9e50c2")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "bd45e32e-084b-fdad-c4cc-c7bffc907c58"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "82d72459-c0fa-4617-8fd9-69fe4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "LCSC" "C22775"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "09a3d748-723f-497c-b808-a6e94642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Manufacturer" "UNI-ROYAL(Uniroyal Elec)"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "1925f3ba-5569-4353-83e2-ed744642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Partnumber" "0603WAF1000T5E"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "bdaf9cd6-1532-4adc-95ad-9ea14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_power" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 0.1, \"max\": 0.1}}]}}, \"unit\": \"watt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "f44a19a0-9a0e-4b1c-82a7-1d954642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_voltage" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 75.0, \"max\": 75.0}}]}}, \"unit\": \"volt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "71ce1f69-2f47-4075-8b6b-28514642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_resistance" "{\"type\": \"Quantity_Interval_Disjoint\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 99.00000002235174, \"max\": 100.99999997764826}}]}}, \"unit\": \"ohm\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "8787dca7-1715-43a7-ac17-397a4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "https://www.lcsc.com/datasheet/lcsc_datasheet_2411221126_UNI-ROYAL-Uniroyal-Elec-0603WAF1000T5E_C22775.pdf"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "fca7427a-a81f-4bc7-8763-b7774642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "r1"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "61c60446-608d-45d8-9ad5-1ce14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr smd)
|
||||||
|
(fp_line
|
||||||
|
(start 0.43 0.66)
|
||||||
|
(end 1.39 0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "8da42f97-a5db-450c-98db-a60d42e8b82d")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 1.39 0.66)
|
||||||
|
(end 1.39 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "ef2e69e8-ee38-472a-a059-e942fe03d49b")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 1.39 -0.66)
|
||||||
|
(end 0.43 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "123c2608-6054-430c-be5d-48a9ed6cc2ac")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -0.43 0.66)
|
||||||
|
(end -1.39 0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "0fa5038f-89cc-48f6-bc2c-4718477aa29d")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -1.39 0.66)
|
||||||
|
(end -1.39 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "3c887a04-476a-4606-8644-e9716b8f2ca8")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -1.39 -0.66)
|
||||||
|
(end -0.43 -0.66)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "09f4e01b-b2c4-4f77-952d-50a4de23a12f")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center -0.8 0.4)
|
||||||
|
(end -0.77 0.4)
|
||||||
|
(stroke
|
||||||
|
(width 0.06)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "a7a3c355-2e7b-49b7-a670-aa353a65a73d")
|
||||||
|
)
|
||||||
|
(fp_text user "%R"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "18695cf3-7c0f-4534-bfd4-715ba8289283")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "d7fe1c4f-20c3-488c-938e-63059e57cf7d")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "2" smd rect
|
||||||
|
(at 0.75 0 0)
|
||||||
|
(size 0.81 0.86)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(uuid "02a0cb42-9654-4f20-968c-49555b0a6dfe")
|
||||||
|
)
|
||||||
|
(pad "1" smd rect
|
||||||
|
(at -0.75 0 0)
|
||||||
|
(size 0.81 0.86)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(uuid "e6c5c5f1-8325-4851-983b-4aefae95396f")
|
||||||
|
)
|
||||||
|
(model "${KIPRJMOD}/../../parts/UNI_ROYAL_0603WAF1000T5E/R0603.STEP"
|
||||||
|
(offset
|
||||||
|
(xyz 0 0 0)
|
||||||
|
)
|
||||||
|
(scale
|
||||||
|
(xyz 1 1 1)
|
||||||
|
)
|
||||||
|
(rotate
|
||||||
|
(xyz 0 0 270)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,360 @@
|
|||||||
|
(kicad_pcb
|
||||||
|
(version 20241229)
|
||||||
|
(generator "atopile")
|
||||||
|
(generator_version "0.12.4")
|
||||||
|
(general
|
||||||
|
(thickness 1.6)
|
||||||
|
(legacy_teardrops no)
|
||||||
|
)
|
||||||
|
(paper "A4")
|
||||||
|
(layers
|
||||||
|
(0 "F.Cu" signal)
|
||||||
|
(31 "B.Cu" signal)
|
||||||
|
(32 "B.Adhes" user "B.Adhesive")
|
||||||
|
(33 "F.Adhes" user "F.Adhesive")
|
||||||
|
(34 "B.Paste" user)
|
||||||
|
(35 "F.Paste" user)
|
||||||
|
(36 "B.SilkS" user "B.Silkscreen")
|
||||||
|
(37 "F.SilkS" user "F.Silkscreen")
|
||||||
|
(38 "B.Mask" user)
|
||||||
|
(39 "F.Mask" user)
|
||||||
|
(40 "Dwgs.User" user "User.Drawings")
|
||||||
|
(41 "Cmts.User" user "User.Comments")
|
||||||
|
(42 "Eco1.User" user "User.Eco1")
|
||||||
|
(43 "Eco2.User" user "User.Eco2")
|
||||||
|
(44 "Edge.Cuts" user)
|
||||||
|
(45 "Margin" user)
|
||||||
|
(46 "B.CrtYd" user "B.Courtyard")
|
||||||
|
(47 "F.CrtYd" user "F.Courtyard")
|
||||||
|
(48 "B.Fab" user)
|
||||||
|
(49 "F.Fab" user)
|
||||||
|
(50 "User.1" user)
|
||||||
|
(51 "User.2" user)
|
||||||
|
(52 "User.3" user)
|
||||||
|
(53 "User.4" user)
|
||||||
|
(54 "User.5" user)
|
||||||
|
(55 "User.6" user)
|
||||||
|
(56 "User.7" user)
|
||||||
|
(57 "User.8" user)
|
||||||
|
(58 "User.9" user)
|
||||||
|
)
|
||||||
|
(setup
|
||||||
|
(pad_to_mask_clearance 0)
|
||||||
|
(allow_soldermask_bridges_in_footprints no)
|
||||||
|
(pcbplotparams
|
||||||
|
(layerselection 0x00010fc_ffffffff)
|
||||||
|
(plot_on_all_layers_selection 0x0000000_00000000)
|
||||||
|
(disableapertmacros no)
|
||||||
|
(usegerberextensions no)
|
||||||
|
(usegerberattributes yes)
|
||||||
|
(usegerberadvancedattributes yes)
|
||||||
|
(creategerberjobfile yes)
|
||||||
|
(dashed_line_dash_ratio 12)
|
||||||
|
(dashed_line_gap_ratio 3)
|
||||||
|
(svgprecision 4)
|
||||||
|
(plotframeref no)
|
||||||
|
(mode 1)
|
||||||
|
(useauxorigin no)
|
||||||
|
(hpglpennumber 1)
|
||||||
|
(hpglpenspeed 20)
|
||||||
|
(hpglpendiameter 15)
|
||||||
|
(pdf_front_fp_property_popups yes)
|
||||||
|
(pdf_back_fp_property_popups yes)
|
||||||
|
(dxfpolygonmode yes)
|
||||||
|
(dxfimperialunits yes)
|
||||||
|
(dxfusepcbnewfont yes)
|
||||||
|
(psnegative no)
|
||||||
|
(psa4output no)
|
||||||
|
(plot_black_and_white yes)
|
||||||
|
(plotinvisibletext no)
|
||||||
|
(sketchpadsonfab no)
|
||||||
|
(plotreference yes)
|
||||||
|
(plotvalue yes)
|
||||||
|
(plotpadnumbers no)
|
||||||
|
(hidednponfab no)
|
||||||
|
(sketchdnponfab yes)
|
||||||
|
(crossoutdnponfab yes)
|
||||||
|
(plotfptext yes)
|
||||||
|
(subtractmaskfromsilk no)
|
||||||
|
(outputformat 1)
|
||||||
|
(mirror no)
|
||||||
|
(drillshape 1)
|
||||||
|
(scaleselection 1)
|
||||||
|
(outputdirectory "")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(net 0 "")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(footprint "UNI_ROYAL_0402WGF1001TCE:R0402"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "3786f3ed-0717-40b7-878c-fb2e4642524b")
|
||||||
|
(at 0 0 0)
|
||||||
|
(property "Reference" "R1"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide no)
|
||||||
|
(uuid "345f7ad1-a349-47f8-ba4e-04bbff791b4c")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "1kΩ ±1% 62.5mW"
|
||||||
|
(at 0 4 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "5bb0bb1f-f910-443d-8b36-165244157542")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "checksum" "3a0ec2dc7c35c97972db9e2a5c9a26a9a2b74cc9defe80a40041b96130696053"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide no)
|
||||||
|
(uuid "228f17e1-2a4f-463e-8e0f-87da090f4dac")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "7c45da14-3bc9-9ff3-ac7d-f87868332dd6"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "c36e4ece-d26c-49bd-bd6f-96f74642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "LCSC" "C11702"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "09a3d748-723f-497c-b808-a6e94642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Manufacturer" "UNI-ROYAL(Uniroyal Elec)"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "1925f3ba-5569-4353-83e2-ed744642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Partnumber" "0402WGF1001TCE"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "bdaf9cd6-1532-4adc-95ad-9ea14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_power" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 0.0625, \"max\": 0.0625}}]}}, \"unit\": \"watt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "f44a19a0-9a0e-4b1c-82a7-1d954642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_voltage" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 50.0, \"max\": 50.0}}]}}, \"unit\": \"volt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "71ce1f69-2f47-4075-8b6b-28514642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_resistance" "{\"type\": \"Quantity_Interval_Disjoint\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 990.0000002235174, \"max\": 1009.9999997764826}}]}}, \"unit\": \"ohm\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "8787dca7-1715-43a7-ac17-397a4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "https://www.lcsc.com/datasheet/lcsc_datasheet_2206010216_UNI-ROYAL-Uniroyal-Elec-0402WGF1001TCE_C11702.pdf"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "fca7427a-a81f-4bc7-8763-b7774642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "r1"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "61c60446-608d-45d8-9ad5-1ce14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr smd)
|
||||||
|
(fp_line
|
||||||
|
(start -0.23 0.5)
|
||||||
|
(end -0.94 0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "21b359e6-90b8-4fb8-853e-add0723cddbe")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -0.94 0.5)
|
||||||
|
(end -0.94 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "4d115620-9f34-4a4c-acfc-573024bf8391")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -0.94 -0.5)
|
||||||
|
(end -0.23 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "3b973153-847e-422b-a3c7-8b1b9197d5f9")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 0.23 0.5)
|
||||||
|
(end 0.94 0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "a50adf3b-7d8d-44e9-ae20-37d2d5ec6c3f")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 0.94 0.5)
|
||||||
|
(end 0.94 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "97e20f73-6781-4bb7-9ebc-56c6b6e9b7ef")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 0.94 -0.5)
|
||||||
|
(end 0.23 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "c39c83d4-6820-4c61-948f-b26adff78450")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center -0.5 0.25)
|
||||||
|
(end -0.47 0.25)
|
||||||
|
(stroke
|
||||||
|
(width 0.06)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "36beed3a-b303-47b4-8a79-76d673e00205")
|
||||||
|
)
|
||||||
|
(fp_text user "%R"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "161b6753-2c5b-4310-aaec-4b75c042bc2f")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "345f7ad1-a349-47f8-ba4e-04bbff791b4c")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "2" smd rect
|
||||||
|
(at 0.43 0 0)
|
||||||
|
(size 0.57 0.54)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(uuid "89f48650-ba2e-4c63-891a-4008dc400372")
|
||||||
|
)
|
||||||
|
(pad "1" smd rect
|
||||||
|
(at -0.43 0 0)
|
||||||
|
(size 0.57 0.54)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(uuid "1d8e8538-3920-49c9-b964-a4be4e5a7d17")
|
||||||
|
)
|
||||||
|
(model "${KIPRJMOD}/../../parts/UNI_ROYAL_0402WGF1001TCE/R0402_L1.0-W0.5-H0.4.step"
|
||||||
|
(offset
|
||||||
|
(xyz 0 0 0)
|
||||||
|
)
|
||||||
|
(scale
|
||||||
|
(xyz 1 1 1)
|
||||||
|
)
|
||||||
|
(rotate
|
||||||
|
(xyz 0 0 0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
@@ -0,0 +1,360 @@
|
|||||||
|
(kicad_pcb
|
||||||
|
(version 20241229)
|
||||||
|
(generator "atopile")
|
||||||
|
(generator_version "0.12.4")
|
||||||
|
(general
|
||||||
|
(thickness 1.6)
|
||||||
|
(legacy_teardrops no)
|
||||||
|
)
|
||||||
|
(paper "A4")
|
||||||
|
(layers
|
||||||
|
(0 "F.Cu" signal)
|
||||||
|
(31 "B.Cu" signal)
|
||||||
|
(32 "B.Adhes" user "B.Adhesive")
|
||||||
|
(33 "F.Adhes" user "F.Adhesive")
|
||||||
|
(34 "B.Paste" user)
|
||||||
|
(35 "F.Paste" user)
|
||||||
|
(36 "B.SilkS" user "B.Silkscreen")
|
||||||
|
(37 "F.SilkS" user "F.Silkscreen")
|
||||||
|
(38 "B.Mask" user)
|
||||||
|
(39 "F.Mask" user)
|
||||||
|
(40 "Dwgs.User" user "User.Drawings")
|
||||||
|
(41 "Cmts.User" user "User.Comments")
|
||||||
|
(42 "Eco1.User" user "User.Eco1")
|
||||||
|
(43 "Eco2.User" user "User.Eco2")
|
||||||
|
(44 "Edge.Cuts" user)
|
||||||
|
(45 "Margin" user)
|
||||||
|
(46 "B.CrtYd" user "B.Courtyard")
|
||||||
|
(47 "F.CrtYd" user "F.Courtyard")
|
||||||
|
(48 "B.Fab" user)
|
||||||
|
(49 "F.Fab" user)
|
||||||
|
(50 "User.1" user)
|
||||||
|
(51 "User.2" user)
|
||||||
|
(52 "User.3" user)
|
||||||
|
(53 "User.4" user)
|
||||||
|
(54 "User.5" user)
|
||||||
|
(55 "User.6" user)
|
||||||
|
(56 "User.7" user)
|
||||||
|
(57 "User.8" user)
|
||||||
|
(58 "User.9" user)
|
||||||
|
)
|
||||||
|
(setup
|
||||||
|
(pad_to_mask_clearance 0)
|
||||||
|
(allow_soldermask_bridges_in_footprints no)
|
||||||
|
(pcbplotparams
|
||||||
|
(layerselection 0x00010fc_ffffffff)
|
||||||
|
(plot_on_all_layers_selection 0x0000000_00000000)
|
||||||
|
(disableapertmacros no)
|
||||||
|
(usegerberextensions no)
|
||||||
|
(usegerberattributes yes)
|
||||||
|
(usegerberadvancedattributes yes)
|
||||||
|
(creategerberjobfile yes)
|
||||||
|
(dashed_line_dash_ratio 12)
|
||||||
|
(dashed_line_gap_ratio 3)
|
||||||
|
(svgprecision 4)
|
||||||
|
(plotframeref no)
|
||||||
|
(mode 1)
|
||||||
|
(useauxorigin no)
|
||||||
|
(hpglpennumber 1)
|
||||||
|
(hpglpenspeed 20)
|
||||||
|
(hpglpendiameter 15)
|
||||||
|
(pdf_front_fp_property_popups yes)
|
||||||
|
(pdf_back_fp_property_popups yes)
|
||||||
|
(dxfpolygonmode yes)
|
||||||
|
(dxfimperialunits yes)
|
||||||
|
(dxfusepcbnewfont yes)
|
||||||
|
(psnegative no)
|
||||||
|
(psa4output no)
|
||||||
|
(plot_black_and_white yes)
|
||||||
|
(plotinvisibletext no)
|
||||||
|
(sketchpadsonfab no)
|
||||||
|
(plotreference yes)
|
||||||
|
(plotvalue yes)
|
||||||
|
(plotpadnumbers no)
|
||||||
|
(hidednponfab no)
|
||||||
|
(sketchdnponfab yes)
|
||||||
|
(crossoutdnponfab yes)
|
||||||
|
(plotfptext yes)
|
||||||
|
(subtractmaskfromsilk no)
|
||||||
|
(outputformat 1)
|
||||||
|
(mirror no)
|
||||||
|
(drillshape 1)
|
||||||
|
(scaleselection 1)
|
||||||
|
(outputdirectory "")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(net 0 "")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(footprint "UNI_ROYAL_0402WGF1001TCE:R0402"
|
||||||
|
(layer "F.Cu")
|
||||||
|
(uuid "3786f3ed-0717-40b7-878c-fb2e4642524b")
|
||||||
|
(at 0 0 0)
|
||||||
|
(property "Reference" "R1"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(hide no)
|
||||||
|
(uuid "345f7ad1-a349-47f8-ba4e-04bbff791b4c")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "1kΩ ±1% 62.5mW"
|
||||||
|
(at 0 4 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide no)
|
||||||
|
(uuid "5bb0bb1f-f910-443d-8b36-165244157542")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "checksum" "3a0ec2dc7c35c97972db9e2a5c9a26a9a2b74cc9defe80a40041b96130696053"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide no)
|
||||||
|
(uuid "228f17e1-2a4f-463e-8e0f-87da090f4dac")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
(hide yes)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "__atopile_lib_fp_hash__" "7c45da14-3bc9-9ff3-ac7d-f87868332dd6"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "c36e4ece-d26c-49bd-bd6f-96f74642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "LCSC" "C11702"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "09a3d748-723f-497c-b808-a6e94642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Manufacturer" "UNI-ROYAL(Uniroyal Elec)"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "1925f3ba-5569-4353-83e2-ed744642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Partnumber" "0402WGF1001TCE"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "bdaf9cd6-1532-4adc-95ad-9ea14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_power" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 0.0625, \"max\": 0.0625}}]}}, \"unit\": \"watt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "f44a19a0-9a0e-4b1c-82a7-1d954642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_max_voltage" "{\"type\": \"Quantity_Set_Discrete\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 50.0, \"max\": 50.0}}]}}, \"unit\": \"volt\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "71ce1f69-2f47-4075-8b6b-28514642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "PARAM_resistance" "{\"type\": \"Quantity_Interval_Disjoint\", \"data\": {\"intervals\": {\"type\": \"Numeric_Interval_Disjoint\", \"data\": {\"intervals\": [{\"type\": \"Numeric_Interval\", \"data\": {\"min\": 990.0000002235174, \"max\": 1009.9999997764826}}]}}, \"unit\": \"ohm\"}}"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "8787dca7-1715-43a7-ac17-397a4642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" "https://www.lcsc.com/datasheet/lcsc_datasheet_2206010216_UNI-ROYAL-Uniroyal-Elec-0402WGF1001TCE_C11702.pdf"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "fca7427a-a81f-4bc7-8763-b7774642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "atopile_address" "r1"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "User.9")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "61c60446-608d-45d8-9ad5-1ce14642524b")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.125 0.125)
|
||||||
|
(thickness 0.01875)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr smd)
|
||||||
|
(fp_line
|
||||||
|
(start -0.23 0.5)
|
||||||
|
(end -0.94 0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "21b359e6-90b8-4fb8-853e-add0723cddbe")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -0.94 0.5)
|
||||||
|
(end -0.94 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "4d115620-9f34-4a4c-acfc-573024bf8391")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -0.94 -0.5)
|
||||||
|
(end -0.23 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "3b973153-847e-422b-a3c7-8b1b9197d5f9")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 0.23 0.5)
|
||||||
|
(end 0.94 0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "a50adf3b-7d8d-44e9-ae20-37d2d5ec6c3f")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 0.94 0.5)
|
||||||
|
(end 0.94 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "97e20f73-6781-4bb7-9ebc-56c6b6e9b7ef")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 0.94 -0.5)
|
||||||
|
(end 0.23 -0.5)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "c39c83d4-6820-4c61-948f-b26adff78450")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center -0.5 0.25)
|
||||||
|
(end -0.47 0.25)
|
||||||
|
(stroke
|
||||||
|
(width 0.06)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "36beed3a-b303-47b4-8a79-76d673e00205")
|
||||||
|
)
|
||||||
|
(fp_text user "%R"
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "161b6753-2c5b-4310-aaec-4b75c042bc2f")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(fp_text user "${REFERENCE}"
|
||||||
|
(at 0 -4 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "345f7ad1-a349-47f8-ba4e-04bbff791b4c")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(unlocked no)
|
||||||
|
)
|
||||||
|
(pad "2" smd rect
|
||||||
|
(at 0.43 0 0)
|
||||||
|
(size 0.57 0.54)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 2 "footprint-net-1")
|
||||||
|
(uuid "89f48650-ba2e-4c63-891a-4008dc400372")
|
||||||
|
)
|
||||||
|
(pad "1" smd rect
|
||||||
|
(at -0.43 0 0)
|
||||||
|
(size 0.57 0.54)
|
||||||
|
(layers "F.Cu" "F.Paste" "F.Mask")
|
||||||
|
(net 1 "footprint-net-0")
|
||||||
|
(uuid "1d8e8538-3920-49c9-b964-a4be4e5a7d17")
|
||||||
|
)
|
||||||
|
(model "${KIPRJMOD}/../../parts/UNI_ROYAL_0402WGF1001TCE/R0402_L1.0-W0.5-H0.4.step"
|
||||||
|
(offset
|
||||||
|
(xyz 0 0 0)
|
||||||
|
)
|
||||||
|
(scale
|
||||||
|
(xyz 1 1 1)
|
||||||
|
)
|
||||||
|
(rotate
|
||||||
|
(xyz 0 0 0)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
|||||||
|
Designator,Footprint,Quantity,Value,Manufacturer,Partnumber,LCSC Part #
|
||||||
|
C1,CAP-SMD_BD8.0-L8.3-W8.3-LS9.9-FD,1,,PANASONIC,EEEFK1A471AP,C178529
|
||||||
|
CN1,CONN-SMD_B4B-PH-SM4-TB-LF-SN,1,,JST Sales America,B4B-PH-SM4-TB(LF)(SN),C160354
|
||||||
|
D1,SMA_L4.3-W2.6-LS5.0-RD,1,,hongjiacheng,M1,C18199093
|
||||||
|
"H1, H2",HDR-SMD_8P-P2.54-V-F-S4.7,2,,hanxia,HX PM2.54-1x8P TP H8.5-YQ,C46635844
|
||||||
|
U1,R0805,1,1kΩ ±1% 125mW,UNI-ROYAL(Uniroyal Elec),0805W8F1001T5E,C17513
|
||||||
|
U2,CONN-SMD_B2B-PH-SM4-TBT-LF-SN,1,,JST Sales America,B2B-PH-SM4-TBT(LF)(SN),C265003
|
||||||
|
U3,AUDIO-SMD_PJ-320B,1,,SOFNG,PJ-320B,C22355831
|
||||||
|
@@ -0,0 +1,3 @@
|
|||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
```
|
||||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user