Footprints/pads on internal layers

I am designing a rigid-flex board and need to place some footprints on ‘inner’ layers. These look like SMD pads, there are no through holes. I do not want them to have openings in the soldermask layer (coverlay, actually). PCBNew only lets me place such footprints on the top or bottom layer.

How do I get these pads onto an inner layer?

Assuming I can get that to work: How do I create the footprint so it doesn’t try to cut holes in the soldermask layer? I tried making it a through hole part with no hole size, and it just gives an error.

1 Like

Sadly this one is not supported in kicad right now. (Maybe there is an unofficial branch out there that supports it.)

I can not even find a bug report requesting pads on inner layers for that reason. the only one i could find requested it for net ties:

1 UP

flex-rigid support wanted

1 Like

This is distressing. We are only going to be doing more rigid-flex designs moving forward, not less. I recently changed my workflow to KiCad for everything and thought I was good to go, especially with the current nightlies.

Does anybody have a work-around for this?

I would hate to go to a much less capable layout program just because of this feature. I am not afraid of hacking, if somebody could point me in the right direction.

I think you can use copper zones. (But as i do not really understand your requirements from what you have given us so far i can not give a definite answer here.)

The first step for getting such a feature is by creating a wishlist bug report over at the bugtracker. State your usecase (maybe include some pictures to showcase what you need.)
And link it back here. (Maybe also cross reference the bug i linked above as you request something similar for a different purpose.)

1 Like

Thanks Rene, your advice is much appreciated.

I started trying to make it work with zones, but I can’t connect them with traces properly.

My current project involves capacitive liquid level-sensing. These ‘pads’ are the electrodes on the flexible section. Similar to this:

Another idea I had was to use top and bottom copper layers as if they were inner, then fix things after the fact by re-naming my gerber files… This plays hell with features on the rigid portion though (SMD components there, but on the outer layers), so I can’t get that to work either.

Could you explain the troubles you had with connecting the zone?

I must apologize, I am indeed able to connect the zones as I need. I just had to assign them to the correct layer and net (obviously).

Thank you! This is a usable work-around for this project. This has the added benefit of no longer having to worry about apertures in my coverlay.

The only thing this doesn’t get me is a proper connection to my schematic (the zones are not footprints from the netlist). Slightly tedious in that I can’t just define the size and shape in a footprint, rather I must draw them in place manually. I can live with that for now.

Your help has been very valuable.

This doesn’t help with your original problem, but you can just uncheck the unwanted layer checkbox in the pad properties dialog.

1 Like

Excellent tip, I will be using this in the future. Thank you.

Interesting question, and this has come up before.

So, I had a quick play, V5 recent build and the news is mostly good :slight_smile:

  • you can create a innerlayer stack in a file and import that
  • it does cough some messages and does not display the inner pads - it ghosts them, you see their effects.
  • I can route connect, flood, DRC check, and gerber plot OK
  • Shove & fill seems to respect the ‘invisible’ pad edge fine
  • saves and loads ok, with the bleat-messages

Looks like the database is actually ok, and as best I can tell it all works, but someone has left warning messages in there - perhaps because it is not yet fully tested.

See above, this connects & DRCs ok, you just get nag messages, and the display ghosts the inner pads.

Tested/saved data information - manually edited:

(pad 1 smd rect (at -1.45 0) (size 0.9 1.7) (layers In1.Cu)
  (net 3 "Net-(J1-Pad3)"))
(pad 2 smd rect (at 1.45 0) (size 0.9 1.7) (layers In2.Cu)
  (net 2 /NTH))

Perhaps you can test this and report back any issues, so they can remove those nag/warning messages ?
I could not get it to break …
Here is the test example :


Thinking some more, even that PAD ghosting effect might not be any bug, so much as a missing feature/ability

  • ie menu choices strictly are Pads Front [] Pads Back [], so there is no Pads Inner [] tick there yet
    Screen may be doing exactly what it is told to display ?


Yes, I can trick it, by change to thru hole and adding a > 0 hole. It lets me define 0.000001mm, and the DRL file then rounds that to 0. PAD now shows on Display. (via Through Hole Pads [] tick)
Drill file heading:


