# Netlist Export

**URL:** https://librepcb.discourse.group/t/netlist-export/1023
**Category:** Improvement Ideas
**Created:** [April 7, 2026, 7:02pm UTC](https://librepcb.discourse.group/t/netlist-export/1023 "2026-04-07T19:02:57Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 7, 2026, 7:02pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/1 "2026-04-07T19:02:57Z")

</div>

EDAs don’t have support for Veroboard/stripboard, so I have written a small utility which can take files from Qucs-s or KiCAD and convert them into a format suitable for DIY Layout Creator or VeroRoute. I’ve looked at all the other schematic design tools I can find and the only one which is worth adding is LibrePCB.  
It might be possible to take the _circuit.lp_ file and extract the components and nets, but it looks likely to be fraught with risk, for example of getting the pin numbers wrong.  
Have you any plans to add an “Export Netlist“ option? It doesn’t need to be sophisticated enough for a simulator, just something like this incomplete Protel example:

```auto
[
R6
RESISTOR
50 Ohm

]
[
R7
RESISTOR
50 Ohm

]
(
_net0
R8-1
OP4-1
OP5-1
)
(
_net1
R8-2
D4-2
D3-1
)

```

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 5:31pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/2 "2026-04-08T17:31:13Z")

</div>

Hi @PopoutApps

Could you elaborate a bit more how this works technically? Is your converter tool and/or the target file format open source?

It might be possible that such a converter doesn’t work well for LibrePCB. A schematic does not contain any information about packages/footprints and their pinout. Those things come in only on the board. So far I don’t know where this information should come from for your use-case.

Also I wonder, how can your tool know which component from the netlist is what real device? I.e. how does it know that “R6” is a resistor? Or is this assignment done in the Veroboard tool?

Maybe we could implement a corresponding netlist export, but for this I’ll need more information so I can understand the whole workflow in more detail.

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 8, 2026, 6:35pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/3 "2026-04-08T18:35:53Z")

</div>

It is a FOSS (Free Open Source Software) Python3 package which can run on any OS. The target file is a simplification of a very early version of Protel. Aimed at DIY Layout Creator and Veroute VeroBoard/Stripboard layout designers. They don’t get much attention from Schematic design tools.

Footprint information isn’t necessary as the layout tools have that.

An extract from a circuit.lp:  
`(component f37726c2-ec60-4155-a858-e262bd330305`  
` (lib_component ef80cd5e-2689-47ee-8888-31d04fc99174)`  
` (lib_variant a5995314-f535-45d4-8bd8-2d0b8a0dc42a)`  
` (name “R1”) (value “{{RESISTANCE}}”)`  
` (lock_assembly false)`  
` (attribute “RESISTANCE” (type resistance) (unit ohm) (value “50”))`  
`(signal 3452d36e-1ce8-4b7c-8e5b-90c2e4929ed8 (net be21f49c-ccbb-45a3-94d2- cad770487034))`  
` (signal ad623f98-9e73-49c3-9404-f7cfa99d17cd (net f5c68e03-ea8b-4dc3-9cd6-0b32e7ee6028))`  
` )`

It contains:  
(name “R1”)  
(attribute “RESISTANCE” (type resistance) (unit kiloohm) (value “1”))

Which provides the 3 items needed for the component part of the file, although kiloohm needs to be K:

[  
R1  
RESISTANCE  
1K

]  
That would be a good start, I haven’t looked at the nets properly yet, but the information is in there too.

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 6:56pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/4 "2026-04-08T18:56:16Z")

</div>

But you neither can assume that every resistor has the RESISTANCE attribute, nor can you assume that every component with the RESISTANCE attribute is a resistor. LibrePCB does not know what function a component has, i.e. whether it is a resistor, capacitor, transistor or anything else.

So my question remains: Where/how are the components from the netlist assigned to a device?

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 8, 2026, 7:07pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/5 "2026-04-08T19:07:11Z")

</div>

How does LibrePCB know what symbol to draw on the schematic then?

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 7:15pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/6 "2026-04-08T19:15:06Z")

</div>

Every symbol is a drawing in the library, for example [Resistor EU](https://github.com/LibrePCB-Libraries/LibrePCB_Base.lplib/blob/10c2945be4b164a3bbe1fda95dbae9f686b9ad4d/sym/75372c18-3ba4-42e8-b3b2-2eb5039d441e/symbol.lp). So for LibrePCB, every component is the same, it’s just a drawing, no matter what the drawing represents.

And how does that work in your mentioned tools? Can you post the file format of a circuit in such a tool?

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 8, 2026, 7:23pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/7 "2026-04-08T19:23:11Z")

