Source code for skidl.tools.kicad8.gen_netlist

# -*- coding: utf-8 -*-

# The MIT License (MIT) - Copyright (c) Dave Vandenbout.

"""
Generate KiCad 5 netlist.
"""

import os.path
import time

from skidl.pckg_info import __version__
from skidl.scriptinfo import scriptinfo
from skidl.utilities import add_quotes, export_to_all


def gen_netlist_comp(part):
    """Generate the netlist text describing a component.

    Args:
        part (Part): Part object.

    Returns:
        str: String containing component netlist description.
    """

    from skidl.circuit import HIER_SEP

    ref = add_quotes(part.ref)

    value = add_quotes(part.value_to_str())

    footprint = getattr(part, "footprint", "")
    footprint = add_quotes(footprint)

    lib_filename = getattr(getattr(part, "lib", ""), "filename", "NO_LIB")
    part_name = add_quotes(part.name)

    # Embed the hierarchy along with a random integer into the sheetpath for each component.
    # This enables hierarchical selection in pcbnew.
    hierarchy = add_quotes("/" + part.hierarchical_name.replace(HIER_SEP, "/"))
    tstamps = hierarchy

    fields = ""
    for fld_name, fld_value in part.fields.items():
        fld_name = add_quotes(fld_name)
        fld_value = add_quotes(fld_value)
        if fld_value:
            fields += "\n        (field (name {fld_name}) {fld_value})".format(
                **locals()
            )
    if fields:
        fields = "      (fields" + fields
        fields += ")\n"

    template = (
        "    (comp (ref {ref})\n"
        + "      (value {value})\n"
        + "      (footprint {footprint})\n"
        + "{fields}"
        + "      (libsource (lib {lib_filename}) (part {part_name}))\n"
        + "      (sheetpath (names {hierarchy}) (tstamps {tstamps})))"
    )
    txt = template.format(**locals())
    return txt


def gen_netlist_net(net):
    """Generate the netlist text describing a net.

    Args:
        part (Net): Net object.

    Returns:
        str: String containing net netlist description.
    """
    code = add_quotes(net.code)
    name = add_quotes(net.name)
    txt = "    (net (code {code}) (name {name})".format(**locals())
    for p in sorted(net.pins, key=str):
        part_ref = add_quotes(p.part.ref)
        pin_num = add_quotes(p.num)
        txt += "\n      (node (ref {part_ref}) (pin {pin_num}))".format(**locals())
    txt += ")"
    return txt


[docs] @export_to_all def gen_netlist(circuit): """Generate a netlist from a Circuit object. Args: circuit (Circuit): Circuit object. Returns: str: String containing netlist text. """ scr_dict = scriptinfo() src_file = os.path.join(scr_dict["dir"], scr_dict["source"]) date = time.strftime("%m/%d/%Y %I:%M %p") tool = "SKiDL (" + __version__ + ")" template = ( "(export (version D)\n" + " (design\n" + ' (source "{src_file}")\n' + ' (date "{date}")\n' + ' (tool "{tool}"))\n' ) netlist = template.format(**locals()) netlist += " (components" for p in sorted(circuit.parts, key=lambda p: str(p.ref)): netlist += "\n" + gen_netlist_comp(p) netlist += ")\n" netlist += " (nets" sorted_nets = sorted(circuit.get_nets(), key=lambda n: str(n.name)) for code, n in enumerate(sorted_nets, 1): n.code = code netlist += "\n" + gen_netlist_net(n) netlist += ")\n)\n" return netlist