# PCB (Auto-)Routability

Background

I'm working on a fairly dense mixed PTH/SMD (plated through hole / surface mount) component PCB design. I'm using Eagle CAD for it for the schematic capture / layout and I'm using the auto-router function to route. It's a two-layer board, and I'm trying to keep all the SMD components on the same side of the board for ease of manufacture.

Experience

I usually place my components in what I think are sensible locations from a point of view of interface proximity, rotate QFP packages 45 degrees where it looks like it might be useful, set the routing grid to 1mil (i.e. the minimum?), set the DRC minimum trace width to the minimum allowed by my manufacturer, click Go, catch some shuteye and see how it turns out in the morning (or that it failed). There are a lot of settings in the auto-router and DRC that I frankly never mess with because I don't understand how they impact routability (is that a word?), which may contribute to my frustrations with it.

Question

I've used Eagle a lot at this point, and I'm very happy with it, but it often seems like a real challenge to get the auto-route to complete, and routability seems to be very sensitive to component placement. It will often times get up to 98+% routed and then give up. What are some rules of thumb / guidelines / advice for how to help the auto-router get the job done?

The Eagle autorouter is a decent tool, and I use it a lot. However, like any tool, you have to know how to use it well and understand its limitations. If you are just expecting to throw everything at the autorouter, you will be dissappointed. No current auto router, and probably for a number of years to come, can do that for anything beyond contrived or toy problems.

You say there are settings in the Eagle autorouter you don't understand and never mess with. This is a bad attitude, and probably a good part of your problem. There is no set of control parameters that works on all boards. Even within 2 layer boards there are various tradeoffs. You absolutely have to read the manual and adjust the parameters for your particular situation.

For two layers boards, I often try to keep most of the bottom layer a ground plane. I therefore use the top layer for interconnects as much as possible, and the bottom layer for short "jumpers" to make the routing topology work out. In this case, I set a high cost for routing in the bottom layer.

Before autorouting, you have to look at the board and think about the critical areas that you can't explain to a autorouter. For example, you want to keep the loop currents of a switching power supply local and off the main ground plane. The same holds true for high frequency currents local to a digital chip, like bypass caps and crystal with its caps. If you are using the pseudo ground plane layer as I described above, then you want to manually connect every ground connection immediately to the ground plane with its own via. That leaves maximum room on the top layer for routing everything else.

The process of routing a board even when letting the auto router do most of the grunt work looks like this:

1. Manually route the critical paths, as I mentioned above.

2. Do basic housekeeping pre-auto routing. This includes connecting all the ground pins directly to the ground plane for example.

3. Look for problem areas where you can see the autorouter might get itself into trouble. If there are short connections in dense areas you might want to make some of them. This takes some experience and intuition, so if you're new to the particular autorouter, skip this step for now.

4. Save a copy of the board, then run the auto router. If this is the first thru here, just have it do the minimum to find a solution. The purpose of the first few times is to see where the problem areas are so you can adjust the layout and your manual pre-route accordingly.

5. Look carefully at the resulting route. See where the problem areas are. Revert back to the saved copy from step 4 and adjust your layout and manual pre-route according to what the auto router did. Repeat back to step 4 until the result looks reasonable. As you do more iterations thru here, you crank up the autorouter optimizations and other parameters to make a more final route. In the beginning you are just trying to see if it can find a solution and what the large problems are. In later passes you converge on a real route. I start out with no optimization passes, and use 8 for final routes. I also configure early passes to find a solution, then later passes to optimize it.

6. Do manual cleanup on the route. In the case of a two layer board with mostly ground on the bottom, you want to minimize the maximum dimensions of islands in the ground plane. It is better to have a large number of small islands than fewer large islands. Sometimes you can see ways of rearranging signals locally to minimize the jumpers on the bottom layer. In this stage, the big picture has already been taken care of and you are focusing on manually optimizing small areas. This is similar to a peephole optimizer of compilers.

Here is a Eagle autorouter control file I used on a two layer project with the bottom layer a ground plane to the extent possible:

; EAGLE Autorouter Control File

[Default]

RoutingGrid     = 4mil

; Trace Parameters:

tpViaShape      = Round

; Preferred Directions:

PrefDir.1       = *
PrefDir.2       = 0
PrefDir.3       = 0
PrefDir.4       = 0
PrefDir.5       = 0
PrefDir.6       = 0
PrefDir.7       = 0
PrefDir.8       = 0
PrefDir.9       = 0
PrefDir.10      = 0
PrefDir.11      = 0
PrefDir.12      = 0
PrefDir.13      = 0
PrefDir.14      = 0
PrefDir.15      = 0
PrefDir.16      = *

Active          =    1
; Cost Factors:

cfVia           =   50
cfNonPref       =    5
cfChangeDir     =    2
cfOrthStep      =    2
cfDiagStep      =    3
cfExtdStep      =    0
cfBonusStep     =    1
cfMalusStep     =    1
cfSmdImpact     =    4
cfBusImpact     =    0
cfHugging       =    3
cfAvoid         =    4
cfPolygon       =   10

cfBase.1        =    0
cfBase.2        =    1
cfBase.3        =    1
cfBase.4        =    1
cfBase.5        =    1
cfBase.6        =    1
cfBase.7        =    1
cfBase.8        =    1
cfBase.9        =    1
cfBase.10       =    1
cfBase.11       =    1
cfBase.12       =    1
cfBase.13       =    1
cfBase.14       =    1
cfBase.15       =    1
cfBase.16       =    5

; Maximum Number of...:

mnVias          =   20
mnSegments      = 9999
mnExtdSteps     = 9999
mnRipupLevel    =   50
mnRipupSteps    =  300
mnRipupTotal    =  500