</div>

So are you saying that none of these values are reliable?

(value “{{RESISTANCE}}”)  
(attribute “RESISTANCE” (type resistance)

(name “Resistor EU”)  
(description “Resistor European (IEC 60617)”)  
(keywords “resistor,resistance”)

Doesn’t that imply that there could be a symbol which looked like a capacitor but had values of inductor? Is anyone likely to design a component like that? Are users able to upload random components or are they created by LibrePCB? If the latter, I would be inclined to trust their judgement.

What about  
(name “R1”) R means Resistor?  
(name “C1”) C means Capacitor?

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 7:33pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/8 "2026-04-08T19:33:18Z")

</div>

It is all dynamic data. Everything can be created/modified by users as they want. Nobody prevents you from creating an inductor that looks like a resistor. Prefixes like “R” are specified by norms and standards, but there exist several of them and they change from time to time, so it’s nothing reliable. And names like “Resistor EU” are just texts, they have no function and may be renamed if someone has a better idea.

The most reliable information is that the component with UUID `ef80cd5e-2689-47ee-8888-31d04fc99174` represents a resistor. But this only applies to our official library. Users don’t have to work with our libraries, they can create their own libraries and will get different UUIDs.

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 8, 2026, 7:35pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/9 "2026-04-08T19:35:05Z")

</div>

Are components created by a user restricted to that user? Can they upload them to you and thereby make them automatically available to any user? Can they edit components in your official library?  
”Official” implies some sort of approval by LibrePCB, so I would assume that users can’t touch those. In that case so long as a user sticks to the “Official” library they are OK, they should know that components from other sources are unpredictable.

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 7:37pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/10 "2026-04-08T19:37:41Z")

</div>

Can we please turn this discussion into another direction? I still didn’t get any information how these things work in your mentioned tools, so I still cannot make my own thoughts about a possible solution. Like you need to understand LibrePCB, I also need to understand your mentioned tools.

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 8, 2026, 7:48pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/11 "2026-04-08T19:48:46Z")

</div>

A tool like DIY Layout Creator just imports the file and shows the components. For example from this file (only showing components):

> [  
> R8  
> RESISTOR  
> 50 Ohm
> 
> ]  
> [  
> D4  
> DIODE  
> BZT52C10T
> 
> ]  
> [  
> OP4  
> DIP8  
> 1e6
> 
> ]  
> [  
> D3  
> LED  
> red
> 
> ]  
> [  
> R4  
> RESISTOR  
> 50 Ohm
> 
> ]  
> [  
> R9  
> RESISTOR  
> 50 Ohm
> 
> ]  
> [  
> D2  
> LED  
> yellow
> 
> ]  
> [  
> C1  
> CAP\_ELECTRO\_200\_NP  
> neutral
> 
> ]  
> [  
> R5  
> RESISTOR  
> 50 Ohm
> 
> ]  
> [  
> D1  
> LED  
> green
> 
> ]  
> [  
> R1  
> RESISTOR  
> 1000 Ohm
> 
> ]  
> [  
> R2  
> RESISTOR  
> 1000 Ohm
> 
> ]  
> [  
> R3  
> RESISTOR  
> 2200 Ohm
> 
> ]  
> [  
> R10  
> RESISTOR  
> 1000000 Ohm
> 
> ]  
> [  
> OP1  
> DIP8  
> 1e6
> 
> ]  
> [  
> OP2  
> DIP8  
> 1e6
> 
> ]  
> [  
> OP5  
> DIP8  
> 1e6
> 
> ]  
> [  
> R6  
> RESISTOR  
> 50 Ohm
> 
> ]  
> [  
> R7  
> RESISTOR  
> 50 Ohm
> 
> ]

 ![image](https://global.discourse-cdn.com/free1/uploads/librepcb1/original/1X/2ceac83ba72bd351e692ac4ec320cc522c67a9cf.png)

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 8, 2026, 7:49pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/12 "2026-04-08T19:49:35Z")

</div>

![image](https://global.discourse-cdn.com/free1/uploads/librepcb1/original/1X/8634e66f1f25729396ba9ff14dd807ba8d862043.png)

It doesn’t place them, it uses a generic footprint.

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 8:02pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/13 "2026-04-08T20:02:03Z")

</div>

Thanks. So you already have a step where you can assign to a DIYLC component type, that’s great. (I assume the terms “RESISTOR”, “DIP8” or “CAP\_ELECTRO\_200\_NP” are built-in types of DIYLC).

