switch to KiCAD

This commit is contained in:
King Kévin 2022-06-23 12:51:28 +02:00
parent 71caf5f793
commit 9446c621ae
52 changed files with 1088 additions and 13658 deletions

View File

@ -1,19 +1,23 @@
this will describe how to generate the output file form the sources.
this will describe how to generate the output files form the sources.
requirements
============
to be able to generate the outputs you need following software:
to be able to generate the outputs, you need following software:
- rake: the central script taking care of generating the output files (Makefile is too cumbersome to parse files)
- [QEDA](http://qeda.org/): to generate footprints for the parts
- [Lepton EDA](https://github.com/lepton-eda/lepton-eda): for the schematic capture
- [pcb-rnd](http://repo.hu/projects/pcb-rnd/): for the board layout
the output generation is automatized.
- [KiCad](https://www.kicad.org/): EDA software used for schematic capture and board layout
- [PcbDraw](https://github.com/yaqwsx/PcbDraw): to generate board layout rendering
- [KiKit](https://github.com/yaqwsx/KiKit): to generate fabrications files (Gerber, Excellon)
- [KiAuto](https://github.com/INTI-CMNB/KiAuto): to generate schematic printout (PDF)
- [KiBoM](https://github.com/SchrodingersGat/KiBoM): to generate Bill of Material (CSV)
compiling
=========
to generate schematic, BoM, board render, and fabrication output, run `rake`.
library
-------
@ -38,18 +42,15 @@ to generate the parts:
rake library
~~~
this will use the parts definition (.yaml files) in the `library` to generate [gEDA gschem](http://wiki.geda-project.org/geda:gaf)/[Lepton EDA](https://github.com/lepton-eda/lepton-eda) symbols (.sym files) in the `geda/symbols` folder, and [coralEDA pcb-rnd](http://repo.hu/projects/pcb-rnd/) footprints (.lht files) in the `coraleda/subc` folder.
only the QEDA parts in subfolders within `library` come from the [QEDA library](https://doc.qeda.org/library/), but the files are included in this project for simplicity and archiving purposes.
all other parts are custom and written for this project.
this will use the parts definition (.yaml files) in the `library` to generate the symbols (.sym files) and footprints used by KiCAD in the `kicad` folder.
schematic
---------
the `.sch` file is the schematic source file.
it has been drawn using [Lepton EDA](https://github.com/lepton-eda/lepton-eda).
the `.kicad_sch` file is the schematic source file.
it has been drawn using the [KiCAD eeschema](https://www.kicad.org/) schematic editor.
it uses standard symbols, and the ones in the `geda/symbols/` folder.
it uses standard symbols, and the ones in the `kicad/` folder.
most symbols are generated by QEDA as described above.
to export as pdf:
@ -68,15 +69,25 @@ rake bom
board
-----
the `.lht` file is the board layout source file.
it has been drawn using [coralEDA pcb-rnd](http://repo.hu/projects/pcb-rnd/).
the `.kicad_brd` file is the board layout source file.
it has been drawn using the [KiCAD pcbnew](https://docs.kicad.org/6.0/en/pcbnew/pcbnew.html) PCB editor.
it uses the symbols from the `coraleda/subc/` folder.
it uses the footprints from the `kicad/` folder.
most symbols are generated by QEDA as described above.
`oshw_logo.lht` is just the Open Source Hardware Logo.
it been generated from https://oshwlogo.cuvoodoo.info/.
to export gerber files for PCB manufacturer (and photo preview + overview document):
~~~
rake fabrication
~~~
versioning
----------
the source schematic and board layout do not include version information.
when generating schematic or board fabrication output, a copy of the source files with date and version information is done as `.versioned.` files.
the date corresponds to the last changes (i.e. commit).
the version is formatted as `v.r hhhhhhh`:
- `v` corresponds to the major version information defined in `version`
- `r` corresponds to the total number of changes done to the source files
- `hhhhhhh` corresponds to the git hash of the commit used to generate the version information

6
JLCPCB_CORRECTION.csv Normal file
View File

@ -0,0 +1,6 @@
package,x,y,rot
LEDC2012X80N,0,0,-90
UC1608X55N,0,0,90
SOT95P237X112-3N,0,0,180
CONNECTOR_MY-1220-03,0,-1.1,0
CONNECTOR_XKB_U262-24XN-4BV64,0,-1.3,180
1 package x y rot
2 LEDC2012X80N 0 0 -90
3 UC1608X55N 0 0 90
4 SOT95P237X112-3N 0 0 180
5 CONNECTOR_MY-1220-03 0 -1.1 0
6 CONNECTOR_XKB_U262-24XN-4BV64 0 -1.3 180

69
Makefile Normal file
View File

@ -0,0 +1,69 @@
# project file name (use for schematic and board layout)
NAME ?= hdmi_firewall
# path to qeda
QEDA := qeda
# read project version
VERSION := $(shell cat version)
# current date for stamping output
DATE = $(shell date +%Y-%m-%d)
# revision based on number of changes on schematic or board layout and current git commit
REVISION := $(shell git log --pretty=oneline "${NAME}.kicad_sch" "${NAME}.kicad_pcb" | wc -l) $(shell git rev-parse --short HEAD)
# generate file with version information
VERSIONED_EXT = kicad_sch kicad_pcb kicad_pro json
define version_rule
%.versioned.$1: %.$1
cp $$< $$@
sed --in-place 's/\$$$$version\$$$$/${VERSION}/g' $$@
sed --in-place 's/\$$$$date\$$$$/${DATE}/g' $$@
sed --in-place 's/\$$$$revision\$$$$/${REVISION}/g' $$@
endef
$(foreach EXT,$(VERSIONED_EXT),$(eval $(call version_rule,$(EXT))))
all: ${NAME}.sch.pdf ${NAME}.brd-top.png ${NAME}.brd-bot.png ${NAME}.bom.csv
# generate fabrication files (gerbers/drill/BoM/PnP)
FABRICATION_DIR := fabrication
fabrication: ${NAME}.versioned.kicad_sch ${NAME}.versioned.kicad_pcb
kikit fab jlcpcb --drc --assembly --schematic $^ ${FABRICATION_DIR}
# generate symbols and footprints from parts
lib:
$(QEDA) generate qeda
# generate printable version (PDF) of schematic
%.sch.pdf: %.versioned.kicad_sch %.versioned.kicad_pro
eeschema_do export $< .
mv $*.versioned.pdf $@
# generate render from layout (top side)
%.brd-top.png: %.versioned.kicad_pcb
pcbdraw --silent $< --dpi 600 $@
# generate render from layout (bottom side)
%.brd-bot.png: %.versioned.kicad_pcb
pcbdraw --silent $< --dpi 600 --back $@
# export Bill of Material (as CSV)
%.bom.csv: %.versioned.kicad_sch %.versioned.kicad_pro
eeschema_do bom_xml $< .
kibom $*.versioned.xml $@
# generate panel
PANEL_DIR := panel
panel: panel.kicad_pcb
panel.kicad_pcb: ${NAME}.versioned.kicad_pcb ${NAME}.versioned.kicad_pro ${NAME}.versioned.kicad_sch ${NAME}.versioned.json
kikit panelize -p ${NAME}.versioned.json ${NAME}.versioned.kicad_pcb $@
pcbdraw --silent $@ --dpi 600 panel.brd-top.png
pcbdraw --silent $@ --dpi 600 --back panel.brd-bot.png
sed --in-place 's/\"missing_courtyard\": \"warning\"/\"missing_courtyard\": \"ignore\"/g' $(patsubst %.kicad_pcb,%.kicad_pro,$@) # the mouse bites don't have a courtyard
kikit fab jlcpcb --drc --assembly --missingError --schematic ${NAME}.versioned.kicad_sch $@ ${PANEL_DIR}
clean:
rm -f $(foreach EXT,$(VERSIONED_EXT),${NAME}.versioned.$(EXT))
rm -f ${NAME}.sch.pdf ${NAME}.brd-top.png ${NAME}.brd-bot.png ${NAME}.versioned.xml ${NAME}.bom.csv
rm -f ${NAME}.versioned.kicad_prl ${NAME}.versioned.kicad_pro-bak ${NAME}.versioned.xml ${NAME}.versioned.csv
rm -rf ${FABRICATION_DIR}
rm -f panel.kicad_pcb panel.kicad_pro
rm -rf ${PANEL_DIR}

181
Rakefile
View File

@ -1,181 +0,0 @@
# encoding: utf-8
# ruby: 2.1.0
=begin
Rakefile to manage hardware projects
uses Lepton EDA for schematic and pcb-rnd for board layouts.
Rakefile instead of Makefile for better text file parsing capabilities.
=end
require 'rake/clean'
require 'csv' # to export BOM and costs
# =================
# project variables
# =================
# common name used for file names
name = "hdmi_firewall"
# project version, read from "version" file
raise "define project version in 'version' file" unless File.exist? "version"
version = IO.read("version").split("\n")[0]
# current date for stamping output
date = Time.now.strftime("%Y-%m-%d")
# revision based on number of changes on schematic or board layout and current git commit
changes = `git log --pretty=oneline "#{name}.sch" "#{name}.lht" | wc -l`.chomp.to_i
commit = `git rev-parse --short HEAD`.chomp
revision = "#{changes} (#{commit})"
# path to qeda"
qeda = "qeda"
# ==========
# main tasks
# ==========
desc "main building task"
task :default => [:print, :fabrication, :bom, :pnp]
desc "print schematic and layout (as pdf)"
prints = [ "#{name}.sch.pdf", "#{name}.brd.pdf", "#{name}.brd-top.svg", "#{name}.brd-bottom.svg" ]
task :print => prints
CLEAN.include([ "#{name}.versioned.sch", "#{name}.versioned.lht" ])
CLOBBER.include(prints)
desc "generate fabrication gerbers (as archive)"
gerbers = [ "#{name}.brd.asb", "#{name}.brd.ast", "#{name}.brd.gbl", "#{name}.brd.gbo", "#{name}.brd.gbp", "#{name}.brd.gbs", "#{name}.brd.gko", "#{name}.brd.gtl", "#{name}.brd.gto", "#{name}.brd.gtp", "#{name}.brd.gts", "#{name}.brd.xln", "#{name}.brd.g2l", "#{name}.brd.g3l" ]
fab = [ "#{name}.brd.zip" ]
task :fabrication => fab
CLEAN.include(gerbers)
CLOBBER.include(fab)
desc "generate symbols and footprints from parts"
task :library do
sh "#{qeda} config output geda"
sh "#{qeda} generate ."
sh "#{qeda} config output coraleda"
sh "#{qeda} generate ."
end
desc "export BOMs from schematic"
boms = [ "#{name}.bom.csv" ]
task :bom => boms
CLOBBER.include(boms)
desc "export PnP placement"
pnps = [ "#{name}.cpl.csv" ]
task :pnp => pnps
CLOBBER.include(pnps)
# ===============
# file generation
# ===============
desc "generate schematic with version information all symbols embedded"
rule ".versioned.sch" => ".sch" do |t|
sh "cp #{t.source} #{t.name}"
sh "lepton-embed --embed #{t.name} 2> /dev/null"
sh "sed --in-place 's/\\$version\\$/#{version}/' #{t.name}"
sh "sed --in-place 's/\\$date\\$/#{date}/' #{t.name}"
sh "sed --in-place 's/\\$revision\\$/#{revision}/' #{t.name}"
end
desc "generate board layout with version information"
rule ".versioned.lht" => ".lht" do |t|
sh "cp #{t.source} #{t.name}"
sh "sed --in-place 's/\\$version\\$/#{version}/' #{t.name}"
sh "sed --in-place 's/\\$date\\$/#{date}/' #{t.name}"
sh "sed --in-place 's/\\$revision\\$/#{revision}/' #{t.name}"
end
desc "generate printable version (PDF) of schematic"
rule ".sch.pdf" => ".versioned.sch" do |t|
sh "lepton-cli export --color --paper=iso_a4 --layout=landscape --output=#{t.name} #{t.source} 2> /dev/null"
end
desc "generate printable version (PostScript) of board layout"
rule ".brd.ps" => ".versioned.lht" do |t|
sh "pcb-rnd -x ps --ps-color --media A4 --psfile #{t.name} #{t.source} 2> /dev/null"
end
desc "generate printable version (PDF) of board layout"
rule ".brd.pdf" => ".brd.ps" do |t|
sh "ps2pdf -sPAPERSIZE=a4 -dEPSCrop #{t.source} #{t.name}"
end
desc "generate photo realistic picture from layout (top side)"
rule ".brd-top.svg" => ".versioned.lht" do |t|
sh "pcb-rnd -x svg --photo-mode --outfile #{t.name} #{t.source} 1> /dev/null"
end
desc "generate photo realistic picture from layout (bottom side)"
rule ".brd-bottom.svg" => ".versioned.lht" do |t|
sh "pcb-rnd -x svg --photo-mode --flip --outfile #{t.name} #{t.source} 1> /dev/null"
end
desc "archive gerbers"
rule ".brd.zip" => ".versioned.lht" do |t|
base = File.basename(t.source, ".versioned.lht")
dir = "fabrication"
sh "mkdir #{dir}" unless File.directory?(dir)
sh "pcb-rnd -x cam gerber:JLC_PCB --outfile #{dir}/#{base}.brd #{t.source} 2> /dev/null"
sh "zip --quiet #{t.name} #{dir}/*"
end
desc "generate BOM file from schematic"
rule ".bom.csv" => ".sch" do |t|
attributes = ["device", "value", "description", "footprint", "manufacturer", "mpn", "datasheet", "lcsc", "digikey"]
bom_data = bom2(t.prerequisites[0], attributes)
CSV.open(t.name, "wb") do |csv|
all_attributes = ["refdes","qty"] + attributes
csv << all_attributes
bom_data.each do |line|
csv << all_attributes.collect{|attribute| line[attribute]}
end
end
end
desc "generate pick-and-place file from board"
rule ".cpl.csv" => [".versioned.lht", "mass_prop.sh", "pnp_fab.tab"] do |t|
sh "./mass_prop.sh #{t.prerequisites[0]} pnp_fab.tab" # add fab placement offsets
sh "pcb-rnd -x XY --xyfile #{t.name} --xy-unit mm --format 'JLCPCB' --vendor jlcpcb #{t.prerequisites[0]}" # export XY file in JLCPCB format
end
# ================
# helper functions
# ================
# generate gnetlist bom2 and parse them
# arguments: schematic=schematic to use, attributes=attributes to use for generating bom2
# returns an array of hash. key is the attribute name, value is the attribute value
def bom2(schematic, attributes)
to_return = []
# force attributes to be an array
attributes = case attributes
when String
[attributes]
when Array
attributes
else
[attributes.to_s]
end
# generate bom2
list = `lepton-netlist --backend bom2 --backend-option attribs=#{attributes*','} --quiet --output - #{schematic} 2> /dev/null`
list = list.each_line {|l| '"' + l + '"' + '\n' }
list.gsub!(/^(.+)/, '"\1')
list.gsub!(/(.+)$/, '\1"')
list.gsub!(/(?!http):(?!\/\/)/, '\1":"\2') # protect the values between ':' (such as URLs)
# parse bom2
csv = CSV.parse(list, col_sep: ":", quote_char: '"')
if csv.empty? then
$stderr.puts "no parts found for BOM"
return []
end
csv[1..-1].each do |row|
line = {}
row.each_index do |col|
line[csv[0][col]] = row[col] unless row[col] == "unknown"
end
to_return << line
end
return to_return
end

42
bom.ini Normal file
View File

@ -0,0 +1,42 @@
[BOM_OPTIONS]
ignore_dnf = 0
number_rows = 0
group_connectors = 1
test_regex = 0
merge_blank_fields = 1
output_file_name = %O%V
[IGNORE_COLUMNS]
; Any column heading that appears here will be excluded from the Generated BoM
; Titles are case-insensitive
Part
Part Lib
Footprint
Footprint Lib
Build Quantity
sheetpath
[COLUMN_ORDER]
; Columns will apear in the order they are listed here
; Titles are case-insensitive
References
Value
Quantity Per PCB
Description
Part
Part Lib
Footprint
Footprint Lib
Build Quantity
LCSC
Datasheet
[GROUP_FIELDS]
; List of fields used for sorting individual components into groups
; Components which match (comparing *all* fields) will be grouped together
; Field names are case-insensitive
Part
Part Lib
Value
Footprint
Footprint Lib

View File

@ -1,307 +0,0 @@
# subcircuit generated using QEDA
li:pcb-rnd-subcircuit-v6 {
ha:subc.1 {
uid = CAPC1608X92N............
ha:attributes {
footprint = CAPC1608X92N
}
ha:data {
li:padstack_prototypes {
ha:ps_proto_v6.2 {
htop = 0
hbottom = 0
hdia = 0
hplated = 0
li:shape {
ha:ps_shape_v4 {
clearance = 0.200mm
li:ps_poly {
-0.625mm
-0.550mm
0.625mm
-0.550mm
0.625mm
0.550mm
-0.625mm
0.550mm
}
ha:layer_mask {
top = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.675mm
-0.600mm
0.675mm
-0.600mm
0.675mm
0.600mm
-0.675mm
0.600mm
}
ha:layer_mask {
top = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.625mm
-0.550mm
0.625mm
-0.550mm
0.625mm
0.550mm
-0.625mm
0.550mm
}
ha:layer_mask {
top = 1
paste = 1
}
ha:combining {
auto = 1
}
}
}
}
}
li:objects {
ha:padstack_ref.23 {
proto = 2
rot = 0
x = 0.000mm
y = -0.750mm
ha:attributes {
term = 1
name = 1
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.24 {
proto = 2
rot = 0
x = 0.000mm
y = 0.750mm
ha:attributes {
term = 2
name = 2
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
}
li:layers {
ha:subc-aux {
lid = 0
ha:type {
top = 1
misc = 1
virtual = 1
}
li:objects {
ha:line.25 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = origin
}
x1 = 0.000mm
x2 = 0.000mm
y1 = 0.000mm
y2 = 0.000mm
}
ha:line.26 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = x
}
x1 = 0.000mm
x2 = 1.000mm
y1 = 0.000mm
y2 = 0.000mm
}
ha:line.27 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = y
}
x1 = 0.000mm
x2 = 0.000mm
y1 = 0.000mm
y2 = 1.000mm
}
ha:line.28 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = pnp-origin
}
x1 = 0.000mm
x2 = 0.000mm
y1 = 0.000mm
y2 = 0.000mm
}
}
}
ha:top-silkscreen {
lid = 1
ha:type {
top = 1
silk = 1
}
li:objects {
ha:text.29 {
x = 0.000mm
y = 0.000mm
rot = 0
scale = 100
string = %a.parent.refdes%
fid = 0
ha:flags {
floater = 1
dyntext = 1
}
}
ha:line.30 {
x1 = -0.925mm
y1 = -0.900mm
x2 = -0.925mm
y2 = 0.900mm
thickness = 0.200mm
clearance = 0
}
ha:line.31 {
x1 = 0.925mm
y1 = -0.900mm
x2 = 0.925mm
y2 = 0.900mm
thickness = 0.200mm
clearance = 0
}
}
}
ha:top-assembly {
lid = 2
ha:type {
top = 1
doc = 1
}
purpose = assy
li:objects {
ha:arc.32 {
x = 0.000mm
y = 0.000mm
width = 0.500mm
height = 0.500mm
thickness = 0.100mm
astart = 0
adelta = 360
clearance = 0
}
ha:line.33 {
x1 = -0.700mm
y1 = 0.000mm
x2 = 0.700mm
y2 = 0.000mm
thickness = 0.100mm
clearance = 0
}
ha:line.34 {
x1 = 0.000mm
y1 = -0.700mm
x2 = 0.000mm
y2 = 0.700mm
thickness = 0.100mm
clearance = 0
}
ha:text.35 {
x = 0.000mm
y = 0.000mm
rot = 90
scale = 53
string = CAPC1608X92N
fid = 0
ha:flags {
floater = 1
}
}
ha:line.36 {
x1 = -0.400mm
y1 = -0.800mm
x2 = 0.400mm
y2 = -0.800mm
thickness = 0.100mm
clearance = 0
}
ha:line.37 {
x1 = 0.400mm
y1 = -0.800mm
x2 = 0.400mm
y2 = 0.800mm
thickness = 0.100mm
clearance = 0
}
ha:line.38 {
x1 = 0.400mm
y1 = 0.800mm
x2 = -0.400mm
y2 = 0.800mm
thickness = 0.100mm
clearance = 0
}
ha:line.39 {
x1 = -0.400mm
y1 = 0.800mm
x2 = -0.400mm
y2 = -0.800mm
thickness = 0.100mm
clearance = 0
}
}
}
ha:top-courtyard {
lid = 3
ha:type {
top = 1
doc = 1
}
purpose = ko.courtyard
li:objects {
ha:polygon.40 {
li:geometry {
ta:contour {
{ -0.875mm; -1.550mm }
{ -0.875mm; -1.050mm }
{ -0.875mm; 1.050mm }
{ -0.875mm; 1.550mm }
{ 0.875mm; 1.550mm }
{ 0.875mm; 1.050mm }
{ 0.875mm; -1.050mm }
{ 0.875mm; -1.550mm }
}
}
}
}
}
}
}
}
}

View File

@ -1,873 +0,0 @@
# subcircuit generated using QEDA
li:pcb-rnd-subcircuit-v6 {
ha:subc.1 {
uid = CONNECTOR_HDMI-001S.....
ha:attributes {
footprint = CONNECTOR_HDMI-001S
}
ha:data {
li:padstack_prototypes {
ha:ps_proto_v6.2 {
htop = 0
hbottom = 0
hdia = 0
hplated = 0
li:shape {
ha:ps_shape_v4 {
clearance = 0.200mm
li:ps_poly {
-0.150mm
-1.300mm
0.150mm
-1.300mm
0.150mm
1.300mm
-0.150mm
1.300mm
}
ha:layer_mask {
top = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.200mm
-1.350mm
0.200mm
-1.350mm
0.200mm
1.350mm
-0.200mm
1.350mm
}
ha:layer_mask {
top = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.150mm
-1.300mm
0.150mm
-1.300mm
0.150mm
1.300mm
-0.150mm
1.300mm
}
ha:layer_mask {
top = 1
paste = 1
}
ha:combining {
auto = 1
}
}
}
}
ha:ps_proto_v6.3 {
htop = 0
hbottom = 0
hdia = 0
hplated = 1
li:shape {
ha:ps_shape_v4 {
clearance = 0
ha:ps_line {
x1 = 0.000mm
y1 = -0.350mm
x2 = 0.000mm
y2 = 0.350mm
thickness = 0.900mm
square = 0
}
ha:layer_mask {
mech = 1
}
ha:combining {
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0.200mm
ha:ps_line {
x1 = 0.000mm
y1 = -0.400mm
x2 = 0.000mm
y2 = 0.400mm
thickness = 1.500mm
square = 0
}
ha:layer_mask {
top = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
ha:ps_line {
x1 = 0.000mm
y1 = -0.400mm
x2 = 0.000mm
y2 = 0.400mm
thickness = 1.600mm
square = 0
}
ha:layer_mask {
top = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0.200mm
ha:ps_line {
x1 = 0.000mm
y1 = -0.400mm
x2 = 0.000mm
y2 = 0.400mm
thickness = 1.500mm
square = 0
}
ha:layer_mask {
intern = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0.200mm
ha:ps_line {
x1 = 0.000mm
y1 = -0.400mm
x2 = 0.000mm
y2 = 0.400mm
thickness = 1.500mm
square = 0
}
ha:layer_mask {
bottom = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
ha:ps_line {
x1 = 0.000mm
y1 = -0.400mm
x2 = 0.000mm
y2 = 0.400mm
thickness = 1.600mm
square = 0
}
ha:layer_mask {
bottom = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
}
}
ha:ps_proto_v6.4 {
htop = 0
hbottom = 0
hdia = 0
hplated = 1
li:shape {
ha:ps_shape_v4 {
clearance = 0
ha:ps_line {
x1 = 0.000mm
y1 = -0.900mm
x2 = 0.000mm
y2 = 0.900mm
thickness = 0.900mm
square = 0
}
ha:layer_mask {
mech = 1
}
ha:combining {
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0.200mm
ha:ps_line {
x1 = 0.000mm
y1 = -0.950mm
x2 = 0.000mm
y2 = 0.950mm
thickness = 1.500mm
square = 0
}
ha:layer_mask {
top = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
ha:ps_line {
x1 = 0.000mm
y1 = -0.950mm
x2 = 0.000mm
y2 = 0.950mm
thickness = 1.600mm
square = 0
}
ha:layer_mask {
top = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0.200mm
ha:ps_line {
x1 = 0.000mm
y1 = -0.950mm
x2 = 0.000mm
y2 = 0.950mm
thickness = 1.500mm
square = 0
}
ha:layer_mask {
intern = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0.200mm
ha:ps_line {
x1 = 0.000mm
y1 = -0.950mm
x2 = 0.000mm
y2 = 0.950mm
thickness = 1.500mm
square = 0
}
ha:layer_mask {
bottom = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
ha:ps_line {
x1 = 0.000mm
y1 = -0.950mm
x2 = 0.000mm
y2 = 0.950mm
thickness = 1.600mm
square = 0
}
ha:layer_mask {
bottom = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
}
}
}
li:objects {
ha:padstack_ref.27 {
proto = 2
rot = 0
x = -4.500mm
y = 4.235mm
ha:attributes {
term = 1
name = 1
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.28 {
proto = 2
rot = 0
x = -4.000mm
y = 4.235mm
ha:attributes {
term = 2
name = 2
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.29 {
proto = 2
rot = 0
x = -3.500mm
y = 4.235mm
ha:attributes {
term = 3
name = 3
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.30 {
proto = 2
rot = 0
x = -3.000mm
y = 4.235mm
ha:attributes {
term = 4
name = 4
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.31 {
proto = 2
rot = 0
x = -2.500mm
y = 4.235mm
ha:attributes {
term = 5
name = 5
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.32 {
proto = 2
rot = 0
x = -2.000mm
y = 4.235mm
ha:attributes {
term = 6
name = 6
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.33 {
proto = 2
rot = 0
x = -1.500mm
y = 4.235mm
ha:attributes {
term = 7
name = 7
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.34 {
proto = 2
rot = 0
x = -1.000mm
y = 4.235mm
ha:attributes {
term = 8
name = 8
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.35 {
proto = 2
rot = 0
x = -0.500mm
y = 4.235mm
ha:attributes {
term = 9
name = 9
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.36 {
proto = 2
rot = 0
x = 0.000mm
y = 4.235mm
ha:attributes {
term = 10
name = 10
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.37 {
proto = 2
rot = 0
x = 0.500mm
y = 4.235mm
ha:attributes {
term = 11
name = 11
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.38 {
proto = 2
rot = 0
x = 1.000mm
y = 4.235mm
ha:attributes {
term = 12
name = 12
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.39 {
proto = 2
rot = 0
x = 1.500mm
y = 4.235mm
ha:attributes {
term = 13
name = 13
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.40 {
proto = 2
rot = 0
x = 2.000mm
y = 4.235mm
ha:attributes {
term = 14
name = 14
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.41 {
proto = 2
rot = 0
x = 2.500mm
y = 4.235mm
ha:attributes {
term = 15
name = 15
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.42 {
proto = 2
rot = 0
x = 3.000mm
y = 4.235mm
ha:attributes {
term = 16
name = 16
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.43 {
proto = 2
rot = 0
x = 3.500mm
y = 4.235mm
ha:attributes {
term = 17
name = 17
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.44 {
proto = 2
rot = 0
x = 4.000mm
y = 4.235mm
ha:attributes {
term = 18
name = 18
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.45 {
proto = 2
rot = 0
x = 4.500mm
y = 4.235mm
ha:attributes {
term = 19
name = 19
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.46 {
proto = 3
rot = 0
x = -7.250mm
y = -2.485mm
ha:attributes {
term = NC1
name = NC1
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.47 {
proto = 3
rot = 0
x = 7.250mm
y = -2.485mm
ha:attributes {
term = NC2
name = NC2
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.48 {
proto = 4
rot = 0
x = -7.250mm
y = 3.475mm
ha:attributes {
term = NC3
name = NC3
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
ha:padstack_ref.49 {
proto = 4
rot = 0
x = 7.250mm
y = 3.475mm
ha:attributes {
term = NC4
name = NC4
}
clearance = 0.200mm
ha:flags {
clearline = 1
}
}
}
li:layers {
ha:subc-aux {
lid = 0
ha:type {
top = 1
misc = 1
virtual = 1
}
li:objects {
ha:line.50 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = origin
}
x1 = 0.000mm
x2 = 0.000mm
y1 = 0.000mm
y2 = 0.000mm
}
ha:line.51 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = x
}
x1 = 0.000mm
x2 = 1.000mm
y1 = 0.000mm
y2 = 0.000mm
}
ha:line.52 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = y
}
x1 = 0.000mm
x2 = 0.000mm
y1 = 0.000mm
y2 = 1.000mm
}
ha:line.53 {
clearance = 0
thickness = 0.1mm
ha:attributes {
subc-role = pnp-origin
}
x1 = 0.000mm
x2 = 0.000mm
y1 = 0.000mm
y2 = 0.000mm
}
}
}
ha:top-silkscreen {
lid = 1
ha:type {
top = 1
silk = 1
}
li:objects {
ha:text.54 {
x = 0.000mm
y = 0.000mm
rot = 0
scale = 100
string = %a.parent.refdes%
fid = 0
ha:flags {
floater = 1
dyntext = 1
}
}
ha:line.55 {
x1 = -7.600mm
y1 = -6.175mm
x2 = 7.600mm
y2 = -6.175mm
thickness = 0.200mm
clearance = 0
}
ha:line.56 {
x1 = 7.600mm
y1 = -6.175mm
x2 = 7.600mm
y2 = -3.935mm
thickness = 0.200mm
clearance = 0
}
ha:line.57 {
x1 = 7.600mm
y1 = -1.035mm
x2 = 7.600mm
y2 = 1.475mm
thickness = 0.200mm
clearance = 0
}
ha:line.58 {
x1 = 7.600mm
y1 = 5.475mm
x2 = 7.600mm
y2 = 6.175mm
thickness = 0.200mm
clearance = 0
}
ha:line.59 {
x1 = 7.600mm
y1 = 6.175mm
x2 = -7.600mm
y2 = 6.175mm
thickness = 0.200mm
clearance = 0
}
ha:line.60 {
x1 = -7.600mm
y1 = -6.175mm
x2 = -7.600mm
y2 = -3.935mm
thickness = 0.200mm
clearance = 0
}
ha:line.61 {
x1 = -7.600mm
y1 = -1.035mm
x2 = -7.600mm
y2 = 1.475mm
thickness = 0.200mm
clearance = 0
}
ha:line.62 {
x1 = -7.600mm
y1 = 5.475mm
x2 = -7.600mm
y2 = 6.175mm
thickness = 0.200mm
clearance = 0
}
}
}
ha:top-assembly {
lid = 2
ha:type {
top = 1
doc = 1
}
purpose = assy
li:objects {
ha:arc.63 {
x = 0.000mm
y = 0.000mm
width = 0.500mm
height = 0.500mm
thickness = 0.100mm
astart = 0
adelta = 360
clearance = 0
}
ha:line.64 {
x1 = -0.700mm
y1 = 0.000mm
x2 = 0.700mm
y2 = 0.000mm
thickness = 0.100mm
clearance = 0
}
ha:line.65 {
x1 = 0.000mm
y1 = -0.700mm
x2 = 0.000mm
y2 = 0.700mm
thickness = 0.100mm
clearance = 0
}
ha:text.66 {
x = 0.000mm
y = 0.000mm
rot = 0
scale = 100
string = CONNECTOR_HDMI-001S
fid = 0
ha:flags {
floater = 1
}
}
ha:line.67 {
x1 = -7.500mm
y1 = -6.075mm
x2 = 7.500mm
y2 = -6.075mm
thickness = 0.100mm
clearance = 0
}
ha:line.68 {
x1 = 7.500mm
y1 = -6.075mm
x2 = 7.500mm
y2 = 6.075mm
thickness = 0.100mm
clearance = 0
}
ha:line.69 {
x1 = 7.500mm
y1 = 6.075mm
x2 = -7.500mm
y2 = 6.075mm
thickness = 0.100mm
clearance = 0
}
ha:line.70 {
x1 = -7.500mm
y1 = 6.075mm
x2 = -7.500mm
y2 = -6.075mm
thickness = 0.100mm
clearance = 0
}
}
}
ha:top-courtyard {
lid = 3
ha:type {
top = 1
doc = 1
}
purpose = ko.courtyard
li:objects {
ha:polygon.71 {
li:geometry {
ta:contour {
{ -8.250mm; -6.325mm }
{ 8.250mm; -6.325mm }
{ 8.250mm; 6.325mm }
{ -8.250mm; 6.325mm }
}
}
}
}
}
}
}
}
}

View File

@ -1,825 +0,0 @@
# subcircuit generated using QEDA
li:pcb-rnd-subcircuit-v6 {
ha:subc.1 {
uid = CONNECTOR_HYC109-HDMIA19
ha:attributes {
footprint = CONNECTOR_HYC109-HDMIA19-160
}
ha:data {
li:padstack_prototypes {
ha:ps_proto_v6.2 {
htop = 0
hbottom = 0
hdia = 0
hplated = 0
li:shape {
ha:ps_shape_v4 {
clearance = 0.200mm
li:ps_poly {
-0.250mm
-0.975mm
0.250mm
-0.975mm
0.250mm
0.975mm
-0.250mm
0.975mm
}
ha:layer_mask {
top = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.300mm
-1.025mm
0.300mm
-1.025mm
0.300mm
1.025mm
-0.300mm
1.025mm
}
ha:layer_mask {
top = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.250mm
-0.975mm
0.250mm
-0.975mm
0.250mm
0.975mm
-0.250mm
0.975mm
}
ha:layer_mask {
top = 1
paste = 1
}
ha:combining {
auto = 1
}
}
}
}
ha:ps_proto_v6.3 {
htop = 0
hbottom = 0
hdia = 0
hplated = 0
li:shape {
ha:ps_shape_v4 {
clearance = 0.200mm
li:ps_poly {
-0.250mm
-0.975mm
0.250mm
-0.975mm
0.250mm
0.975mm
-0.250mm
0.975mm
}
ha:layer_mask {
bottom = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.300mm
-1.025mm
0.300mm
-1.025mm
0.300mm
1.025mm
-0.300mm
1.025mm
}
ha:layer_mask {
bottom = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.250mm
-0.975mm
0.250mm
-0.975mm
0.250mm
0.975mm
-0.250mm
0.975mm
}
ha:layer_mask {
bottom = 1
paste = 1
}
ha:combining {
auto = 1
}
}
}
}
ha:ps_proto_v6.4 {
htop = 0
hbottom = 0
hdia = 0
hplated = 0
li:shape {
ha:ps_shape_v4 {
clearance = 0.200mm
li:ps_poly {
-0.500mm
-1.400mm
0.500mm
-1.400mm
0.500mm
1.400mm
-0.500mm
1.400mm
}
ha:layer_mask {
top = 1
copper = 1
}
ha:combining {
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.550mm
-1.450mm
0.550mm
-1.450mm
0.550mm
1.450mm
-0.550mm
1.450mm
}
ha:layer_mask {
top = 1
mask = 1
}
ha:combining {
sub = 1
auto = 1
}
}
ha:ps_shape_v4 {
clearance = 0
li:ps_poly {
-0.500mm
-1.400mm
0.500mm
-1.400mm