[Busses]

@Route

Active          =    1
cfVia           =   10
cfChangeDir     =    5
cfBusImpact     =    4
cfPolygon       =   25
cfBase.16       =   10
mnVias          =    0
mnRipupLevel    =   10
mnRipupSteps    =  100
mnRipupTotal    =  100

[Route]

@Default

Active          =    1

[Optimize1]

@Route

Active          =    1
cfVia           =   99
cfNonPref       =    4
cfChangeDir     =    4
cfExtdStep      =    1
cfHugging       =    1
cfPolygon       =   30
cfBase.16       =   10
mnExtdSteps     =   20
mnRipupLevel    =    0
mnRipupSteps    =  100
mnRipupTotal    =  100

[Optimize2]

@Optimize1

Active          =    1
cfNonPref       =    3
cfChangeDir     =    3
cfBonusStep     =    2
cfMalusStep     =    2
cfSmdImpact     =    2
cfHugging       =    0
cfPolygon       =   40
mnExtdSteps     =   15

[Optimize3]

@Optimize2

Active          =    1
cfVia           =   80
cfNonPref       =    2
cfChangeDir     =    2
cfSmdImpact     =    0
cfPolygon       =   50
mnExtdSteps     =   10

[Optimize4]

@Optimize3

Active          =    1
cfVia           =   60
cfNonPref       =    1
cfPolygon       =   60
cfBase.16       =   12

[Optimize5]

@Optimize4

Active          =    1
cfVia           =   40
cfNonPref       =    0
cfPolygon       =   70
cfBase.16       =   14
mnExtdSteps     =    5

[Optimize6]

@Optimize5

Active          =    1
cfVia           =   20
cfBase.16       =   16

[Optimize7]

@Optimize6

Active          =    1
cfBase.16       =   18

[Optimize8]

@Optimize7

Active          =    1
cfBase.16       =   20

• I didn't mean to come across with a bad attitude... Nov 19, 2011 at 0:17

Autorouting, in general, is more of a pain than it's worth. Even with super-expensive routers. My company uses Cadence Allegro (US\$70,000 per seat), and I find that it takes longer to tell the autorouter how to do a good job than it is to just route the thing by hand. And the end results are always better. This has been true for every autorouter I've tried, and independent of board complexity. The boards I do range from simple 2-layer things with just a couple of parts up to 14 layer monsters with 16 BGA's and 2000+ nets.

• Have you tried TopoR? I have no personal experience with it, but I've always thought that conventional routers are stupid, and this one doesn't look stupid per the marketing materials. Nov 22, 2011 at 20:28
• @romkyns I have not tried TopoR. It doesn't look all that useful for my purposes. It doesn't support more complex rules about differential traces, matched impedance traces, matched trace lengths, net classes with different rules for each class, etc. Maybe it has those things, but I didn't see it mentioned on their web site.
– user3624
Nov 22, 2011 at 23:13
• I'm told it's possible to do all of those things. See Elena's answer. I've always had a good feeling about this autorouter... :) Nov 24, 2011 at 12:37

I would like to suggest TopoR. TopoR is very efficient on 2 layer boards (but it also successfully routes both single-layer and high-density multilayer boards). I can tell you that on 2 layer board it'll provide you with the best result (in comparison to other CADs)

If you are interested, I could make a sample routing of your project (I'd need .brd file) -> diztempa{at}gmail.com

• Please see David Kessner's comment in response to my suggestion of TopoR - does it support any of those features mentioned? Nov 23, 2011 at 13:12
• @romkyns It is possible to set the variety of rules in TopoR. Speaking of High-Speed rules, TopoR allows you to - Create the differential pairs - Specify the differential pair parameters: impedance ,wire width and clearance for each signal layer. - Match signal delay in the groups of nets and set delay relation between the group of nets etc PS as it's not advisable to post lost of links here, if you're interested, drop me a line on my mailbox and I'll give you detailed answer :) Nov 24, 2011 at 9:54

I have found Eagle's autorouter to be inadequate. Many people here will say that autorouting is bad and should be avoided, but I tend to disagree. I have had great success with freerouting, and I find that it generally gives much better routes than eagle with fewer vias and less total track length. They have scripts to import and export from eagle easily, and it is generally easy to use.

• So if one uses FreeRouting with Eagle, I assume you only need to buy the schematic and layout modules from CadSoft. Nov 18, 2011 at 17:05

Autorouters can be very fussy, and the algorithms vary so what works well for one might not with another.
Although I do much of my routing by hand, I am not one of those that thinks they should be avoided completely. They are just a tool like any other and if it works and makes your job easier then use it. However, personally I have never come across a router than can do a better job than you can by hand, so I wouldn't try to use it exclusively.

If the board is very complex or the routing is sensitive (i.e. has constraints the router doesn't know about and you have no decent way of "telling" it) however, then it's often better to route at least some of it by hand. If it get's to e.g. 98% complete you can often just finish it off yourself as you can judge where you might be able to relax constraints (or tell the autorouter and retry for certain nets)

Placement and routing grid is very important. Also make use of any rules you can to optimise it's performance - it can make a big difference spending some time setting it up correctly as opposed to just clicking "route".

Sometimes it's simply not possible to route the board and keep to whatever design rules you have set. There are formulas around for working out the "routablility" of a board, based on board size, number of pads, trace width, etc. Google will know more.

I haven't used the eagle router so I can't advise on that specifically, but read the documentation thoroughly and try to get to know what each individual setting does. Perhaps do this on a test board to see what works best in different situations.
I agree with CMP on Freerouter. It's actually better than most of the native autorouters I have used routing wise, so it's worth a try to see if you get better results than Eagle's.