Routing enhancements


I’m been using Kicad (nightly build 5.0 rc2) for the past 2 months instead of my normal Orcad/PADS flow. Though those commercial tools still have some advantages, I’m very impressed with Kicad so far, and have been able to get things done without too much trouble. I’m now in my routing stage and do see some things that could make routing easier. I don’t know if the capabilities I’m looking for already exist, or whether they are enhancement requests, so I thought I’d float some ideas here to see what people think.

  1. While routing, if I place down a track or a via, if I want to change the track position, I have to cancel the route and then either delete or undo the route steps. PADS has a much easier interface for this, using the backspace key to undo the last track segment/corner or via placement (this already exists in Kicad when placing zone borders). This is the single biggest UI issue I’ve seen, though it might already exist or should be easy enough to implement. Using undo does exactly this, but you have to cancel the route for it to work. I’d love to see undo available (either through CTRL-Z or backspace) while routing.

  2. Local ratsnest doesn’t appear to be implemented in the GAL tool. I find it much nicer to turn the global ratsnest off while I’m working so I can concentrate on only the area I’m routing. It would be great if I could see how a single component is connected to the rest of the board without all the clutter of a full ratsnest. Will this feature be implemented?

  3. After adding vias to connect a track to a plane, Kicad wants to keep routing, so I have to ESC out of routing. That’s not a big deal, but it changes the active layer, so I have to again change back to the original active layer. It would be nice to be able to stop routing after adding a via to a plane without changing layers. Perhaps hitting a key like CTRL or ALT while adding the via stops routing.

  4. If I want to change the track width and spacing after doing some routing (I start off conservative and then find I need to be more aggressive), there does not appear to be an easy way to change the size of multiple nets at once. I can use the edit all tracks menu item to change either a single net, or all nets to the netclass settings, but what would be most helpful would be to set all nets in a single netclass to match the netclass settings. That way I could add the nets I want to modify to a new netclass, and then change them all. I’ve done this before in PADS for my LVDS pairs when I’ve found the trace width should be different after talking to my board house.

  5. I’ve used mils for all of my career, and the board houses I speak to also think in mils, we’d have to type many fewer 0s and . if we could make specifications in mils instead of inches. Kicad uses mm instead of meters, why not mils instead of inches?

  6. Sometimes when routing, I find my pin selection for interchangeable pins (like on an FPGA) doesn’t work well on the layout. To make changes, I have to go to the schematic, make the necessary changes, produce a new netlist, import that netlist, then observe my changes. I find this an iterative process where I can see another optimization that I’d like, repeating the whole process. I wish we could make netlist changes in Pcbnew and then, when all is done, do the comparison to the schematic netlist at the end.

That’s it for now… I appreciate any comments or help!

Certainly, KiCad could use a PinSwap feature.
It also needs an AddNetName ability - surely easily added to the ListNets window.

You can kludge pinswap now, with a long-hand workaround :
Select PADa -> Properties.Copy NetName
Select PADb -> Properties.paste(as prefix) NetName Select to end of line, Cut
Select PADa -> Properties.paste NetName

1 Like

KiCad is poor in grouped selections.
Probably the easiest path to allow multiple-net select, would be in the Inspect.ListNets menu.
There, allowing multiple line selects, via Ctrl.Click or a tickbox, would allow global edits of the selected items.

I agree backspace (or Ctrl-Z) is the natural go-back , which should be available when routing.
Strangely, ^Z seems to work, once you exit route, but that’s not quite a by-segment removal

Thanks for sharing. This can be easily handled as an action plugin. But, the schematics should also be changed though, and I haven’t got a slightest idea how to approach this.

