Source code for skidl.tools.kicad5.gen_xml

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

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

"""
Generate KiCad 5 XML.
"""

import os.path
import time
import os

from skidl.pckg_info import __version__
from skidl.scriptinfo import scriptinfo
from skidl.utilities import add_quotes, export_to_all
from skidl.logger import active_logger
from skidl.part import LIBRARY


def gen_xml_comp(part):
    """Generate the XML describing a component.

    Args:
        part (Part): Part object.

    Returns:
        str: String containing the XML for the part.
    """
    ref = part.ref
    value = add_quotes(part.value_to_str())

    try:
        footprint = part.footprint
    except AttributeError:
        active_logger.error(
            "No footprint for {part}/{ref}.".format(part=part.name, ref=ref)
        )
        footprint = "No Footprint"

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

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

    template = (
        '    <comp ref="{ref}">\n'
        + "      <value>{value}</value>\n"
        + "      <footprint>{footprint}</footprint>\n"
        + "{fields}"
        + '      <libsource lib="{lib_filename}" part="{part_name}"/>\n'
        + "    </comp>"
    )
    txt = template.format(**locals())
    return txt


def gen_xml_net(net):
    code = net.code
    name = net.name
    txt = '    <net code="{code}" name="{name}">'.format(**locals())
    for p in net.pins:
        part_ref = p.part.ref
        pin_num = p.num
        txt += '\n      <node ref="{part_ref}" pin="{pin_num}"/>'.format(**locals())
    txt += "\n    </net>"
    return txt


[docs] @export_to_all def gen_xml(circuit): """Generate the XML describing a circuit. Args: circuit (Circuit): Circuit object. Returns: str: String containing the XML for the circuit. """ 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 = ( '<?xml version="1.0" encoding="UTF-8"?>\n' + '<export version="D">\n' + " <design>\n" + " <source>{src_file}</source>\n" + " <date>{date}</date>\n" + " <tool>{tool}</tool>\n" + " </design>\n" ) netlist = template.format(**locals()) netlist += " <components>" for p in circuit.parts: netlist += "\n" + gen_xml_comp(p) netlist += "\n </components>\n" netlist += " <nets>" for code, n in enumerate(circuit.get_nets()): n.code = code netlist += "\n" + gen_xml_net(n) netlist += "\n </nets>\n" netlist += "</export>\n" return netlist