But the DIP8 example does not make sense for LibrePCB. When you draw a schematic in LibrePCB, you will use a proper component (e.g. “NE555”, with pins “GND”, “VCC”, “TRIG” etc.), not just a DIP8 package.

And the problem with pins applies to every kind of component. Not just for ICs, even for transistors we work with signal names (e.g. “B”, “E”, “C” for base/emitter/collector), not pin names “1”, “2”, “3”. As I wrote earlier, LibrePCB schematics do not contain information about pinouts.

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 8:08pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/14 "2026-04-08T20:08:19Z")

</div>

And how do you handle transistors at all? Some transistors have the pinout 1,2,3 = Collector,Base,Emitter, some have 1,2,3 = Emitter,Base,Collector. In a LibrePCB schematic there is no difference between those two types, since the schematic does not contain any pinout information. It will be the responsibility of DIYLC to assign the desired pinout.

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 8, 2026, 8:10pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/15 "2026-04-08T20:10:58Z")

</div>

So each component like this one

> <https://github.com/LibrePCB-Libraries/LibrePCB_Base.lplib/blob/10c2945be4b164a3bbe1fda95dbae9f686b9ad4d/sym/92837b2d-919d-4589-b7ce-96c11b36955b/symbol.lp>

has to have its own detailed list to define its geometry? There aren’t any generic definitions?

I’m busy now, will come back to this later.

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 8, 2026, 8:17pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/16 "2026-04-08T20:17:35Z")

</div>

Everything is dynamically loaded from library files. There are no built-in definitions at all. The library concept is quite complex, see [LibrePCB Developers Documentation: Library Specification](https://developers.librepcb.org/df/d4f/doc_library.html). It is designed for the use-case of PCBs, not for stripboards.

I think the only reasonable way will be to create a manual mapping of LibrePCB UUIDs to DIYLC identifiers. This would then work for basic components (R, C, L, …) from our official libraries, which should be fine I guess (users who work with stripboards are unlikely to have their own libraries created). But for ICs it’s gonna be difficult. And also the question remains how DIYLC can know the pinout of a transistor as it is not defined in LibrePCB.

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 9, 2026, 6:29pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/17 "2026-04-09T18:29:43Z")

</div>

> Can we please turn this discussion into another direction?.. **Like you need to understand LibrePCB**

That is why I asked these questions 😄

> Doesn’t that imply that there could be a symbol which looked like a capacitor but had values of inductor? Is anyone likely to design a component like that? Are users able to upload random components or are they created by LibrePCB? If the latter, I would be inclined to trust their judgement.

Since you didn’t answer, I looked at some files, made some guesses and fiddled about.

I can see that this resistor has several fields which all say much the same, one of which might be editable to say RESISTOR - or export code could translate it.

(component 0842826b-6829-47e6-b9a3-993764ec0e98  
(lib\_component ef80cd5e-2689-47ee-8888-31d04fc99174)  
(lib\_variant a5995314-f535-45d4-8bd8-2d0b8a0dc42a)  
(name “ **R** 8”) (value “{{ **RESISTANCE** }}”)  
(lock\_assembly false)  
(attribute “ **RESISTANCE** ” (type **resistance** ) (unit ohm) (value “50”))  
(signal 3452d36e-1ce8-4b7c-8e5b-90c2e4929ed8 (net 5204efd8-ccae-4d66-bb15-1081192620e5))  
(signal ad623f98-9e73-49c3-9404-f7cfa99d17cd (net 6902b07d-078c-42cb-8f14-486bdb00e608))  
)