If (and this is a big if) we assume:

  1. The nets to be swapped connect only two pads (they have no branches)
  2. The corresponding wires in schematics connect the pins via net name (short wire at one pin with net name tied to it, short wire on the other pin with same net name tied to it.

this could be doable. I’d have to think about it, but if you parse.sch file, find the shortest wire with this netname and swap names it might work. It is tempting, but I’ll sleep on it for a week or so. If anybody has any reservations (I am looking at you @bobc, as you always have substantial comments) or comments please let me know.

Thanks, I’ll have to try it.

I disagree. The Inspect.ListNets menu is sorted on something other than the hierarchy or netname, making searching through the nets a pain. At least the design rules page has nets ordered in a much more sensible way and you don’t have to get everything in one mass selection. Allowing the netclass settings to override the current settings of a set of nets would be easier from the user point of view, and the implementation is already there. We just need a little bit of code that allows us to limit which netclasses to override.

The user would have to manually swap in SCH, unless SCH can run Python yet ?

NET import reports changes, & also has a ‘message only’ mode, so if you forgot to match-swap in SCH, it would report that on import.
If you have kept in phase, net import will report no connection changes.

I was just thinking of a menu-list. Netclass is also ok - maybe that can have a select-in-design option, so all the selected in list highlight in PCB.

I did try a script that selected a few nets, but KiCad PCB does not support Properties popup on that selected group :frowning:
but strangely, it does on a window select, if the filters are set right.
Missing is the simple manual Ctrl-Clk multi-element select. (window select is coarse/blunt instrument)

The script can change width using track.SetWidth(NewWidth), so if you have a known list of net names, & NewWidth, then a script could give a workaround.

If you are running pcbnew and eeschema is closed, python script running from pcbnew can modify the sch files. I agree it is crude, but I’ve got it working in Archive project plugin, which archives symbols to the project local library from the pcbnew.

Interesting, but sounds above my pay-scale :wink:

I’ve got scripts that export NET files from pcb, in order to confirm a design - useful for flows where no KiCad SCH exists (eg PCAD-PCB imports)

You can’t hide only part of a ratsnest, but you can highlight a net. Turn off the ratsnest with View->Show Ratsnest or the left side tool button if you want to. Hover over a pad or track, hold down Ctrl key and click left mouse button. Do it again on an empty area to go back to normal view. It can also be toggled as a tool in the right hand toolbar, but it’s a bit confusing, because you can’t cancel it by changing to another tool - the highlight stays on if you just select another tool without first clicking on empty area.

There have been developer discussion about proper back-annotation which would make pin swapping possible. Maybe for v6.0.

It is a tought nut to crack. With FPGAs you have pin swaping, but with opamps and logic gates you have unit swaping. And there is probably more of this. And I doubt that you can handle this with unified interface.

That would be nice to have.
Swap inside pcbnew should be quite simple, as it can be done now via tedious longhand.
It does not need any database changes.

Swap in SCH is a tad more complex, as if you do not want to move the wires, you need to swap the pins on the symbol(s).
Another approach would be to highlight the pins needing swap, and let the user shift the wires, with a simple swap-wire for adjacent pin cases ?

Yes, classic ‘gate swap’ is less common, as not much 74xx gets used anymore, but resistor networks and dual-transistors in SOT353 for example, are more ‘modern’ parts where unit swapping would be useful.

Here’s a very old wishlist item for “pin swapping” and “gate swapping”:

Add a vote if you haven’t done it already and maybe comment about unit swapping.

As far as i understand it, pin swapping (and gate swapping) are planned for v6. To be honest i doubt it a bit as the file format changes will already be a lot of work so lets see how much time remains for anything else.
(At least the kicad internal data structure redesign would be needed for this.)

Thanks for putting that in the bug tracker!

I use highlighting a bit, but if I go into the legacy tool, I can see the ratsnest for a component that I select for movement. It’s not persistent, but I can get a good look at where I’m going. After checking again, this has nothing to do with local ratsnest, it’s just how movement works with the legacy tool, but it’s the right way to implement movement. Seems like moving this feature over to GAL would be reasonable.

EDIT: When trying to post the bug, I saw that this feature was brought to the nightly build just today.

Complex ratsnest handling is also a known wishlist bug. (currently it is tagged for version 6.)