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