Hmm, that trick confirmed the Display Viz question, but Through hole triggers other things too
PAD stack is now on all layers, and generates a solder mask too.

A few problems come to mind when allowing inner layers for footprints:

  • What should happen with pads assigned to inner layers if that inner layer is missing from the pcb?
  • What does flipping mean?
  • In say an 8 layer board how do you define on what layer the pads should be from within pcb_new? (Currently you only need the flip operation to get all possible placements. would there then be something like layer up/down?)
  • Can the part have pads on any inner layer?
  • Inner layers can be renamed by the user. How to handle that?

I think some of these have been partly discussed back when oliver started to implement keepout zones in footprints. (should be somewhere on the mailing list)

Good questions :slight_smile:
Flip currently in Kicad, swaps F. and B., so any absolute-inner pads defines I’d expect to not move, and that seems to be what happens. In1.Cu stays on In1.Cu
That should be enough for most uses, but I can see that an order reversal might be useful too…

Rename of layers does what I’d expect - a global search/replace eg In1.Cu -> RnIn1.Cu, ie looks ok now.
This also seems fine : (layers ReIn2.Cu ReIn1.Cu) ie 2 inner layers defined

in PCB Duplicate part looks best avoided, as that seems to give (almost) endless nag messages…

1 Like

Maybe you can try with Move to layer action plugin


Thanks to your advice, I was able to get this to work.

I started by creating the footprints as if they were normal SMD pads on the top copper layer. I then lay out my board, making sure to get these inner pads exactly where I need them (it will be extremely difficult to move things around later), except they will of course be on the top layer for now.

Once all the inner pads have been placed precisely, I add a mechanical drawing outlining all the pads as accurately as possible. This is because once we move the pads to inner layers they will no longer be visible. This serves as a nice visual aid later. Save and close Pcbnew.

I then open the .kicad_pcb file in a text editor and find all the pads that need to be moved. Searching by footprint name was helpful for this. I needed to change the ‘layers’ for the pad from F.Cu to In1.Cu or Like this:

Don’t bother changing the layer of the module, it will just get changed back when you open the board again.

Save and re-open the board. You will be greeted with a warning box like this:

You will get very used to this interrupting your work. Anytime you try to pan or zoom after clicking on one of the now invisible pads, this error box will come up. It is important to deselect anything, or at least select a legitimate pad before trying to route/pan/zoom.

The router was a bit wonky, and the error boxes kept popping up, needing to be closed. But I got everything routed and even the DRC check works.

One thing I found out, you can’t move the pads once you have changed their layer. Even if you drag select everything and move as a block, you will leave the altered pads behind (but you can’t see them! you can tell when you look at your gerbers).

It is frustrating and time-consuming, but the good news is it can be done!

Thank you for the help.

Good to hear it works :slight_smile:

Can you submit this as a bug/feature request, with an example file if possible, so the developers can look at this for V6 release ?
Rigid/Flex is going to be a growing use, so it would be important to improve KiCad support for this.

It looks like some simple menu/message gateway options, and an innerlayers[] display option could go some way to making what actually does work, into something more tolerable to actually use !

Do you mean inside the footprint editor ? I can’t imagine layout fracturing a part, but it would need a re-pour after any move.

Rigid/Flex is not the only use for custom layer stacks.
To get good joints and to route inner layer tracks, dense circular connectors need minimum internal layer pads, with much larger rear layer pads for hand soldering.

1 Like

Yes, that makes a good point. .

I will definitely do this. I can’t submit my current design, but I will make a nice example file to demonstrate.

No, I mean while doing the board layout. I did not change layers in the footprint editor, but in the .kicad_pcb file. Once changing layers, you cannot move the now invisible footprint, even if it is ‘selected’. If you try a block move, you may inadvertently leave the inner footprints behind.

In hindsight, I may have been better off altering the footprint file. I will have to test. This way I could incorporate the mechanical drawing outline into the footprint itself, so I wouldn’t have to draw this in the board file every time.