Add ADG936BCPZ, OSD32MP157F-1G-BAA, TPS22965DSGR, AXP2101; add programmatic API and usage guide

- scripts/mikilab_lib.py / mikilab_cli.py: typed Python API + JSON CLI
  for add/update/remove/query, for other apps to integrate without
  shelling out to add_component.py
- lib_common.py/import_component.py/import_batch.py: regenerate
  sym-lib-table.global/fp-lib-table.global on every mutating call, not
  just the project-local tables
- scripts/find_missing_3d_models.py: lists components with no 3D model
  and search links to fill the gap
- docs/GUIDA_USO.md: practical Italian usage guide (companion to README.md)
- checkup fixes: removed orphan duplicate footprint
  footprints/other/CP_20_1_ADI.kicad_mod, and a dangling
  ${easyeda2kicad}/tmp 3D model reference in AXP2101's footprint that
  pointed at a file that never existed on disk
This commit is contained in:
2026-08-30 14:50:08 +02:00
parent 2313dac850
commit 58185c2215
23 changed files with 35793 additions and 0 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+19
View File
@@ -613,3 +613,22 @@ symbol,symbols/other/TESTPART.kicad_sym,,REMOVED,9dd05201adaf0b2ff542da3882782d9
symbol,symbols/other/FSC-BT1058.kicad_sym,symbols/rf/FSC-BT1058.kicad_sym,MOVED,ffd04c13db32c7bea4b500f235da29aa3f105eb512afb3d7d84fca442e3c8244,recategorized other -> rf; category=rf symbol,symbols/other/FSC-BT1058.kicad_sym,symbols/rf/FSC-BT1058.kicad_sym,MOVED,ffd04c13db32c7bea4b500f235da29aa3f105eb512afb3d7d84fca442e3c8244,recategorized other -> rf; category=rf
footprint,footprints/other/FSC-BT1058.pretty/FSC-BT1058.kicad_mod,footprints/rf/FSC-BT1058.pretty/FSC-BT1058.kicad_mod,REPLACED_AND_MOVED,cc0a2f7e5359e2ab87d5cf2226d668ffafb4c89246518fd31a61d4195d305086,geometry replaced with FSC-BT1035 pad layout (physically identical package); recategorized other -> rf; category=rf footprint,footprints/other/FSC-BT1058.pretty/FSC-BT1058.kicad_mod,footprints/rf/FSC-BT1058.pretty/FSC-BT1058.kicad_mod,REPLACED_AND_MOVED,cc0a2f7e5359e2ab87d5cf2226d668ffafb4c89246518fd31a61d4195d305086,geometry replaced with FSC-BT1035 pad layout (physically identical package); recategorized other -> rf; category=rf
3d-model,3dmodels/other/FSC-BT1058.step,3dmodels/rf/FSC-BT1058.step,MOVED,cea88ca65e7f9b06ce5cb4949fce0614f2f21414267b4cc1655f1037cc54c1aa,recategorized other -> rf; category=rf 3d-model,3dmodels/other/FSC-BT1058.step,3dmodels/rf/FSC-BT1058.step,MOVED,cea88ca65e7f9b06ce5cb4949fce0614f2f21414267b4cc1655f1037cc54c1aa,recategorized other -> rf; category=rf
symbol,/Users/michelebigi/Development/tmp/easyeda2kicad.kicad_sym,symbols/power/AXP2101.kicad_sym,NEW,63aea641b82a5970807a1e9c010008b8089474d779c85970224c9d7709eb3077,category=power
footprint,/Users/michelebigi/Development/tmp/easyeda2kicad.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod,footprints/power/AXP2101.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod,NEW,5db83e8b1617b0a6eb12ff868e8556516ad7fe9cb60eff1fe9377443a8d397e2,category=power
symbol,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_gnret1wf/TPS22965DSGR.kicad_sym,symbols/other/TPS22965DSGR.kicad_sym,NEW,b666f2da5baa7945bed44501d87ef941715cced9f63fcd8184046af2a877cbe2,category=other
footprint,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_gnret1wf/SON50P200X200X80-9N.kicad_mod,footprints/other/TPS22965DSGR.pretty/SON50P200X200X80-9N.kicad_mod,NEW,b42d46ab378bf4612971b3f4367671d3c48ebf7eb550dfd8c64c11bd009abdaf,category=other
3d-model,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_gnret1wf/TPS22965DSGR.step,3dmodels/other/TPS22965DSGR.step,NEW,d45622c50e62deaae35a28477e6235595834260597e017eaf79c752e27d1a81b,category=other
symbol,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_365ba5cp/OSD32MP157F-1G-BAA.kicad_sym,symbols/other/OSD32MP157F-1G-BAA.kicad_sym,NEW,52fb1a4e5e9edd50674066d39cfa1bc837e307375c92f8f9eb9fa64d6de938e8,category=other
footprint,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_365ba5cp/OSD32MP15X-BGA-324.kicad_mod,footprints/other/OSD32MP157F-1G-BAA.pretty/OSD32MP15X-BGA-324.kicad_mod,NEW,1f665839e5449823e40d623347a1cdf79f1d2ddbacba3532f0c0fd0afa6860bf,category=other
3d-model,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_365ba5cp/OSD32MP157F-1G-BAA.step,3dmodels/other/OSD32MP157F-1G-BAA.step,NEW,fff9dc032792b58c283f9b8597cae3b89ee1c34b45d29efd0a54da226005403e,category=other
symbol,/private/tmp/claude-501/-Users-michelebigi-Development-mikylab-kikad-library/ecb2958c-8aec-438e-bab1-47258811b002/scratchpad/CLITEST_PART.kicad_sym,symbols/other/CLITEST_PART.kicad_sym,NEW,c78a14700fd54f190e6f729b8aefe92efb792ed24fa6345b9581808493b35bfa,category=other
symbol,/private/tmp/claude-501/-Users-michelebigi-Development-mikylab-kikad-library/ecb2958c-8aec-438e-bab1-47258811b002/scratchpad/CLITEST_PART.kicad_sym,,ERROR,,"A component named 'CLITEST_PART' already exists: symbols/other/CLITEST_PART.kicad_sym. Refusing to overwrite -- choose a different --name, pass --update to replace it in place, or remove the existing component first."
symbol,/private/tmp/claude-501/-Users-michelebigi-Development-mikylab-kikad-library/ecb2958c-8aec-438e-bab1-47258811b002/scratchpad/CLITEST_PART.kicad_sym,symbols/other/CLITEST_PART.kicad_sym,UPDATED,c78a14700fd54f190e6f729b8aefe92efb792ed24fa6345b9581808493b35bfa,category=other
symbol,symbols/other/CLITEST_PART.kicad_sym,,REMOVED,c78a14700fd54f190e6f729b8aefe92efb792ed24fa6345b9581808493b35bfa,category=other
symbol,/Users/michelebigi/Downloads/ADG936BRUZ.zip,,ERROR,,"A component named 'ADG936BRUZ' already exists: symbols/other/ADG936BRUZ.kicad_sym. Refusing to overwrite -- choose a different --name, pass --update to replace it in place, or remove the existing component first."
symbol,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_s0r4iric/KiCADv6/2026-08-29_21-57-03.kicad_sym,symbols/other/ADG936BCPZ.kicad_sym,NEW,961fa300ed9a835ae83e6fdbb1a27eeccc29302fe929eac7f735c84ba8e83c29,category=other
footprint,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_s0r4iric/KiCADv6/footprints.pretty/CP_20_1_ADI.kicad_mod,footprints/other/ADG936BCPZ.pretty/CP_20_1_ADI.kicad_mod,NEW,e92f3dd1ebd13397f8767e6f0f16be893326fed5ea1d795c94ac004de6c32136,category=other
symbol,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_i1vl86eh/KiCADv6/2026-08-29_21-57-03.kicad_sym,symbols/other/ADG936BCPZ.kicad_sym,UPDATED,961fa300ed9a835ae83e6fdbb1a27eeccc29302fe929eac7f735c84ba8e83c29,category=other
footprint,/var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_i1vl86eh/KiCADv6/footprints.pretty/CP_20_1_ADI.kicad_mod,footprints/other/ADG936BCPZ.pretty/CP_20_1_ADI.kicad_mod,UPDATED,e92f3dd1ebd13397f8767e6f0f16be893326fed5ea1d795c94ac004de6c32136,category=other
footprint,footprints/other/CP_20_1_ADI.kicad_mod,,REMOVED,,"orphan duplicate footprint left directly under footprints/other/ (not inside any .pretty, not registered in any lib-table); byte-identical to footprints/other/ADG936BCPZ.pretty/CP_20_1_ADI.kicad_mod; found and removed during library checkup; category=other"
footprint,footprints/power/AXP2101.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod,footprints/power/AXP2101.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod,UPDATED,8abd9f69eaaa802fc5f6abcf1c8a69508b498db6de92880708b0d97cd6e2e4d0,"removed dangling (model ../tmp/easyeda2kicad.3dshapes/QFN-40_L5.0-W5.0-H0.9-P0.4-TL-EP.wrl) reference left over from raw easyeda2kicad export; no matching 3D file exists anywhere; found and fixed during library checkup; category=power"
1 type source destination status hash notes
613 symbol symbols/other/FSC-BT1058.kicad_sym symbols/rf/FSC-BT1058.kicad_sym MOVED ffd04c13db32c7bea4b500f235da29aa3f105eb512afb3d7d84fca442e3c8244 recategorized other -> rf; category=rf
614 footprint footprints/other/FSC-BT1058.pretty/FSC-BT1058.kicad_mod footprints/rf/FSC-BT1058.pretty/FSC-BT1058.kicad_mod REPLACED_AND_MOVED cc0a2f7e5359e2ab87d5cf2226d668ffafb4c89246518fd31a61d4195d305086 geometry replaced with FSC-BT1035 pad layout (physically identical package); recategorized other -> rf; category=rf
615 3d-model 3dmodels/other/FSC-BT1058.step 3dmodels/rf/FSC-BT1058.step MOVED cea88ca65e7f9b06ce5cb4949fce0614f2f21414267b4cc1655f1037cc54c1aa recategorized other -> rf; category=rf
616 symbol /Users/michelebigi/Development/tmp/easyeda2kicad.kicad_sym symbols/power/AXP2101.kicad_sym NEW 63aea641b82a5970807a1e9c010008b8089474d779c85970224c9d7709eb3077 category=power
617 footprint /Users/michelebigi/Development/tmp/easyeda2kicad.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod footprints/power/AXP2101.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod NEW 5db83e8b1617b0a6eb12ff868e8556516ad7fe9cb60eff1fe9377443a8d397e2 category=power
618 symbol /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_gnret1wf/TPS22965DSGR.kicad_sym symbols/other/TPS22965DSGR.kicad_sym NEW b666f2da5baa7945bed44501d87ef941715cced9f63fcd8184046af2a877cbe2 category=other
619 footprint /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_gnret1wf/SON50P200X200X80-9N.kicad_mod footprints/other/TPS22965DSGR.pretty/SON50P200X200X80-9N.kicad_mod NEW b42d46ab378bf4612971b3f4367671d3c48ebf7eb550dfd8c64c11bd009abdaf category=other
620 3d-model /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_gnret1wf/TPS22965DSGR.step 3dmodels/other/TPS22965DSGR.step NEW d45622c50e62deaae35a28477e6235595834260597e017eaf79c752e27d1a81b category=other
621 symbol /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_365ba5cp/OSD32MP157F-1G-BAA.kicad_sym symbols/other/OSD32MP157F-1G-BAA.kicad_sym NEW 52fb1a4e5e9edd50674066d39cfa1bc837e307375c92f8f9eb9fa64d6de938e8 category=other
622 footprint /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_365ba5cp/OSD32MP15X-BGA-324.kicad_mod footprints/other/OSD32MP157F-1G-BAA.pretty/OSD32MP15X-BGA-324.kicad_mod NEW 1f665839e5449823e40d623347a1cdf79f1d2ddbacba3532f0c0fd0afa6860bf category=other
623 3d-model /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/snapeda_365ba5cp/OSD32MP157F-1G-BAA.step 3dmodels/other/OSD32MP157F-1G-BAA.step NEW fff9dc032792b58c283f9b8597cae3b89ee1c34b45d29efd0a54da226005403e category=other
624 symbol /private/tmp/claude-501/-Users-michelebigi-Development-mikylab-kikad-library/ecb2958c-8aec-438e-bab1-47258811b002/scratchpad/CLITEST_PART.kicad_sym symbols/other/CLITEST_PART.kicad_sym NEW c78a14700fd54f190e6f729b8aefe92efb792ed24fa6345b9581808493b35bfa category=other
625 symbol /private/tmp/claude-501/-Users-michelebigi-Development-mikylab-kikad-library/ecb2958c-8aec-438e-bab1-47258811b002/scratchpad/CLITEST_PART.kicad_sym ERROR A component named 'CLITEST_PART' already exists: symbols/other/CLITEST_PART.kicad_sym. Refusing to overwrite -- choose a different --name, pass --update to replace it in place, or remove the existing component first.
626 symbol /private/tmp/claude-501/-Users-michelebigi-Development-mikylab-kikad-library/ecb2958c-8aec-438e-bab1-47258811b002/scratchpad/CLITEST_PART.kicad_sym symbols/other/CLITEST_PART.kicad_sym UPDATED c78a14700fd54f190e6f729b8aefe92efb792ed24fa6345b9581808493b35bfa category=other
627 symbol symbols/other/CLITEST_PART.kicad_sym REMOVED c78a14700fd54f190e6f729b8aefe92efb792ed24fa6345b9581808493b35bfa category=other
628 symbol /Users/michelebigi/Downloads/ADG936BRUZ.zip ERROR A component named 'ADG936BRUZ' already exists: symbols/other/ADG936BRUZ.kicad_sym. Refusing to overwrite -- choose a different --name, pass --update to replace it in place, or remove the existing component first.
629 symbol /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_s0r4iric/KiCADv6/2026-08-29_21-57-03.kicad_sym symbols/other/ADG936BCPZ.kicad_sym NEW 961fa300ed9a835ae83e6fdbb1a27eeccc29302fe929eac7f735c84ba8e83c29 category=other
630 footprint /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_s0r4iric/KiCADv6/footprints.pretty/CP_20_1_ADI.kicad_mod footprints/other/ADG936BCPZ.pretty/CP_20_1_ADI.kicad_mod NEW e92f3dd1ebd13397f8767e6f0f16be893326fed5ea1d795c94ac004de6c32136 category=other
631 symbol /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_i1vl86eh/KiCADv6/2026-08-29_21-57-03.kicad_sym symbols/other/ADG936BCPZ.kicad_sym UPDATED 961fa300ed9a835ae83e6fdbb1a27eeccc29302fe929eac7f735c84ba8e83c29 category=other
632 footprint /var/folders/cv/lwgyj_k14gx2rc3t2rlt29s80000gn/T/ultralibrarian_i1vl86eh/KiCADv6/footprints.pretty/CP_20_1_ADI.kicad_mod footprints/other/ADG936BCPZ.pretty/CP_20_1_ADI.kicad_mod UPDATED e92f3dd1ebd13397f8767e6f0f16be893326fed5ea1d795c94ac004de6c32136 category=other
633 footprint footprints/other/CP_20_1_ADI.kicad_mod REMOVED orphan duplicate footprint left directly under footprints/other/ (not inside any .pretty, not registered in any lib-table); byte-identical to footprints/other/ADG936BCPZ.pretty/CP_20_1_ADI.kicad_mod; found and removed during library checkup; category=other
634 footprint footprints/power/AXP2101.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod footprints/power/AXP2101.pretty/QFN-40_L5.0-W5.0-P0.40-TL-EP3.4.kicad_mod UPDATED 8abd9f69eaaa802fc5f6abcf1c8a69508b498db6de92880708b0d97cd6e2e4d0 removed dangling (model ../tmp/easyeda2kicad.3dshapes/QFN-40_L5.0-W5.0-H0.9-P0.4-TL-EP.wrl) reference left over from raw easyeda2kicad export; no matching 3D file exists anywhere; found and fixed during library checkup; category=power
+71
View File
@@ -307,6 +307,77 @@ bottom-to-top) identical to the datasheet's own Table 3-2 pin order, so
straight lines in the silkscreen (cosmetic only, no pad geometry straight lines in the silkscreen (cosmetic only, no pad geometry
affected). No 3D model is included. affected). No 3D model is included.
## 7. Programmatic API (for integrating into other apps)
For apps that want to add/update/remove/query components without
shelling out to `add_component.py` and parsing its human-readable
report, there are two entry points on top of the exact same
`import_component.py` core logic (same validation, collision handling,
and lib-table regeneration as every path in section 5):
- **`scripts/mikilab_lib.py`** — a typed Python API, for Python apps to
import directly:
```python
import sys
sys.path.insert(0, "/path/to/mikylab_kikad_library/scripts")
import mikilab_lib as mikilab
result = mikilab.add_component(
name="TPS7A2018PDBVR",
symbol="/path/TPS7A2018PDBVR.kicad_sym",
footprint="/path/SOT95P280X145-5N.kicad_mod", # optional
model="/path/TPS7A2018PDBVR.step", # optional
category="power", # optional, auto-detected if omitted
)
# -> ComponentResult(name=..., category=..., action="add", symbol_path=..., ...)
mikilab.update_component(name="TPS7A2018PDBVR", symbol=..., footprint=...) # upsert: replaces in place
mikilab.remove_component(name="TPS7A2018PDBVR")
mikilab.get_component("TPS7A2018PDBVR") # -> ComponentInfo | None
mikilab.list_components(category="power") # -> list[ComponentInfo]
mikilab.find_components("tps22") # -> list[ComponentInfo], substring match
```
Failures raise `mikilab.MikilabError` (a single exception type, message
safe to show to a user or log as-is) instead of printing and exiting.
- **`scripts/mikilab_cli.py`** — the same operations exposed as a stable
JSON-over-stdout CLI, for apps in Swift, C++, or anything else that
can spawn a subprocess:
```
python3 scripts/mikilab_cli.py add --name TPS7A2018PDBVR \
--symbol /path/TPS7A2018PDBVR.kicad_sym \
--footprint /path/SOT95P280X145-5N.kicad_mod --category power
python3 scripts/mikilab_cli.py update --name TPS7A2018PDBVR --symbol /path/...
python3 scripts/mikilab_cli.py remove --name TPS7A2018PDBVR
python3 scripts/mikilab_cli.py get --name TPS7A2018PDBVR
python3 scripts/mikilab_cli.py list [--category power]
python3 scripts/mikilab_cli.py find --query tps22 [--category power]
```
Every invocation prints exactly one JSON object to stdout —
`{"ok": true, "data": ...}` or `{"ok": false, "error": "..."}` — and
exits 0 iff `"ok"` is `true`. From Swift: run it via `Process`, decode
stdout with `JSONDecoder`. From C++: `popen`/`posix_spawn` plus any
JSON library (e.g. `nlohmann::json`).
Both entry points regenerate `sym-lib-table`, `fp-lib-table`,
`sym-lib-table.global` and `fp-lib-table.global`, and append to
`MANIFEST.csv`, on every mutating call — same guarantees as
`add_component.py`. Neither touches KiCad's real global tables under
`~/Library/Preferences/kicad/*/` — if this library is registered
globally (section 1), merging new entries there is still a separate,
deliberate step (section 1, step 3), so that an app driving this API
never silently rewrites your live KiCad configuration.
`update_component()`/`update` does not move a component between
categories — recategorizing means `remove` + `add` under the new
category.
## Provenance ## Provenance
`MANIFEST.csv` has one row per file in the library (`type`, `source`, `MANIFEST.csv` has one row per file in the library (`type`, `source`,
+189
View File
@@ -0,0 +1,189 @@
# Guida rapida all'uso della libreria MIKILAB
> Questa guida è il complemento pratico, in italiano, al `README.md` alla
> radice del repository (che resta il riferimento tecnico completo, in
> inglese, con anche la provenienza dettagliata di ogni componente).
> Qui trovi solo "cosa fare" per i compiti di tutti i giorni.
## Cos'è
Una libreria KiCad personale e autonoma: simboli, footprint e modelli 3D
per i progetti hardware di MIKILAB. Non dipende da nessun'altra cartella
sul disco — puoi spostarla, zipparla o sincronizzarla su un'altra
macchina e continua a funzionare.
```
mikylab_kikad_library/
├── sym-lib-table / fp-lib-table # registrano tutte le librerie
├── symbols/<categoria>/<Nome>.kicad_sym
├── footprints/<categoria>/<Nome>.pretty/<Nome>.kicad_mod
├── 3dmodels/<categoria>/<Nome>.step
├── scripts/ # tutti gli strumenti descritti qui sotto
└── MANIFEST.csv # log di provenienza, una riga per file
```
Categorie: `analog`, `audio`, `display`, `fpga_cpld`, `interface`,
`logic`, `mechanical`, `memory`, `microcontrollers`, `other`, `power`,
`rf`.
## 1. Installare la libreria in KiCad
**Un solo progetto** — se il tuo `.kicad_pro` sta dentro
`mikylab_kikad_library/` (o copi `sym-lib-table`/`fp-lib-table` nella
cartella del progetto), KiCad li trova da solo grazie a `${KIPRJMOD}`.
Nessuna configurazione extra.
**Tutti i progetti** (consigliato per una libreria personale):
1. KiCad → Preferences → Configure Paths… → aggiungi `MIKILAB` che punta
a `/Users/michelebigi/Development/mikylab_kikad_library`.
2. Rigenera le tabelle "globali" ogni volta che aggiungi componenti:
```
python3 scripts/generate_global_tables.py
```
3. Copia le righe `(lib ...)` di `sym-lib-table.global` e
`fp-lib-table.global` dentro le tabelle globali reali di KiCad
(`~/Library/Preferences/kicad/10.0/sym-lib-table` e `fp-lib-table`),
prima della parentesi finale. Vedi README §1 per lo script Python
pronto che lo fa automaticamente (fai un backup prima).
4. Riavvia KiCad.
## 2. Usare simboli e footprint
- Schematico: cerca `MIKILAB_<Libreria>:<Simbolo>`, es.
`MIKILAB_TPS7A2012PDBVR:TPS7A2012PDBVR`.
- PCB / footprint assignment: `MIKILAB_<Libreria>:<Footprint>`, es.
`MIKILAB_SOT95P280X145_5N:SOT95P280X145-5N`.
Se un footprint non mostra il corpo 3D, quasi sempre è uno dei ~48 casi
noti "`${KISBLIB}` gap" (footprint importati da fornitori il cui file
STEP originale non era incluso nell'export) — vedi la sezione checkup o
`python3 scripts/check_library.py` per l'elenco. Non è un errore da
correggere subito: pad, courtyard e serigrafia restano corretti, manca
solo la resa 3D.
## 3. Aggiungere un componente nuovo
**Un componente singolo** (hai già i file `.kicad_sym`/`.kicad_mod`/`.step`):
```
python3 scripts/add_component.py \
--name TPS7A2018PDBVR \
--symbol /percorso/TPS7A2018PDBVR.kicad_sym \
--footprint /percorso/SOT95P280X145-5N.kicad_mod \
--model /percorso/TPS7A2018PDBVR.step \
--category power
```
`--footprint` e `--model` sono opzionali. `--category` è opzionale,
viene auto-rilevata dal nome (altrimenti finisce in `other`).
**Da uno zip SnapEDA** ("Download KiCad"):
```
python3 scripts/import_snapeda.py --zip ~/Downloads/PARTNUMBER.zip [--category ...]
```
**Da uno zip UltraLibrarian**:
```
python3 scripts/import_ultralibrarian.py --zip ~/Downloads/PARTNUMBER.zip [--category ...]
```
**Molti componenti insieme**: una sottocartella per componente dentro
una directory, poi:
```
python3 scripts/import_batch.py --source /percorso/batch_dir [--category power]
```
Tutti gli importer: rifiutano di sovrascrivere un componente esistente
(a meno di `--update`), deduplicano i footprint per contenuto (non per
nome file), rigenerano le lib-table da zero e appendono una riga a
`MANIFEST.csv` per ogni file toccato.
## 4. Aggiornare un componente esistente
Aggiungi `--update` allo stesso comando di import (qualunque sorgente:
file locali, SnapEDA, UltraLibrarian) per sostituire in-place
symbol/footprint/modello di un componente già presente, invece di
ottenere l'errore "esiste già":
```
python3 scripts/import_ultralibrarian.py --zip ~/Downloads/PARTNUMBER.zip --name NOME_ESISTENTE --update
```
`--update` non cambia la categoria di un componente — per ricategorizzare
serve `remove` + `add` nella nuova categoria (vedi §6).
## 5. Cercare / consultare componenti
Da riga di comando, senza scrivere Python:
```
python3 scripts/mikilab_cli.py list [--category power]
python3 scripts/mikilab_cli.py find --query tps22 [--category power]
python3 scripts/mikilab_cli.py get --name TPS7A2018PDBVR
```
Ogni comando stampa un JSON `{"ok": true, "data": ...}` su stdout.
Da Python, per integrare in un altro programma:
```python
import sys
sys.path.insert(0, "/Users/michelebigi/Development/mikylab_kikad_library/scripts")
import mikilab_lib as mikilab
mikilab.list_components(category="power")
mikilab.find_components("tps22")
mikilab.get_component("TPS7A2018PDBVR")
```
## 6. Rimuovere / rinominare / ricategorizzare un componente
```
python3 scripts/mikilab_cli.py remove --name NOME
```
oppure `mikilab.remove_component(name="NOME")` in Python. Per spostare un
componente in un'altra categoria: `remove` seguito da un nuovo `add`
(`--update`) nella categoria corretta.
## 7. Controllare l'integrità della libreria
Da lanciare dopo ogni import/modifica manuale, e comunque periodicamente:
```
python3 scripts/check_library.py
```
Verifica: struttura delle cartelle, sintassi di simboli/footprint,
duplicati reali (per hash, non per nome), validità e portabilità dei
riferimenti ai modelli 3D, sintassi e coerenza di
`sym-lib-table`/`fp-lib-table`, e che ogni simbolo MIKILAB punti a un
footprint esistente. Esce con `RESULT: OK` se non ci sono errori (i
warning sono lacune note e documentate, non bloccanti — vedi README §4).
Per un elenco mirato dei componenti senza modello 3D (con link rapidi a
SnapEDA/Octopart/UltraLibrarian per cercarlo):
```
python3 scripts/find_missing_3d_models.py
```
## 8. Verificare che non ci siano percorsi assoluti o dipendenze esterne
La libreria non deve mai contenere percorsi assoluti né dipendere da
`kicad-personal-library`. Puoi verificarlo in qualsiasi momento con:
```
grep -R "/Users/$(whoami)" --include="*.kicad_mod" --include="*.kicad_sym" .
grep -R "kicad-personal-library" .
```
Entrambi i comandi devono restituire nessun risultato (a parte, per il
secondo, le menzioni storiche nel README).
## Riferimento rapido comandi
| Cosa vuoi fare | Comando |
|---|---|
| Installare/aggiornare in tutti i progetti | `python3 scripts/generate_global_tables.py` |
| Aggiungere un componente (file locali) | `python3 scripts/add_component.py --name ... --symbol ... [--footprint ...] [--model ...] [--category ...]` |
| Aggiungere da zip SnapEDA | `python3 scripts/import_snapeda.py --zip ...` |
| Aggiungere da zip UltraLibrarian | `python3 scripts/import_ultralibrarian.py --zip ...` |
| Aggiungere molti componenti | `python3 scripts/import_batch.py --source ...` |
| Aggiornare un componente esistente | aggiungi `--update` al comando di import |
| Cercare un componente | `python3 scripts/mikilab_cli.py find --query ...` |
| Rimuovere un componente | `python3 scripts/mikilab_cli.py remove --name ...` |
| Controllare l'integrità della libreria | `python3 scripts/check_library.py` |
| Trovare componenti senza modello 3D | `python3 scripts/find_missing_3d_models.py` |
@@ -0,0 +1,176 @@
(footprint "CP_20_1_ADI" (version 20211014) (generator pcbnew)
(layer "F.Cu")
(tags "ADG936BCPZ ")
(attr smd)
(fp_text reference "REF**" (at 0 0 unlocked) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value CP_20_1_ADI (at 0 0 unlocked) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "${REFERENCE}" (at 0 0 unlocked) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "*" (at -2.9337 -1.25) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "*" (at -1.2319 -1.25) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_poly (pts
(xy 0.809501 2.5527)
(xy 0.809501 2.8067)
(xy 1.190501 2.8067)
(xy 1.190501 2.5527)
) (layer "F.SilkS") (width 0) (fill solid))
(fp_poly (pts
(xy -1.190501 -2.5527)
(xy -1.190501 -2.8067)
(xy -0.809501 -2.8067)
(xy -0.809501 -2.5527)
) (layer "F.SilkS") (width 0) (fill solid))
(fp_line (start -2.2479 2.2479) (end -2.2479 1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -2.2479 1.381) (end -2.5527 1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -2.5527 1.381) (end -2.5527 -1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -2.5527 -1.381) (end -2.2479 -1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -2.2479 -1.381) (end -2.2479 -2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -2.2479 -2.2479) (end -1.381 -2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -1.381 -2.2479) (end -1.381 -2.5527) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -1.381 -2.5527) (end 1.381 -2.5527) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 1.381 -2.5527) (end 1.381 -2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 1.381 -2.2479) (end 2.2479 -2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 2.2479 -2.2479) (end 2.2479 -1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 2.2479 -1.381) (end 2.5527 -1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 2.5527 -1.381) (end 2.5527 1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 2.5527 1.381) (end 2.2479 1.381) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 2.2479 1.381) (end 2.2479 2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 2.2479 2.2479) (end 1.381 2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 1.381 2.2479) (end 1.381 2.5527) (layer "F.CrtYd") (width 0.1524))
(fp_line (start 1.381 2.5527) (end -1.381 2.5527) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -1.381 2.5527) (end -1.381 2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_line (start -1.381 2.2479) (end -2.2479 2.2479) (layer "F.CrtYd") (width 0.1524))
(fp_text user "*" (at -2.9337 -1.25 unlocked) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user "*" (at -1.2319 -1.25 unlocked) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -1.9939 -0.7239) (end -0.7239 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.8476 -1.9939) (end 1.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.1524 -1.9939) (end 1.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.1524 -1.9939) (end 0.8476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.8476 -1.9939) (end 0.8476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.3476 -1.9939) (end 0.6524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.6524 -1.9939) (end 0.6524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.6524 -1.9939) (end 0.3476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.3476 -1.9939) (end 0.3476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.1524 -1.9939) (end 0.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.1524 -1.9939) (end 0.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.1524 -1.9939) (end -0.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.1524 -1.9939) (end -0.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.6524 -1.9939) (end -0.3476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.3476 -1.9939) (end -0.3476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.3476 -1.9939) (end -0.6524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.6524 -1.9939) (end -0.6524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.1524 -1.9939) (end -0.8476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.8476 -1.9939) (end -0.8476 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.8476 -1.9939) (end -1.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.1524 -1.9939) (end -1.1524 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.8476) (end -1.9939 -1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -1.1524) (end -1.9939 -1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -1.1524) (end -1.9939 -0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.8476) (end -1.9939 -0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.3476) (end -1.9939 -0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.6524) (end -1.9939 -0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.6524) (end -1.9939 -0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.3476) (end -1.9939 -0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.1524) (end -1.9939 -0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.1524) (end -1.9939 -0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -0.1524) (end -1.9939 0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.1524) (end -1.9939 0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.6524) (end -1.9939 0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.3476) (end -1.9939 0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.3476) (end -1.9939 0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.6524) (end -1.9939 0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 1.1524) (end -1.9939 0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.8476) (end -1.9939 0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 0.8476) (end -1.9939 1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 1.1524) (end -1.9939 1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.8476 1.9939) (end -1.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.1524 1.9939) (end -1.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.1524 1.9939) (end -0.8476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.8476 1.9939) (end -0.8476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.3476 1.9939) (end -0.6524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.6524 1.9939) (end -0.6524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.6524 1.9939) (end -0.3476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.3476 1.9939) (end -0.3476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.1524 1.9939) (end -0.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.1524 1.9939) (end -0.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -0.1524 1.9939) (end 0.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.1524 1.9939) (end 0.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.6524 1.9939) (end 0.3476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.3476 1.9939) (end 0.3476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.3476 1.9939) (end 0.6524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.6524 1.9939) (end 0.6524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.1524 1.9939) (end 0.8476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.8476 1.9939) (end 0.8476 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 0.8476 1.9939) (end 1.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.1524 1.9939) (end 1.1524 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.8476) (end 1.9939 1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 1.1524) (end 1.9939 1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 1.1524) (end 1.9939 0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.8476) (end 1.9939 0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.3476) (end 1.9939 0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.6524) (end 1.9939 0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.6524) (end 1.9939 0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.3476) (end 1.9939 0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.1524) (end 1.9939 0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.1524) (end 1.9939 0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 0.1524) (end 1.9939 -0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.1524) (end 1.9939 -0.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.6524) (end 1.9939 -0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.3476) (end 1.9939 -0.3476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.3476) (end 1.9939 -0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.6524) (end 1.9939 -0.6524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -1.1524) (end 1.9939 -0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.8476) (end 1.9939 -0.8476) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -0.8476) (end 1.9939 -1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -1.1524) (end 1.9939 -1.1524) (layer "F.Fab") (width 0.0254))
(fp_line (start -2.1209 2.1209) (end -1.459741 2.1209) (layer "F.SilkS") (width 0.1524))
(fp_line (start 2.1209 2.1209) (end 2.1209 1.459741) (layer "F.SilkS") (width 0.1524))
(fp_line (start 2.1209 -2.1209) (end 1.459741 -2.1209) (layer "F.SilkS") (width 0.1524))
(fp_line (start -2.1209 -2.1209) (end -2.1209 -1.459741) (layer "F.SilkS") (width 0.1524))
(fp_line (start -2.1209 1.459741) (end -2.1209 2.1209) (layer "F.SilkS") (width 0.1524))
(fp_line (start -1.9939 1.9939) (end 1.9939 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 1.9939) (end 1.9939 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 1.9939) (end 1.9939 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -1.9939) (end 1.9939 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.9939 -1.9939) (end -1.9939 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -1.9939) (end -1.9939 -1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 -1.9939) (end -1.9939 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start -1.9939 1.9939) (end -1.9939 1.9939) (layer "F.Fab") (width 0.0254))
(fp_line (start 1.459741 2.1209) (end 2.1209 2.1209) (layer "F.SilkS") (width 0.1524))
(fp_line (start 2.1209 -1.459741) (end 2.1209 -2.1209) (layer "F.SilkS") (width 0.1524))
(fp_line (start -1.459741 -2.1209) (end -2.1209 -2.1209) (layer "F.SilkS") (width 0.1524))
(pad "1" smd rect (at -1.7653 -1.000001 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "2" smd rect (at -1.7653 -0.499999 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "3" smd rect (at -1.7653 0 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "4" smd rect (at -1.7653 0.499999 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "5" smd rect (at -1.7653 1.000001 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "6" smd rect (at -1.000001 1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "7" smd rect (at -0.499999 1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "8" smd rect (at 0 1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "9" smd rect (at 0.499999 1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "10" smd rect (at 1.000001 1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "11" smd rect (at 1.7653 1.000001 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "12" smd rect (at 1.7653 0.499999 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "13" smd rect (at 1.7653 0 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "14" smd rect (at 1.7653 -0.499999 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "15" smd rect (at 1.7653 -1.000001 90) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "16" smd rect (at 1.000001 -1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "17" smd rect (at 0.499999 -1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "18" smd rect (at 0 -1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "19" smd rect (at -0.499999 -1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "20" smd rect (at -1.000001 -1.7653) (size 0.254 1.0668) (layers "F.Cu" "F.Paste" "F.Mask"))
(pad "21" smd rect (at 0 0) (size 2.2606 2.2606) (layers "F.Cu" "F.Paste" "F.Mask"))
)
@@ -0,0 +1,343 @@
(footprint OSD32MP15X-BGA-324 (layer F.Cu) (tedit 6A92A499)
(descr "")
(attr smd)
(fp_text reference REF** (at -6.223 -9.9314 0) (layer F.SilkS)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(fp_text value OSD32MP15X-BGA-324 (at -0.3048 9.7536 0) (layer F.Fab)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(pad L9 smd circle (at -0.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L12 smd circle (at 2.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L8 smd circle (at -1.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L13 smd circle (at 3.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L7 smd circle (at -2.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L14 smd circle (at 4.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L6 smd circle (at -3.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L15 smd circle (at 5.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L5 smd circle (at -4.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L16 smd circle (at 6.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L4 smd circle (at -5.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L17 smd circle (at 7.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L3 smd circle (at -6.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L18 smd circle (at 8.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L2 smd circle (at -7.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad L1 smd circle (at -8.5 1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K18 smd circle (at 8.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K17 smd circle (at 7.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K16 smd circle (at 6.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K15 smd circle (at 5.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K14 smd circle (at 4.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K13 smd circle (at 3.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K12 smd circle (at 2.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K9 smd circle (at -0.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K8 smd circle (at -1.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K7 smd circle (at -2.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K6 smd circle (at -3.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K5 smd circle (at -4.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K4 smd circle (at -5.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K3 smd circle (at -6.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K2 smd circle (at -7.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad K1 smd circle (at -8.5 0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M10 smd circle (at 0.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N10 smd circle (at 0.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P10 smd circle (at 0.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G10 smd circle (at 0.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R10 smd circle (at 0.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F10 smd circle (at 0.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T10 smd circle (at 0.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E10 smd circle (at 0.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U10 smd circle (at 0.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D10 smd circle (at 0.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C10 smd circle (at 0.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V10 smd circle (at 0.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B10 smd circle (at 0.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A10 smd circle (at 0.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V11 smd circle (at 1.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U11 smd circle (at 1.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T11 smd circle (at 1.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R11 smd circle (at 1.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N11 smd circle (at 1.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M11 smd circle (at 1.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G11 smd circle (at 1.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F11 smd circle (at 1.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E11 smd circle (at 1.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C11 smd circle (at 1.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B11 smd circle (at 1.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A11 smd circle (at 1.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A12 smd circle (at 2.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B12 smd circle (at 2.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C12 smd circle (at 2.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E12 smd circle (at 2.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F12 smd circle (at 2.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G12 smd circle (at 2.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H12 smd circle (at 2.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J12 smd circle (at 2.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M12 smd circle (at 2.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N12 smd circle (at 2.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R12 smd circle (at 2.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T12 smd circle (at 2.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U12 smd circle (at 2.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V12 smd circle (at 2.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V9 smd circle (at -0.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U9 smd circle (at -0.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T9 smd circle (at -0.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R9 smd circle (at -0.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P9 smd circle (at -0.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N9 smd circle (at -0.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M9 smd circle (at -0.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J9 smd circle (at -0.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H9 smd circle (at -0.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G9 smd circle (at -0.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F9 smd circle (at -0.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E9 smd circle (at -0.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D9 smd circle (at -0.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C9 smd circle (at -0.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B9 smd circle (at -0.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A9 smd circle (at -0.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A8 smd circle (at -1.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B8 smd circle (at -1.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C8 smd circle (at -1.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D8 smd circle (at -1.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E8 smd circle (at -1.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F8 smd circle (at -1.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G8 smd circle (at -1.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H8 smd circle (at -1.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J8 smd circle (at -1.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M8 smd circle (at -1.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N8 smd circle (at -1.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P8 smd circle (at -1.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R8 smd circle (at -1.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T8 smd circle (at -1.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U8 smd circle (at -1.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V8 smd circle (at -1.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V13 smd circle (at 3.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U13 smd circle (at 3.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T13 smd circle (at 3.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R13 smd circle (at 3.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N13 smd circle (at 3.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M13 smd circle (at 3.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J13 smd circle (at 3.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H13 smd circle (at 3.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G13 smd circle (at 3.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F13 smd circle (at 3.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E13 smd circle (at 3.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C13 smd circle (at 3.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B13 smd circle (at 3.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A13 smd circle (at 3.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A14 smd circle (at 4.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B14 smd circle (at 4.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C14 smd circle (at 4.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E14 smd circle (at 4.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F14 smd circle (at 4.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G14 smd circle (at 4.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H14 smd circle (at 4.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J14 smd circle (at 4.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M14 smd circle (at 4.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N14 smd circle (at 4.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R14 smd circle (at 4.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T14 smd circle (at 4.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U14 smd circle (at 4.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V14 smd circle (at 4.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V15 smd circle (at 5.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U15 smd circle (at 5.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T15 smd circle (at 5.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R15 smd circle (at 5.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N15 smd circle (at 5.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M15 smd circle (at 5.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J15 smd circle (at 5.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H15 smd circle (at 5.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G15 smd circle (at 5.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F15 smd circle (at 5.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E15 smd circle (at 5.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C15 smd circle (at 5.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B15 smd circle (at 5.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A15 smd circle (at 5.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A16 smd circle (at 6.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B16 smd circle (at 6.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C16 smd circle (at 6.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D16 smd circle (at 6.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E16 smd circle (at 6.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F16 smd circle (at 6.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G16 smd circle (at 6.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H16 smd circle (at 6.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J16 smd circle (at 6.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M16 smd circle (at 6.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N16 smd circle (at 6.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P16 smd circle (at 6.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R16 smd circle (at 6.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T16 smd circle (at 6.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U16 smd circle (at 6.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V16 smd circle (at 6.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V17 smd circle (at 7.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U17 smd circle (at 7.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T17 smd circle (at 7.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R17 smd circle (at 7.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P17 smd circle (at 7.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N17 smd circle (at 7.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M17 smd circle (at 7.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J17 smd circle (at 7.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H17 smd circle (at 7.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G17 smd circle (at 7.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F17 smd circle (at 7.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E17 smd circle (at 7.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D17 smd circle (at 7.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C17 smd circle (at 7.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B17 smd circle (at 7.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A17 smd circle (at 7.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B18 smd circle (at 8.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C18 smd circle (at 8.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D18 smd circle (at 8.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E18 smd circle (at 8.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F18 smd circle (at 8.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G18 smd circle (at 8.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H18 smd circle (at 8.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J18 smd circle (at 8.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M18 smd circle (at 8.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N18 smd circle (at 8.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P18 smd circle (at 8.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R18 smd circle (at 8.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T18 smd circle (at 8.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U18 smd circle (at 8.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M7 smd circle (at -2.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M6 smd circle (at -3.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M5 smd circle (at -4.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M4 smd circle (at -5.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M3 smd circle (at -6.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M2 smd circle (at -7.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad M1 smd circle (at -8.5 2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J1 smd circle (at -8.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J2 smd circle (at -7.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J3 smd circle (at -6.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J4 smd circle (at -5.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J5 smd circle (at -4.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J6 smd circle (at -3.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad J7 smd circle (at -2.5 -0.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H1 smd circle (at -8.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H2 smd circle (at -7.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H3 smd circle (at -6.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H4 smd circle (at -5.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H5 smd circle (at -4.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H6 smd circle (at -3.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad H7 smd circle (at -2.5 -1.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G1 smd circle (at -8.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G2 smd circle (at -7.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G3 smd circle (at -6.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G4 smd circle (at -5.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G5 smd circle (at -4.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G6 smd circle (at -3.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad G7 smd circle (at -2.5 -2.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F1 smd circle (at -8.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F2 smd circle (at -7.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F3 smd circle (at -6.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F4 smd circle (at -5.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F5 smd circle (at -4.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F6 smd circle (at -3.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad F7 smd circle (at -2.5 -3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E1 smd circle (at -8.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E2 smd circle (at -7.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E3 smd circle (at -6.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E4 smd circle (at -5.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E5 smd circle (at -4.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E6 smd circle (at -3.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad E7 smd circle (at -2.5 -4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D7 smd circle (at -2.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D6 smd circle (at -3.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D5 smd circle (at -4.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D4 smd circle (at -5.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D3 smd circle (at -6.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D2 smd circle (at -7.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad D1 smd circle (at -8.5 -5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C1 smd circle (at -8.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C2 smd circle (at -7.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C3 smd circle (at -6.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C4 smd circle (at -5.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C5 smd circle (at -4.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C6 smd circle (at -3.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad C7 smd circle (at -2.5 -6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B7 smd circle (at -2.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A7 smd circle (at -2.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A6 smd circle (at -3.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B6 smd circle (at -3.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B5 smd circle (at -4.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A5 smd circle (at -4.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A4 smd circle (at -5.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B4 smd circle (at -5.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B3 smd circle (at -6.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A3 smd circle (at -6.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad A2 smd circle (at -7.5 -8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B2 smd circle (at -7.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad B1 smd circle (at -8.5 -7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N1 smd circle (at -8.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N2 smd circle (at -7.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N3 smd circle (at -6.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N4 smd circle (at -5.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N5 smd circle (at -4.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N6 smd circle (at -3.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad N7 smd circle (at -2.5 3.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P7 smd circle (at -2.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P6 smd circle (at -3.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P5 smd circle (at -4.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P4 smd circle (at -5.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P3 smd circle (at -6.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P2 smd circle (at -7.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad P1 smd circle (at -8.5 4.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R1 smd circle (at -8.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R2 smd circle (at -7.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R3 smd circle (at -6.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R4 smd circle (at -5.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R5 smd circle (at -4.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R6 smd circle (at -3.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad R7 smd circle (at -2.5 5.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T7 smd circle (at -2.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T6 smd circle (at -3.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T5 smd circle (at -4.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T4 smd circle (at -5.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T3 smd circle (at -6.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T2 smd circle (at -7.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad T1 smd circle (at -8.5 6.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U1 smd circle (at -8.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U2 smd circle (at -7.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U3 smd circle (at -6.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U4 smd circle (at -5.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U5 smd circle (at -4.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U6 smd circle (at -3.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad U7 smd circle (at -2.5 7.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V7 smd circle (at -2.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V6 smd circle (at -3.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V5 smd circle (at -4.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V4 smd circle (at -5.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V3 smd circle (at -6.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad V2 smd circle (at -7.5 8.5) (size 0.35 0.35) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(fp_line (start 9.0 -9.0) (end 0.0 -9.0) (layer F.SilkS) (width 0.127))
(fp_line (start 0.0 -9.0) (end -9.0 -9.0) (layer F.SilkS) (width 0.127))
(fp_line (start -9.0 -9.0) (end -9.0 0.0) (layer F.SilkS) (width 0.127))
(fp_line (start -9.0 0.0) (end -9.0 9.0) (layer F.SilkS) (width 0.127))
(fp_line (start -9.0 9.0) (end 0.0 9.0) (layer F.SilkS) (width 0.127))
(fp_line (start 0.0 9.0) (end 9.0 9.0) (layer F.SilkS) (width 0.127))
(fp_line (start 9.0 9.0) (end 9.0 0.0) (layer F.SilkS) (width 0.127))
(fp_circle (center -9.5 -9.525) (end -9.373 -9.525) (layer F.SilkS) (width 0.254))
(fp_text user "1" (at -8.5 9.5) (layer F.Fab)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(fp_text user "18" (at 8.5 9.5) (layer F.Fab)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(fp_text user "A" (at -9.5 -8.5) (layer F.Fab)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(fp_text user "V" (at -9.5 8.5) (layer F.Fab)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(fp_line (start 9.0 0.0) (end 9.0 -9.0) (layer F.SilkS) (width 0.127))
(fp_line (start -8.0 0.0) (end -9.0 0.0) (layer F.SilkS) (width 0.127))
(fp_line (start 0.0 -9.0) (end 0.0 -8.0) (layer F.SilkS) (width 0.127))
(fp_line (start 0.0 8.0) (end 0.0 9.0) (layer F.SilkS) (width 0.127))
(fp_line (start 8.0 0.0) (end 9.0 0.0) (layer F.SilkS) (width 0.127))
(model ${KIPRJMOD}/3dmodels/other/OSD32MP157F-1G-BAA.step
(offset (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
@@ -0,0 +1,47 @@
(footprint SON50P200X200X80-9N (layer F.Cu) (tedit 6A90224C)
(descr "")
(attr smd)
(fp_text reference REF** (at 0.292 -1.7934 0) (layer F.SilkS)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(fp_text value SON50P200X200X80-9N (at 5.9816 1.7934 0) (layer F.Fab)
(effects (font (size 0.64 0.64) (thickness 0.15)))
)
(pad 1 smd roundrect (roundrect_rratio 0.125) (at -0.985 -0.75) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 2 smd roundrect (roundrect_rratio 0.125) (at -0.985 -0.25) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 3 smd roundrect (roundrect_rratio 0.125) (at -0.985 0.25) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 4 smd roundrect (roundrect_rratio 0.125) (at -0.985 0.75) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 5 smd roundrect (roundrect_rratio 0.125) (at 0.985 0.75) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 6 smd roundrect (roundrect_rratio 0.125) (at 0.985 0.25) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 7 smd roundrect (roundrect_rratio 0.125) (at 0.985 -0.25) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 8 smd roundrect (roundrect_rratio 0.125) (at 0.985 -0.75) (size 0.74 0.28) (layers F.Cu F.Mask F.Paste) (solder_mask_margin 0.102))
(pad 9 smd rect (at 0.0 0.0) (size 0.9 1.6) (layers F.Cu F.Mask) (solder_mask_margin 0.102))
(pad 9_1 thru_hole circle (at 0.0 -0.55) (size 0.4 0.4) (drill 0.2) (layers *.Cu))
(pad 9_2 thru_hole circle (at 0.0 0.55) (size 0.4 0.4) (drill 0.2) (layers *.Cu))
(fp_poly
(pts
(xy -0.28 -0.51)
(xy 0.28 -0.51)
(xy 0.28 0.51)
(xy -0.28 0.51)
) (layer F.Paste) (width 0.01)
)
(fp_circle (center -1.925 -0.75) (end -1.825 -0.75) (layer F.SilkS) (width 0.2))
(fp_circle (center -1.925 -0.75) (end -1.825 -0.75) (layer F.Fab) (width 0.2))
(fp_line (start -1.0 -1.0) (end 1.0 -1.0) (layer F.Fab) (width 0.127))
(fp_line (start -1.0 1.0) (end 1.0 1.0) (layer F.Fab) (width 0.127))
(fp_line (start -1.0 -1.21) (end 1.0 -1.21) (layer F.SilkS) (width 0.127))
(fp_line (start -1.0 1.21) (end 1.0 1.21) (layer F.SilkS) (width 0.127))
(fp_line (start -1.0 -1.0) (end -1.0 1.0) (layer F.Fab) (width 0.127))
(fp_line (start 1.0 -1.0) (end 1.0 1.0) (layer F.Fab) (width 0.127))
(fp_line (start -1.605 -1.25) (end 1.605 -1.25) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.605 1.25) (end 1.605 1.25) (layer F.CrtYd) (width 0.05))
(fp_line (start -1.605 -1.25) (end -1.605 1.25) (layer F.CrtYd) (width 0.05))
(fp_line (start 1.605 -1.25) (end 1.605 1.25) (layer F.CrtYd) (width 0.05))
(model ${KIPRJMOD}/3dmodels/other/TPS22965DSGR.step
(offset (xyz 0 0 0))
(scale (xyz 1 1 1))
(rotate (xyz 0 0 0))
)
)
@@ -0,0 +1,69 @@
(module easyeda2kicad:QFN-40_L5.0-W5.0-P0.40-TL-EP3.4 (layer F.Cu) (tedit 5DC5F6A4)
(attr smd)
(fp_text reference REF** (at 0.000 -6.500) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value QFN-40_L5.0-W5.0-P0.40-TL-EP3.4 (at 0.000 6.500) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text user %R (at 0 0) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(property "LCSC Part" "C3036461")
(fp_line (start -2.20 2.70) (end -2.70 2.70) (layer F.SilkS) (width 0.20))
(fp_line (start -2.70 2.70) (end -2.70 2.20) (layer F.SilkS) (width 0.20))
(fp_line (start 2.20 2.70) (end 2.70 2.70) (layer F.SilkS) (width 0.20))
(fp_line (start 2.70 2.70) (end 2.70 2.20) (layer F.SilkS) (width 0.20))
(fp_line (start 2.70 -2.20) (end 2.70 -2.70) (layer F.SilkS) (width 0.20))
(fp_line (start 2.70 -2.70) (end 2.20 -2.70) (layer F.SilkS) (width 0.20))
(fp_line (start -2.70 -2.20) (end -2.70 -2.70) (layer F.SilkS) (width 0.20))
(fp_line (start -2.70 -2.70) (end -2.20 -2.70) (layer F.SilkS) (width 0.20))
(pad 41 smd rect (at 0.00 -0.00 -90.00) (size 3.400 3.400) (layers F.Cu F.Paste F.Mask))
(pad 1 smd oval (at -2.50 -1.80 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 2 smd oval (at -2.50 -1.40 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 3 smd oval (at -2.50 -1.00 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 4 smd oval (at -2.50 -0.60 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 5 smd oval (at -2.50 -0.20 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 6 smd oval (at -2.50 0.20 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 7 smd oval (at -2.50 0.60 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 8 smd oval (at -2.50 1.00 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 9 smd oval (at -2.50 1.40 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 10 smd oval (at -2.50 1.80 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 21 smd oval (at 2.50 1.80 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 22 smd oval (at 2.50 1.40 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 23 smd oval (at 2.50 1.00 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 24 smd oval (at 2.50 0.60 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 25 smd oval (at 2.50 0.20 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 26 smd oval (at 2.50 -0.20 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 27 smd oval (at 2.50 -0.60 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 28 smd oval (at 2.50 -1.00 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 29 smd oval (at 2.50 -1.40 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 30 smd oval (at 2.50 -1.80 0.00) (size 0.800 0.200) (layers F.Cu F.Paste F.Mask))
(pad 40 smd oval (at -1.80 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 39 smd oval (at -1.40 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 38 smd oval (at -1.00 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 37 smd oval (at -0.60 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 36 smd oval (at -0.20 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 35 smd oval (at 0.20 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 34 smd oval (at 0.60 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 33 smd oval (at 1.00 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 32 smd oval (at 1.40 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 31 smd oval (at 1.80 -2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 20 smd oval (at 1.80 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 19 smd oval (at 1.40 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 18 smd oval (at 1.00 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 17 smd oval (at 0.60 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 16 smd oval (at 0.20 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 15 smd oval (at -0.20 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 14 smd oval (at -0.60 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 13 smd oval (at -1.00 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 12 smd oval (at -1.40 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(pad 11 smd oval (at -1.80 2.50 0.00) (size 0.200 0.800) (layers F.Cu F.Paste F.Mask))
(fp_circle (center -2.50 -2.50) (end -2.47 -2.50) (layer F.SilkS) (width 0.06))
(fp_circle (center -2.80 -1.82) (end -2.65 -1.82) (layer Cmts.User) (width 0.30))
(fp_arc (start -3.20 -2.50) (end -3.05 -2.50) (angle 359.03) (layer F.SilkS) (width 0.30))
(fp_line (start -2.50 -2.50) (end 2.50 -2.50) (layer F.CrtYd) (width 0.05))
(fp_line (start 2.50 -2.50) (end 2.50 2.50) (layer F.CrtYd) (width 0.05))
(fp_line (start 2.50 2.50) (end -2.50 2.50) (layer F.CrtYd) (width 0.05))
(fp_line (start -2.50 2.50) (end -2.50 -2.50) (layer F.CrtYd) (width 0.05))
)
+4
View File
@@ -34,10 +34,12 @@
(lib (name "MIKILAB_ESP32_WROVER_E")(type "KiCad")(uri "${KIPRJMOD}/footprints/microcontrollers/ESP32-WROVER-E.pretty")(options "")(descr "ESP32-WROVER-E.pretty")) (lib (name "MIKILAB_ESP32_WROVER_E")(type "KiCad")(uri "${KIPRJMOD}/footprints/microcontrollers/ESP32-WROVER-E.pretty")(options "")(descr "ESP32-WROVER-E.pretty"))
(lib (name "MIKILAB_ESP8684_WROOM_02C_U")(type "KiCad")(uri "${KIPRJMOD}/footprints/microcontrollers/ESP8684-WROOM-02C_U.pretty")(options "")(descr "ESP8684-WROOM-02C_U.pretty")) (lib (name "MIKILAB_ESP8684_WROOM_02C_U")(type "KiCad")(uri "${KIPRJMOD}/footprints/microcontrollers/ESP8684-WROOM-02C_U.pretty")(options "")(descr "ESP8684-WROOM-02C_U.pretty"))
(lib (name "MIKILAB_25AA1024")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/25AA1024.pretty")(options "")(descr "25AA1024.pretty")) (lib (name "MIKILAB_25AA1024")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/25AA1024.pretty")(options "")(descr "25AA1024.pretty"))
(lib (name "MIKILAB_ADG936BCPZ")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ADG936BCPZ.pretty")(options "")(descr "ADG936BCPZ.pretty"))
(lib (name "MIKILAB_ADG936BRUZ")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ADG936BRUZ.pretty")(options "")(descr "ADG936BRUZ.pretty")) (lib (name "MIKILAB_ADG936BRUZ")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ADG936BRUZ.pretty")(options "")(descr "ADG936BRUZ.pretty"))
(lib (name "MIKILAB_CDCLVC1102PW")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/CDCLVC1102PW.pretty")(options "")(descr "CDCLVC1102PW.pretty")) (lib (name "MIKILAB_CDCLVC1102PW")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/CDCLVC1102PW.pretty")(options "")(descr "CDCLVC1102PW.pretty"))
(lib (name "MIKILAB_ESD9B5_0ST5G")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ESD9B5.0ST5G.pretty")(options "")(descr "ESD9B5.0ST5G.pretty")) (lib (name "MIKILAB_ESD9B5_0ST5G")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ESD9B5.0ST5G.pretty")(options "")(descr "ESD9B5.0ST5G.pretty"))
(lib (name "MIKILAB_IC_TPS63020DSJT")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/IC_TPS63020DSJT.pretty")(options "")(descr "IC_TPS63020DSJT.pretty")) (lib (name "MIKILAB_IC_TPS63020DSJT")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/IC_TPS63020DSJT.pretty")(options "")(descr "IC_TPS63020DSJT.pretty"))
(lib (name "MIKILAB_OSD32MP157F_1G_BAA")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/OSD32MP157F-1G-BAA.pretty")(options "")(descr "OSD32MP157F-1G-BAA.pretty"))
(lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/PESD5V0L4UW.pretty")(options "")(descr "PESD5V0L4UW.pretty")) (lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/PESD5V0L4UW.pretty")(options "")(descr "PESD5V0L4UW.pretty"))
(lib (name "MIKILAB_SJ_3506_SMT_TR")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SJ-3506-SMT-TR.pretty")(options "")(descr "SJ-3506-SMT-TR.pretty")) (lib (name "MIKILAB_SJ_3506_SMT_TR")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SJ-3506-SMT-TR.pretty")(options "")(descr "SJ-3506-SMT-TR.pretty"))
(lib (name "MIKILAB_SJ_435107RS")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SJ-435107RS.pretty")(options "")(descr "SJ-435107RS.pretty")) (lib (name "MIKILAB_SJ_435107RS")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SJ-435107RS.pretty")(options "")(descr "SJ-435107RS.pretty"))
@@ -45,6 +47,7 @@
(lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SN74AXC1T45DBVR.pretty")(options "")(descr "SN74AXC1T45DBVR.pretty")) (lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SN74AXC1T45DBVR.pretty")(options "")(descr "SN74AXC1T45DBVR.pretty"))
(lib (name "MIKILAB_SOT95P280X145_5N")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SOT95P280X145-5N.pretty")(options "")(descr "SOT95P280X145-5N.pretty")) (lib (name "MIKILAB_SOT95P280X145_5N")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/SOT95P280X145-5N.pretty")(options "")(descr "SOT95P280X145-5N.pretty"))
(lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/TPD2E007DCKR.pretty")(options "")(descr "TPD2E007DCKR.pretty")) (lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/TPD2E007DCKR.pretty")(options "")(descr "TPD2E007DCKR.pretty"))
(lib (name "MIKILAB_TPS22965DSGR")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/TPS22965DSGR.pretty")(options "")(descr "TPS22965DSGR.pretty"))
(lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/TPS22994RUKT.pretty")(options "")(descr "TPS22994RUKT.pretty")) (lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/TPS22994RUKT.pretty")(options "")(descr "TPS22994RUKT.pretty"))
(lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/XTAC5212IRGER.pretty")(options "")(descr "XTAC5212IRGER.pretty")) (lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/XTAC5212IRGER.pretty")(options "")(descr "XTAC5212IRGER.pretty"))
(lib (name "MIKILAB_abracon")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/abracon.pretty")(options "")(descr "abracon.pretty")) (lib (name "MIKILAB_abracon")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/abracon.pretty")(options "")(descr "abracon.pretty"))
@@ -108,6 +111,7 @@
(lib (name "MIKILAB_ublox")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ublox.pretty")(options "")(descr "ublox.pretty")) (lib (name "MIKILAB_ublox")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/ublox.pretty")(options "")(descr "ublox.pretty"))
(lib (name "MIKILAB_wurth")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/wurth.pretty")(options "")(descr "wurth.pretty")) (lib (name "MIKILAB_wurth")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/wurth.pretty")(options "")(descr "wurth.pretty"))
(lib (name "MIKILAB_zif")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/zif.pretty")(options "")(descr "zif.pretty")) (lib (name "MIKILAB_zif")(type "KiCad")(uri "${KIPRJMOD}/footprints/other/zif.pretty")(options "")(descr "zif.pretty"))
(lib (name "MIKILAB_AXP2101")(type "KiCad")(uri "${KIPRJMOD}/footprints/power/AXP2101.pretty")(options "")(descr "AXP2101.pretty"))
(lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${KIPRJMOD}/footprints/power/BQ25896RTWT.pretty")(options "")(descr "BQ25896RTWT.pretty")) (lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${KIPRJMOD}/footprints/power/BQ25896RTWT.pretty")(options "")(descr "BQ25896RTWT.pretty"))
(lib (name "MIKILAB_FSC_BT1035")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/FSC-BT1035.pretty")(options "")(descr "FSC-BT1035.pretty")) (lib (name "MIKILAB_FSC_BT1035")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/FSC-BT1035.pretty")(options "")(descr "FSC-BT1035.pretty"))
(lib (name "MIKILAB_FSC_BT1058")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/FSC-BT1058.pretty")(options "")(descr "FSC-BT1058.pretty")) (lib (name "MIKILAB_FSC_BT1058")(type "KiCad")(uri "${KIPRJMOD}/footprints/rf/FSC-BT1058.pretty")(options "")(descr "FSC-BT1058.pretty"))
+3
View File
@@ -38,6 +38,7 @@
(lib (name "MIKILAB_CDCLVC1102PW")(type "KiCad")(uri "${MIKILAB}/footprints/other/CDCLVC1102PW.pretty")(options "")(descr "CDCLVC1102PW.pretty")) (lib (name "MIKILAB_CDCLVC1102PW")(type "KiCad")(uri "${MIKILAB}/footprints/other/CDCLVC1102PW.pretty")(options "")(descr "CDCLVC1102PW.pretty"))
(lib (name "MIKILAB_ESD9B5_0ST5G")(type "KiCad")(uri "${MIKILAB}/footprints/other/ESD9B5.0ST5G.pretty")(options "")(descr "ESD9B5.0ST5G.pretty")) (lib (name "MIKILAB_ESD9B5_0ST5G")(type "KiCad")(uri "${MIKILAB}/footprints/other/ESD9B5.0ST5G.pretty")(options "")(descr "ESD9B5.0ST5G.pretty"))
(lib (name "MIKILAB_IC_TPS63020DSJT")(type "KiCad")(uri "${MIKILAB}/footprints/other/IC_TPS63020DSJT.pretty")(options "")(descr "IC_TPS63020DSJT.pretty")) (lib (name "MIKILAB_IC_TPS63020DSJT")(type "KiCad")(uri "${MIKILAB}/footprints/other/IC_TPS63020DSJT.pretty")(options "")(descr "IC_TPS63020DSJT.pretty"))
(lib (name "MIKILAB_OSD32MP157F_1G_BAA")(type "KiCad")(uri "${MIKILAB}/footprints/other/OSD32MP157F-1G-BAA.pretty")(options "")(descr "OSD32MP157F-1G-BAA.pretty"))
(lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${MIKILAB}/footprints/other/PESD5V0L4UW.pretty")(options "")(descr "PESD5V0L4UW.pretty")) (lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${MIKILAB}/footprints/other/PESD5V0L4UW.pretty")(options "")(descr "PESD5V0L4UW.pretty"))
(lib (name "MIKILAB_SJ_3506_SMT_TR")(type "KiCad")(uri "${MIKILAB}/footprints/other/SJ-3506-SMT-TR.pretty")(options "")(descr "SJ-3506-SMT-TR.pretty")) (lib (name "MIKILAB_SJ_3506_SMT_TR")(type "KiCad")(uri "${MIKILAB}/footprints/other/SJ-3506-SMT-TR.pretty")(options "")(descr "SJ-3506-SMT-TR.pretty"))
(lib (name "MIKILAB_SJ_435107RS")(type "KiCad")(uri "${MIKILAB}/footprints/other/SJ-435107RS.pretty")(options "")(descr "SJ-435107RS.pretty")) (lib (name "MIKILAB_SJ_435107RS")(type "KiCad")(uri "${MIKILAB}/footprints/other/SJ-435107RS.pretty")(options "")(descr "SJ-435107RS.pretty"))
@@ -45,6 +46,7 @@
(lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${MIKILAB}/footprints/other/SN74AXC1T45DBVR.pretty")(options "")(descr "SN74AXC1T45DBVR.pretty")) (lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${MIKILAB}/footprints/other/SN74AXC1T45DBVR.pretty")(options "")(descr "SN74AXC1T45DBVR.pretty"))
(lib (name "MIKILAB_SOT95P280X145_5N")(type "KiCad")(uri "${MIKILAB}/footprints/other/SOT95P280X145-5N.pretty")(options "")(descr "SOT95P280X145-5N.pretty")) (lib (name "MIKILAB_SOT95P280X145_5N")(type "KiCad")(uri "${MIKILAB}/footprints/other/SOT95P280X145-5N.pretty")(options "")(descr "SOT95P280X145-5N.pretty"))
(lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${MIKILAB}/footprints/other/TPD2E007DCKR.pretty")(options "")(descr "TPD2E007DCKR.pretty")) (lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${MIKILAB}/footprints/other/TPD2E007DCKR.pretty")(options "")(descr "TPD2E007DCKR.pretty"))
(lib (name "MIKILAB_TPS22965DSGR")(type "KiCad")(uri "${MIKILAB}/footprints/other/TPS22965DSGR.pretty")(options "")(descr "TPS22965DSGR.pretty"))
(lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${MIKILAB}/footprints/other/TPS22994RUKT.pretty")(options "")(descr "TPS22994RUKT.pretty")) (lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${MIKILAB}/footprints/other/TPS22994RUKT.pretty")(options "")(descr "TPS22994RUKT.pretty"))
(lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${MIKILAB}/footprints/other/XTAC5212IRGER.pretty")(options "")(descr "XTAC5212IRGER.pretty")) (lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${MIKILAB}/footprints/other/XTAC5212IRGER.pretty")(options "")(descr "XTAC5212IRGER.pretty"))
(lib (name "MIKILAB_abracon")(type "KiCad")(uri "${MIKILAB}/footprints/other/abracon.pretty")(options "")(descr "abracon.pretty")) (lib (name "MIKILAB_abracon")(type "KiCad")(uri "${MIKILAB}/footprints/other/abracon.pretty")(options "")(descr "abracon.pretty"))
@@ -108,6 +110,7 @@
(lib (name "MIKILAB_ublox")(type "KiCad")(uri "${MIKILAB}/footprints/other/ublox.pretty")(options "")(descr "ublox.pretty")) (lib (name "MIKILAB_ublox")(type "KiCad")(uri "${MIKILAB}/footprints/other/ublox.pretty")(options "")(descr "ublox.pretty"))
(lib (name "MIKILAB_wurth")(type "KiCad")(uri "${MIKILAB}/footprints/other/wurth.pretty")(options "")(descr "wurth.pretty")) (lib (name "MIKILAB_wurth")(type "KiCad")(uri "${MIKILAB}/footprints/other/wurth.pretty")(options "")(descr "wurth.pretty"))
(lib (name "MIKILAB_zif")(type "KiCad")(uri "${MIKILAB}/footprints/other/zif.pretty")(options "")(descr "zif.pretty")) (lib (name "MIKILAB_zif")(type "KiCad")(uri "${MIKILAB}/footprints/other/zif.pretty")(options "")(descr "zif.pretty"))
(lib (name "MIKILAB_AXP2101")(type "KiCad")(uri "${MIKILAB}/footprints/power/AXP2101.pretty")(options "")(descr "AXP2101.pretty"))
(lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${MIKILAB}/footprints/power/BQ25896RTWT.pretty")(options "")(descr "BQ25896RTWT.pretty")) (lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${MIKILAB}/footprints/power/BQ25896RTWT.pretty")(options "")(descr "BQ25896RTWT.pretty"))
(lib (name "MIKILAB_FSC_BT1035")(type "KiCad")(uri "${MIKILAB}/footprints/rf/FSC-BT1035.pretty")(options "")(descr "FSC-BT1035.pretty")) (lib (name "MIKILAB_FSC_BT1035")(type "KiCad")(uri "${MIKILAB}/footprints/rf/FSC-BT1035.pretty")(options "")(descr "FSC-BT1035.pretty"))
(lib (name "MIKILAB_FSC_BT1058")(type "KiCad")(uri "${MIKILAB}/footprints/rf/FSC-BT1058.pretty")(options "")(descr "FSC-BT1058.pretty")) (lib (name "MIKILAB_FSC_BT1058")(type "KiCad")(uri "${MIKILAB}/footprints/rf/FSC-BT1058.pretty")(options "")(descr "FSC-BT1058.pretty"))
+100
View File
@@ -0,0 +1,100 @@
#!/usr/bin/env python3
"""
find_missing_3d_models.py
===========================
Reports every single-part MIKILAB component that has a footprint but no
3D model, and prints ready-to-open search links for each one (SnapEDA,
Octopart, UltraLibrarian) to speed up manually finding and importing the
missing model via import_component.py --update (or mikilab_lib.update_component()).
This does not download or scrape anything -- SnapEDA/UltraLibrarian
require a logged-in browser session to download a model, and Octopart's
search UI sits behind a bot-detection challenge, so there is no reliable
unattended way to fetch these. This script only narrows down *which*
components need attention and *where* to look.
Bulk, multi-package category libraries (e.g. symbols/other/ti.kicad_sym,
which pairs with a footprints/other/ti.pretty containing many unrelated
footprints for many different chips) are excluded -- a single 3D model
doesn't apply to a whole such library, only to one real part.
Usage:
python3 scripts/find_missing_3d_models.py [--category CAT] [--csv OUTPUT.csv]
"""
from __future__ import annotations
import argparse
import csv
import sys
from pathlib import Path
from urllib.parse import quote
sys.path.insert(0, str(Path(__file__).resolve().parent))
import mikilab_lib as mikilab
def missing_3d_models(category: str | None = None) -> list[mikilab.ComponentInfo]:
"""Single-part components (exactly one footprint file in their
.pretty dir) that have a footprint but no 3D model."""
return [
c for c in mikilab.list_components(category=category)
if c.footprint_path and not c.model_paths and len(c.footprint_files) == 1
]
def search_links(query: str) -> dict[str, str]:
q = quote(query)
return {
"snapeda": f"https://www.snapeda.com/search/?q={q}&search-type=parts",
"octopart": f"https://octopart.com/search?q={q}",
"ultralibrarian": "https://app.ultralibrarian.com/search",
}
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--category", choices=mikilab.lc.CATEGORIES)
parser.add_argument("--csv", help="Also write the report to this CSV file")
args = parser.parse_args()
missing = sorted(missing_3d_models(args.category), key=lambda c: (c.category, c.name))
if not missing:
print("Nessun componente singolo senza modello 3D.")
return 0
print(f"{len(missing)} componenti senza modello 3D:\n")
rows = []
for c in missing:
links = search_links(c.name)
print(f"{c.category:15} {c.name}")
print(f" footprint : {c.footprint_path}/{c.footprint_files[0]}.kicad_mod")
print(f" SnapEDA : {links['snapeda']}")
print(f" Octopart : {links['octopart']}")
print(f" UltraLibrarian: {links['ultralibrarian']} (cerca a mano \"{c.name}\")")
print()
rows.append({
"name": c.name,
"category": c.category,
"footprint": f"{c.footprint_path}/{c.footprint_files[0]}.kicad_mod",
"snapeda_search": links["snapeda"],
"octopart_search": links["octopart"],
"ultralibrarian_search": links["ultralibrarian"],
})
if args.csv:
with open(args.csv, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()))
writer.writeheader()
writer.writerows(rows)
print(f"Scritto anche {args.csv}")
return 0
if __name__ == "__main__":
sys.exit(main())
+7
View File
@@ -110,6 +110,7 @@ def main() -> int:
sym_entries = lc.write_sym_lib_table(ROOT) sym_entries = lc.write_sym_lib_table(ROOT)
fp_entries = lc.write_fp_lib_table(ROOT) fp_entries = lc.write_fp_lib_table(ROOT)
lc.write_global_tables(ROOT)
print(f"Batch import from {source}") print(f"Batch import from {source}")
print() print()
@@ -118,6 +119,12 @@ def main() -> int:
print() print()
print(f"Regenerated sym-lib-table ({len(sym_entries)} libraries) and fp-lib-table ({len(fp_entries)} libraries)") print(f"Regenerated sym-lib-table ({len(sym_entries)} libraries) and fp-lib-table ({len(fp_entries)} libraries)")
print("Regenerated sym-lib-table.global and fp-lib-table.global")
print(
"NOTE: if this library is registered globally in KiCad (README.md section 1), "
"also re-run the merge step to update ~/Library/Preferences/kicad/*/sym-lib-table "
"and fp-lib-table, or new components will not show up there."
)
ok = sum(1 for _, status, _ in results if status == "OK") ok = sum(1 for _, status, _ in results if status == "OK")
errors = sum(1 for _, status, _ in results if status == "ERROR") errors = sum(1 for _, status, _ in results if status == "ERROR")
+14
View File
@@ -273,7 +273,14 @@ def main() -> int:
lc.append_manifest_rows(ROOT, manifest_rows) lc.append_manifest_rows(ROOT, manifest_rows)
sym_entries = lc.write_sym_lib_table(ROOT) sym_entries = lc.write_sym_lib_table(ROOT)
fp_entries = lc.write_fp_lib_table(ROOT) fp_entries = lc.write_fp_lib_table(ROOT)
lc.write_global_tables(ROOT)
report.append(f"Regenerated sym-lib-table ({len(sym_entries)} libraries) and fp-lib-table ({len(fp_entries)} libraries)") report.append(f"Regenerated sym-lib-table ({len(sym_entries)} libraries) and fp-lib-table ({len(fp_entries)} libraries)")
report.append("Regenerated sym-lib-table.global and fp-lib-table.global")
report.append(
"NOTE: if this library is registered globally in KiCad (README.md section 1), "
"also re-run the merge step to update ~/Library/Preferences/kicad/*/sym-lib-table "
"and fp-lib-table, or the removed component will still resolve there."
)
print("\n".join(report)) print("\n".join(report))
print("\nOK.") print("\nOK.")
@@ -327,7 +334,14 @@ def main() -> int:
sym_entries = lc.write_sym_lib_table(ROOT) sym_entries = lc.write_sym_lib_table(ROOT)
fp_entries = lc.write_fp_lib_table(ROOT) fp_entries = lc.write_fp_lib_table(ROOT)
lc.write_global_tables(ROOT)
report.append(f"Regenerated sym-lib-table ({len(sym_entries)} libraries) and fp-lib-table ({len(fp_entries)} libraries)") report.append(f"Regenerated sym-lib-table ({len(sym_entries)} libraries) and fp-lib-table ({len(fp_entries)} libraries)")
report.append("Regenerated sym-lib-table.global and fp-lib-table.global")
report.append(
"NOTE: if this library is registered globally in KiCad (README.md section 1), "
"also re-run the merge step to update ~/Library/Preferences/kicad/*/sym-lib-table "
"and fp-lib-table, or the new component will not show up there."
)
print("\n".join(report)) print("\n".join(report))
print("\nOK.") print("\nOK.")
+19
View File
@@ -239,6 +239,25 @@ def write_fp_lib_table(root: Path) -> list[LibEntry]:
return entries return entries
def write_global_tables(root: Path, env_var: str = "MIKILAB") -> tuple[list[LibEntry], list[LibEntry]]:
"""Regenerate sym-lib-table.global / fp-lib-table.global (the
${MIKILAB}-based variants used when this library is registered
globally in KiCad, across every project). Mirrors write_sym_lib_table
/ write_fp_lib_table, which only cover the ${KIPRJMOD} project
tables -- those alone are not enough for components to show up in
KiCad when this library is used globally (see README.md section 1)."""
sym_entries = build_sym_table_entries(root, env_var=env_var)
fp_entries = build_fp_table_entries(root, env_var=env_var)
(root / "sym-lib-table.global").write_text(
render_lib_table("sym_lib_table", sym_entries), encoding="utf-8"
)
(root / "fp-lib-table.global").write_text(
render_lib_table("fp_lib_table", fp_entries), encoding="utf-8"
)
return sym_entries, fp_entries
LIB_ENTRY_RE = re.compile( LIB_ENTRY_RE = re.compile(
r'\(lib\s*\(name\s*"([^"]*)"\)\s*\(type\s*"([^"]*)"\)\s*' r'\(lib\s*\(name\s*"([^"]*)"\)\s*\(type\s*"([^"]*)"\)\s*'
r'\(uri\s*"([^"]*)"\)\s*\(options\s*"([^"]*)"\)\s*' r'\(uri\s*"([^"]*)"\)\s*\(options\s*"([^"]*)"\)\s*'
+162
View File
@@ -0,0 +1,162 @@
#!/usr/bin/env python3
"""
mikilab_cli.py
===============
Stable JSON-over-stdout CLI for mikilab_lib.py, for apps that are not
Python (Swift, C++, ...) or that otherwise want to drive the MIKILAB
library out-of-process instead of importing it directly.
Every invocation prints exactly one JSON object to stdout and nothing
else (diagnostics, if any, go to stderr) -- safe to pipe straight into a
JSON parser. Exit code is 0 iff "ok" is true.
On success:
{"ok": true, "data": <command-specific object or array>}
On failure:
{"ok": false, "error": "<human-readable message>"}
Commands:
add --name NAME --symbol PATH [--footprint PATH] [--model PATH] [--category CAT]
update --name NAME --symbol PATH [--footprint PATH] [--model PATH] [--category CAT]
remove --name NAME
get --name NAME
list [--category CAT]
find --query TEXT [--category CAT]
Examples:
python3 scripts/mikilab_cli.py add --name TPS7A2018PDBVR \\
--symbol /path/TPS7A2018PDBVR.kicad_sym \\
--footprint /path/SOT95P280X145-5N.kicad_mod --category power
python3 scripts/mikilab_cli.py get --name TPS7A2018PDBVR
python3 scripts/mikilab_cli.py find --query tps22
From Swift: run as a subprocess (Process), read stdout, decode with
JSONDecoder. From C++: popen()/posix_spawn + any JSON library (e.g.
nlohmann::json). In both cases, check the process exit code as well as
"ok" -- a non-zero exit always means "ok": false was printed (or, if the
process crashed before printing anything, stdout will be empty).
"""
from __future__ import annotations
import argparse
import dataclasses
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
import mikilab_lib as mikilab
def _emit(payload: dict) -> int:
print(json.dumps(payload, indent=2))
return 0 if payload.get("ok") else 1
def _ok(data) -> dict:
if dataclasses.is_dataclass(data):
data = dataclasses.asdict(data)
elif isinstance(data, list):
data = [dataclasses.asdict(x) if dataclasses.is_dataclass(x) else x for x in data]
return {"ok": True, "data": data}
def _err(message: str) -> dict:
return {"ok": False, "error": message}
def cmd_add(args) -> dict:
result = mikilab.add_component(
name=args.name, symbol=args.symbol, footprint=args.footprint,
model=args.model, category=args.category,
)
return _ok(result)
def cmd_update(args) -> dict:
result = mikilab.update_component(
name=args.name, symbol=args.symbol, footprint=args.footprint,
model=args.model, category=args.category,
)
return _ok(result)
def cmd_remove(args) -> dict:
result = mikilab.remove_component(args.name)
return _ok(result)
def cmd_get(args) -> dict:
result = mikilab.get_component(args.name)
if result is None:
return _err(f"no component named '{args.name}' found")
return _ok(result)
def cmd_list(args) -> dict:
return _ok(mikilab.list_components(category=args.category))
def cmd_find(args) -> dict:
return _ok(mikilab.find_components(args.query, category=args.category))
def main() -> int:
parser = argparse.ArgumentParser(description="JSON CLI over mikilab_lib.py")
sub = parser.add_subparsers(dest="command", required=True)
p_add = sub.add_parser("add", help="Add a new component")
p_add.add_argument("--name", required=True)
p_add.add_argument("--symbol", required=True)
p_add.add_argument("--footprint")
p_add.add_argument("--model")
p_add.add_argument("--category", choices=mikilab.lc.CATEGORIES)
p_add.set_defaults(func=cmd_add)
p_update = sub.add_parser("update", help="Replace an existing component in place (or create it)")
p_update.add_argument("--name", required=True)
p_update.add_argument("--symbol", required=True)
p_update.add_argument("--footprint")
p_update.add_argument("--model")
p_update.add_argument("--category", choices=mikilab.lc.CATEGORIES)
p_update.set_defaults(func=cmd_update)
p_remove = sub.add_parser("remove", help="Remove a component")
p_remove.add_argument("--name", required=True)
p_remove.set_defaults(func=cmd_remove)
p_get = sub.add_parser("get", help="Look up one component by exact name")
p_get.add_argument("--name", required=True)
p_get.set_defaults(func=cmd_get)
p_list = sub.add_parser("list", help="List components, optionally filtered by category")
p_list.add_argument("--category", choices=mikilab.lc.CATEGORIES)
p_list.set_defaults(func=cmd_list)
p_find = sub.add_parser("find", help="Case-insensitive substring search by name")
p_find.add_argument("--query", required=True)
p_find.add_argument("--category", choices=mikilab.lc.CATEGORIES)
p_find.set_defaults(func=cmd_find)
args = parser.parse_args()
try:
payload = args.func(args)
except mikilab.MikilabError as e:
payload = _err(str(e))
except Exception as e: # last-resort guard so callers always get valid JSON, never a traceback on stdout
payload = _err(f"unexpected error: {e}")
return _emit(payload)
if __name__ == "__main__":
sys.exit(main())
+308
View File
@@ -0,0 +1,308 @@
#!/usr/bin/env python3
"""
mikilab_lib.py
===============
Public Python API for managing the MIKILAB KiCad library: add, update,
remove and query components. Meant to be imported directly by Python
apps:
import sys
sys.path.insert(0, "/path/to/mikylab_kikad_library/scripts")
import mikilab_lib as mikilab
result = mikilab.add_component(
name="TPS7A2018PDBVR",
symbol="/path/to/TPS7A2018PDBVR.kicad_sym",
footprint="/path/to/SOT95P280X145-5N.kicad_mod",
model="/path/to/TPS7A2018PDBVR.step",
category="power",
)
Non-Python apps (Swift, C++, ...) should drive this through
mikilab_cli.py instead, which exposes the same operations as a stable
JSON-over-stdout CLI (see that file's docstring).
This module does not reimplement any import/removal logic -- it is a
thin, typed wrapper over import_component.py's existing functions (same
validation, collision handling, and lib-table regeneration used by every
other entry point in this repo: add_component.py, import_batch.py,
import_snapeda.py, import_ultralibrarian.py). It only adds:
- structured results/exceptions instead of print()+exit code,
- query functions (get/list/find) that nothing else in this repo
exposes today.
All mutating calls (add_component, update_component, remove_component)
regenerate sym-lib-table, fp-lib-table, sym-lib-table.global and
fp-lib-table.global before returning, and append rows to MANIFEST.csv --
same guarantees as the CLI scripts. They do NOT touch the real KiCad
global tables under ~/Library/Preferences/kicad/*/ -- if this library is
registered globally in KiCad (README.md section 1), that merge step is
still a separate, deliberate action (see README section 1, step 3).
"""
from __future__ import annotations
import sys
from dataclasses import dataclass, field
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
import lib_common as lc
import import_component as ic
ROOT = lc.LIBRARY_ROOT
class MikilabError(Exception):
"""Raised for any library-management failure: bad component name,
missing source file, unknown category, component not found (on
remove/lookup), etc. str(e) is a human-readable message safe to show
to a user or log as-is."""
@dataclass
class ComponentResult:
"""Result of a successful add_component/update_component/remove_component call."""
name: str
category: str
action: str # "add" | "update" | "remove"
symbol_path: str | None = None
footprint_path: str | None = None
footprint_status: str | None = None # NEW / UPDATED / DUPLICATE / RENAMED_COLLISION
model_path: str | None = None
messages: list[str] = field(default_factory=list)
@dataclass
class ComponentInfo:
"""One entry as returned by get_component/list_components/find_components.
Note: this reports one entry per .kicad_sym file under symbols/, which
is the same unit add_component/remove_component operate on. A few
library files (e.g. category-wide symbol libraries like LED.kicad_sym)
contain multiple symbol definitions internally; this API does not look
inside those, it reports the file as a single entry."""
name: str
category: str
symbol_path: str
sym_nickname: str
footprint_path: str | None
fp_nickname: str | None
footprint_files: list[str]
model_paths: list[str]
def _component_info(symbol_path: Path) -> ComponentInfo:
name = symbol_path.stem
category = symbol_path.parent.name
pretty_dir = ROOT / "footprints" / category / f"{name}.pretty"
footprint_path = None
fp_nickname = None
footprint_files: list[str] = []
if pretty_dir.is_dir():
footprint_path = str(pretty_dir.relative_to(ROOT))
fp_nickname = lc.fp_nickname(pretty_dir)
footprint_files = sorted(p.stem for p in pretty_dir.glob("*.kicad_mod"))
models_dir = ROOT / "3dmodels" / category
model_paths = []
if models_dir.is_dir():
model_paths = sorted(
str(p.relative_to(ROOT))
for p in models_dir.glob(f"{name}.*")
if p.suffix.lower() in lc.MODEL_EXTENSIONS
)
return ComponentInfo(
name=name,
category=category,
symbol_path=str(symbol_path.relative_to(ROOT)),
sym_nickname=lc.sym_nickname(symbol_path),
footprint_path=footprint_path,
fp_nickname=fp_nickname,
footprint_files=footprint_files,
model_paths=model_paths,
)
def _resolve(path: str | Path | None) -> Path | None:
if path is None:
return None
return Path(path).expanduser().resolve()
def _regenerate_tables() -> None:
lc.write_sym_lib_table(ROOT)
lc.write_fp_lib_table(ROOT)
lc.write_global_tables(ROOT)
def _import(
name: str,
symbol: str | Path,
footprint: str | Path | None,
model: str | Path | None,
category: str | None,
update: bool,
action: str,
) -> ComponentResult:
name = name.strip()
if not name:
raise MikilabError("name must not be empty")
symbol_path = _resolve(symbol)
footprint_path = _resolve(footprint)
model_path = _resolve(model)
for label, p in (("symbol", symbol_path), ("footprint", footprint_path), ("model", model_path)):
if p is not None and not p.is_file():
raise MikilabError(f"{label} does not exist or is not a file: {p}")
if model_path is not None and footprint_path is None:
raise MikilabError("model requires footprint (a 3D model needs a footprint to attach to)")
resolved_category = category or lc.classify(name)
if resolved_category not in lc.CATEGORIES:
raise MikilabError(
f"category '{resolved_category}' is not one of the known categories: "
+ ", ".join(lc.CATEGORIES)
)
manifest_rows: list[list[str]] = []
report: list[str] = []
try:
sym_dst = ic.import_symbol(name, resolved_category, symbol_path, manifest_rows, report, update=update)
except ic.ImportError_ as e:
lc.append_manifest_rows(ROOT, [["symbol", str(symbol_path), "", "ERROR", "", str(e)]])
raise MikilabError(str(e)) from e
fp_dst = None
fp_status = None
model_dst = None
if footprint_path is not None:
try:
fp_dst, fp_nick, fp_name, fp_status = ic.import_footprint(
name, resolved_category, footprint_path, manifest_rows, report, update=update
)
except ic.ImportError_ as e:
lc.append_manifest_rows(ROOT, manifest_rows + [["footprint", str(footprint_path), "", "ERROR", "", str(e)]])
raise MikilabError(str(e)) from e
if model_path is not None:
model_target = fp_dst if fp_dst is not None else None
ic.import_model(name, resolved_category, model_path, model_target, manifest_rows, report)
model_dst = ROOT / "3dmodels" / resolved_category / f"{name}{model_path.suffix.lower()}"
text = sym_dst.read_text(encoding="utf-8")
new_ref = f"{fp_nick}:{fp_name}"
new_text, changed = lc.set_symbol_footprint_property(text, new_ref)
if changed:
sym_dst.write_text(new_text, encoding="utf-8")
report.append(f" Linked symbol Footprint property -> {new_ref}")
lc.append_manifest_rows(ROOT, manifest_rows)
_regenerate_tables()
return ComponentResult(
name=name,
category=resolved_category,
action=action,
symbol_path=str(sym_dst.relative_to(ROOT)),
footprint_path=str(fp_dst.relative_to(ROOT)) if fp_dst is not None else None,
footprint_status=fp_status,
model_path=str(model_dst.relative_to(ROOT)) if model_dst is not None else None,
messages=report,
)
def add_component(
name: str,
symbol: str | Path,
footprint: str | Path | None = None,
model: str | Path | None = None,
category: str | None = None,
) -> ComponentResult:
"""Add a new component. Raises MikilabError if a component with this
name already exists -- use update_component() to replace it in
place instead."""
return _import(name, symbol, footprint, model, category, update=False, action="add")
def update_component(
name: str,
symbol: str | Path,
footprint: str | Path | None = None,
model: str | Path | None = None,
category: str | None = None,
) -> ComponentResult:
"""Replace an existing component's symbol/footprint in place (upsert:
if no component with this name exists yet, it is created, same as
add_component()). `category` should normally match the component's
current category -- this does not move files between category
directories; use remove_component() + add_component() to
recategorize."""
return _import(name, symbol, footprint, model, category, update=True, action="update")
def remove_component(name: str) -> ComponentResult:
"""Remove a component: its symbol, its footprint library (if any),
and its 3D model(s) (if any). Raises MikilabError if no component
with this name exists."""
name = name.strip()
if not name:
raise MikilabError("name must not be empty")
manifest_rows: list[list[str]] = []
report: list[str] = []
try:
ic.remove_component(name, manifest_rows, report)
except ic.ImportError_ as e:
raise MikilabError(str(e)) from e
category = next(
(row[5].split("category=", 1)[1] for row in manifest_rows if row[0] == "symbol" and "category=" in row[5]),
"",
)
lc.append_manifest_rows(ROOT, manifest_rows)
_regenerate_tables()
return ComponentResult(name=name, category=category, action="remove", messages=report)
def get_component(name: str) -> ComponentInfo | None:
"""Look up a component by exact name. Returns None if not found."""
path = lc.find_symbol_by_name(ROOT, name.strip())
if path is None:
return None
return _component_info(path)
def list_components(category: str | None = None) -> list[ComponentInfo]:
"""List every symbol library file under symbols/ (optionally filtered
to one category). See ComponentInfo's docstring for what "one entry"
means for multi-symbol category libraries."""
if category is not None and category not in lc.CATEGORIES:
raise MikilabError(
f"category '{category}' is not one of the known categories: " + ", ".join(lc.CATEGORIES)
)
entries = [_component_info(p) for p in lc.discover_symbol_libraries(ROOT)]
if category is not None:
entries = [e for e in entries if e.category == category]
return entries
def find_components(query: str, category: str | None = None) -> list[ComponentInfo]:
"""Case-insensitive substring search over component names, optionally
restricted to one category."""
q = query.strip().lower()
return [e for e in list_components(category) if q in e.name.lower()]
+4
View File
@@ -197,6 +197,7 @@
(lib (name "MIKILAB_MCU_WCH_CH32V3")(type "KiCad")(uri "${KIPRJMOD}/symbols/microcontrollers/MCU_WCH_CH32V3.kicad_sym")(options "")(descr "MCU_WCH_CH32V3")) (lib (name "MIKILAB_MCU_WCH_CH32V3")(type "KiCad")(uri "${KIPRJMOD}/symbols/microcontrollers/MCU_WCH_CH32V3.kicad_sym")(options "")(descr "MCU_WCH_CH32V3"))
(lib (name "MIKILAB_25AA1024")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/25AA1024.kicad_sym")(options "")(descr "25AA1024")) (lib (name "MIKILAB_25AA1024")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/25AA1024.kicad_sym")(options "")(descr "25AA1024"))
(lib (name "MIKILAB_74xGxx")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/74xGxx.kicad_sym")(options "")(descr "74xGxx")) (lib (name "MIKILAB_74xGxx")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/74xGxx.kicad_sym")(options "")(descr "74xGxx"))
(lib (name "MIKILAB_ADG936BCPZ")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/ADG936BCPZ.kicad_sym")(options "")(descr "ADG936BCPZ"))
(lib (name "MIKILAB_ADG936BRUZ")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/ADG936BRUZ.kicad_sym")(options "")(descr "ADG936BRUZ")) (lib (name "MIKILAB_ADG936BRUZ")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/ADG936BRUZ.kicad_sym")(options "")(descr "ADG936BRUZ"))
(lib (name "MIKILAB_Amplifier_Current")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Amplifier_Current.kicad_sym")(options "")(descr "Amplifier_Current")) (lib (name "MIKILAB_Amplifier_Current")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Amplifier_Current.kicad_sym")(options "")(descr "Amplifier_Current"))
(lib (name "MIKILAB_Amplifier_Difference")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Amplifier_Difference.kicad_sym")(options "")(descr "Amplifier_Difference")) (lib (name "MIKILAB_Amplifier_Difference")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Amplifier_Difference.kicad_sym")(options "")(descr "Amplifier_Difference"))
@@ -215,6 +216,7 @@
(lib (name "MIKILAB_Isolator")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Isolator.kicad_sym")(options "")(descr "Isolator")) (lib (name "MIKILAB_Isolator")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Isolator.kicad_sym")(options "")(descr "Isolator"))
(lib (name "MIKILAB_LED")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/LED.kicad_sym")(options "")(descr "LED")) (lib (name "MIKILAB_LED")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/LED.kicad_sym")(options "")(descr "LED"))
(lib (name "MIKILAB_Motor")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Motor.kicad_sym")(options "")(descr "Motor")) (lib (name "MIKILAB_Motor")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Motor.kicad_sym")(options "")(descr "Motor"))
(lib (name "MIKILAB_OSD32MP157F_1G_BAA")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/OSD32MP157F-1G-BAA.kicad_sym")(options "")(descr "OSD32MP157F-1G-BAA"))
(lib (name "MIKILAB_Oscillator")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Oscillator.kicad_sym")(options "")(descr "Oscillator")) (lib (name "MIKILAB_Oscillator")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Oscillator.kicad_sym")(options "")(descr "Oscillator"))
(lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/PESD5V0L4UW.kicad_sym")(options "")(descr "PESD5V0L4UW")) (lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/PESD5V0L4UW.kicad_sym")(options "")(descr "PESD5V0L4UW"))
(lib (name "MIKILAB_Potentiometer_Digital")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Potentiometer_Digital.kicad_sym")(options "")(descr "Potentiometer_Digital")) (lib (name "MIKILAB_Potentiometer_Digital")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Potentiometer_Digital.kicad_sym")(options "")(descr "Potentiometer_Digital"))
@@ -224,6 +226,7 @@
(lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/SN74AXC1T45DBVR.kicad_sym")(options "")(descr "SN74AXC1T45DBVR")) (lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/SN74AXC1T45DBVR.kicad_sym")(options "")(descr "SN74AXC1T45DBVR"))
(lib (name "MIKILAB_Security")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Security.kicad_sym")(options "")(descr "Security")) (lib (name "MIKILAB_Security")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Security.kicad_sym")(options "")(descr "Security"))
(lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/TPD2E007DCKR.kicad_sym")(options "")(descr "TPD2E007DCKR")) (lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/TPD2E007DCKR.kicad_sym")(options "")(descr "TPD2E007DCKR"))
(lib (name "MIKILAB_TPS22965DSGR")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/TPS22965DSGR.kicad_sym")(options "")(descr "TPS22965DSGR"))
(lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/TPS22994RUKT.kicad_sym")(options "")(descr "TPS22994RUKT")) (lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/TPS22994RUKT.kicad_sym")(options "")(descr "TPS22994RUKT"))
(lib (name "MIKILAB_TPS63020DSJT")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/TPS63020DSJT.kicad_sym")(options "")(descr "TPS63020DSJT")) (lib (name "MIKILAB_TPS63020DSJT")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/TPS63020DSJT.kicad_sym")(options "")(descr "TPS63020DSJT"))
(lib (name "MIKILAB_Transformer")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Transformer.kicad_sym")(options "")(descr "Transformer")) (lib (name "MIKILAB_Transformer")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Transformer.kicad_sym")(options "")(descr "Transformer"))
@@ -232,6 +235,7 @@
(lib (name "MIKILAB_Video")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Video.kicad_sym")(options "")(descr "Video")) (lib (name "MIKILAB_Video")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/Video.kicad_sym")(options "")(descr "Video"))
(lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/XTAC5212IRGER.kicad_sym")(options "")(descr "XTAC5212IRGER")) (lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/XTAC5212IRGER.kicad_sym")(options "")(descr "XTAC5212IRGER"))
(lib (name "MIKILAB_ti")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/ti.kicad_sym")(options "")(descr "ti")) (lib (name "MIKILAB_ti")(type "KiCad")(uri "${KIPRJMOD}/symbols/other/ti.kicad_sym")(options "")(descr "ti"))
(lib (name "MIKILAB_AXP2101")(type "KiCad")(uri "${KIPRJMOD}/symbols/power/AXP2101.kicad_sym")(options "")(descr "AXP2101"))
(lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${KIPRJMOD}/symbols/power/BQ25896RTWT.kicad_sym")(options "")(descr "BQ25896RTWT")) (lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${KIPRJMOD}/symbols/power/BQ25896RTWT.kicad_sym")(options "")(descr "BQ25896RTWT"))
(lib (name "MIKILAB_Battery_Management")(type "KiCad")(uri "${KIPRJMOD}/symbols/power/Battery_Management.kicad_sym")(options "")(descr "Battery_Management")) (lib (name "MIKILAB_Battery_Management")(type "KiCad")(uri "${KIPRJMOD}/symbols/power/Battery_Management.kicad_sym")(options "")(descr "Battery_Management"))
(lib (name "MIKILAB_Converter_ACDC")(type "KiCad")(uri "${KIPRJMOD}/symbols/power/Converter_ACDC.kicad_sym")(options "")(descr "Converter_ACDC")) (lib (name "MIKILAB_Converter_ACDC")(type "KiCad")(uri "${KIPRJMOD}/symbols/power/Converter_ACDC.kicad_sym")(options "")(descr "Converter_ACDC"))
+3
View File
@@ -215,6 +215,7 @@
(lib (name "MIKILAB_Isolator")(type "KiCad")(uri "${MIKILAB}/symbols/other/Isolator.kicad_sym")(options "")(descr "Isolator")) (lib (name "MIKILAB_Isolator")(type "KiCad")(uri "${MIKILAB}/symbols/other/Isolator.kicad_sym")(options "")(descr "Isolator"))
(lib (name "MIKILAB_LED")(type "KiCad")(uri "${MIKILAB}/symbols/other/LED.kicad_sym")(options "")(descr "LED")) (lib (name "MIKILAB_LED")(type "KiCad")(uri "${MIKILAB}/symbols/other/LED.kicad_sym")(options "")(descr "LED"))
(lib (name "MIKILAB_Motor")(type "KiCad")(uri "${MIKILAB}/symbols/other/Motor.kicad_sym")(options "")(descr "Motor")) (lib (name "MIKILAB_Motor")(type "KiCad")(uri "${MIKILAB}/symbols/other/Motor.kicad_sym")(options "")(descr "Motor"))
(lib (name "MIKILAB_OSD32MP157F_1G_BAA")(type "KiCad")(uri "${MIKILAB}/symbols/other/OSD32MP157F-1G-BAA.kicad_sym")(options "")(descr "OSD32MP157F-1G-BAA"))
(lib (name "MIKILAB_Oscillator")(type "KiCad")(uri "${MIKILAB}/symbols/other/Oscillator.kicad_sym")(options "")(descr "Oscillator")) (lib (name "MIKILAB_Oscillator")(type "KiCad")(uri "${MIKILAB}/symbols/other/Oscillator.kicad_sym")(options "")(descr "Oscillator"))
(lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${MIKILAB}/symbols/other/PESD5V0L4UW.kicad_sym")(options "")(descr "PESD5V0L4UW")) (lib (name "MIKILAB_PESD5V0L4UW")(type "KiCad")(uri "${MIKILAB}/symbols/other/PESD5V0L4UW.kicad_sym")(options "")(descr "PESD5V0L4UW"))
(lib (name "MIKILAB_Potentiometer_Digital")(type "KiCad")(uri "${MIKILAB}/symbols/other/Potentiometer_Digital.kicad_sym")(options "")(descr "Potentiometer_Digital")) (lib (name "MIKILAB_Potentiometer_Digital")(type "KiCad")(uri "${MIKILAB}/symbols/other/Potentiometer_Digital.kicad_sym")(options "")(descr "Potentiometer_Digital"))
@@ -224,6 +225,7 @@
(lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${MIKILAB}/symbols/other/SN74AXC1T45DBVR.kicad_sym")(options "")(descr "SN74AXC1T45DBVR")) (lib (name "MIKILAB_SN74AXC1T45DBVR")(type "KiCad")(uri "${MIKILAB}/symbols/other/SN74AXC1T45DBVR.kicad_sym")(options "")(descr "SN74AXC1T45DBVR"))
(lib (name "MIKILAB_Security")(type "KiCad")(uri "${MIKILAB}/symbols/other/Security.kicad_sym")(options "")(descr "Security")) (lib (name "MIKILAB_Security")(type "KiCad")(uri "${MIKILAB}/symbols/other/Security.kicad_sym")(options "")(descr "Security"))
(lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${MIKILAB}/symbols/other/TPD2E007DCKR.kicad_sym")(options "")(descr "TPD2E007DCKR")) (lib (name "MIKILAB_TPD2E007DCKR")(type "KiCad")(uri "${MIKILAB}/symbols/other/TPD2E007DCKR.kicad_sym")(options "")(descr "TPD2E007DCKR"))
(lib (name "MIKILAB_TPS22965DSGR")(type "KiCad")(uri "${MIKILAB}/symbols/other/TPS22965DSGR.kicad_sym")(options "")(descr "TPS22965DSGR"))
(lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${MIKILAB}/symbols/other/TPS22994RUKT.kicad_sym")(options "")(descr "TPS22994RUKT")) (lib (name "MIKILAB_TPS22994RUKT")(type "KiCad")(uri "${MIKILAB}/symbols/other/TPS22994RUKT.kicad_sym")(options "")(descr "TPS22994RUKT"))
(lib (name "MIKILAB_TPS63020DSJT")(type "KiCad")(uri "${MIKILAB}/symbols/other/TPS63020DSJT.kicad_sym")(options "")(descr "TPS63020DSJT")) (lib (name "MIKILAB_TPS63020DSJT")(type "KiCad")(uri "${MIKILAB}/symbols/other/TPS63020DSJT.kicad_sym")(options "")(descr "TPS63020DSJT"))
(lib (name "MIKILAB_Transformer")(type "KiCad")(uri "${MIKILAB}/symbols/other/Transformer.kicad_sym")(options "")(descr "Transformer")) (lib (name "MIKILAB_Transformer")(type "KiCad")(uri "${MIKILAB}/symbols/other/Transformer.kicad_sym")(options "")(descr "Transformer"))
@@ -232,6 +234,7 @@
(lib (name "MIKILAB_Video")(type "KiCad")(uri "${MIKILAB}/symbols/other/Video.kicad_sym")(options "")(descr "Video")) (lib (name "MIKILAB_Video")(type "KiCad")(uri "${MIKILAB}/symbols/other/Video.kicad_sym")(options "")(descr "Video"))
(lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${MIKILAB}/symbols/other/XTAC5212IRGER.kicad_sym")(options "")(descr "XTAC5212IRGER")) (lib (name "MIKILAB_XTAC5212IRGER")(type "KiCad")(uri "${MIKILAB}/symbols/other/XTAC5212IRGER.kicad_sym")(options "")(descr "XTAC5212IRGER"))
(lib (name "MIKILAB_ti")(type "KiCad")(uri "${MIKILAB}/symbols/other/ti.kicad_sym")(options "")(descr "ti")) (lib (name "MIKILAB_ti")(type "KiCad")(uri "${MIKILAB}/symbols/other/ti.kicad_sym")(options "")(descr "ti"))
(lib (name "MIKILAB_AXP2101")(type "KiCad")(uri "${MIKILAB}/symbols/power/AXP2101.kicad_sym")(options "")(descr "AXP2101"))
(lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${MIKILAB}/symbols/power/BQ25896RTWT.kicad_sym")(options "")(descr "BQ25896RTWT")) (lib (name "MIKILAB_BQ25896RTWT")(type "KiCad")(uri "${MIKILAB}/symbols/power/BQ25896RTWT.kicad_sym")(options "")(descr "BQ25896RTWT"))
(lib (name "MIKILAB_Battery_Management")(type "KiCad")(uri "${MIKILAB}/symbols/power/Battery_Management.kicad_sym")(options "")(descr "Battery_Management")) (lib (name "MIKILAB_Battery_Management")(type "KiCad")(uri "${MIKILAB}/symbols/power/Battery_Management.kicad_sym")(options "")(descr "Battery_Management"))
(lib (name "MIKILAB_Converter_ACDC")(type "KiCad")(uri "${MIKILAB}/symbols/power/Converter_ACDC.kicad_sym")(options "")(descr "Converter_ACDC")) (lib (name "MIKILAB_Converter_ACDC")(type "KiCad")(uri "${MIKILAB}/symbols/power/Converter_ACDC.kicad_sym")(options "")(descr "Converter_ACDC"))
+144
View File
@@ -0,0 +1,144 @@
(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
(symbol "ADG936BCPZ" (pin_names (offset 0.254)) (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at 30.48 10.16 0)
(effects (font (size 1.524 1.524)))
)
(property "Value" "ADG936BCPZ" (id 1) (at 30.48 7.62 0)
(effects (font (size 1.524 1.524)))
)
(property "Footprint" "MIKILAB_ADG936BCPZ:CP_20_1_ADI" (id 2) (at 0 0 0)
(effects (font (size 1.27 1.27) italic) hide)
)
(property "Datasheet" "https://www.analog.com/media/en/technical-documentation/data-sheets/ADG936_936R.pdf" (id 3) (at 0 0 0)
(effects (font (size 1.27 1.27) italic) hide)
)
(property "ki_keywords" "ADG936BCPZ" (id 4) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_locked" "" (id 5) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "ki_fp_filters" "CP_20_1_ADI CP_20_1_ADI-M CP_20_1_ADI-L" (id 6) (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "ADG936BCPZ_0_1"
(polyline
(pts
(xy 7.62 5.08)
(xy 7.62 -30.48)
)
(stroke (width 0.127) (type default) (color 0 0 0 0))
(fill (type none))
)
(polyline
(pts
(xy 7.62 -30.48)
(xy 53.34 -30.48)
)
(stroke (width 0.127) (type default) (color 0 0 0 0))
(fill (type none))
)
(polyline
(pts
(xy 53.34 -30.48)
(xy 53.34 5.08)
)
(stroke (width 0.127) (type default) (color 0 0 0 0))
(fill (type none))
)
(polyline
(pts
(xy 53.34 5.08)
(xy 7.62 5.08)
)
(stroke (width 0.127) (type default) (color 0 0 0 0))
(fill (type none))
)
(pin unspecified line (at 0 0 0) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -2.54 0) (length 7.62)
(name "RF1A" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -5.08 0) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -7.62 0) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -10.16 0) (length 7.62)
(name "RF1B" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -12.7 0) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -15.24 0) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "7" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -17.78 0) (length 7.62)
(name "RFCB" (effects (font (size 1.27 1.27))))
(number "8" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -20.32 0) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "9" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 0 -22.86 0) (length 7.62)
(name "INB" (effects (font (size 1.27 1.27))))
(number "10" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -25.4 180) (length 7.62)
(name "RF2B" (effects (font (size 1.27 1.27))))
(number "11" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -22.86 180) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "12" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -20.32 180) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "13" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -17.78 180) (length 7.62)
(name "RF2A" (effects (font (size 1.27 1.27))))
(number "14" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -15.24 180) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "15" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -12.7 180) (length 7.62)
(name "INA" (effects (font (size 1.27 1.27))))
(number "16" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -10.16 180) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "17" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -7.62 180) (length 7.62)
(name "RFCA" (effects (font (size 1.27 1.27))))
(number "18" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 60.96 -5.08 180) (length 7.62)
(name "VDD" (effects (font (size 1.27 1.27))))
(number "19" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 -2.54 180) (length 7.62)
(name "GND" (effects (font (size 1.27 1.27))))
(number "20" (effects (font (size 1.27 1.27))))
)
(pin unspecified line (at 60.96 0 180) (length 7.62)
(name "EP" (effects (font (size 1.27 1.27))))
(number "21" (effects (font (size 1.27 1.27))))
)
)
)
)
File diff suppressed because it is too large Load Diff
+131
View File
@@ -0,0 +1,131 @@
(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
(symbol "TPS22965DSGR" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at -12.7 11.16 0.0)
(effects (font (size 1.27 1.27)) (justify bottom left))
)
(property "Value" "TPS22965DSGR" (id 1) (at -12.7 -14.16 0.0)
(effects (font (size 1.27 1.27)) (justify bottom left))
)
(property "Footprint" "MIKILAB_TPS22965DSGR:SON50P200X200X80-9N" (id 2) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MF" "Texas Instruments" (id 4) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Description" "\n \n 5.7-V, 6-A, 16-mΩ load switch with adj. rise time and optional output discharge\n \n" (id 5) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Package" "WSON-8 Texas Instruments" (id 6) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Price" "None" (id 7) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "SnapEDA_Link" "https://www.snapeda.com/parts/TPS22965DSGR/Texas+Instruments/view-part/?ref=snap" (id 8) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "MP" "TPS22965DSGR" (id 9) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Availability" "In Stock" (id 10) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(property "Check_prices" "https://www.snapeda.com/parts/TPS22965DSGR/Texas+Instruments/view-part/?ref=eda" (id 11) (at 0 0 0)
(effects (font (size 1.27 1.27)) (justify bottom) hide)
)
(symbol "TPS22965DSGR_0_0"
(rectangle (start -12.7 -10.16) (end 12.7 10.16)
(stroke (width 0.41)) (fill (type background))
)
(pin input line (at -17.78 2.54 0) (length 5.08)
(name "ON"
(effects (font (size 1.016 1.016)))
)
(number "3"
(effects (font (size 1.016 1.016)))
)
)
(pin input line (at -17.78 0.0 0) (length 5.08)
(name "VIN"
(effects (font (size 1.016 1.016)))
)
(number "1"
(effects (font (size 1.016 1.016)))
)
)
(pin input line (at -17.78 0.0 0) (length 5.08) hide
(name "VIN"
(effects (font (size 1.016 1.016)))
)
(number "2"
(effects (font (size 1.016 1.016)))
)
)
(pin power_in line (at 17.78 7.62 180.0) (length 5.08)
(name "VBIAS"
(effects (font (size 1.016 1.016)))
)
(number "4"
(effects (font (size 1.016 1.016)))
)
)
(pin output line (at 17.78 2.54 180.0) (length 5.08)
(name "CT"
(effects (font (size 1.016 1.016)))
)
(number "6"
(effects (font (size 1.016 1.016)))
)
)
(pin output line (at 17.78 0.0 180.0) (length 5.08)
(name "VOUT"
(effects (font (size 1.016 1.016)))
)
(number "7"
(effects (font (size 1.016 1.016)))
)
)
(pin output line (at 17.78 0.0 180.0) (length 5.08) hide
(name "VOUT"
(effects (font (size 1.016 1.016)))
)
(number "8"
(effects (font (size 1.016 1.016)))
)
)
(pin power_in line (at 17.78 -5.08 180.0) (length 5.08)
(name "GND"
(effects (font (size 1.016 1.016)))
)
(number "5"
(effects (font (size 1.016 1.016)))
)
)
(pin power_in line (at 17.78 -5.08 180.0) (length 5.08) hide
(name "GND"
(effects (font (size 1.016 1.016)))
)
(number "9"
(effects (font (size 1.016 1.016)))
)
)
(pin power_in line (at 17.78 -5.08 180.0) (length 5.08) hide
(name "GND"
(effects (font (size 1.016 1.016)))
)
(number "9_1"
(effects (font (size 1.016 1.016)))
)
)
(pin power_in line (at 17.78 -5.08 180.0) (length 5.08) hide
(name "GND"
(effects (font (size 1.016 1.016)))
)
(number "9_2"
(effects (font (size 1.016 1.016)))
)
)
)
)
)
+325
View File
@@ -0,0 +1,325 @@
(kicad_symbol_lib
(version 20211014)
(generator "https://github.com/uPesy/easyeda2kicad.py")
(symbol "AXP2101"
(in_bom yes)
(on_board yes)
(property
"Reference"
"U"
(id 0)
(at 0 33.02 0)
(effects (font (size 1.27 1.27) ) )
)
(property
"Value"
"AXP2101"
(id 1)
(at 0 -30.48 0)
(effects (font (size 1.27 1.27) ) )
)
(property
"Footprint"
"MIKILAB_AXP2101:QFN-40_L5.0-W5.0-P0.40-TL-EP3.4"
(id 2)
(at 0 -33.02 0)
(effects (font (size 1.27 1.27) ) hide)
)
(property
"Datasheet"
"https://www.lcsc.com/datasheet/C3036461.pdf"
(id 3)
(at 0 -35.56 0)
(effects (font (size 1.27 1.27) ) hide)
)
(property
"Manufacturer"
"x-powers(芯智汇)"
(id 4)
(at 0 -38.10 0)
(effects (font (size 1.27 1.27) ) hide)
)
(property
"MPN"
"AXP2101"
(id 5)
(at 0 -40.64 0)
(effects (font (size 1.27 1.27) ) hide)
)
(property
"LCSC Part"
"C3036461"
(id 6)
(at 0 -43.18 0)
(effects (font (size 1.27 1.27) ) hide)
)
(property
"ki_keywords"
"Microcontroller Units (MCUs/MPUs/SOCs)"
(id 8)
(at 0 -45.72 0)
(effects (font (size 1.27 1.27) ) hide)
)
(symbol "AXP2101_0_1"
(rectangle
(start -26.67 25.40)
(end 26.67 -27.94)
(stroke (width 0) (type default))
(fill (type background))
)
(circle
(center -25.40 24.13)
(radius 0.38)
(stroke (width 0) (type default))
(fill (type none))
)
(pin unspecified line
(at -29.21 22.86 0)
(length 2.54)
(name "CHGLED" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 20.32 0)
(length 2.54)
(name "VREF" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 17.78 0)
(length 2.54)
(name "GND" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 15.24 0)
(length 2.54)
(name "FB3" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 12.70 0)
(length 2.54)
(name "LX3" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 10.16 0)
(length 2.54)
(name "VIN3" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 7.62 0)
(length 2.54)
(name "VIN4" (effects (font (size 1.27 1.27))))
(number "7" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 5.08 0)
(length 2.54)
(name "LX4" (effects (font (size 1.27 1.27))))
(number "8" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 2.54 0)
(length 2.54)
(name "FB4" (effects (font (size 1.27 1.27))))
(number "9" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -0.00 0)
(length 2.54)
(name "CPULDOS" (effects (font (size 1.27 1.27))))
(number "10" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -2.54 0)
(length 2.54)
(name "DLDO2/DC4SW" (effects (font (size 1.27 1.27))))
(number "11" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -5.08 0)
(length 2.54)
(name "BLDO1" (effects (font (size 1.27 1.27))))
(number "12" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -7.62 0)
(length 2.54)
(name "BLDOIN" (effects (font (size 1.27 1.27))))
(number "13" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -10.16 0)
(length 2.54)
(name "BLDO2" (effects (font (size 1.27 1.27))))
(number "14" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -12.70 0)
(length 2.54)
(name "ALDO4" (effects (font (size 1.27 1.27))))
(number "15" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -15.24 0)
(length 2.54)
(name "ALDO3" (effects (font (size 1.27 1.27))))
(number "16" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -17.78 0)
(length 2.54)
(name "ALDOIN" (effects (font (size 1.27 1.27))))
(number "17" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -20.32 0)
(length 2.54)
(name "ALDO1" (effects (font (size 1.27 1.27))))
(number "18" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -22.86 0)
(length 2.54)
(name "ALDO2" (effects (font (size 1.27 1.27))))
(number "19" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at -29.21 -25.40 0)
(length 2.54)
(name "DLDO1/DC1SW" (effects (font (size 1.27 1.27))))
(number "20" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -25.40 180)
(length 2.54)
(name "FB1" (effects (font (size 1.27 1.27))))
(number "21" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -22.86 180)
(length 2.54)
(name "LX1" (effects (font (size 1.27 1.27))))
(number "22" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -20.32 180)
(length 2.54)
(name "VIN1" (effects (font (size 1.27 1.27))))
(number "23" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -17.78 180)
(length 2.54)
(name "VIN2" (effects (font (size 1.27 1.27))))
(number "24" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -15.24 180)
(length 2.54)
(name "LX2" (effects (font (size 1.27 1.27))))
(number "25" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -12.70 180)
(length 2.54)
(name "FB2" (effects (font (size 1.27 1.27))))
(number "26" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -10.16 180)
(length 2.54)
(name "VBACKUP" (effects (font (size 1.27 1.27))))
(number "27" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -7.62 180)
(length 2.54)
(name "VRTC" (effects (font (size 1.27 1.27))))
(number "28" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -5.08 180)
(length 2.54)
(name "PWROK" (effects (font (size 1.27 1.27))))
(number "29" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -2.54 180)
(length 2.54)
(name "PWRON" (effects (font (size 1.27 1.27))))
(number "30" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 -0.00 180)
(length 2.54)
(name "TS" (effects (font (size 1.27 1.27))))
(number "31" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 2.54 180)
(length 2.54)
(name "GPIO1/FB5/RTC/LDO2" (effects (font (size 1.27 1.27))))
(number "32" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 5.08 180)
(length 2.54)
(name "BAT" (effects (font (size 1.27 1.27))))
(number "33" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 7.62 180)
(length 2.54)
(name "VSYS" (effects (font (size 1.27 1.27))))
(number "34" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 10.16 180)
(length 2.54)
(name "SW" (effects (font (size 1.27 1.27))))
(number "35" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 12.70 180)
(length 2.54)
(name "VMID" (effects (font (size 1.27 1.27))))
(number "36" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 15.24 180)
(length 2.54)
(name "VBUS" (effects (font (size 1.27 1.27))))
(number "37" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 17.78 180)
(length 2.54)
(name "IRQ" (effects (font (size 1.27 1.27))))
(number "38" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 20.32 180)
(length 2.54)
(name "SDA" (effects (font (size 1.27 1.27))))
(number "39" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 29.21 22.86 180)
(length 2.54)
(name "SCK" (effects (font (size 1.27 1.27))))
(number "40" (effects (font (size 1.27 1.27))))
)
(pin unspecified line
(at 0.00 27.94 270)
(length 2.54)
(name "EP" (effects (font (size 1.27 1.27))))
(number "41" (effects (font (size 1.27 1.27))))
)
)
)
)