home *** CD-ROM | disk | FTP | other *** search
/ Hacker Chronicles 2 / HACKER2.BIN / 633.ARTICLE < prev    next >
Text File  |  1989-03-25  |  29KB  |  507 lines

  1.                     Autorouting with the A* Algorithm
  2.  
  3.  
  4. 1. Introduction
  5.  
  6. A few years ago, a friend of mine designed an adapter board for the IBM PC.
  7. The tools he used were blue and red strips of tape, a sharp knife, large
  8. sheets of clear plastic, and a generous amount of patience.  It took him
  9. several weeks, and after the first board was tested he discovered that some of
  10. the traces were incorrect, and had to be cut with the knife and rerouted with
  11. solder and wires.  This caused me to start thinking about ways to use the
  12. power of the computer to simplify this tedious, error-prone job.
  13.  
  14. What you want to do when designing a printed circuit board is implement an
  15. electronic circuit.  First you will create a schematic which represents the
  16. circuit.  From this, you will derive a list of TTL chips and other components
  17. that implement the needed functions, and a list of the pins that need to be
  18. connected.  Together, these lists are referred to as the netlist.  As long as
  19. the connections are made correctly, you usually don't care where the traces
  20. (the wires that will be embedded in the board) are placed.  Autorouters are
  21. computer programs that do this task for you.
  22.  
  23. As we will see, the autorouting problem is really a search problem, and there
  24. are algorithms from the field of artificial intelligence we can use to solve
  25. it.  We will look at two of these, the breadth-first and A* search algorithms.
  26. The C source code for a freely-copyable implementation of an autorouter using
  27. the A* search algorithm accompanies this article, and programs to view the
  28. routed printed circuit board and print it on a laser printer are also
  29. available.
  30.  
  31.  
  32. 2. Autorouters
  33.  
  34. Autorouting can be viewed as a global optimization problem, which are very
  35. difficult problems to solve.  To produce a good circuit you want to minimize
  36. some things (trace length, board size, number of routing holes (holes created
  37. by the autorouter to transfer a trace from one side of the board to the other,
  38. also called vias), signal crosstalk, number of layers, cost to manufacture)
  39. while maximizing others (signal strength, reliability, ease of debugging).
  40. The measure of the overall value of a circuit will be a function of all of
  41. these often conflicting variables (assuming the circuit behaves correctly,
  42. otherwise its value is zero).  Usually it is acceptable to find a solution
  43. which satisfies a set of constraints, because finding the globally optimal
  44. solution is infeasible for all but the most trivial problems.
  45.  
  46. Autorouting can also be viewed as a collection of search problems.  The
  47. individual search problems deal with finding a route, and laying down a trace,
  48. between two locations on a printed circuit board.  There are many algorithms
  49. for solving search problems, each with different running time characteristics
  50. and data space requirements.  The two search algorithms we will be discussing
  51. are breadth-first and A*.
  52.  
  53.  
  54. 3. Autorouting by Searching
  55.  
  56. When search algorithms are used to solve the autorouting problem, they
  57. typically operate in two phases (reference [1]), and treat the board as a
  58. matrix of cells.  The first phase starts at the source cell and searches for
  59. the target cell, usually by going in several directions at the same time.
  60. While searching, an auxiliary data structure will be built which keeps track
  61. of how each cell was reached (this is referred to as Pred in the algorithms in
  62. figures 1 and 2).  Once the target cell has been found, the first phase is
  63. finished, and the second phase is started.  However, if the first phase
  64. exhausts all possibilities without reaching the target cell, then no route
  65. exists between them, and there is no reason to do the second phase.
  66.  
  67. In the second phase, the auxiliary data structure is used to trace the route
  68. from the target cell back to the source cell, actually laying down the
  69. electrical connections.  The second phase is identical for the breadth-first
  70. and A* search algorithms.  But the first phase is different, and it is what
  71. gives these algorithms different behaviors.
  72.  
  73. The main data structures used in the first phase are the Open queue and the
  74. Closed set, and are used to hold cell coordinates.  Since a cell's coordinates
  75. uniquely identify that cell, we'll say that the Open queue and Closed set
  76. contain cells.  Cell coordinates will be represented as r2c3s1 for the cell at
  77. row 2, column 3, side 1, or as r2c3 when it is understood that all cells are
  78. on the same side of the board.  To remind ourselves that Open is a queue and
  79. Closed is a set, when we talk about adding cells to them, we will put the
  80. cells "on" the queue, and "in" the set.  Initially, the Open queue contains
  81. the source cell and the Closed set is empty.  The first phase is a loop which
  82. removes an element from the head of the Open queue, puts it in the Closed set
  83. (which indicates that it has been searched), and checks to see if it is the
  84. target cell.  If it is, the first phase is done.  Otherwise, the neighbors of
  85. the cell (the cells that are adjacent to it) are placed on the Open queue, and
  86. the loop continues.  As we will see below, the essential difference in the
  87. breadth-first and A* search algorithms is the order in which the neighbors are
  88. placed on the Open queue.
  89.  
  90.  
  91. 4. Breadth-First Search
  92.  
  93. The breadth-first search algorithm (figure 1) works by processing a
  94. first-in-first-out (FIFO) queue of open cells (cells that have been reached,
  95. but not yet searched).  Initially, the open queue contains only the source
  96. cell.  A cell is removed from the head of the open queue, placed in the set of
  97. closed cells (cells that have been searched), checked to see if it is the
  98. target cell, and if it is not, its neighboring cells are placed at the tail of
  99. the open queue.  Neighboring cells which have already been reached are
  100. ignored.  (If a cell's coordinates are on the open queue or in the closed set,
  101. then it has been reached.  Otherwise, it has not been reached.)  This
  102. continues until the target cell has been found, or the open queue is empty, in
  103. which case the target cell cannot be reached from the source cell.
  104.  
  105. A version of breadth-first search known as Lee's algorithm (reference [2]) was
  106. applied to the autorouting problem in the early 1960's, and is still the basis
  107. of some autorouters.  (In the original algorithm, cells diagonally adjacent to
  108. each other were not considered to be neighbors.  Consequently, the
  109. backtracking phase could only create horizontal and vertical traces.  We will
  110. enhance the algorithm so that diagonally adjacent cells are neighbors, thus
  111. diagonal traces can also be produced.)  Unfortunately, Lee's algorithm suffers
  112. from a behavior inherent in the breadth-first search technique which limits
  113. its application to problems of relatively small size.  As the distance between
  114. the source and target cells increases by a factor of N, the number of cells
  115. processed by Lee's algorithm (and therefore the processing time) increases by
  116. the square of N.
  117.  
  118. The behavior of Lee's algorithm while searching for a path between the source
  119. cell S (r5c5) and the target cell T (r8c8) is shown in figure 2.  Lee's
  120. algorithm does not specify the order in which neighboring cells are placed on
  121. the open queue, but we will use the compass directions north, east, south, and
  122. west, followed by northeast, southeast, southwest, and northwest.  This order
  123. tends to produce traces with a minimal number of turns.
  124.  
  125. In figure 2a, the source cell (r5c5) has been searched, and its eight
  126. neighbors have been placed on the open queue.  The arrows indicate the
  127. direction from which each cell was reached, and correspond to the Pred data
  128. structure.  After the first eight cells on the open queue have been reached
  129. and moved to the closed set, the configuration in figure 2b is searched, where
  130. there are 16 cells on the open queue.  Once these 16 cells have been searched,
  131. the configuration in figure 2c is reached.  Now the target cell (r8c8) is
  132. fourth from the end on the open queue, and a solution is imminent.  When r8c8
  133. is searched, it will be recognized as the target cell, and the Pred data
  134. structure will be used to construct a trace back to the source cell.
  135.  
  136. You can see that the search progresses outward from the source cell in all
  137. directions, like the ripples in a pond when you throw a pebble into the water.
  138. If we double the size of the problem (S and T are six cells apart), the number
  139. of cells searched (and therefore the processing time) will be roughly four
  140. times as large, and if we triple the size of the problem, the number of cells
  141. searched will be roughly nine times as large.  Thus, the behavior of Lee's
  142. algorithm is quadratic in the size of the problem, which makes it infeasible
  143. for large problems.
  144.  
  145.  
  146. 5. A* Search
  147.  
  148. The A* search algorithm (figure 3) also works by processing a queue of open
  149. cells, which initially contains only the source cell.  But this is a priority
  150. queue, which means cells are inserted according to the estimated distance to
  151. the target cell (reference [3]), not just at the end.  Cells that are on the
  152. shortest estimated path from source to target are placed at the head of the
  153. queue.  Cells are still removed from the head of the open queue, then they are
  154. checked to see if they are the target cell, and if they are not, their
  155. neighboring cells are put on the open queue at the proper position.
  156. Neighboring cells which have already been searched are checked to see if the
  157. new path between them and the source cell is better (shorter) than the
  158. previous one.  If it is, they are repositioned on the open queue according to
  159. the new estimated path length from source to target.  As in breadth-first
  160. search, this continues until the target cell has been found or the open queue
  161. is empty.
  162.  
  163. A* depends on being able to estimate the distance between a cell and the
  164. target cell.  In the case of autorouting, a simple measure of this distance is
  165. available, and this helps A* to concentrate the search in the direction most
  166. likely to succeed.  The more accurate the estimate is, the faster the search
  167. will be.
  168.  
  169. In practice, A* does not suffer from the quadratic behavior of Lee's
  170. algorithm, so it solves the same problems faster, and can be applied to the
  171. larger problems that Lee's algorithm performs so poorly on.  As the distance
  172. between the source and target cells increases, the number of cells processed
  173. by A* will increase, but not as dramatically as with Lee's algorithm.
  174.  
  175. The behavior of the A* search algorithm is shown in figure 4.  The A*
  176. algorithm does not specify whether new cells are placed in front of or behind
  177. cells already on the open queue which evaluate to identical estimated path
  178. lengths.  We will use the convention that they are placed in front of cells of
  179. the same distance.  This will minimize the amount of time to insert a cell on
  180. the open queue.
  181.  
  182. In figure 4a, the source cell (r3c3) has been searched, and its eight
  183. neighbors have been placed on the open queue.  Each cell on the open queue
  184. also includes the estimated length of the shortest path from S to T that goes
  185. through that cell.  After the first cell on the open queue (r4c4) has been
  186. searched and moved to the closed set, the configuration in figure 4b is
  187. reached, where there are 12 cells on the open queue.  Once the next cell
  188. (r5c5) has been searched, the configuration in figure 4c is reached.  Now the
  189. target cell (r6c6) is at the head of the open queue, and a solution will be
  190. found on the next iteration of the loop.  When r6c6 is searched, it will be
  191. recognized as the target cell, and the Pred data structure will be used to
  192. construct a trace back to the source cell.
  193.  
  194. You can see that the search progresses more directly toward the target cell.
  195. The search is drawn toward the target just as the earth's gravity pulls
  196. objects toward the center of mass.  If we double the size of the problem, the
  197. search will search roughly twice as many cells, and if we triple the size of
  198. the problem, the search will search roughly three times as many cells.  This
  199. linear behavior makes A* more attractive for autorouting than the quadratic
  200. Lee's algorithm.  With the incorporation of the heuristic (the rule which
  201. guides the search in the direction most likely to succeed), it is more
  202. difficult to specify a worst case behavior.  However, A* will never take more
  203. time than Lee's algorithm, and will never search any cells that Lee's
  204. algorithm could avoid.
  205.  
  206.  
  207. 6. Optimizations and Generalizations
  208.  
  209. The algorithms in figures 1 and 3 solve the general search problem.  When we
  210. implement these algorithms and customize them to a particular application,
  211. there are a few things we can do to speed them up.
  212.  
  213. The A* algorithm as presented in figure 3 recomputes the heuristic H(y) when
  214. it discovers a better way to reach a cell.  Depending on how difficult this
  215. heuristic is to compute, we can probably save some work at the expense of
  216. complicating the algorithm.  When lines 20 and 21 of figure 3 are executed,
  217. the previous values of G[y] and F[y] are destroyed.  But F[y] = G[y] + H(y),
  218. so we could save F[y] - G[y] (which is H(y)) in a temporary variable, and use
  219. that variable instead of recomputing H(y) on line 21.  Also, the common
  220. subexpression G[x] + Distance(x,y) should be placed in a temporary variable,
  221. instead of being computed twice (lines 18 and 20).
  222.  
  223. Often, rather than searching for a path between two individual cells, what is
  224. really desired is a path between one of a set of source cells and one of a set
  225. of target cells (as when connecting power and ground pins).  Both algorithms
  226. can be modified by adding the entire set of source cells to the initial open
  227. queue, and checking for a member of the set of target cells on each iteration.
  228. When this is done, the heuristic that the A* algorithm uses becomes more
  229. complicated.  It must estimate the minimum distance from the current cell to
  230. any one of the target cells.
  231.  
  232. For breadth-first search, once the target cell is placed on the open queue, it
  233. is pointless to add any more cells to the open queue.  In fact, once this
  234. happens the problem has been solved.  An appropriate shortcut would be to
  235. insert a check before line 13 in figure 1 to see if y is the target cell.  If
  236. it is, immediately use Pred[y] to construct the trace back to the source cell,
  237. and return.
  238.  
  239.  
  240. Distance Calculations    [sidebar topic, with figures 5, 6, and 7]
  241.  
  242. The A* search algorithm depends on a heuristic to estimate the distance
  243. between the current cell and the target cell.  As implemented in the
  244. accompanying program, the heuristic is a simple geometric distance
  245. approximation.
  246.  
  247. Figure 5 illustrates all of the possible cell types used to construct a trace,
  248. grouped by type.  For each group, the distance of that cell type is also
  249. given.  These distances are calculated based on a cell size of 50 mils by 50
  250. mils.  A mil is a thousandth of an inch, so the autorouter uses 20 cells per
  251. inch.  A typical full-length adapter board for an IBM PC is 4 inches high and
  252. 13 inches long, or 80 cell rowss by 260 cell columns.
  253.  
  254. The traces of groups B and C can coexist in the same cell, so that a hole can
  255. have up to 16 traces connecting it with other cells (8 on each side of the
  256. board).  Also, the parallel traces of group F can coexist in the same cell (on
  257. the same side of the board), as shown by group J.  This allows the routing of
  258. two traces through the same cell, providing the higher density required by
  259. some circuits (memory arrays, for example).  Aside from these exceptions,
  260. cells can only contain one type of trace (on each side of the board).
  261.  
  262. In figure 6, we want to know the approximate distance of a trace that will
  263. connect the two holes.  Viewing the board as a matrix, the differences in cell
  264. coordinates are three rows and five columns.  The shortest path between them
  265. will use a diagonal trace across three cells and a horizontal trace across two
  266. cells, as shown.  Using the cell types in figure 5, the length of the trace
  267. will be 23 + (2 * 71) + 60 + 50 + 12 = 287 mils.
  268.  
  269. A trace that uses a routing hole to go from one side of the board to the other
  270. covers a greater distance than one that goes diagonally across a cell (group E
  271. in figure 5) and stays on the same side of the board.  This is because part of
  272. its path goes around the edge of a circle.
  273.  
  274. A hole is 25 mils in diameter, and is at the center of a cell.  To calculate
  275. the distance of a trace through a routing hole, we measure the section of the
  276. hole between the two connecting traces.  Figure 7 shows an entering trace
  277. connecting to a hole at point A, and possible exiting traces on the opposite
  278. side of the board at points B, C, D, and E.  The distances between A and each
  279. of these points are 10, 20, 29, and 39 mils, respectively.  To calculate
  280. these, we use the geometric formula Circumference = PI * Diameter
  281. (approximately 78.5 mils) and divide by eight (a one-eighth section of a hole
  282. is approximately 9.8 mils), then add one, two, three, and four of these
  283. sections, and round off to an integer.
  284.  
  285. The heuristic in the accompanying program includes a penalty when a trace
  286. takes a turn or switches to the other side of the board through a routing
  287. hole.  This is because turns are often the weak points in a circuit, and
  288. traces are more likely to break at a turn than in a straight part.  Including
  289. a penalty encourages A* to use straight lines, and even allows a slightly
  290. longer trace to be selected over one with too many turns.  The amount of
  291. penalty depends on the kind of turn; sharper turns are assessed a larger
  292. penalty.  Routing holes incur a significant penalty, since overusing them
  293. early in the routing process can make later traces more difficult or even
  294. impossible to construct.  This is because a routing hole dedicates a cell
  295. exclusively to a single trace, for both sides of the board.  Such a cell is
  296. not available to later routing, thus reducing the total number of cells that
  297. can be used.
  298.  
  299.  
  300. 7. Memory Requirements
  301.  
  302. Both of the search algorithms require quite a bit of memory in order to solve
  303. problems of non-trivial size.  The breadth-first search algorithm needs memory
  304. to represent the board, the predecessor structure, and the closed set.  The A*
  305. search algorithm needs these too, plus structures for F[x] and G[x].  In
  306. addition, both algorithms need to dynamically allocate memory for the open
  307. cell queue.
  308.  
  309. In this program, the board is represented as a pair of two-dimensional arrays
  310. (one for the front side of the printed circuit board, and one for the back
  311. side), where the dimensions are the number of rows and columns of cells.  Not
  312. counting holes and traces relating to holes (figure 5, groups A, B, and C),
  313. there are 30 possible cell contents, which can be represented with five bits
  314. per cell.  The hole-related cells are more difficult to enumerate, since they
  315. can be combined in many ways.  If we simply assign one bit to each of the
  316. eight traces in groups B and C, and add one more bit to indicate a hole, 14
  317. bits will be sufficient to represent any cell.  On a board of N rows and M
  318. columns, we'll need N*M*28 bits total.
  319.  
  320. The predecessor structure will also be a pair of two-dimensional arrays, where
  321. an entry must be able to represent one of the eight compass directions or an
  322. indication for the opposite side of the board.  This will take four bits per
  323. cell, or N*M*8 bits total.
  324.  
  325. The closed set can be represented by a pair of two-dimensional single-bit
  326. arrays, where a bit is one if the corresponding cell has been searched, and
  327. zero otherwise.  This will take N*M*2 bits total.
  328.  
  329. F[x] and G[x] will be similar to the board arrays, but they must contain a
  330. 16-bit integer for each cell.  This will take N*M*64 bits total.  Note that if
  331. memory usage needs to be minimized at the cost of increased processing time,
  332. we could omit the F[x] arrays, and calculate the F values as they are needed
  333. from the G[x] arrays and the heuristic function, H(x).
  334.  
  335. Breadth-first search will require N*M*38 bits and A* will require N*M*102 bits
  336. of static memory.  For a printed circuit board that is 4 inches by 13 inches
  337. (80 cells by 260 cells), breadth-first search will need 98800 bytes and A*
  338. will need 265200 bytes.  It is often the case that different algorithms to
  339. solve the same problem trade off memory against processing time to achieve
  340. different behaviors.  This is the case with breadth-first search and A*.
  341.  
  342.  
  343. 8. Locality of Reference
  344.  
  345. Despite the fact that A* requires more memory than breadth-first search, A*
  346. exhibits better memory usage patterns.  This is because it shows better
  347. locality of reference than breadth-first search.  Locality of reference deals
  348. with the sequence in which memory locations are used, and consists of two
  349. rules of thumb: (1) the memory location currently being referenced is likely
  350. to be referenced again in the near future, and (2) memory locations near the
  351. one currently being referenced are likely to be referenced in the near future.
  352.  
  353. When the first rule holds true for a given program, that program can probably
  354. benefit from a memory cache.  When the second rule holds true, the program can
  355. probably benefit from a virtual memory environment with a least-recently-used
  356. page preemption policy.  Most computer systems with virtual memory and caches
  357. apply them to both code and data, so programs that exhibit good locality of
  358. reference should benefit from both rules.
  359.  
  360. This becomes a factor when solving large problems (say, routing a printed
  361. circuit board that is 10 inches in both dimensions).  In a virtual memory
  362. environment, improved locality of reference can minimize swapping.  In an
  363. environment with cache memory, improved locality of reference can increase the
  364. cache hit rate.  Both of these tend to decrease the total running time.
  365.  
  366. The memory references in the breadth-first search algorithm go around and
  367. around in circles of constantly increasing size, and do not reflect a common
  368. locality of reference.  Thus, the breadth-first search algorithm is not able
  369. to take good advantage of virtual memory or a memory cache.  However, the
  370. memory references of A* tend to be from the same area of the printed circuit
  371. board for extended periods of time, taking better advantage of these
  372. mechanisms.  On a large problem, this helps to offset the extra memory that A*
  373. requires by adding speed beyond that provided by the basic algorithm.
  374. Improved locality of reference by itself may not be a sufficient reason to
  375. select A* over breadth-first search, but it is icing on the cake.
  376.  
  377.  
  378. 9. Input and Output Formats
  379.  
  380. Figure 8 contains an example input file; it defines a circuit to calculate a
  381. parity bit for a 16-bit word using exclusive-or gates.  There are statements
  382. for defining the size of the printed circuit board, the locations of holes and
  383. components, and the connections between them.
  384.  
  385. The autorouter sorts the connections by approximate trace distance (see the
  386. section on distance calculations, above); the shortest connections are
  387. processed first, and the longest are processed last.  However, connections
  388. which include the "priority" keyword are processed before any of the other
  389. connections.  This allows the designer to have control over the order in which
  390. traces are constructed.
  391.  
  392. In addition, there are statements for defining chip templates, and associating
  393. position-independent labels to each component and pin.  This makes it easy to
  394. move components from one location to another without having to edit each
  395. connection.  Chips can be rotated in any of four directions.
  396.  
  397. Figure 9 shows the traces created by the autorouter while processing the
  398. example input file in figure 8.  On an 8 Mhz IBM PC-AT compatible computer,
  399. this board took 37 seconds of processing time to route.
  400.  
  401. The output from the autorouter is a copy of the printed circuit board as it is
  402. represented in memory.  This consists of the dimensions of the board (number
  403. of rows and columns), followed by a pair of two-dimensional arrays (one for
  404. the front side, and one for the back).  The elements of the arrays are double
  405. words (32 bits) containing bits which encode the contents of each cell.  For
  406. example, if a particular bit is set, there is a horizontal line running across
  407. the cell, and if a different bit is set, there is a hole in the cell.
  408.  
  409.  
  410. 10. Viewing and Printing the Board
  411.  
  412. A program to view the routed printed circuit board on an IBM PC equipped with
  413. an enhanced graphics adapter (EGA) is provided with the autorouter.  The
  414. viewing program provides four levels of detail (zooming), panning, and viewing
  415. of the front and back sides of the printed circuit board separately.
  416.  
  417. Another program prints the routed printed circuit board on a laser printer.
  418. This program allows the user to specify four levels of detail and resolution
  419. ranging from 75 to 300 dots per inch (dpi).  Figure 9 was produced with this
  420. program using the maximum zoom level and 300 dpi.
  421.  
  422.  
  423. 11. Future Enhancements
  424.  
  425. The autorouter presented here provides the basics of a personal computer CAD
  426. system, but could be enhanced in many ways.  A few of these are:
  427.  
  428. * Use Lotus-Intel-Microsoft (LIM) 4.0 expanded memory to provide access to
  429.   more memory.
  430.  
  431. * Incrementally save the board after each connection is routed, so that a
  432.   large problem can be solved in several short sessions, rather than requiring
  433.   a computer to be dedicated for an extended period of time.
  434.  
  435. * Automatically compress the output (which often consists of many repeated
  436.   bytes) to save disk space.
  437.  
  438. * Wide traces for power and ground.
  439.  
  440. * Calculate how close the solution of each connection is to the optimal
  441.   solution.
  442.  
  443. * Add symbolic support for components such as capacitors, resistors, and
  444.   diodes.
  445.  
  446. * Support surface mount technology (a pad, rather than a hole).
  447.  
  448. * Display a "rat's nest" of direct routes (use a straight lines for each
  449.   connection, without regard for whether traces cross).  This would help the
  450.   designer decide how the components should be arranged.  It may also be
  451.   possible to do an analysis, and suggest in which direction each component
  452.   should be moved.  Reducing the total distance of the traces that must be
  453.   routed can significantly reduce the processing time of any autorouter.
  454.  
  455. * Provide support for printed circuit boards with more than two routing
  456.   layers.
  457.  
  458. * A program the designer can use to edit the routed printed circuit board.
  459.  
  460. * Allow multiple priority levels for connections.
  461.  
  462. * Visually distinguish holes from routing holes by displaying them in a
  463.   different color.
  464.  
  465. * Increase the size of the TTL library (chip definitions).
  466.  
  467. * A program to translate the output into Gerber format (a standard language
  468.   for describing trace and hole placement, used for board fabrication) and
  469.   Excellon format (a standard language for describing hole placement, used to
  470.   drill the holes).
  471.  
  472.  
  473. 12. Conclusion
  474.  
  475. When autorouting is viewed as a special kind of search problem, there are
  476. several search algorithms from the field of artificial intelligence that can
  477. be used to solve it.  An autorouting program can be easily implemented on a
  478. microcomputer, such as the IBM PC family of computers, and can greatly reduce
  479. the amount of work required to route a printed circuit board by hand.  When
  480. combined with other tools, such as the viewing and printing programs,
  481. high-resolution output devices (laser printers), and high performance
  482. 386-based microcomputers, a complete design system can be built which makes
  483. tape-ups obsolete.  Just a few years ago, such a system would have required an
  484. expensive workstation.
  485.  
  486.  
  487. 13. Author Biography
  488.  
  489. Randy Nevin received a BS in computer science from Oregon State University in
  490. 1983 and an MS in computer science from the University of Washington in 1988.
  491. He has worked for Microsoft since 1983 on various programming language and
  492. networking products.
  493.  
  494.  
  495. 14. References
  496.  
  497. [1] Stephen E. Belter, Computer-aided Routing of Printed Circuit Boards: an
  498.     Examination of Lee's Algorithm and Possible Enhancements, BYTE, June 1987,
  499.     pp. 199-208.
  500.  
  501. [2] C. Y. Lee, An Algorithm for Path Connections and Its Applications, IRE
  502.     Transactions on Electronic Computers, September 1961, pp. 346-365.
  503.  
  504. [3] Steven L. Tanimoto, The Elements of Artificial Intelligence, 1987,
  505.     Rockville, Maryland: Computer Science Press, pp. 148-164.  This covers the
  506.     breadth-first and A* search algorithms.
  507.