diff --git a/PCBLayoutRecommendationsforLeadedPackages.pdf b/PCBLayoutRecommendationsforLeadedPackages.pdf new file mode 100644 index 0000000..391ebd6 Binary files /dev/null and b/PCBLayoutRecommendationsforLeadedPackages.pdf differ diff --git a/bldc-parts.pretty/Lattice_QFN-48UP.kicad_mod b/bldc-parts.pretty/Lattice_QFN-48UP.kicad_mod new file mode 100644 index 0000000..1c8308c --- /dev/null +++ b/bldc-parts.pretty/Lattice_QFN-48UP.kicad_mod @@ -0,0 +1,135 @@ +(module Lattice_QFN-48UP (layer F.Cu) (tedit 5DE350A8) + (fp_text reference REF** (at 0.0 0.0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user %R (at 0.0 0.0) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value %V (at 0 -0.5) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) + + (fp_line (start -3.7 -3.0700000000000003) (end -3.0700000000000003 -3.7) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.7 3.7) (end -3.7 3.0700000000000003) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.0700000000000003 3.7) (end -3.7 3.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.0700000000000003 3.7) (end 3.7 3.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7 3.7) (end 3.7 3.0700000000000003) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7 -3.0700000000000003) (end 3.7 -3.7) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.7 -3.7) (end 3.0700000000000003 -3.7) (layer F.SilkS) (width 0.15)) + (fp_circle (center -3.7 -3.7) (end -3.7 -3.85) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.25 -3.55) (end -3.55 -3.25) (layer F.Fab) (width 0.15)) + (fp_line (start 3.55 -3.55) (end -3.25 -3.55) (layer F.Fab) (width 0.15)) + (fp_line (start 3.55 3.55) (end 3.55 -3.55) (layer F.Fab) (width 0.15)) + (fp_line (start -3.55 3.55) (end 3.55 3.55) (layer F.Fab) (width 0.15)) + (fp_line (start -3.55 -3.25) (end -3.55 3.55) (layer F.Fab) (width 0.15)) + (fp_line (start -3.8 -3.02) (end -3.8 -3.8) (layer F.CrtYd) (width 0.15)) + (fp_line (start -3.8 -3.8) (end 3.8 -3.8) (layer F.CrtYd) (width 0.15)) + (fp_line (start 3.8 -3.8) (end 3.8 -3.02) (layer F.CrtYd) (width 0.15)) + (fp_line (start 3.8 -3.02) (end 4.05 -3.02) (layer F.CrtYd) (width 0.15)) + (fp_line (start 4.05 -3.02) (end 4.05 3.02) (layer F.CrtYd) (width 0.15)) + (fp_line (start 4.05 3.02) (end 3.8 3.02) (layer F.CrtYd) (width 0.15)) + (fp_line (start 3.8 3.02) (end 3.8 3.8) (layer F.CrtYd) (width 0.15)) + (fp_line (start 3.8 3.8) (end -3.8 3.8) (layer F.CrtYd) (width 0.15)) + (fp_line (start -3.8 3.8) (end -3.8 3.02) (layer F.CrtYd) (width 0.15)) + (fp_line (start -3.8 3.02) (end -4.05 3.02) (layer F.CrtYd) (width 0.15)) + (fp_line (start -4.05 3.02) (end -4.05 -3.02) (layer F.CrtYd) (width 0.15)) + (fp_line (start -4.05 -3.02) (end -3.8 -3.02) (layer F.CrtYd) (width 0.15)) + (pad 1 smd roundrect (at -3.5 -2.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 2 smd roundrect (at -3.5 -2.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 3 smd roundrect (at -3.5 -1.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 4 smd roundrect (at -3.5 -1.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 5 smd roundrect (at -3.5 -0.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 6 smd roundrect (at -3.5 -0.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 7 smd roundrect (at -3.5 0.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 8 smd roundrect (at -3.5 0.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 9 smd roundrect (at -3.5 1.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 10 smd roundrect (at -3.5 1.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 11 smd roundrect (at -3.5 2.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 12 smd roundrect (at -3.5 2.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 13 smd roundrect (at -2.75 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 14 smd roundrect (at -2.25 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 15 smd roundrect (at -1.75 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 16 smd roundrect (at -1.25 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 17 smd roundrect (at -0.75 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 18 smd roundrect (at -0.25 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 19 smd roundrect (at 0.25 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 20 smd roundrect (at 0.75 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 21 smd roundrect (at 1.25 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 22 smd roundrect (at 1.75 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 23 smd roundrect (at 2.25 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 24 smd roundrect (at 2.75 3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 25 smd roundrect (at 3.5 2.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 26 smd roundrect (at 3.5 2.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 27 smd roundrect (at 3.5 1.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 28 smd roundrect (at 3.5 1.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 29 smd roundrect (at 3.5 0.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 30 smd roundrect (at 3.5 0.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 31 smd roundrect (at 3.5 -0.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 32 smd roundrect (at 3.5 -0.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 33 smd roundrect (at 3.5 -1.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 34 smd roundrect (at 3.5 -1.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 35 smd roundrect (at 3.5 -2.25) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 36 smd roundrect (at 3.5 -2.75) (size 0.7999999999999998 0.24) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 37 smd roundrect (at 2.75 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 38 smd roundrect (at 2.25 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 39 smd roundrect (at 1.75 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 40 smd roundrect (at 1.25 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 41 smd roundrect (at 0.75 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 42 smd roundrect (at 0.25 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 43 smd roundrect (at -0.25 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 44 smd roundrect (at -0.75 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 45 smd roundrect (at -1.25 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 46 smd roundrect (at -1.75 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 47 smd roundrect (at -2.25 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 48 smd roundrect (at -2.75 -3.5) (size 0.24 0.7999999999999998) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.625) (solder_mask_margin 0.07)) + (pad 0 smd roundrect (at 0.0 0.0) (size 5.5 5.5) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio 0.02727272727272727) (solder_mask_margin 0.07)) +) diff --git a/fp-info-cache b/fp-info-cache index 2d9a54f..6facd60 100644 --- a/fp-info-cache +++ b/fp-info-cache @@ -1,4 +1,4 @@ -16918992665384721 +16920567844714721 Battery BatteryHolder_Bulgin_BX0036_1xC Bulgin Battery Holder, BX0036, Battery Type C (https://www.bulgin.com/products/pub/media/bulgin/data/Battery_holders.pdf) @@ -75208,6 +75208,13 @@ Infineon_PG-TDSON-8-33 10 8 bldc-parts +Lattice_QFN-48UP + + +0 +49 +49 +bldc-parts Maxim_TQFN-28 diff --git a/gen_lattice_qfn48up.py b/gen_lattice_qfn48up.py new file mode 100644 index 0000000..ca3aade --- /dev/null +++ b/gen_lattice_qfn48up.py @@ -0,0 +1,304 @@ +#!/usr/bin/env python3 + +# QFN/QFP-style packages with ground plane +# version 0.0.7 + +# added solder mask parameter +# added optional indicator circle +# added ground pad +# made ground pad optional +# fix silkscreen pin 1 marker +# added rounded pads option +# added reference designator to fab layer +# make fab layer pin drawing optional +# added TI's weird ground pad extensions +# v0.0.5 +# added indicator marker to fab layer +# v0.0.6 +# removed TI extensions +# converted for use in QFN/QFP packages +# - add pads for QFN/QFP +# - add fab pad drawings for QFN/QFP +# - fix silkscreen +# v0.0.7 +# - add ground pad offset +# - add rotation + +PARTNAME = "Lattice_QFN-48UP" + +total_pins = 48 +num_per_edge = total_pins // 4 + +M1 = 0.2 # silkscreen margin +M2 = 0.05 # fab outline margin +M3 = 0.3 # courtyard margin + +Z = 7.0 + 0.80 # distance across outer edges of pads +G = 7.0 - 0.80 # distance across inner edges of pads + +X = (Z+G)/2. # distance between pad centers +C = 0.5 # footprint pad spacing +w = 0.24 # footprint pad width +h = (Z-G)/2. # footprint pad length + +show_fab_pads = False +H = 7.0 # distance from physical pad end to opposite pad end +e = C # physical pad spacing, same as above +b = 0.24 # physical pad width +L1 = -0.4 # physical pad length + +D1 = 7.0 # package width +E1 = 7.0 # package height + +has_ground_pad = True +G1 = 5.5 # ground pad width +H1 = 5.5 # ground pad height +I1 = 0.0 # ground pad x offset +J1 = 0.0 # ground pad y offset +ground_pad_num = 0 + +# NOTE: need to test with SMD footprints +# need to make sure pad size adjustment works +# nsmd = positive +solder_mask_margin = 0.07 +indicator_circle_dia = 0.3 + +pad_radius = 0.15 + +rotation = 0 + +if solder_mask_margin < 0.0: + w -= 2.0*solder_mask_margin + h -= 2.0*solder_mask_margin + G1 -= 2.0*solder_mask_margin + H1 -= 2.0*solder_mask_margin + +import math +def _x(x, y): + return x*math.cos(rotation*math.pi/180.) - y*math.sin(rotation*math.pi/180.) +def _y(x, y): + return x*math.sin(rotation*math.pi/180.) + y*math.cos(rotation*math.pi/180.) +def xy(x, y): + return (_x(x, y), _y(x, y)) +def xyxy(x1, y1, x2, y2): + return (_x(x1, y1), _y(x1, y1), _x(x2, y2), _y(x2, y2)) + +if rotation == 90 or rotation == 270: + h, w = w, h + H1, G1 = G1, H1 + +import time +gen_time = hex(int(time.time()))[2:].upper() + + +prologue = """(module {} (layer F.Cu) (tedit {}) + (fp_text reference REF** (at 0.0 0.0) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text user %R (at 0.0 0.0) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value %V (at 0 -0.5) (layer F.Fab) hide + (effects (font (size 1 1) (thickness 0.15))) + ) +""" + +prologue = prologue.format(PARTNAME, gen_time, PARTNAME) +epilogue = """)""" + +print(prologue) + +# print silkscreen outline +inner_edge = C*(num_per_edge/2 - 0.5) + w/2 + M1 +x = D1/2 + M1 +y = E1/2 + M1 +for x, y, nx, ny in [ + (-x, -inner_edge, -inner_edge, -y), + + (-x, y, -x, inner_edge), (-inner_edge, y, -x, y), + (inner_edge, y, x, y), (x, y, x, inner_edge), + (x, -inner_edge, x, -y), (x, -y, inner_edge, -y)]: + print(""" (fp_line (start {} {}) (end {} {}) (layer F.SilkS) (width 0.15))""". + format(*xyxy(x, y, nx, ny))) + +if indicator_circle_dia is not None: + x = D1/2 + M1 #+ 0.5*indicator_circle_dia + y = E1/2 + M1 #+ 0.5*indicator_circle_dia + # add indicator circle + print(""" (fp_circle (center {} {}) (end {} {}) (layer F.SilkS) (width 0.15))""". + format(*xyxy(-x, -y, -x, -y - indicator_circle_dia/2.0))) + + +# draw package outline in fab layer +FC = 0.3 +fab_points = [(-D1/2 - M2 + FC, -E1/2 - M2), + (D1/2 + M2, -E1/2 - M2), + (D1/2 + M2, E1/2 + M2), + (-D1/2 + -M2, E1/2 + M2), + (-D1/2 + -M2, -E1/2 - M2 + FC)] + +nx, ny = fab_points[-1] +for x, y in fab_points: + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x, y, nx, ny))) + nx, ny = x, y + +if show_fab_pads: + for i in range(num_per_edge): + x_pos = -D1/2 - M2 + y_pos = C*(i-(num_per_edge/2-0.5)) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos, y_pos - b/2 - M2, x_pos - L1, y_pos - b/2 - M2))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos - L1, y_pos - b/2 - M2, x_pos - L1, y_pos + b/2 + M2))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos - L1, y_pos + b/2 + M2, x_pos, y_pos + b/2 + M2))) + + for i in range(num_per_edge): + x_pos = C*(i-(num_per_edge/2-0.5)) + y_pos = E1/2 + M2 + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos - b/2 - M2, y_pos, x_pos - b/2 - M2, y_pos + L1))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos - b/2 - M2, y_pos + L1, x_pos + b/2 + M2, y_pos + L1))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos + b/2 + M2, y_pos + L1, x_pos + b/2 + M2, y_pos))) + + for i in range(num_per_edge): + x_pos = D1/2 + M2 + y_pos = -C*(i-(num_per_edge/2-0.5)) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos, y_pos + b/2 + M2, x_pos + L1, y_pos + b/2 + M2))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos + L1, y_pos + b/2 + M2, x_pos + L1, y_pos - b/2 - M2))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos + L1, y_pos - b/2 - M2, x_pos, y_pos - b/2 - M2))) + + for i in range(num_per_edge): + x_pos = -C*(i-(num_per_edge/2-0.5)) + y_pos = -E1/2 - M2 + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos + b/2 + M2, y_pos, x_pos + b/2 + M2, y_pos - L1))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos + b/2 + M2, y_pos - L1, x_pos - b/2 - M2, y_pos - L1))) + print(""" (fp_line (start {} {}) (end {} {}) (layer F.Fab) (width 0.15))""". + format(*xyxy(x_pos - b/2 - M2, y_pos - L1, x_pos - b/2 - M2, y_pos))) + + +# print courtyard outline +inner_x = D1/2 + M3 +outer_x = X/2 + h/2 + M3/2 +inner_y = C*(num_per_edge/2-0.5) + b/2 + M3/2 +outer_y = E1/2 + M3 +pts = [ + (-inner_x, -outer_y), + (inner_x, -outer_y), + (inner_x, -inner_y), + (outer_x, -inner_y), + (outer_x, inner_y), + (inner_x, inner_y), + (inner_x, outer_y), + (-inner_x, outer_y), + (-inner_x, inner_y), + (-outer_x, inner_y), + (-outer_x, -inner_y), + (-inner_x, -inner_y) + ] +nx, ny = pts[-1] +for px, py in pts: + x, y, nx, ny = nx, ny, px, py + print(""" (fp_line (start {} {}) (end {} {}) (layer F.CrtYd) (width 0.15))""". + format(*xyxy(x, y, nx, ny))) + + +padtype = "rect" +padext = "" +if pad_radius is not None: + padtype = "roundrect" + padext = "(roundrect_rratio {})".format(pad_radius/min(h, w)) + +for i in range(0, num_per_edge): + tx, ty = xy(-X/2, C*(i-(num_per_edge/2-0.5))) + print(""" (pad {} smd {} (at {} {}) (size {} {}) (layers F.Cu F.Paste F.Mask) + {} (solder_mask_margin {}))""". + format( + i+1, + padtype, + tx, + ty, + h, + w, + padext, + solder_mask_margin)) + +for i in range(0, num_per_edge): + tx, ty = xy(C*(i-(num_per_edge/2-0.5)), X/2) + print(""" (pad {} smd {} (at {} {}) (size {} {}) (layers F.Cu F.Paste F.Mask) + {} (solder_mask_margin {}))""". + format( + i+1+1*num_per_edge, + padtype, + tx, + ty, + w, + h, + padext, + solder_mask_margin)) + +for i in range(0, num_per_edge): + tx, ty = xy(X/2, -C*(i-(num_per_edge/2-0.5))) + print(""" (pad {} smd {} (at {} {}) (size {} {}) (layers F.Cu F.Paste F.Mask) + {} (solder_mask_margin {}))""". + format( + i+1+2*num_per_edge, + padtype, + tx, + ty, + h, + w, + padext, + solder_mask_margin)) + +for i in range(0, num_per_edge): + tx, ty = xy(-C*(i-(num_per_edge/2-0.5)), -X/2) + print(""" (pad {} smd {} (at {} {}) (size {} {}) (layers F.Cu F.Paste F.Mask) + {} (solder_mask_margin {}))""". + format( + i+1+3*num_per_edge, + padtype, + tx, + ty, + w, + h, + padext, + solder_mask_margin)) + + +if has_ground_pad: + tx, ty = xy(I1, J1) + if pad_radius is None: + # add ground pad + print(""" (pad {} smd {} (at {} {}) (size {} {}) (layers F.Cu F.Paste F.Mask) + (solder_mask_margin {}))""". + format( + ground_pad_num, + "rect", + tx, + ty, + G1, + H1, + solder_mask_margin)) + else: + print(""" (pad {} smd {} (at {} {}) (size {} {}) (layers F.Cu F.Paste F.Mask) + (roundrect_rratio {}) (solder_mask_margin {}))""". + format( + ground_pad_num, + "roundrect", + tx, + ty, + G1, + H1, + pad_radius/min(G1, H1), + solder_mask_margin)) + +print(epilogue)