Initial commit
This commit is contained in:
BIN
.ato/modules/.cache/atopile-mounting-holes-0.1.0.zip
Normal file
BIN
.ato/modules/.cache/atopile-mounting-holes-0.1.0.zip
Normal file
Binary file not shown.
67
.ato/modules/atopile/mounting-holes/MountingHole.py
Normal file
67
.ato/modules/atopile/mounting-holes/MountingHole.py
Normal file
@@ -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)
|
||||||
49
.ato/modules/atopile/mounting-holes/README.md
Normal file
49
.ato/modules/atopile/mounting-holes/README.md
Normal file
@@ -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.
20
.ato/modules/atopile/mounting-holes/ato.yaml
Normal file
20
.ato/modules/atopile/mounting-holes/ato.yaml
Normal file
@@ -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
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
|
)
|
||||||
@@ -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
.ato/modules/atopile/mounting-holes/parts/.gitkeep
Normal file
0
.ato/modules/atopile/mounting-holes/parts/.gitkeep
Normal file
16
.ato/modules/atopile/mounting-holes/usage.ato
Normal file
16
.ato/modules/atopile/mounting-holes/usage.ato
Normal file
@@ -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
|
||||||
20
.cursor/mcp.json
Normal file
20
.cursor/mcp.json
Normal file
@@ -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": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
714
.cursor/rules/ato.mdc
Normal file
714
.cursor/rules/ato.mdc
Normal file
@@ -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
|
||||||
|
|
||||||
|
|
||||||
20
.gemini/settings.json
Normal file
20
.gemini/settings.json
Normal file
@@ -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": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
713
.github/instructions/ato.instructions.md
vendored
Normal file
713
.github/instructions/ato.instructions.md
vendored
Normal file
@@ -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
|
||||||
|
|
||||||
|
|
||||||
20
.mcp.json
Normal file
20
.mcp.json
Normal file
@@ -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": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
714
.windsurf/rules/ato.md
Normal file
714
.windsurf/rules/ato.md
Normal file
@@ -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
|
||||||
|
|
||||||
|
|
||||||
710
CLAUDE.md
Normal file
710
CLAUDE.md
Normal file
@@ -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
|
||||||
|
|
||||||
|
|
||||||
710
GEMINI.md
Normal file
710
GEMINI.md
Normal file
@@ -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
|
||||||
|
|
||||||
|
|
||||||
86
README.md
Normal file
86
README.md
Normal file
@@ -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.
|
||||||
|
|
||||||
14
ato.yaml
Normal file
14
ato.yaml
Normal file
@@ -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
|
||||||
87
build/builds/default/default.20250926-003626.kicad_pcb
Normal file
87
build/builds/default/default.20250926-003626.kicad_pcb
Normal file
@@ -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 "")
|
||||||
|
)
|
||||||
360
build/builds/default/default.20250926-003738.kicad_pcb
Normal file
360
build/builds/default/default.20250926-003738.kicad_pcb
Normal file
@@ -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)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
360
build/builds/default/default.20250926-004130.kicad_pcb
Normal file
360
build/builds/default/default.20250926-004130.kicad_pcb
Normal file
@@ -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)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
360
build/builds/default/default.20250926-004845.kicad_pcb
Normal file
360
build/builds/default/default.20250926-004845.kicad_pcb
Normal file
@@ -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)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
360
build/builds/default/default.20250926-035107.kicad_pcb
Normal file
360
build/builds/default/default.20250926-035107.kicad_pcb
Normal file
@@ -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)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
2353
build/builds/default/default.20250926-035519.kicad_pcb
Normal file
2353
build/builds/default/default.20250926-035519.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2353
build/builds/default/default.20250926-035609.kicad_pcb
Normal file
2353
build/builds/default/default.20250926-035609.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2353
build/builds/default/default.20250926-035649.kicad_pcb
Normal file
2353
build/builds/default/default.20250926-035649.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2353
build/builds/default/default.20250926-035709.kicad_pcb
Normal file
2353
build/builds/default/default.20250926-035709.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2503
build/builds/default/default.20250926-041423.kicad_pcb
Normal file
2503
build/builds/default/default.20250926-041423.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2503
build/builds/default/default.20250926-041955.kicad_pcb
Normal file
2503
build/builds/default/default.20250926-041955.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2883
build/builds/default/default.20250926-132257.kicad_pcb
Normal file
2883
build/builds/default/default.20250926-132257.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2539
build/builds/default/default.20250926-133105.kicad_pcb
Normal file
2539
build/builds/default/default.20250926-133105.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2539
build/builds/default/default.20250926-135542.kicad_pcb
Normal file
2539
build/builds/default/default.20250926-135542.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2539
build/builds/default/default.20250926-135816.kicad_pcb
Normal file
2539
build/builds/default/default.20250926-135816.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2539
build/builds/default/default.20250926-140105.kicad_pcb
Normal file
2539
build/builds/default/default.20250926-140105.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2539
build/builds/default/default.20250926-140501.kicad_pcb
Normal file
2539
build/builds/default/default.20250926-140501.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2539
build/builds/default/default.20250926-140520.kicad_pcb
Normal file
2539
build/builds/default/default.20250926-140520.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2539
build/builds/default/default.20250927-000149.kicad_pcb
Normal file
2539
build/builds/default/default.20250927-000149.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2811
build/builds/default/default.20250927-005342.kicad_pcb
Normal file
2811
build/builds/default/default.20250927-005342.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2811
build/builds/default/default.20250927-010927.kicad_pcb
Normal file
2811
build/builds/default/default.20250927-010927.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2811
build/builds/default/default.20250927-011242.kicad_pcb
Normal file
2811
build/builds/default/default.20250927-011242.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2850
build/builds/default/default.20250927-011906.kicad_pcb
Normal file
2850
build/builds/default/default.20250927-011906.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2850
build/builds/default/default.20250927-012456.kicad_pcb
Normal file
2850
build/builds/default/default.20250927-012456.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2891
build/builds/default/default.20250927-013804.kicad_pcb
Normal file
2891
build/builds/default/default.20250927-013804.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2891
build/builds/default/default.20250927-024250.kicad_pcb
Normal file
2891
build/builds/default/default.20250927-024250.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2892
build/builds/default/default.20250927-024953.kicad_pcb
Normal file
2892
build/builds/default/default.20250927-024953.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2892
build/builds/default/default.20250927-025147.kicad_pcb
Normal file
2892
build/builds/default/default.20250927-025147.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2892
build/builds/default/default.20250927-025937.kicad_pcb
Normal file
2892
build/builds/default/default.20250927-025937.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2892
build/builds/default/default.20250927-031413.kicad_pcb
Normal file
2892
build/builds/default/default.20250927-031413.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2930
build/builds/default/default.20250927-033016.kicad_pcb
Normal file
2930
build/builds/default/default.20250927-033016.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
2997
build/builds/default/default.20250927-033058.kicad_pcb
Normal file
2997
build/builds/default/default.20250927-033058.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3133
build/builds/default/default.20250927-034548.kicad_pcb
Normal file
3133
build/builds/default/default.20250927-034548.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3140
build/builds/default/default.20250927-040231.kicad_pcb
Normal file
3140
build/builds/default/default.20250927-040231.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3499
build/builds/default/default.20250927-045522.kicad_pcb
Normal file
3499
build/builds/default/default.20250927-045522.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3499
build/builds/default/default.20250927-051509.kicad_pcb
Normal file
3499
build/builds/default/default.20250927-051509.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3952
build/builds/default/default.20250927-052034.kicad_pcb
Normal file
3952
build/builds/default/default.20250927-052034.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3497
build/builds/default/default.20250927-120055.kicad_pcb
Normal file
3497
build/builds/default/default.20250927-120055.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3497
build/builds/default/default.20250927-121326.kicad_pcb
Normal file
3497
build/builds/default/default.20250927-121326.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3497
build/builds/default/default.20250927-121420.kicad_pcb
Normal file
3497
build/builds/default/default.20250927-121420.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
3594
build/builds/default/default.20250927-123232.kicad_pcb
Normal file
3594
build/builds/default/default.20250927-123232.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
4995
build/builds/default/default.20250927-124028.kicad_pcb
Normal file
4995
build/builds/default/default.20250927-124028.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
8
build/builds/default/default.bom.csv
Normal file
8
build/builds/default/default.bom.csv
Normal file
@@ -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
|
||||||
|
3
build/builds/default/default.i2c_tree.md
Normal file
3
build/builds/default/default.i2c_tree.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
```mermaid
|
||||||
|
graph TD
|
||||||
|
```
|
||||||
BIN
build/builds/default/default.pcba.glb
Normal file
BIN
build/builds/default/default.pcba.glb
Normal file
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