File: netlist_form_pads-pcb-asc.py

package info (click to toggle)
kicad 9.0.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 770,320 kB
  • sloc: cpp: 961,692; ansic: 121,001; xml: 66,428; python: 18,387; sh: 1,010; awk: 301; asm: 292; makefile: 227; javascript: 167; perl: 10
file content (103 lines) | stat: -rw-r--r-- 2,370 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#
# Example python script to generate a BOM from a KiCad generic netlist
#

"""
    @package
    Output: PADS  format netlist
    Sorted By: Ref

    Command line:
    python "pathToFile/netlist_form_pads-pcb-asc.py" "%I" "%O.net"
"""

from __future__ import print_function

# Import the KiCad python helper module
import kicad_netlist_reader
import sys

# A helper function to convert a UTF8/Unicode/locale string read in netlist
# for python2 or python3 (Windows/unix)
def fromNetlistText( aText ):
    if sys.platform.startswith('win32'):
        try:
            return aText.encode('utf-8').decode('cp1252')
        except UnicodeDecodeError:
            return aText
    else:
        return aText

# Generate an instance of a generic netlist, and load the netlist tree from
# the command line option. If the file doesn't exist, execution will stop
netlist = kicad_netlist_reader.netlist(sys.argv[1])

# Open a file to write to, if the file cannot be opened output to stdout
# instead
canOpenFile = True
try:
    f = open(sys.argv[2], 'wb')
except IOError:
    e = "Can't open output file for writing: " + sys.argv[2]
    print(__file__, ":", e, sys.stderr)
    f = sys.stdout
    canOpenFile = False

components = netlist.getInterestingComponents( excludeBoard=True )

row =""

''' Netlist header '''
row += "!PADS-POWERPCB-V2.0-MILS!" + '\n'
row += '*PART*' + '\n'


''' Generate list of component
 for each component  create lines like
 C1 Capacitor_THT:CP_Axial_L18.0mm_D6.5mm_P25.00mm_Horizontal
 C2 Capacitor_THT:CP_Axial_L18.0mm_D6.5mm_P25.00mm_Horizontal
'''

for c in components:
    row += " " + c.getRef()

    fp_name = c.getFootprint( False )

    if fp_name != "":
        row += " " + fp_name

    row += '\n'

'''
generate for each net create lines like
*SIGNAL* /CLOCK-RB6
 P2.27
 P3.39
'''
nets = netlist.getNets()

row += '\n*NET*' + '\n'

for net in nets:
    # count the number of pads in net. nets with only one pad are skipped
    netitems = net.children
    pad_count = 0

    for node in netitems:
        pad_count += 1

    netitems = net.children

    if pad_count > 1:
        row += "*SIGNAL* " + net.get( "net", "name" ) + '\n'

        for node in netitems:
            row += node.get('node','ref') + '.' + node.get('node','pin') + '\n'

row += '*END*\n'

f.write(row.encode('utf-8'))
f.close()

if not canOpenFile:
    sys.exit(1)