diff --git a/docs/module/kiutils.items.rst b/docs/module/kiutils.items.rst index 21ddf84..9a3fe74 100644 --- a/docs/module/kiutils.items.rst +++ b/docs/module/kiutils.items.rst @@ -40,6 +40,13 @@ Graphical items (`kiutils.items.gritems`) :members: :undoc-members: :show-inheritance: +Netlist items (`kiutils.items.netitems`) +----------------------------------------- + +.. automodule:: kiutils.items.netitems + :members: + :undoc-members: + :show-inheritance: Schematic items (`kiutils.items.schitems`) ------------------------------------------ diff --git a/docs/module/kiutils.rst b/docs/module/kiutils.rst index 5291463..53c0c7b 100644 --- a/docs/module/kiutils.rst +++ b/docs/module/kiutils.rst @@ -33,6 +33,14 @@ Library tables (`kiutils.libraries`) :undoc-members: :show-inheritance: +Netlists (`kiutils.netlist`) +------------------------------------ + +.. automodule:: kiutils.netlist + :members: + :undoc-members: + :show-inheritance: + Schematics (`kiutils.schematic`) -------------------------------- diff --git a/src/kiutils/items/netitems.py b/src/kiutils/items/netitems.py new file mode 100644 index 0000000..623dd61 --- /dev/null +++ b/src/kiutils/items/netitems.py @@ -0,0 +1,848 @@ +"""Defines items used in KiCad eeschema netlist export + +Author: + (C) Ashton Snelgrove - @yashton - 2024 + +License identifier: + GPL-3.0 + +Major changes: + 10.07.2024 - created + +Documentation taken from: + https://docs.kicad.org/master/en/eeschema/eeschema.html#intermediate-netlist-structure +""" +from dataclasses import dataclass, field +from typing import Optional, List, Union +from kiutils.utils import sexpr +from kiutils.utils.strings import dequote +from os import path + +@dataclass +class NetlistTitleBlock(): + company: Optional[str] = None + title: Optional[str] = None + name: Optional[str] = None + rev: Optional[str] = None + date: Optional[str] = None + source: str = "" + comments: List[str] = field(default_factory=lambda: [None for _ in range(0,9)]) + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(title_block ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not title_block + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'title_block': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'title' and len(item) > 1: object.title = item[1] + elif item[0] == 'company' and len(item) > 1: object.company = datetime.strptime(item[1]) + elif item[0] == 'rev' and len(item) > 1: object.rev = item[1] + elif item[0] == 'date' and len(item) > 1: object.date = item[1] + elif item[0] == 'source': object.source = item[1] + elif item[0] == 'comment': + index = -1 + for sub in item[1:]: + if sub[0] == "number": + index = int(sub[1]) - 1 + if sub[0] == "value": + comment = sub[1] + if index == -1: + raise Exception("Missing comment number") + object.comments[index] = comment + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(title_block\n' + if self.title is not None: + expression += f'{indents} (title "{dequote(self.title)}")\n' + else: + expression += f'{indents} (title)\n' + + if self.company is not None: + expression += f'{indents} (company "{dequote(self.company)}")\n' + else: + expression += f'{indents} (company)\n' + + if self.rev is not None: + expression += f'{indents} (rev "{dequote(self.rev)}")\n' + else: + expression += f'{indents} (rev)\n' + + if self.date is not None: + expression += f'{indents} (date "{dequote(self.date)}")\n' + else: + expression += f'{indents} (date)\n' + + expression += f'{indents} (source "{dequote(self.source)}")\n' + for i, comment in enumerate(self.comments): + expression += f'{indents} (comment (number "{i+1}") (value "{dequote(comment)}"))\n' + + expression += f'{indents}){endline}' + return expression + +@dataclass +class NetlistSheet(): + """A hierarchical sheet in the design""" + number: str = "" + """Sheet numeric identifier""" + + name: str = "" + """Sheet name""" + + tstamps: str = "" + """Unique identifier of the sheet""" + + title_block: NetlistTitleBlock = field(default_factory=lambda: NetlistTitleBlock()) + """Title block with renderable sheet information""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(sheet ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not sheet + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'sheet': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'number': object.number = item[1] + elif item[0] == 'name': object.name = item[1] + elif item[0] == 'tstamps': object.tstamps = item[1] + elif item[0] == 'title_block': + object.title_block = NetlistTitleBlock().from_sexpr(item) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(sheet' + expression += f' (number "{dequote(self.number)}")' + expression += f' (name "{dequote(self.name)}")' + expression += f' (tstamps "{dequote(self.tstamps)}")\n' + expression += self.title_block.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class NetlistDesign(): + """The header section of the export. This section can be considered a comment. + + Documentation: + https://docs.kicad.org/master/en/eeschema/eeschema.html#the-nets-section + """ + + source: str = "" + """The ``source`` is the filename of the original schematic file""" + + date: str = "" + """The timestamp of the export. + The date format found in a local example on Linux is almost ISO8601 format, but seems to be missing the colon in the timezone. The date format in the eeschema documentation is more like the output of the unix `date` command. Without clear documentation of expected format, this is left as a string.""" + + tool: str = "" + """Identifier for the toola and version that did the export (usually eeschema)""" + + sheets: List[NetlistSheet] = field(default_factory=list) + """List of sheet information. Not documented in the eeschema documentation for the XML format, but is present in the example netlist and generated netlists.""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(design ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not design + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'design': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'source': object.source = item[1] + + elif item[0] == 'date': + object.date = item[1] + elif item[0] == 'tool': object.tool = item[1] + elif item[0] == 'sheet': + object.sheets.append(NetlistSheet().from_sexpr(item)) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(design\n' + expression += f'{indents} (source "{dequote(self.source)}")\n' + expression += f'{indents} (date "{dequote(self.date)}")\n' + expression += f'{indents} (tool "{dequote(self.tool)}")\n' + for sheet in self.sheets: + expression += sheet.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression + +@dataclass +class NetlistLibsource(): + lib: str = "" + """Logical library name""" + + part: str = "" + """Symbol identifier""" + + description: str = "" + """Symbol description""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(libsource ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not libsource + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'libsource': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'lib': object.lib = item[1] + elif item[0] == 'part': object.part = item[1] + elif item[0] == 'description': object.description = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + return f'{indents}(libsource (lib "{dequote(self.lib)}") (part "{dequote(self.part)}") (description "{dequote(self.description)}")){endline}' + + +@dataclass +class NetlistSheetpath(): + names: str = "" + tstamps: str = "" + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(sheetpath ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not sheetpath + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'sheetpath': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'names': object.names = item[1] + elif item[0] == 'tstamps': object.tstamps = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(sheetpath' + expression += f' (names "{dequote(self.names)}")' + expression += f' (tstamps "{dequote(self.tstamps)}")' + expression += f'){endline}' + return expression + +@dataclass +class NetlistField(): + name: str = "" + value: Optional[str] = None + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(field ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not field + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'field': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'name': object.name = item[1] + else: object.value = item + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + value = f' "{dequote(self.value)}"' if self.value else '' + return f'{indents}(field (name "{dequote(self.name)}"){value}){endline}' + +@dataclass +class NetlistProperty(): + name: str = "" + value: str = "" + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(property ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not property + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'property': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'name': object.name = item[1] + elif item[0] == 'value': object.value = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + return f'{indents}(property (name "{dequote(self.name)}") (value "{dequote(self.value)}")){endline}' + +@dataclass +class NetlistComponent(): + """A component from the schematic""" + + ref: str = "" + """The component reference field from the schematic""" + value: str = "" + """The component value field from the schematic""" + tstamps: str = "" + """The timestamp reference is used as unique id for each component""" + libsource: NetlistLibsource = field(default_factory=lambda: NetlistLibsource()) + """The name of the lib where this component was found.""" + sheetpath: NetlistSheetpath = field(default_factory=lambda: NetlistSheetpath()) + """The path of the sheet inside the hierarchy: identify the sheet within the full schematic hierarchy.""" + fields: List[NetlistField] = field(default_factory=list) + """The symbol field key/value pairs.""" + properties: List[NetlistProperty] = field(default_factory=list) + """A second set of key/value pairs. Appears to include copies of everything in the ``fields`` set plus "Sheetname" and "Sheetfile" pairs.""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Component object + https://docs.kicad.org/master/en/eeschema/eeschema.html#the-components-section + Args: + - exp (list): Part of parsed S-Expression ``(comp ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not comp + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'comp': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'ref': object.ref = item[1] + elif item[0] == 'value': object.value = item[1] + elif item[0] == 'tstamps': object.tstamps = item[1] + elif item[0] == 'libsource': object.libsource = NetlistLibsource.from_sexpr(item) + elif item[0] == 'sheetpath': object.sheetpath = NetlistSheetpath.from_sexpr(item) + elif item[0] == 'fields': + for field in item[1:]: + object.fields.append(NetlistField().from_sexpr(field)) + elif item[0] == 'property': + object.properties.append(NetlistProperty().from_sexpr(item)) + + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(comp' + expression += f' (ref "{dequote(self.ref)}")\n' + expression += f'{indents} (value "{dequote(self.value)}")\n' + if len(self.fields) > 0: + expression += f'{indents} (fields\n' + for field in self.fields: + expression += field.to_sexpr(indent+4) + expression += f'{indents} )\n' + expression += self.libsource.to_sexpr(indent+2) + for prop in self.properties: + expression += prop.to_sexpr(indent+2) + + expression += self.sheetpath.to_sexpr(indent+2) + expression += f'{indents} (tstamps "{dequote(self.tstamps)}")\n' + expression += f'{indents}){endline}' + return expression + +@dataclass +class NetlistLibrary(): + """ + The location of the library files that parts are derived from. + https://docs.kicad.org/master/en/eeschema/eeschema.html#the-libraries-section""" + logical: str = "" + """The identifier used by part listings.""" + uri: str = "" + """The file location of the symbol file.""" + + @classmethod + def from_sexpr(cls, exp: list): + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'library': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'logical': object.logical = item[1] + elif item[0] == 'uri': object.uri = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + expression = f'{indents}(library (logical "{dequote(self.logical)}")\n' + expression += f'{indents} (uri "{dequote(self.uri)}")){endline}' + return expression +@dataclass +class NetlistLibpartPin(): + num: str = "" + """Numeric identifier of pin. This is used in the nets section.""" + + name: str = "" + """String identifier of pin.""" + + pintype: str = "" + """One of `input`, `output`, `inout`, `tristate`, or `passive`""" + + pinfunction: Optional[str] = None + """Optional function id""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(pin ...)`` + +v Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not pin + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'pin': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'name': object.name = item[1] + elif item[0] == 'num': object.num = item[1] + elif item[0] == 'type': object.pintype = item[1] + elif item[0] == 'pinfunction': object.pinfunction = item[1] + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(pin' + expression += f' (num "{dequote(self.num)}")' + expression += f' (name "{dequote(self.name)}")' + expression += f' (type "{dequote(self.pintype)}")' + if self.pinfunction is not None: + expression += f' (pinfunction "{dequote(self.pinfunction)}")' + expression += f'){endline}' + return expression + +@dataclass +class NetlistLibpart(): + lib: str = "" + """The logical name from the libraries section.""" + + part: str = "" + """The symbol name""" + + footprints: List[str] = field(default_factory=list) + """The footprint filters used to define which footprints are appropriate to use with the symbol.""" + + fields: List[NetlistField] = field(default_factory=list) + """The default fields associated with the symbol.""" + + pins: List[NetlistLibpartPin] = field(default_factory=list) + """The list of pins associated with the symbol""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object +https://docs.kicad.org/master/en/eeschema/eeschema.html#the-libparts-section + Args: + - exp (list): Part of parsed S-Expression ``(libpart ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not libpart + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'libpart': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'lib': object.lib = item[1] + elif item[0] == 'part': object.part = item[1] + elif item[0] == 'footprints': + for fp in item[1:]: + assert fp[0] == 'fp' + object.footprints.append(fp[1]) + elif item[0] == 'fields': + for comp in item[1:]: + object.fields.append(NetlistField().from_sexpr(comp)) + elif item[0] == 'pins': + for lib in item[1:]: + object.pins.append(NetlistLibpartPin().from_sexpr(lib)) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(libpart' + expression += f' (lib "{dequote(self.lib)}")' + expression += f' (part "{dequote(self.part)}")\n' + if len(self.footprints) > 0: + expression += f'{indents} (footprints\n' + for fp in self.footprints: + expression += f'{indents} (fp "{dequote(fp)}")\n' + expression += f"{indents} )\n" + + expression += f'{indents} (fields\n' + for field in self.fields: + expression += field.to_sexpr(indent+4) + expression += f"{indents} )\n" + + expression += f'{indents} (pins\n' + for pin in self.pins: + expression += pin.to_sexpr(indent+4) + expression += f"{indents} )\n" + + expression += f'{indents}){endline}' + return expression + + + +@dataclass +class NetlistNetNode(): + """A connection to a net""" + + ref: str = "" + """Component reference id""" + + pin: str = "" + """Pin number on the referenced component""" + + pintype: str = "" + """Pin type of the connection""" + + pinfunction: Optional[str] = None + """Pin function of the connection""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + + Args: + - exp (list): Part of parsed S-Expression ``(node ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not node + + Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'node': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + + if item[0] == 'pin': object.pin = item[1] + elif item[0] == 'ref': object.ref = item[1] + elif item[0] == 'pintype': object.pintype = item[1] + elif item[0] == 'pinfunction': object.pinfunction = item[1] + return object + + def to_sexpr(self, indent=0, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(node' + expression += f' (ref "{dequote(self.ref)}")' + expression += f' (pin "{dequote(self.pin)}")' + if self.pinfunction is not None: + expression += f' (pinfunction "{dequote(self.pinfunction)}")' + if self.pintype is not None: + expression += f' (pintype "{dequote(self.pintype)}")' + expression += f'){endline}' + return expression + +@dataclass +class NetlistNet(): + """A net in the design. This section describes the connectivity of the schematic by listing all nets and the pins connected to each net. + https://docs.kicad.org/master/en/eeschema/eeschema.html#the-nets-section +""" + + code: str = "" + """an internal identifier for this net""" + + name: str = "" + """The net name""" + + nodes: List[NetlistNetNode] = field(default_factory=list) + """The pin (identified by pin) of a symbol (identified by ref) which is connected to the net""" + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Schematic object + Args: + - exp (list): Part of parsed S-Expression ``(net ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not net + +b Returns: + - Schematic: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'net': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'code': object.code = item[1] + elif item[0] == 'name': object.name = item[1] + elif item[0] == 'node': + object.nodes.append(NetlistNetNode().from_sexpr(item)) + return object + + def to_sexpr(self, indent: int = 2, newline: bool = True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 2. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(net' + expression += f' (code "{dequote(self.code)}")' + expression += f' (name "{dequote(self.name)}")\n' + for node in self.nodes: + expression += node.to_sexpr(indent+2) + expression += f'{indents}){endline}' + return expression diff --git a/src/kiutils/netlist.py b/src/kiutils/netlist.py new file mode 100644 index 0000000..abc01c8 --- /dev/null +++ b/src/kiutils/netlist.py @@ -0,0 +1,156 @@ +"""Class to manage KiCad eeschema netlist export + +Author: + (C) Ashton Snelgrove - @yashton - 2024 + +License identifier: + GPL-3.0 + +Major changes: + 10.07.2024 - created + +Documentation taken from: + https://docs.kicad.org/master/en/eeschema/eeschema.html#netlist-export + https://docs.kicad.org/master/en/eeschema/eeschema.html#intermediate-netlist-structure +""" +from datetime import datetime +from dataclasses import dataclass, field +from typing import Optional, List, Union +from kiutils.utils import sexpr +from kiutils.items.netitems import * +from os import path + +@dataclass +class Netlist(): + version: str = "" + design: NetlistDesign = field(default_factory=lambda: NetlistDesign()) + components: List[NetlistComponent] = field(default_factory=list) + libraries: List[NetlistLibrary] = field(default_factory=list) + libparts: List[NetlistLibpart] = field(default_factory=list) + nets: List[NetlistNet] = field(default_factory=list) + + @classmethod + def from_sexpr(cls, exp: list): + """Convert the given S-Expression into a Netlist object + + Args: + - exp (list): Part of parsed S-Expression ``(netlist ...)`` + + Raises: + - Exception: When given parameter's type is not a list + - Exception: When the first item of the list is not netlist + + Returns: + - Netlist: Object of the class initialized with the given S-Expression + """ + if not isinstance(exp, list): + raise Exception("Expression does not have the correct type") + + if exp[0] != 'export': + raise Exception(f"Expression does not have the correct type: '{exp[0]}'") + + object = cls() + for item in exp[1:]: + if item[0] == 'version': object.version = item[1] + elif item[0] == 'design': object.design = NetlistDesign.from_sexpr(item) + elif item[0] == 'components': + for comp in item[1:]: + object.components.append(NetlistComponent().from_sexpr(comp)) + elif item[0] == 'libraries': + for lib in item[1:]: + object.libraries.append(NetlistLibrary().from_sexpr(lib)) + elif item[0] == 'libparts': + for symbol in item[1:]: + object.libparts.append(NetlistLibpart().from_sexpr(symbol)) + elif item[0] == 'nets': + for symbol in item[1:]: + object.nets.append(NetlistNet().from_sexpr(symbol)) + else: raise Exception(f"Unexpected list item '{item[0]}'") + return object + + @classmethod + def from_file(cls, filepath: str, encoding: Optional[str] = None): + """Load a netlist directly from a KiCad netlist export file and sets the + ``self.filePath`` attribute to the given file path. + + Args: + - filepath (str): Path or path-like object that points to the file + - encoding (str, optional): Encoding of the input file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If the given path is not a file + + Returns: + - Netlist: Object of the Netlist class initialized with the given netlist + """ + if not path.isfile(filepath): + raise Exception("Given path is not a file!") + + with open(filepath, 'r', encoding=encoding) as infile: + item = cls.from_sexpr(sexpr.parse_sexp(infile.read())) + item.filePath = filepath + return item + + def to_file(self, filepath = None, encoding: Optional[str] = None): + """Save the object to a file in S-Expression format + + Args: + - filepath (str, optional): Path-like string to the file. Defaults to None. If not set, + the attribute ``self.filePath`` will be used instead. + - encoding (str, optional): Encoding of the output file. Defaults to None (platform + dependent encoding). + + Raises: + - Exception: If no file path is given via the argument or via `self.filePath` + """ + if filepath is None: + if self.filePath is None: + raise Exception("File path not set") + filepath = self.filePath + + with open(filepath, 'w', encoding=encoding) as outfile: + outfile.write(self.to_sexpr()) + + def to_sexpr(self, indent=0, newline=True) -> str: + """Generate the S-Expression representing this object + + Args: + - indent (int): Number of whitespaces used to indent the output. Defaults to 0. + - newline (bool): Adds a newline to the end of the output. Defaults to True. + + Returns: + - str: S-Expression of this object + """ + indents = ' '*indent + endline = '\n' if newline else '' + + expression = f'{indents}(export (version "{dequote(self.version)}")\n' + if self.design is not None: + expression += self.design.to_sexpr(indent+2) + if self.components: + expression += '\n' + expression += ' (components\n' + for item in self.components: + expression += item.to_sexpr(indent+4) + expression += ' )\n' + if self.libparts: + expression += '\n' + expression += ' (libparts\n' + for item in self.libparts: + expression += item.to_sexpr(indent+4) + expression += ' )\n' + if self.libraries: + expression += '\n' + expression += ' (libraries\n' + for item in self.libraries: + expression += item.to_sexpr(indent+4) + expression += ' )\n' + if self.nets: + expression += '\n' + expression += ' (nets\n' + for item in self.nets: + expression += item.to_sexpr(indent+4) + expression += ' )\n' + expression += f'{indents}){endline}' + return expression diff --git a/test.py b/test.py index 7daeb33..5e7e1e5 100644 --- a/test.py +++ b/test.py @@ -26,7 +26,7 @@ from tests.test_worksheets import * from tests.test_misc import * from tests.reporter.runner import HTMLTestRunner - +from tests.test_netlist import * if __name__ == "__main__": unittest.main(testRunner=HTMLTestRunner( combine_reports = True, @@ -34,4 +34,4 @@ report_title = 'KiUtils Unittest Report', report_name = 'KiUtils_Testreport', open_in_browser = True - )) \ No newline at end of file + )) diff --git a/tests/test_netlist.py b/tests/test_netlist.py new file mode 100644 index 0000000..bddf409 --- /dev/null +++ b/tests/test_netlist.py @@ -0,0 +1,83 @@ +"""Unittests of netlist related classes + +Authors: + (C) Ashton Snelgrove - @yashton - 2024 + +License identifier: + GPL-3.0 +""" + +import unittest +import os +import tempfile +from tests.testfunctions import to_file_and_compare, prepare_test, cleanup_after_test, TEST_BASE +from kiutils.netlist import Netlist +from kiutils.utils import sexpr + +NETLIST_BASE = os.path.join(TEST_BASE, 'netlist') + +class Tests_Netlist(unittest.TestCase): + """Test cases for Netlists""" + + def setUp(self) -> None: + prepare_test(self) + return super().setUp() + + def test_givenExample(self): + """Tests the parsing of the example given in the documentation.""" + + self.testData.compareToTestFile = True + self.testData.pathToTestFile = os.path.join(NETLIST_BASE, 'example.net') + netlist = Netlist().from_file(self.testData.pathToTestFile) + result = Netlist().from_sexpr(sexpr.parse_sexp(netlist.to_sexpr())) + self.assertNetlistEqual(netlist, result) + + def test_hierarchical(self): + """Tests the parsing of the example given in the documentation.""" + + self.testData.compareToTestFile = True + self.testData.pathToTestFile = os.path.join(NETLIST_BASE, 'hierarchical.net') + netlist = Netlist().from_file(self.testData.pathToTestFile) + result = Netlist().from_sexpr(sexpr.parse_sexp(netlist.to_sexpr())) + self.assertNetlistEqual(netlist, result) + + def assertNetlistEqual(self, netlist, result): + # Note this asserts order is preserved + self.assertEqual(netlist.design, result.design) + for given, got in zip(netlist.components, result.components): + self.assertComponentEqual(given, got) + for given, got in zip(netlist.libparts, result.libparts): + self.assertPartEqual(given, got) + for given, got in zip(netlist.libraries, result.libraries): + self.assertEqual(given, got) + for given, got in zip(netlist.nets, result.nets): + self.assertNetEqual(given, got) + # Global check in case more detailed comparisons miss something + self.assertEqual(given, got) + + def assertNetEqual(self, given, got): + self.assertEqual(given.code, got.code) + self.assertEqual(given.name, got.name) + for left, right in zip(given.nodes, got.nodes): + self.assertEqual(left, right) + + def assertComponentEqual(self, given, got): + self.assertEqual(given.ref, got.ref) + self.assertEqual(given.value, got.value) + self.assertEqual(given.libsource, got.libsource) + self.assertEqual(given.sheetpath, got.sheetpath) + self.assertEqual(given.tstamps, got.tstamps) + for left, right in zip(given.fields, got.fields): + self.assertEqual(left, right) + for left, right in zip(given.properties, got.properties): + self.assertEqual(left, right) + + def assertPartEqual(self, given, got): + self.assertEqual(given.lib, got.lib) + self.assertEqual(given.part, got.part) + for left, right in zip(given.footprints, got.footprints): + self.assertEqual(left, right) + for left, right in zip(given.fields, got.fields): + self.assertEqual(left, right) + for left, right in zip(given.pins, got.pins): + self.assertEqual(left, right) diff --git a/tests/testdata/netlist/example.net b/tests/testdata/netlist/example.net new file mode 100644 index 0000000..4df8f35 --- /dev/null +++ b/tests/testdata/netlist/example.net @@ -0,0 +1,196 @@ +(export (version "E") + (design + (source "/usr/share/kicad/demos/simulation/sallen_key/sallen_key.kicad_sch") + (date "Sun 01 May 2022 03:14:05 PM EDT") + (tool "Eeschema (6.0.4)") + (sheet (number "1") (name "/") (tstamps "/") + (title_block + (title) + (company) + (rev) + (date) + (source "sallen_key.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value ""))))) + (components + (comp (ref "C1") + (value "100n") + (libsource (lib "sallen_key_schlib") (part "C") (description "")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-00005789077d")) + (comp (ref "C2") + (value "100n") + (fields + (field (name "Fieldname") "Value") + (field (name "SpiceMapping") "1 2") + (field (name "Spice_Primitive") "C")) + (libsource (lib "sallen_key_schlib") (part "C") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "Spice_Primitive") (value "C")) + (property (name "SpiceMapping") (value "1 2")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-00005789085b")) + (comp (ref "R1") + (value "1k") + (fields + (field (name "Fieldname") "Value") + (field (name "SpiceMapping") "1 2") + (field (name "Spice_Primitive") "R")) + (libsource (lib "sallen_key_schlib") (part "R") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "SpiceMapping") (value "1 2")) + (property (name "Spice_Primitive") (value "R")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-0000578906ff")) + (comp (ref "R2") + (value "1k") + (fields + (field (name "Fieldname") "Value") + (field (name "SpiceMapping") "1 2") + (field (name "Spice_Primitive") "R")) + (libsource (lib "sallen_key_schlib") (part "R") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "SpiceMapping") (value "1 2")) + (property (name "Spice_Primitive") (value "R")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-000057890691")) + (comp (ref "U1") + (value "AD8051") + (fields + (field (name "Spice_Lib_File") "ad8051.lib") + (field (name "Spice_Model") "AD8051") + (field (name "Spice_Netlist_Enabled") "Y") + (field (name "Spice_Primitive") "X")) + (libsource (lib "sallen_key_schlib") (part "Generic_Opamp") (description "")) + (property (name "Spice_Primitive") (value "X")) + (property (name "Spice_Model") (value "AD8051")) + (property (name "Spice_Lib_File") (value "ad8051.lib")) + (property (name "Spice_Netlist_Enabled") (value "Y")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-00005788ff9f")) + (comp (ref "V1") + (value "AC 1") + (libsource (lib "sallen_key_schlib") (part "VSOURCE") (description "")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-000057336052")) + (comp (ref "V2") + (value "DC 10") + (fields + (field (name "Fieldname") "Value") + (field (name "Spice_Node_Sequence") "1 2") + (field (name "Spice_Primitive") "V")) + (libsource (lib "sallen_key_schlib") (part "VSOURCE") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "Spice_Primitive") (value "V")) + (property (name "Spice_Node_Sequence") (value "1 2")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-0000578900ba")) + (comp (ref "V3") + (value "DC 10") + (fields + (field (name "Fieldname") "Value") + (field (name "Spice_Node_Sequence") "1 2") + (field (name "Spice_Primitive") "V")) + (libsource (lib "sallen_key_schlib") (part "VSOURCE") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "Spice_Primitive") (value "V")) + (property (name "Spice_Node_Sequence") (value "1 2")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-000057890232"))) + (libparts + (libpart (lib "sallen_key_schlib") (part "C") + (footprints + (fp "C?") + (fp "C_????_*") + (fp "C_????") + (fp "SMD*_c") + (fp "Capacitor*")) + (fields + (field (name "Reference") "C") + (field (name "Value") "C")) + (pins + (pin (num "1") (name "") (type "passive")) + (pin (num "2") (name "") (type "passive")))) + (libpart (lib "sallen_key_schlib") (part "Generic_Opamp") + (fields + (field (name "Reference") "U") + (field (name "Value") "Generic_Opamp")) + (pins + (pin (num "1") (name "+") (type "input")) + (pin (num "2") (name "-") (type "input")) + (pin (num "3") (name "V+") (type "power_in")) + (pin (num "4") (name "V-") (type "power_in")) + (pin (num "5") (name "") (type "output")))) + (libpart (lib "sallen_key_schlib") (part "R") + (footprints + (fp "R_*") + (fp "Resistor_*")) + (fields + (field (name "Reference") "R") + (field (name "Value") "R")) + (pins + (pin (num "1") (name "") (type "passive")) + (pin (num "2") (name "") (type "passive")))) + (libpart (lib "sallen_key_schlib") (part "VSOURCE") + (fields + (field (name "Reference") "V") + (field (name "Value") "VSOURCE") + (field (name "Fieldname") "Value") + (field (name "Spice_Primitive") "V") + (field (name "Spice_Node_Sequence") "1 2")) + (pins + (pin (num "1") (name "") (type "input")) + (pin (num "2") (name "") (type "input"))))) + (libraries + (library (logical "sallen_key_schlib") + (uri "/usr/share/kicad/demos/simulation/sallen_key/sallen_key_schlib.kicad_sym"))) + (nets + (net (code "1") (name "/lowpass") + (node (ref "C1") (pin "1") (pintype "passive")) + (node (ref "U1") (pin "2") (pinfunction "-") (pintype "input")) + (node (ref "U1") (pin "5") (pintype "output"))) + (net (code "2") (name "GND") + (node (ref "C2") (pin "2") (pintype "passive")) + (node (ref "V1") (pin "2") (pintype "input")) + (node (ref "V2") (pin "2") (pintype "input")) + (node (ref "V3") (pin "1") (pintype "input"))) + (net (code "3") (name "Net-(C1-Pad2)") + (node (ref "C1") (pin "2") (pintype "passive")) + (node (ref "R1") (pin "1") (pintype "passive")) + (node (ref "R2") (pin "2") (pintype "passive"))) + (net (code "4") (name "Net-(C2-Pad1)") + (node (ref "C2") (pin "1") (pintype "passive")) + (node (ref "R2") (pin "1") (pintype "passive")) + (node (ref "U1") (pin "1") (pinfunction "+") (pintype "input"))) + (net (code "5") (name "Net-(R1-Pad2)") + (node (ref "R1") (pin "2") (pintype "passive")) + (node (ref "V1") (pin "1") (pintype "input"))) + (net (code "6") (name "VDD") + (node (ref "U1") (pin "3") (pinfunction "V+") (pintype "power_in")) + (node (ref "V2") (pin "1") (pintype "input"))) + (net (code "7") (name "VSS") + (node (ref "U1") (pin "4") (pinfunction "V-") (pintype "power_in")) + (node (ref "V3") (pin "2") (pintype "input"))))) diff --git a/tests/testdata/netlist/example.net.output b/tests/testdata/netlist/example.net.output new file mode 100644 index 0000000..18733d4 --- /dev/null +++ b/tests/testdata/netlist/example.net.output @@ -0,0 +1,243 @@ +(export (version "E") + (design + (source "/usr/share/kicad/demos/simulation/sallen_key/sallen_key.kicad_sch") + (date "Sun 01 May 2022 03:14:05 PM EDT") + (tool "Eeschema (6.0.4)") + (sheet (number "1") (name "/") (tstamps "/") + (title_block + (title) + (company) + (rev) + (date) + (source "sallen_key.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value "")) + ) + ) + ) + + (components + (comp (ref "C1") + (value "100n") + (libsource (lib "sallen_key_schlib") (part "C") (description "")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-00005789077d") + ) + (comp (ref "C2") + (value "100n") + (fields + (field (name "Fieldname") "Value") + (field (name "SpiceMapping") "1 2") + (field (name "Spice_Primitive") "C") + ) + (libsource (lib "sallen_key_schlib") (part "C") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "Spice_Primitive") (value "C")) + (property (name "SpiceMapping") (value "1 2")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-00005789085b") + ) + (comp (ref "R1") + (value "1k") + (fields + (field (name "Fieldname") "Value") + (field (name "SpiceMapping") "1 2") + (field (name "Spice_Primitive") "R") + ) + (libsource (lib "sallen_key_schlib") (part "R") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "SpiceMapping") (value "1 2")) + (property (name "Spice_Primitive") (value "R")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-0000578906ff") + ) + (comp (ref "R2") + (value "1k") + (fields + (field (name "Fieldname") "Value") + (field (name "SpiceMapping") "1 2") + (field (name "Spice_Primitive") "R") + ) + (libsource (lib "sallen_key_schlib") (part "R") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "SpiceMapping") (value "1 2")) + (property (name "Spice_Primitive") (value "R")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-000057890691") + ) + (comp (ref "U1") + (value "AD8051") + (fields + (field (name "Spice_Lib_File") "ad8051.lib") + (field (name "Spice_Model") "AD8051") + (field (name "Spice_Netlist_Enabled") "Y") + (field (name "Spice_Primitive") "X") + ) + (libsource (lib "sallen_key_schlib") (part "Generic_Opamp") (description "")) + (property (name "Spice_Primitive") (value "X")) + (property (name "Spice_Model") (value "AD8051")) + (property (name "Spice_Lib_File") (value "ad8051.lib")) + (property (name "Spice_Netlist_Enabled") (value "Y")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-00005788ff9f") + ) + (comp (ref "V1") + (value "AC 1") + (libsource (lib "sallen_key_schlib") (part "VSOURCE") (description "")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-000057336052") + ) + (comp (ref "V2") + (value "DC 10") + (fields + (field (name "Fieldname") "Value") + (field (name "Spice_Node_Sequence") "1 2") + (field (name "Spice_Primitive") "V") + ) + (libsource (lib "sallen_key_schlib") (part "VSOURCE") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "Spice_Primitive") (value "V")) + (property (name "Spice_Node_Sequence") (value "1 2")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-0000578900ba") + ) + (comp (ref "V3") + (value "DC 10") + (fields + (field (name "Fieldname") "Value") + (field (name "Spice_Node_Sequence") "1 2") + (field (name "Spice_Primitive") "V") + ) + (libsource (lib "sallen_key_schlib") (part "VSOURCE") (description "")) + (property (name "Fieldname") (value "Value")) + (property (name "Spice_Primitive") (value "V")) + (property (name "Spice_Node_Sequence") (value "1 2")) + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "sallen_key.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "00000000-0000-0000-0000-000057890232") + ) + ) + + (libparts + (libpart (lib "sallen_key_schlib") (part "C") + (footprints + (fp "C?") + (fp "C_????_*") + (fp "C_????") + (fp "SMD*_c") + (fp "Capacitor*") + ) + (fields + (field (name "Reference") "C") + (field (name "Value") "C") + ) + (pins + (pin (num "1") (name "") (type "passive")) + (pin (num "2") (name "") (type "passive")) + ) + ) + (libpart (lib "sallen_key_schlib") (part "Generic_Opamp") + (fields + (field (name "Reference") "U") + (field (name "Value") "Generic_Opamp") + ) + (pins + (pin (num "1") (name "+") (type "input")) + (pin (num "2") (name "-") (type "input")) + (pin (num "3") (name "V+") (type "power_in")) + (pin (num "4") (name "V-") (type "power_in")) + (pin (num "5") (name "") (type "output")) + ) + ) + (libpart (lib "sallen_key_schlib") (part "R") + (footprints + (fp "R_*") + (fp "Resistor_*") + ) + (fields + (field (name "Reference") "R") + (field (name "Value") "R") + ) + (pins + (pin (num "1") (name "") (type "passive")) + (pin (num "2") (name "") (type "passive")) + ) + ) + (libpart (lib "sallen_key_schlib") (part "VSOURCE") + (fields + (field (name "Reference") "V") + (field (name "Value") "VSOURCE") + (field (name "Fieldname") "Value") + (field (name "Spice_Primitive") "V") + (field (name "Spice_Node_Sequence") "1 2") + ) + (pins + (pin (num "1") (name "") (type "input")) + (pin (num "2") (name "") (type "input")) + ) + ) + ) + + (libraries + (library (logical "sallen_key_schlib") + (uri "/usr/share/kicad/demos/simulation/sallen_key/sallen_key_schlib.kicad_sym")) + ) + + (nets + (net (code "1") (name "/lowpass") + (node (ref "C1") (pin "1") (pintype "passive")) + (node (ref "U1") (pin "2") (pinfunction "-") (pintype "input")) + (node (ref "U1") (pin "5") (pintype "output")) + ) + (net (code "2") (name "GND") + (node (ref "C2") (pin "2") (pintype "passive")) + (node (ref "V1") (pin "2") (pintype "input")) + (node (ref "V2") (pin "2") (pintype "input")) + (node (ref "V3") (pin "1") (pintype "input")) + ) + (net (code "3") (name "Net-(C1-Pad2)") + (node (ref "C1") (pin "2") (pintype "passive")) + (node (ref "R1") (pin "1") (pintype "passive")) + (node (ref "R2") (pin "2") (pintype "passive")) + ) + (net (code "4") (name "Net-(C2-Pad1)") + (node (ref "C2") (pin "1") (pintype "passive")) + (node (ref "R2") (pin "1") (pintype "passive")) + (node (ref "U1") (pin "1") (pinfunction "+") (pintype "input")) + ) + (net (code "5") (name "Net-(R1-Pad2)") + (node (ref "R1") (pin "2") (pintype "passive")) + (node (ref "V1") (pin "1") (pintype "input")) + ) + (net (code "6") (name "VDD") + (node (ref "U1") (pin "3") (pinfunction "V+") (pintype "power_in")) + (node (ref "V2") (pin "1") (pintype "input")) + ) + (net (code "7") (name "VSS") + (node (ref "U1") (pin "4") (pinfunction "V-") (pintype "power_in")) + (node (ref "V3") (pin "2") (pintype "input")) + ) + ) +) diff --git a/tests/testdata/netlist/hierarchical.net b/tests/testdata/netlist/hierarchical.net new file mode 100644 index 0000000..d20f030 --- /dev/null +++ b/tests/testdata/netlist/hierarchical.net @@ -0,0 +1,1232 @@ +(export (version "E") + (design + (source "/home/snelgrov/kicad_exploration/kinase/exploration.kicad_sch") + (date "2024-06-27T14:37:45-0600") + (tool "Eeschema 8.0.3") + (sheet (number "1") (name "/") (tstamps "/") + (title_block + (title) + (company) + (rev) + (date) + (source "exploration.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value "")))) + (sheet (number "2") (name "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/") + (title_block + (title) + (company) + (rev) + (date) + (source "component.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value "")))) + (sheet (number "3") (name "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/") + (title_block + (title) + (company) + (rev) + (date) + (source "component.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value ""))))) + (components + (comp (ref "J1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "flushing_interface_04x08") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "e35e08eb-b14f-4fdd-a4e7-9bf06ee86b78")) + (comp (ref "J2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "82d081ab-082c-45f3-864e-12b126dbfc33")) + (comp (ref "J3") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "44b820c8-3df3-49b0-bc95-928cf4da74fd")) + (comp (ref "J4") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "6b033fcb-2c95-4f80-80cb-8f274bebc078")) + (comp (ref "J5") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "66f6c150-d422-4436-9eb3-417c9661f4c3")) + (comp (ref "J6") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "65a3ada0-e0e2-4f5b-8e38-2e5915873cc0")) + (comp (ref "J7") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "e23f2052-387c-4207-85f4-03458fb82cde")) + (comp (ref "J8") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "b105ed69-b9ed-464c-b0b3-beedaf0b383f")) + (comp (ref "J9") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "d6cd2a1b-b9d2-4135-9217-4447879ed242")) + (comp (ref "J10") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "d2bf6edd-9c4a-493e-a4d6-9b466242fdec")) + (comp (ref "J11") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "5afcf1b8-012b-4f59-8e60-d53f6897075e")) + (comp (ref "J12") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "51d36340-4751-4a79-bd77-061b6ab83a5c")) + (comp (ref "J13") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "bc59df1d-2b66-4f42-8aa8-c1db54f5d2fe")) + (comp (ref "J14") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "5f01d993-4c75-43c4-92f8-c8bdfe6957c5")) + (comp (ref "J15") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "898f7001-27ff-4dd3-918f-557506629561")) + (comp (ref "J16") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "fde2b834-ae83-49f6-b3c0-17e8819bb13c")) + (comp (ref "U1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "sensor_radiation") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "f322418e-312a-4f00-8575-dd7abf48ca79")) + (comp (ref "U2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "sensor_radiation") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "7c1e01b8-e55e-4f5a-b432-c7ad32e75d29")) + (comp (ref "C1") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "11ccc61e-7e29-4121-898a-50aed0f2374d")) + (comp (ref "C2") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "2cfe4f0d-ef53-4ab7-b383-df16f7d3246f")) + (comp (ref "C3") + (value "42") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "length") "10m") + (field (name "width") "10u") + (field (name "height") "10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "length") (value "10m")) + (property (name "width") (value "10u")) + (property (name "height") (value "10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "52c25e0b-e689-47e9-95e1-c84dfc1372f7")) + (comp (ref "C4") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "34f9966b-b06f-467a-afeb-44d529d57a13")) + (comp (ref "P1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "da5a8c3b-87f0-49f5-b306-3eae0963d2a5")) + (comp (ref "P2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "pump_3") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "a6c2a337-c5c6-4b23-ba46-77d13bead410")) + (comp (ref "P3") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e0597333-c903-41a4-a3f5-b8ee8363359b")) + (comp (ref "V1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "mux_3") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "d4c936a2-46a8-4670-a8c6-9b9b9428dfda")) + (comp (ref "V2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "1623e12e-77e7-40c9-bba0-8a7967a428c3")) + (comp (ref "V3") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "8f977f37-95fe-44d7-94c8-9ab145a7ae00")) + (comp (ref "V4") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "54185cda-d4a9-4571-92bf-3375f0962238")) + (comp (ref "V5") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "a52bb754-876b-46b0-8fec-65a342115d6c")) + (comp (ref "V6") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "9442cc3a-5329-4f9e-911a-7e53ad6c6505")) + (comp (ref "V7") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "bfeb718b-2cbd-4fea-8d97-efb6f2a402a8")) + (comp (ref "V8") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "6dbad102-50f8-4aed-9c46-cee485db79a6")) + (comp (ref "V9") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e8c443a5-8a14-4930-a959-e3071b172582")) + (comp (ref "V10") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "59427e37-a339-4271-92c4-2b447765c92d")) + (comp (ref "V11") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "661df5c9-4640-4117-b12a-0900cab96360")) + (comp (ref "V12") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e06ccfa5-cd2a-41f3-8f88-2998761289b7")) + (comp (ref "V13") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "f6edf2c9-b9b4-4569-9896-a7f9d5307a2b")) + (comp (ref "V14") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "04933428-9e70-4816-ac5b-9d93c26ee2d9")) + (comp (ref "V15") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e68a3854-ba61-4946-bfc0-071fcb9c7774")) + (comp (ref "C5") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "11ccc61e-7e29-4121-898a-50aed0f2374d")) + (comp (ref "C6") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "2cfe4f0d-ef53-4ab7-b383-df16f7d3246f")) + (comp (ref "C7") + (value "42") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "length") "10m") + (field (name "width") "10u") + (field (name "height") "10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "length") (value "10m")) + (property (name "width") (value "10u")) + (property (name "height") (value "10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "52c25e0b-e689-47e9-95e1-c84dfc1372f7")) + (comp (ref "C8") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "34f9966b-b06f-467a-afeb-44d529d57a13")) + (comp (ref "P4") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "da5a8c3b-87f0-49f5-b306-3eae0963d2a5")) + (comp (ref "P5") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "pump_3") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "a6c2a337-c5c6-4b23-ba46-77d13bead410")) + (comp (ref "P6") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e0597333-c903-41a4-a3f5-b8ee8363359b")) + (comp (ref "V16") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "mux_3") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "d4c936a2-46a8-4670-a8c6-9b9b9428dfda")) + (comp (ref "V17") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "1623e12e-77e7-40c9-bba0-8a7967a428c3")) + (comp (ref "V18") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "8f977f37-95fe-44d7-94c8-9ab145a7ae00")) + (comp (ref "V19") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "54185cda-d4a9-4571-92bf-3375f0962238")) + (comp (ref "V20") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "a52bb754-876b-46b0-8fec-65a342115d6c")) + (comp (ref "V21") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "9442cc3a-5329-4f9e-911a-7e53ad6c6505")) + (comp (ref "V22") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "bfeb718b-2cbd-4fea-8d97-efb6f2a402a8")) + (comp (ref "V23") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "6dbad102-50f8-4aed-9c46-cee485db79a6")) + (comp (ref "V24") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e8c443a5-8a14-4930-a959-e3071b172582")) + (comp (ref "V25") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "59427e37-a339-4271-92c4-2b447765c92d")) + (comp (ref "V26") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "661df5c9-4640-4117-b12a-0900cab96360")) + (comp (ref "V27") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e06ccfa5-cd2a-41f3-8f88-2998761289b7")) + (comp (ref "V28") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "f6edf2c9-b9b4-4569-9896-a7f9d5307a2b")) + (comp (ref "V29") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "04933428-9e70-4816-ac5b-9d93c26ee2d9")) + (comp (ref "V30") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e68a3854-ba61-4946-bfc0-071fcb9c7774"))) + (libparts + (libpart (lib "mfda") (part "chamber") + (fields + (field (name "Reference") "R") + (field (name "Value") "${SIM.PARAMS}") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u")) + (pins + (pin (num "1") (name "in") (type "passive")) + (pin (num "2") (name "out") (type "passive")))) + (libpart (lib "mfda") (part "flushing_interface_04x08") + (fields + (field (name "Reference") "J") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "") (type "passive")) + (pin (num "2") (name "") (type "passive")) + (pin (num "3") (name "") (type "passive")) + (pin (num "4") (name "") (type "passive")) + (pin (num "5") (name "") (type "passive")) + (pin (num "6") (name "") (type "passive")) + (pin (num "7") (name "") (type "passive")) + (pin (num "8") (name "") (type "passive")) + (pin (num "9") (name "") (type "passive")) + (pin (num "10") (name "") (type "passive")) + (pin (num "11") (name "") (type "passive")) + (pin (num "12") (name "") (type "passive")) + (pin (num "13") (name "") (type "passive")) + (pin (num "14") (name "") (type "passive")) + (pin (num "15") (name "") (type "passive")) + (pin (num "16") (name "") (type "passive")) + (pin (num "17") (name "") (type "passive")) + (pin (num "18") (name "") (type "passive")) + (pin (num "19") (name "") (type "passive")) + (pin (num "20") (name "") (type "passive")) + (pin (num "21") (name "") (type "passive")) + (pin (num "22") (name "") (type "passive")) + (pin (num "23") (name "") (type "passive")) + (pin (num "24") (name "") (type "passive")) + (pin (num "25") (name "") (type "passive")) + (pin (num "26") (name "") (type "passive")) + (pin (num "27") (name "") (type "passive")) + (pin (num "28") (name "") (type "passive")) + (pin (num "29") (name "") (type "passive")) + (pin (num "30") (name "") (type "passive")) + (pin (num "31") (name "") (type "passive")) + (pin (num "32") (name "") (type "passive")))) + (libpart (lib "mfda") (part "mux_3") + (fields + (field (name "Reference") "V") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "a") (type "input")) + (pin (num "2") (name "b") (type "input")) + (pin (num "3") (name "c") (type "input")) + (pin (num "4") (name "sa") (type "input")) + (pin (num "5") (name "sb") (type "input")) + (pin (num "6") (name "sc") (type "input")) + (pin (num "7") (name "y") (type "output")))) + (libpart (lib "mfda") (part "pump_1") + (fields + (field (name "Reference") "P") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")) + (pin (num "3") (name "pump_1") (type "input")))) + (libpart (lib "mfda") (part "pump_3") + (fields + (field (name "Reference") "P") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")) + (pin (num "3") (name "pump_1") (type "input")) + (pin (num "4") (name "pump_2") (type "input")) + (pin (num "5") (name "pump_3") (type "input")))) + (libpart (lib "mfda") (part "sensor_radiation") + (fields + (field (name "Reference") "S") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")))) + (libpart (lib "mfda") (part "tube_connector") + (fields + (field (name "Reference") "J") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "connect") (type "passive")))) + (libpart (lib "mfda") (part "valve") + (fields + (field (name "Reference") "V") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "left") (type "bidirectional")) + (pin (num "2") (name "right") (type "bidirectional")) + (pin (num "3") (name "control") (type "input")))) + (libpart (lib "mfda") (part "valve_sieve") + (fields + (field (name "Reference") "V") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description"))) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")) + (pin (num "3") (name "control") (type "input"))))) + (libraries + (library (logical "mfda") + (uri "/home/snelgrov/kicad_exploration/kinase/../mfda.kicad_sym"))) + (nets + (net (code "1") (name "/component/control.circulate1") + (node (ref "J1") (pin "14") (pintype "passive")) + (node (ref "V22") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V7") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "2") (name "/component/control.circulate2") + (node (ref "J1") (pin "10") (pintype "passive")) + (node (ref "V18") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V3") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "3") (name "/component/control.circulate3") + (node (ref "J1") (pin "11") (pintype "passive")) + (node (ref "V19") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V4") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "4") (name "/component/control.circulate_in") + (node (ref "J1") (pin "9") (pintype "passive")) + (node (ref "V17") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V2") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "5") (name "/component/control.circulate_out") + (node (ref "J1") (pin "16") (pintype "passive")) + (node (ref "V24") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V9") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "6") (name "/component/control.filter1") + (node (ref "J1") (pin "12") (pintype "passive")) + (node (ref "V20") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V5") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "7") (name "/component/control.filter2") + (node (ref "J1") (pin "13") (pintype "passive")) + (node (ref "V21") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V6") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "8") (name "/component/control.filter3") + (node (ref "J1") (pin "24") (pintype "passive")) + (node (ref "V13") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V28") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "9") (name "/component/control.filter4") + (node (ref "J1") (pin "23") (pintype "passive")) + (node (ref "V12") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V27") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "10") (name "/component/control.fluid_in1") + (node (ref "J1") (pin "7") (pintype "passive")) + (node (ref "J11") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "J14") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "4") (pinfunction "sa") (pintype "input")) + (node (ref "V16") (pin "4") (pinfunction "sa") (pintype "input"))) + (net (code "11") (name "/component/control.fluid_in2") + (node (ref "J1") (pin "6") (pintype "passive")) + (node (ref "J12") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "J15") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "5") (pinfunction "sb") (pintype "input")) + (node (ref "V16") (pin "5") (pinfunction "sb") (pintype "input"))) + (net (code "12") (name "/component/control.fluid_in3") + (node (ref "J1") (pin "5") (pintype "passive")) + (node (ref "J13") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "J16") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "6") (pinfunction "sc") (pintype "input")) + (node (ref "V16") (pin "6") (pinfunction "sc") (pintype "input"))) + (net (code "13") (name "/component/control.flush1") + (node (ref "J1") (pin "15") (pintype "passive")) + (node (ref "V23") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V8") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "14") (name "/component/control.flush2") + (node (ref "J1") (pin "17") (pintype "passive")) + (node (ref "V10") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V25") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "15") (name "/component/control.flush3") + (node (ref "J1") (pin "19") (pintype "passive")) + (node (ref "V15") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V30") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "16") (name "/component/control.out") + (node (ref "J1") (pin "22") (pintype "passive")) + (node (ref "V14") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V29") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "17") (name "/component/control.stage") + (node (ref "J1") (pin "18") (pintype "passive")) + (node (ref "V11") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V26") (pin "3") (pinfunction "control") (pintype "input"))) + (net (code "19") (name "/component/fluid_in1") + (node (ref "J2") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "1") (pinfunction "a") (pintype "input")) + (node (ref "V16") (pin "1") (pinfunction "a") (pintype "input"))) + (net (code "20") (name "/component/fluid_in2") + (node (ref "J3") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "2") (pinfunction "b") (pintype "input")) + (node (ref "V16") (pin "2") (pinfunction "b") (pintype "input"))) + (net (code "21") (name "/component/fluid_in3") + (node (ref "J4") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "3") (pinfunction "c") (pintype "input"))) + (net (code "22") (name "/component/flush_1") + (node (ref "J7") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V23") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V8") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "23") (name "/component/flush_2") + (node (ref "J8") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V10") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V25") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "24") (name "/component/flush_3") + (node (ref "J9") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V15") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V30") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "25") (name "/component/foo") + (node (ref "C1") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V3") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "26") (name "/component/out") + (node (ref "U1") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V14") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "27") (name "/component/pump1") + (node (ref "J1") (pin "1") (pintype "passive")) + (node (ref "P2") (pin "3") (pinfunction "pump_1") (pintype "input")) + (node (ref "P5") (pin "3") (pinfunction "pump_1") (pintype "input"))) + (net (code "28") (name "/component/pump2") + (node (ref "J1") (pin "2") (pintype "passive")) + (node (ref "P2") (pin "4") (pinfunction "pump_2") (pintype "input")) + (node (ref "P5") (pin "4") (pinfunction "pump_2") (pintype "input"))) + (net (code "29") (name "/component/pump3") + (node (ref "J1") (pin "3") (pintype "passive")) + (node (ref "P2") (pin "5") (pinfunction "pump_3") (pintype "input")) + (node (ref "P5") (pin "5") (pinfunction "pump_3") (pintype "input"))) + (net (code "30") (name "/component/pump4") + (node (ref "J1") (pin "4") (pintype "passive")) + (node (ref "P3") (pin "3") (pinfunction "pump_1") (pintype "input")) + (node (ref "P6") (pin "3") (pinfunction "pump_1") (pintype "input"))) + (net (code "31") (name "/component/pump5") + (node (ref "J1") (pin "8") (pintype "passive")) + (node (ref "P1") (pin "3") (pinfunction "pump_1") (pintype "input")) + (node (ref "P4") (pin "3") (pinfunction "pump_1") (pintype "input"))) + (net (code "33") (name "/component1/fluid_in3") + (node (ref "J10") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V16") (pin "3") (pinfunction "c") (pintype "input"))) + (net (code "34") (name "/component1/foo") + (node (ref "C5") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V18") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "35") (name "/component1/out") + (node (ref "U2") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V29") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "36") (name "Net-(C1-out)") + (node (ref "C1") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P2") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "37") (name "Net-(C2-in)") + (node (ref "C2") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P3") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "38") (name "Net-(C2-out)") + (node (ref "C2") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P1") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "39") (name "Net-(C3-in)") + (node (ref "C3") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P2") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "40") (name "Net-(C3-out)") + (node (ref "C3") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V7") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V8") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "41") (name "Net-(C4-in)") + (node (ref "C4") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V12") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "42") (name "Net-(C4-out)") + (node (ref "C4") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V13") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "43") (name "Net-(C5-out)") + (node (ref "C5") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P5") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "44") (name "Net-(C6-in)") + (node (ref "C6") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P6") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "45") (name "Net-(C6-out)") + (node (ref "C6") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P4") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "46") (name "Net-(C7-in)") + (node (ref "C7") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P5") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "47") (name "Net-(C7-out)") + (node (ref "C7") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V22") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V23") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "48") (name "Net-(C8-in)") + (node (ref "C8") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V27") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "49") (name "Net-(C8-out)") + (node (ref "C8") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V28") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "50") (name "Net-(J5-connect)") + (node (ref "J5") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "U1") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "51") (name "Net-(J6-connect)") + (node (ref "J6") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "U2") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "52") (name "Net-(P1-out)") + (node (ref "P1") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V5") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "53") (name "Net-(P3-in)") + (node (ref "P3") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V6") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "54") (name "Net-(P4-out)") + (node (ref "P4") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V20") (pin "1") (pinfunction "in") (pintype "input"))) + (net (code "55") (name "Net-(P6-in)") + (node (ref "P6") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V21") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "56") (name "Net-(V1-y)") + (node (ref "V1") (pin "7") (pinfunction "y") (pintype "output")) + (node (ref "V2") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "57") (name "Net-(V2-left)") + (node (ref "V2") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V3") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V4") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "58") (name "Net-(V4-right)") + (node (ref "V4") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V5") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "59") (name "Net-(V6-in)") + (node (ref "V6") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V7") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V9") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "60") (name "Net-(V10-left)") + (node (ref "V10") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V11") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V9") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "61") (name "Net-(V11-right)") + (node (ref "V11") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V12") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "62") (name "Net-(V13-in)") + (node (ref "V13") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V14") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V15") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "63") (name "Net-(V16-y)") + (node (ref "V16") (pin "7") (pinfunction "y") (pintype "output")) + (node (ref "V17") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "64") (name "Net-(V17-left)") + (node (ref "V17") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V18") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V19") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "65") (name "Net-(V19-right)") + (node (ref "V19") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V20") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "66") (name "Net-(V21-in)") + (node (ref "V21") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V22") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V24") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "67") (name "Net-(V24-left)") + (node (ref "V24") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V25") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V26") (pin "1") (pinfunction "left") (pintype "bidirectional"))) + (net (code "68") (name "Net-(V26-right)") + (node (ref "V26") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V27") (pin "2") (pinfunction "out") (pintype "output"))) + (net (code "69") (name "Net-(V28-in)") + (node (ref "V28") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V29") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V30") (pin "2") (pinfunction "right") (pintype "bidirectional"))) + (net (code "70") (name "unconnected-(J1-Pad20)") + (node (ref "J1") (pin "20") (pintype "passive+no_connect"))) + (net (code "71") (name "unconnected-(J1-Pad21)") + (node (ref "J1") (pin "21") (pintype "passive+no_connect"))) + (net (code "72") (name "unconnected-(J1-Pad25)") + (node (ref "J1") (pin "25") (pintype "passive+no_connect"))) + (net (code "73") (name "unconnected-(J1-Pad26)") + (node (ref "J1") (pin "26") (pintype "passive+no_connect"))) + (net (code "74") (name "unconnected-(J1-Pad27)") + (node (ref "J1") (pin "27") (pintype "passive+no_connect"))) + (net (code "75") (name "unconnected-(J1-Pad28)") + (node (ref "J1") (pin "28") (pintype "passive+no_connect"))) + (net (code "76") (name "unconnected-(J1-Pad29)") + (node (ref "J1") (pin "29") (pintype "passive+no_connect"))) + (net (code "77") (name "unconnected-(J1-Pad30)") + (node (ref "J1") (pin "30") (pintype "passive+no_connect"))) + (net (code "78") (name "unconnected-(J1-Pad31)") + (node (ref "J1") (pin "31") (pintype "passive+no_connect"))) + (net (code "79") (name "unconnected-(J1-Pad32)") + (node (ref "J1") (pin "32") (pintype "passive+no_connect"))))) \ No newline at end of file diff --git a/tests/testdata/netlist/hierarchical.net.result b/tests/testdata/netlist/hierarchical.net.result new file mode 100644 index 0000000..9eef697 --- /dev/null +++ b/tests/testdata/netlist/hierarchical.net.result @@ -0,0 +1,1476 @@ +(export (version "E") + (design + (source "/home/snelgrov/kicad_exploration/kinase/exploration.kicad_sch") + (date "2024-06-27T14:37:45-0600") + (tool "Eeschema 8.0.3") + (sheet (number "1") (name "/") (tstamps "/") + (title_block + (title) + (company) + (rev) + (date) + (source "exploration.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value "")) + ) + ) + (sheet (number "2") (name "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/") + (title_block + (title) + (company) + (rev) + (date) + (source "component.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value "")) + ) + ) + (sheet (number "3") (name "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/") + (title_block + (title) + (company) + (rev) + (date) + (source "component.kicad_sch") + (comment (number "1") (value "")) + (comment (number "2") (value "")) + (comment (number "3") (value "")) + (comment (number "4") (value "")) + (comment (number "5") (value "")) + (comment (number "6") (value "")) + (comment (number "7") (value "")) + (comment (number "8") (value "")) + (comment (number "9") (value "")) + ) + ) + ) + + (components + (comp (ref "J1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "flushing_interface_04x08") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "e35e08eb-b14f-4fdd-a4e7-9bf06ee86b78") + ) + (comp (ref "J2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "82d081ab-082c-45f3-864e-12b126dbfc33") + ) + (comp (ref "J3") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "44b820c8-3df3-49b0-bc95-928cf4da74fd") + ) + (comp (ref "J4") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "6b033fcb-2c95-4f80-80cb-8f274bebc078") + ) + (comp (ref "J5") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "66f6c150-d422-4436-9eb3-417c9661f4c3") + ) + (comp (ref "J6") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "65a3ada0-e0e2-4f5b-8e38-2e5915873cc0") + ) + (comp (ref "J7") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "e23f2052-387c-4207-85f4-03458fb82cde") + ) + (comp (ref "J8") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "b105ed69-b9ed-464c-b0b3-beedaf0b383f") + ) + (comp (ref "J9") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "d6cd2a1b-b9d2-4135-9217-4447879ed242") + ) + (comp (ref "J10") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "d2bf6edd-9c4a-493e-a4d6-9b466242fdec") + ) + (comp (ref "J11") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "5afcf1b8-012b-4f59-8e60-d53f6897075e") + ) + (comp (ref "J12") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "51d36340-4751-4a79-bd77-061b6ab83a5c") + ) + (comp (ref "J13") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "bc59df1d-2b66-4f42-8aa8-c1db54f5d2fe") + ) + (comp (ref "J14") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "5f01d993-4c75-43c4-92f8-c8bdfe6957c5") + ) + (comp (ref "J15") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "898f7001-27ff-4dd3-918f-557506629561") + ) + (comp (ref "J16") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "tube_connector") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "fde2b834-ae83-49f6-b3c0-17e8819bb13c") + ) + (comp (ref "U1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "sensor_radiation") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "f322418e-312a-4f00-8575-dd7abf48ca79") + ) + (comp (ref "U2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "sensor_radiation") (description "")) + (property (name "Sheetname") (value "Root")) + (property (name "Sheetfile") (value "exploration.kicad_sch")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "7c1e01b8-e55e-4f5a-b432-c7ad32e75d29") + ) + (comp (ref "C1") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "11ccc61e-7e29-4121-898a-50aed0f2374d") + ) + (comp (ref "C2") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "2cfe4f0d-ef53-4ab7-b383-df16f7d3246f") + ) + (comp (ref "C3") + (value "42") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "length") "10m") + (field (name "width") "10u") + (field (name "height") "10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "length") (value "10m")) + (property (name "width") (value "10u")) + (property (name "height") (value "10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "52c25e0b-e689-47e9-95e1-c84dfc1372f7") + ) + (comp (ref "C4") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "34f9966b-b06f-467a-afeb-44d529d57a13") + ) + (comp (ref "P1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "da5a8c3b-87f0-49f5-b306-3eae0963d2a5") + ) + (comp (ref "P2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "pump_3") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "a6c2a337-c5c6-4b23-ba46-77d13bead410") + ) + (comp (ref "P3") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e0597333-c903-41a4-a3f5-b8ee8363359b") + ) + (comp (ref "V1") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "mux_3") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "d4c936a2-46a8-4670-a8c6-9b9b9428dfda") + ) + (comp (ref "V2") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "1623e12e-77e7-40c9-bba0-8a7967a428c3") + ) + (comp (ref "V3") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "8f977f37-95fe-44d7-94c8-9ab145a7ae00") + ) + (comp (ref "V4") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "54185cda-d4a9-4571-92bf-3375f0962238") + ) + (comp (ref "V5") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "a52bb754-876b-46b0-8fec-65a342115d6c") + ) + (comp (ref "V6") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "9442cc3a-5329-4f9e-911a-7e53ad6c6505") + ) + (comp (ref "V7") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "bfeb718b-2cbd-4fea-8d97-efb6f2a402a8") + ) + (comp (ref "V8") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "6dbad102-50f8-4aed-9c46-cee485db79a6") + ) + (comp (ref "V9") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e8c443a5-8a14-4930-a959-e3071b172582") + ) + (comp (ref "V10") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "59427e37-a339-4271-92c4-2b447765c92d") + ) + (comp (ref "V11") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "661df5c9-4640-4117-b12a-0900cab96360") + ) + (comp (ref "V12") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e06ccfa5-cd2a-41f3-8f88-2998761289b7") + ) + (comp (ref "V13") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "f6edf2c9-b9b4-4569-9896-a7f9d5307a2b") + ) + (comp (ref "V14") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "04933428-9e70-4816-ac5b-9d93c26ee2d9") + ) + (comp (ref "V15") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component/") (tstamps "/481bfd06-53f7-40da-8587-8ed1f2dcbc2d/")) + (tstamps "e68a3854-ba61-4946-bfc0-071fcb9c7774") + ) + (comp (ref "C5") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "11ccc61e-7e29-4121-898a-50aed0f2374d") + ) + (comp (ref "C6") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "2cfe4f0d-ef53-4ab7-b383-df16f7d3246f") + ) + (comp (ref "C7") + (value "42") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "length") "10m") + (field (name "width") "10u") + (field (name "height") "10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "length") (value "10m")) + (property (name "width") (value "10u")) + (property (name "height") (value "10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "52c25e0b-e689-47e9-95e1-c84dfc1372f7") + ) + (comp (ref "C8") + (value "~") + (fields + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "chamber") (description "")) + (property (name "Sim.Library") (value "channel_flow.lib")) + (property (name "Sim.Name") (value "channel")) + (property (name "Sim.Device") (value "SUBCKT")) + (property (name "Sim.Pins") (value "1=in 2=out")) + (property (name "Sim.Params") (value "length=5 width=5u height=10u")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "34f9966b-b06f-467a-afeb-44d529d57a13") + ) + (comp (ref "P4") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "da5a8c3b-87f0-49f5-b306-3eae0963d2a5") + ) + (comp (ref "P5") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "pump_3") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "a6c2a337-c5c6-4b23-ba46-77d13bead410") + ) + (comp (ref "P6") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "pump_1") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e0597333-c903-41a4-a3f5-b8ee8363359b") + ) + (comp (ref "V16") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "mux_3") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "d4c936a2-46a8-4670-a8c6-9b9b9428dfda") + ) + (comp (ref "V17") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "1623e12e-77e7-40c9-bba0-8a7967a428c3") + ) + (comp (ref "V18") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "8f977f37-95fe-44d7-94c8-9ab145a7ae00") + ) + (comp (ref "V19") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "54185cda-d4a9-4571-92bf-3375f0962238") + ) + (comp (ref "V20") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "a52bb754-876b-46b0-8fec-65a342115d6c") + ) + (comp (ref "V21") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "9442cc3a-5329-4f9e-911a-7e53ad6c6505") + ) + (comp (ref "V22") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "bfeb718b-2cbd-4fea-8d97-efb6f2a402a8") + ) + (comp (ref "V23") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "6dbad102-50f8-4aed-9c46-cee485db79a6") + ) + (comp (ref "V24") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e8c443a5-8a14-4930-a959-e3071b172582") + ) + (comp (ref "V25") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "59427e37-a339-4271-92c4-2b447765c92d") + ) + (comp (ref "V26") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "661df5c9-4640-4117-b12a-0900cab96360") + ) + (comp (ref "V27") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e06ccfa5-cd2a-41f3-8f88-2998761289b7") + ) + (comp (ref "V28") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve_sieve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "f6edf2c9-b9b4-4569-9896-a7f9d5307a2b") + ) + (comp (ref "V29") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "04933428-9e70-4816-ac5b-9d93c26ee2d9") + ) + (comp (ref "V30") + (value "~") + (fields + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (libsource (lib "mfda") (part "valve") (description "")) + (property (name "Sheetname") (value "component1")) + (property (name "Sheetfile") (value "component.kicad_sch")) + (sheetpath (names "/component1/") (tstamps "/1d23077e-b8e9-4724-a3a5-7e8296a849d9/")) + (tstamps "e68a3854-ba61-4946-bfc0-071fcb9c7774") + ) + ) + + (libparts + (libpart (lib "mfda") (part "chamber") + (fields + (field (name "Reference") "R") + (field (name "Value") "${SIM.PARAMS}") + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + (field (name "Sim.Library") "channel_flow.lib") + (field (name "Sim.Name") "channel") + (field (name "Sim.Device") "SUBCKT") + (field (name "Sim.Pins") "1=in 2=out") + (field (name "Sim.Params") "length=5 width=5u height=10u") + ) + (pins + (pin (num "1") (name "in") (type "passive")) + (pin (num "2") (name "out") (type "passive")) + ) + ) + (libpart (lib "mfda") (part "flushing_interface_04x08") + (fields + (field (name "Reference") "J") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "") (type "passive")) + (pin (num "2") (name "") (type "passive")) + (pin (num "3") (name "") (type "passive")) + (pin (num "4") (name "") (type "passive")) + (pin (num "5") (name "") (type "passive")) + (pin (num "6") (name "") (type "passive")) + (pin (num "7") (name "") (type "passive")) + (pin (num "8") (name "") (type "passive")) + (pin (num "9") (name "") (type "passive")) + (pin (num "10") (name "") (type "passive")) + (pin (num "11") (name "") (type "passive")) + (pin (num "12") (name "") (type "passive")) + (pin (num "13") (name "") (type "passive")) + (pin (num "14") (name "") (type "passive")) + (pin (num "15") (name "") (type "passive")) + (pin (num "16") (name "") (type "passive")) + (pin (num "17") (name "") (type "passive")) + (pin (num "18") (name "") (type "passive")) + (pin (num "19") (name "") (type "passive")) + (pin (num "20") (name "") (type "passive")) + (pin (num "21") (name "") (type "passive")) + (pin (num "22") (name "") (type "passive")) + (pin (num "23") (name "") (type "passive")) + (pin (num "24") (name "") (type "passive")) + (pin (num "25") (name "") (type "passive")) + (pin (num "26") (name "") (type "passive")) + (pin (num "27") (name "") (type "passive")) + (pin (num "28") (name "") (type "passive")) + (pin (num "29") (name "") (type "passive")) + (pin (num "30") (name "") (type "passive")) + (pin (num "31") (name "") (type "passive")) + (pin (num "32") (name "") (type "passive")) + ) + ) + (libpart (lib "mfda") (part "mux_3") + (fields + (field (name "Reference") "V") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "a") (type "input")) + (pin (num "2") (name "b") (type "input")) + (pin (num "3") (name "c") (type "input")) + (pin (num "4") (name "sa") (type "input")) + (pin (num "5") (name "sb") (type "input")) + (pin (num "6") (name "sc") (type "input")) + (pin (num "7") (name "y") (type "output")) + ) + ) + (libpart (lib "mfda") (part "pump_1") + (fields + (field (name "Reference") "P") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")) + (pin (num "3") (name "pump_1") (type "input")) + ) + ) + (libpart (lib "mfda") (part "pump_3") + (fields + (field (name "Reference") "P") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")) + (pin (num "3") (name "pump_1") (type "input")) + (pin (num "4") (name "pump_2") (type "input")) + (pin (num "5") (name "pump_3") (type "input")) + ) + ) + (libpart (lib "mfda") (part "sensor_radiation") + (fields + (field (name "Reference") "S") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")) + ) + ) + (libpart (lib "mfda") (part "tube_connector") + (fields + (field (name "Reference") "J") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "connect") (type "passive")) + ) + ) + (libpart (lib "mfda") (part "valve") + (fields + (field (name "Reference") "V") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "left") (type "bidirectional")) + (pin (num "2") (name "right") (type "bidirectional")) + (pin (num "3") (name "control") (type "input")) + ) + ) + (libpart (lib "mfda") (part "valve_sieve") + (fields + (field (name "Reference") "V") + (field (name "Value")) + (field (name "Footprint")) + (field (name "Datasheet")) + (field (name "Description")) + ) + (pins + (pin (num "1") (name "in") (type "input")) + (pin (num "2") (name "out") (type "output")) + (pin (num "3") (name "control") (type "input")) + ) + ) + ) + + (libraries + (library (logical "mfda") + (uri "/home/snelgrov/kicad_exploration/kinase/../mfda.kicad_sym")) + ) + + (nets + (net (code "1") (name "/component/control.circulate1") + (node (ref "J1") (pin "14") (pintype "passive")) + (node (ref "V22") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V7") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "2") (name "/component/control.circulate2") + (node (ref "J1") (pin "10") (pintype "passive")) + (node (ref "V18") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V3") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "3") (name "/component/control.circulate3") + (node (ref "J1") (pin "11") (pintype "passive")) + (node (ref "V19") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V4") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "4") (name "/component/control.circulate_in") + (node (ref "J1") (pin "9") (pintype "passive")) + (node (ref "V17") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V2") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "5") (name "/component/control.circulate_out") + (node (ref "J1") (pin "16") (pintype "passive")) + (node (ref "V24") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V9") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "6") (name "/component/control.filter1") + (node (ref "J1") (pin "12") (pintype "passive")) + (node (ref "V20") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V5") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "7") (name "/component/control.filter2") + (node (ref "J1") (pin "13") (pintype "passive")) + (node (ref "V21") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V6") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "8") (name "/component/control.filter3") + (node (ref "J1") (pin "24") (pintype "passive")) + (node (ref "V13") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V28") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "9") (name "/component/control.filter4") + (node (ref "J1") (pin "23") (pintype "passive")) + (node (ref "V12") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V27") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "10") (name "/component/control.fluid_in1") + (node (ref "J1") (pin "7") (pintype "passive")) + (node (ref "J11") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "J14") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "4") (pinfunction "sa") (pintype "input")) + (node (ref "V16") (pin "4") (pinfunction "sa") (pintype "input")) + ) + (net (code "11") (name "/component/control.fluid_in2") + (node (ref "J1") (pin "6") (pintype "passive")) + (node (ref "J12") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "J15") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "5") (pinfunction "sb") (pintype "input")) + (node (ref "V16") (pin "5") (pinfunction "sb") (pintype "input")) + ) + (net (code "12") (name "/component/control.fluid_in3") + (node (ref "J1") (pin "5") (pintype "passive")) + (node (ref "J13") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "J16") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "6") (pinfunction "sc") (pintype "input")) + (node (ref "V16") (pin "6") (pinfunction "sc") (pintype "input")) + ) + (net (code "13") (name "/component/control.flush1") + (node (ref "J1") (pin "15") (pintype "passive")) + (node (ref "V23") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V8") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "14") (name "/component/control.flush2") + (node (ref "J1") (pin "17") (pintype "passive")) + (node (ref "V10") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V25") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "15") (name "/component/control.flush3") + (node (ref "J1") (pin "19") (pintype "passive")) + (node (ref "V15") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V30") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "16") (name "/component/control.out") + (node (ref "J1") (pin "22") (pintype "passive")) + (node (ref "V14") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V29") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "17") (name "/component/control.stage") + (node (ref "J1") (pin "18") (pintype "passive")) + (node (ref "V11") (pin "3") (pinfunction "control") (pintype "input")) + (node (ref "V26") (pin "3") (pinfunction "control") (pintype "input")) + ) + (net (code "19") (name "/component/fluid_in1") + (node (ref "J2") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "1") (pinfunction "a") (pintype "input")) + (node (ref "V16") (pin "1") (pinfunction "a") (pintype "input")) + ) + (net (code "20") (name "/component/fluid_in2") + (node (ref "J3") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "2") (pinfunction "b") (pintype "input")) + (node (ref "V16") (pin "2") (pinfunction "b") (pintype "input")) + ) + (net (code "21") (name "/component/fluid_in3") + (node (ref "J4") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V1") (pin "3") (pinfunction "c") (pintype "input")) + ) + (net (code "22") (name "/component/flush_1") + (node (ref "J7") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V23") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V8") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "23") (name "/component/flush_2") + (node (ref "J8") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V10") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V25") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "24") (name "/component/flush_3") + (node (ref "J9") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V15") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V30") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "25") (name "/component/foo") + (node (ref "C1") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V3") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "26") (name "/component/out") + (node (ref "U1") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V14") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "27") (name "/component/pump1") + (node (ref "J1") (pin "1") (pintype "passive")) + (node (ref "P2") (pin "3") (pinfunction "pump_1") (pintype "input")) + (node (ref "P5") (pin "3") (pinfunction "pump_1") (pintype "input")) + ) + (net (code "28") (name "/component/pump2") + (node (ref "J1") (pin "2") (pintype "passive")) + (node (ref "P2") (pin "4") (pinfunction "pump_2") (pintype "input")) + (node (ref "P5") (pin "4") (pinfunction "pump_2") (pintype "input")) + ) + (net (code "29") (name "/component/pump3") + (node (ref "J1") (pin "3") (pintype "passive")) + (node (ref "P2") (pin "5") (pinfunction "pump_3") (pintype "input")) + (node (ref "P5") (pin "5") (pinfunction "pump_3") (pintype "input")) + ) + (net (code "30") (name "/component/pump4") + (node (ref "J1") (pin "4") (pintype "passive")) + (node (ref "P3") (pin "3") (pinfunction "pump_1") (pintype "input")) + (node (ref "P6") (pin "3") (pinfunction "pump_1") (pintype "input")) + ) + (net (code "31") (name "/component/pump5") + (node (ref "J1") (pin "8") (pintype "passive")) + (node (ref "P1") (pin "3") (pinfunction "pump_1") (pintype "input")) + (node (ref "P4") (pin "3") (pinfunction "pump_1") (pintype "input")) + ) + (net (code "33") (name "/component1/fluid_in3") + (node (ref "J10") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "V16") (pin "3") (pinfunction "c") (pintype "input")) + ) + (net (code "34") (name "/component1/foo") + (node (ref "C5") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V18") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "35") (name "/component1/out") + (node (ref "U2") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V29") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "36") (name "Net-(C1-out)") + (node (ref "C1") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P2") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "37") (name "Net-(C2-in)") + (node (ref "C2") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P3") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "38") (name "Net-(C2-out)") + (node (ref "C2") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P1") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "39") (name "Net-(C3-in)") + (node (ref "C3") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P2") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "40") (name "Net-(C3-out)") + (node (ref "C3") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V7") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V8") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "41") (name "Net-(C4-in)") + (node (ref "C4") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V12") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "42") (name "Net-(C4-out)") + (node (ref "C4") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V13") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "43") (name "Net-(C5-out)") + (node (ref "C5") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P5") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "44") (name "Net-(C6-in)") + (node (ref "C6") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P6") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "45") (name "Net-(C6-out)") + (node (ref "C6") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "P4") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "46") (name "Net-(C7-in)") + (node (ref "C7") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "P5") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "47") (name "Net-(C7-out)") + (node (ref "C7") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V22") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V23") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "48") (name "Net-(C8-in)") + (node (ref "C8") (pin "1") (pinfunction "in") (pintype "passive")) + (node (ref "V27") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "49") (name "Net-(C8-out)") + (node (ref "C8") (pin "2") (pinfunction "out") (pintype "passive")) + (node (ref "V28") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "50") (name "Net-(J5-connect)") + (node (ref "J5") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "U1") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "51") (name "Net-(J6-connect)") + (node (ref "J6") (pin "1") (pinfunction "connect") (pintype "passive")) + (node (ref "U2") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "52") (name "Net-(P1-out)") + (node (ref "P1") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V5") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "53") (name "Net-(P3-in)") + (node (ref "P3") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V6") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "54") (name "Net-(P4-out)") + (node (ref "P4") (pin "2") (pinfunction "out") (pintype "output")) + (node (ref "V20") (pin "1") (pinfunction "in") (pintype "input")) + ) + (net (code "55") (name "Net-(P6-in)") + (node (ref "P6") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V21") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "56") (name "Net-(V1-y)") + (node (ref "V1") (pin "7") (pinfunction "y") (pintype "output")) + (node (ref "V2") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "57") (name "Net-(V2-left)") + (node (ref "V2") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V3") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V4") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "58") (name "Net-(V4-right)") + (node (ref "V4") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V5") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "59") (name "Net-(V6-in)") + (node (ref "V6") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V7") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V9") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "60") (name "Net-(V10-left)") + (node (ref "V10") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V11") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V9") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "61") (name "Net-(V11-right)") + (node (ref "V11") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V12") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "62") (name "Net-(V13-in)") + (node (ref "V13") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V14") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V15") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "63") (name "Net-(V16-y)") + (node (ref "V16") (pin "7") (pinfunction "y") (pintype "output")) + (node (ref "V17") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "64") (name "Net-(V17-left)") + (node (ref "V17") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V18") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V19") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "65") (name "Net-(V19-right)") + (node (ref "V19") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V20") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "66") (name "Net-(V21-in)") + (node (ref "V21") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V22") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V24") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "67") (name "Net-(V24-left)") + (node (ref "V24") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V25") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V26") (pin "1") (pinfunction "left") (pintype "bidirectional")) + ) + (net (code "68") (name "Net-(V26-right)") + (node (ref "V26") (pin "2") (pinfunction "right") (pintype "bidirectional")) + (node (ref "V27") (pin "2") (pinfunction "out") (pintype "output")) + ) + (net (code "69") (name "Net-(V28-in)") + (node (ref "V28") (pin "1") (pinfunction "in") (pintype "input")) + (node (ref "V29") (pin "1") (pinfunction "left") (pintype "bidirectional")) + (node (ref "V30") (pin "2") (pinfunction "right") (pintype "bidirectional")) + ) + (net (code "70") (name "unconnected-(J1-Pad20)") + (node (ref "J1") (pin "20") (pintype "passive+no_connect")) + ) + (net (code "71") (name "unconnected-(J1-Pad21)") + (node (ref "J1") (pin "21") (pintype "passive+no_connect")) + ) + (net (code "72") (name "unconnected-(J1-Pad25)") + (node (ref "J1") (pin "25") (pintype "passive+no_connect")) + ) + (net (code "73") (name "unconnected-(J1-Pad26)") + (node (ref "J1") (pin "26") (pintype "passive+no_connect")) + ) + (net (code "74") (name "unconnected-(J1-Pad27)") + (node (ref "J1") (pin "27") (pintype "passive+no_connect")) + ) + (net (code "75") (name "unconnected-(J1-Pad28)") + (node (ref "J1") (pin "28") (pintype "passive+no_connect")) + ) + (net (code "76") (name "unconnected-(J1-Pad29)") + (node (ref "J1") (pin "29") (pintype "passive+no_connect")) + ) + (net (code "77") (name "unconnected-(J1-Pad30)") + (node (ref "J1") (pin "30") (pintype "passive+no_connect")) + ) + (net (code "78") (name "unconnected-(J1-Pad31)") + (node (ref "J1") (pin "31") (pintype "passive+no_connect")) + ) + (net (code "79") (name "unconnected-(J1-Pad32)") + (node (ref "J1") (pin "32") (pintype "passive+no_connect")) + ) + ) +)