This chip has much less relevant data, it only has “U…” and “MPN or DEVICE”:  
(component 6ddcd5bb-08a4-4105-bd1b-df93ce8cf1a6  
(lib\_component 0aabc0df-a3fe-4a95-be1f-7be4cccddb2b)  
(lib\_variant 52ababe6-3d42-40dc-9108-422ec3637479)  
**(name “U1”) (value “{{MPN or DEVICE}}”)**  
…

But I right-clicked on a chip, selected properties and typed something in, which led to:  
(component 6ddcd5bb-08a4-4105-bd1b-df93ce8cf1a6  
(lib\_component 0aabc0df-a3fe-4a95-be1f-7be4cccddb2b)  
(lib\_variant 52ababe6-3d42-40dc-9108-422ec3637479)  
(name “U1”) **(value “DIP8”**)  
(lock\_assembly false)  
**(attribute “VALUE” (type string) (unit none) (value “741”))**

So data exists to put in the output file so that it says:  
[  
U1 ← component-id  
DIP8 ← compnent type  
741 ← value

]

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 10, 2026, 1:19pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/18 "2026-04-10T13:19:04Z")

</div>

So far as nets are concerned I can see a list near the top of the file:

(net **05ecba28-367b-4f19-a7ad-f829a201eea1** (auto true) (name “N8”)  
(netclass a42b7248-edb9-45c7-8d04-2b5c96754d12)  
)

and one of the components it connects has:

(component a2416820-13ef-4e22-b4a4-94de5c92c372  
(lib\_component ef80cd5e-2689-47ee-8888-31d04fc99174)  
(lib\_variant a5995314-f535-45d4-8bd8-2d0b8a0dc42a)  
(name “R4”) (value “{{RESISTANCE}}”)  
(lock\_assembly false)  
(attribute “RESISTANCE” (type resistance) (unit ohm) (value “50”))  
(signal 3452d36e-1ce8-4b7c-8e5b-90c2e4929ed8 (net 576260d3-7045-45d3-a913-b0448a497f31))  
(signal ad623f98-9e73-49c3-9404-f7cfa99d17cd (net **05ecba28-367b-4f19-a7ad-f829a201eea1** ))

On the schematic if I click on the -ve input of U1B a popup says that it is N8, so there is information somwhere about which pin of the chip N8 connects to. Also, if I click on an unconnected opamp I see a popup which contains:

> Signal OUT  
> Net X  
> Pin +/-/OUT  
> Pads

So pin data is available too.

---

<div class="post-metadata">

### Author: ![ubruhin](https://avatars.discourse-cdn.com/v4/letter/u/c89c15/32.png) [@ubruhin](https://librepcb.discourse.group/u/ubruhin)
#### Post date: [April 13, 2026, 9:01am UTC](https://librepcb.discourse.group/t/netlist-export/1023/19 "2026-04-13T09:01:09Z")

</div>

Yes that is the way our file format works. But I agree with your initial comment that it’s not good to operate directly on our file format (as it is subject to change in future versions).

The proper way would be to use a netlist export instead, but unfortunately there doesn’t exist a standard file format for netlist. Every tool uses something different.

Actually I am thinking about the following way: We currently already have a JSON project export, which is intended to provide a stable, well-defined way to extract data from a LibrePCB project. Currently it contains mainly information about the PCB (dimension, design rules, used drill sizes, …). But it could be extended to also contain netlist information. For example something like this:

```json
{
    "library": {
        "components": {
            "ef80cd5e-2689-47ee-8888-31d04fc99174": {
                "name": "Resistor",
                "signals": {
                    "3452d36e-1ce8-4b7c-8e5b-90c2e4929ed8": {
                        "name": "1"
                    },
                    "ad623f98-9e73-49c3-9404-f7cfa99d17cd": {
                        "name": "2"
                    }
                }
            }
        }
    },
    "nets": {
        "1c52cd66-5f72-4e55-b973-c8db6accf092": {
            "name": "GND"
        }
    },
    "components": {
        "56da425a-e5b9-4d4b-a579-b303d7755011": {
            "name": "C1",
            "value": "100nF",
            "lib_component": "ef80cd5e-2689-47ee-8888-31d04fc99174",
            "nets": {
                "3452d36e-1ce8-4b7c-8e5b-90c2e4929ed8": "1c52cd66-5f72-4e55-b973-c8db6accf092",
                "ad623f98-9e73-49c3-9404-f7cfa99d17cd": null
            }
        }
    }
}

```

And then for the converter to DIYLC you may use a mapping from standard components to DIYLC components, like this:

```json
{
  "ef80cd5e-2689-47ee-8888-31d04fc99174": {
    "type": "RESISTOR",
    "pins": {
      "3452d36e-1ce8-4b7c-8e5b-90c2e4929ed8": "1",
      "ad623f98-9e73-49c3-9404-f7cfa99d17cd": "2"
    }
  }
}

```

But I’m still not sure how well this will work for IC components.

---

<div class="post-metadata">

### Author: ![PopoutApps](https://yyz2.discourse-cdn.com/free1/user_avatar/librepcb.discourse.group/popoutapps/32/849_2.png) [@PopoutApps](https://librepcb.discourse.group/u/PopoutApps)
#### Post date: [April 22, 2026, 1:13pm UTC](https://librepcb.discourse.group/t/netlist-export/1023/20 "2026-04-22T13:13:04Z")

</div>

This seems very similar to the data already available. I can’t see any advantage to it, as it would still need my utility to process the file into something that might be usable by DIYLC etc.

[Next page](https://librepcb.discourse.group/t/netlist-export/1023.md?page=2)
