%----------------------------------------------------------------------------
% Magic tutorial number 7
%----------------------------------------------------------------------------

\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\documentclass[letterpaper,twoside,12pt]{article}
\usepackage{epsfig,times}

\setlength{\textwidth}{8.5in}
\addtolength{\textwidth}{-2.0in}
\setlength{\textheight}{11.0in}
\addtolength{\textheight}{-2.0in}
\setlength{\oddsidemargin}{0in}
\setlength{\evensidemargin}{0pt}
\setlength{\topmargin}{-0.5in}
\setlength{\headheight}{0.2in}
\setlength{\headsep}{0.3in}
\setlength{\topskip}{0pt}

\def\hinch{\hspace*{0.5in}}
\def\starti{\begin{center}\begin{tabbing}\hinch\=\hinch\=\hinch\=hinch\hinch\=\kill}
\def\endi{\end{tabbing}\end{center}}
\def\ii{\>\>\>}
\def\mytitle{Magic Tutorial \#7: Netlists and Routing}

%----------------------------------------------------------------------------

\begin{document}

\makeatletter
\newcommand{\ps@magic}{%
	\renewcommand{\@oddhead}{\mytitle\hfil\today}%
	\renewcommand{\@evenhead}{\today\hfil\mytitle}%
	\renewcommand{\@evenfoot}{\hfil\textrm{--{\thepage}--}\hfil}%
	\renewcommand{\@oddfoot}{\@evenfoot}}
\newcommand{\ps@mplain}{%
	\renewcommand{\@oddhead}{}%
	\renewcommand{\@evenhead}{}%
	\renewcommand{\@evenfoot}{\hfil\textrm{--{\thepage}--}\hfil}%
	\renewcommand{\@oddfoot}{\@evenfoot}}
\makeatother
\pagestyle{magic}
\thispagestyle{mplain}


\begin{center}
  {\bfseries \Large \mytitle} \\
  \vspace*{0.5in}
  {\itshape John Ousterhout} \\
  \vspace*{0.5in}
   Computer Science Division \\
   Electrical Engineering and Computer Sciences \\
   University of California \\
   Berkeley, CA  94720 \\
  \vspace*{0.25in}
  {\itshape (Updated by others, too.)} \\
  \vspace*{0.25in}
  This tutorial corresponds to Magic version 7. \\
\end{center}
\vspace*{0.5in}

{\noindent\bfseries\large Tutorials to read first:}
\starti
   \> Magic Tutorial  \#1: Getting Started \\
   \> Magic Tutorial \#2: Basic Painting and Selection \\
   \> Magic Tutorial \#3: Advanced Painting (Wiring and Plowing) \\
   \> Magic Tutorial \#4: Cell Hierarchies \\
   \> Magic Tutorial \#5: Multiple Windows \\
\endi

{\noindent\bfseries\large Netlist Commands introduced in this tutorial:}
\starti
   \> :extract, :flush, :ripup, :savenetlist, :trace, :writeall
\endi

{\noindent\bfseries\large Layout Commands introduced in this tutorial:}
\starti
   \> :channel, :route
\endi

{\noindent\bfseries\large Macros introduced in this tutorial:}

\starti
   \> {\itshape (none)}
\endi

\vspace*{0.75in}
\section{Introduction}

This tutorial describes how to use Magic's automatic routing
tools to make interconnections between subcells in a design.  In
addition to the standard Magic router, which is invoked by the {\bfseries route}
command and covered in this tutorial, two
other routing tools are available.  A gate-array router {\itshape Garouter}
permits user specified channel definitions, terminals in the interior
of cells, and route-throughs across cells.  To learn about the gate-array
router read this first then
``Magic Tutorial \#12:  Routing Gate Arrays''.  Finally Magic
provides an interactive maze-router that takes graphic hints, the 
{\itshape Irouter}, that
permits the user to control the overall path of routes while leaving
the tedious details to Magic.  The {\itshape Irouter} is documented in 
``Magic Tutorial \#10:  The Interactive Router''.

The standard Magic router provides an {\itshape obstacle-avoidance}
capability:  if there is mask material in
the routing areas, the router can work under, over, or
around that material to complete the connections.  This means
that you can pre-route key signals by hand and have Magic
route the less important signals automatically.  In addition,
you can route power and ground by hand (right now we don't have
any power-ground routing tools, so you {\itshape have}
to route them by hand).

The router {\itshape only} makes connections between
subcells; to make point-to-point connections between pieces of layout within
a single cell you should use the wiring command described
in ``Magic Tutorial \#3: Advanced Painting (Wiring and Plowing) '' or
the maze router described in ``Magic Tutorial \#10:  The Interactive Router''.
If you only need to make a few connections you are probably better off doing
them manually.

The first step in routing is to tell Magic what should be connected
to what.  This information is contained in a file called a {\itshape netlist}.
Sections 2, 3, 4, and 5 describe how to create and modify netlists using
Magic's interactive netlist editing tools.
Once you've created a netlist, the next step is to invoke the
router.  Section 6 shows how to do this, and gives a brief summary
of what goes on inside the routing tools.  Unless your design is
very simple and has lots of free space, the routing probably won't
succeed the first time.  Section 7 describes the feedback provided
by the routing tools.  Sections 8 and 9 discuss how you can modify your design
in light of this feedback to improve its routability.
You'll probably need to iterate a few times until the routing is successful.

\section{Terminals and Netlists}

A netlist is a file that describes a set of desired connections.
It contains one or more {\itshape nets}.  Each net names a
set of {\itshape terminals} that should all be wired together.
A terminal is simply a label attached to a piece of mask material within
a subcell; it is distinguishable from ordinary labels within a subcell by its
presence within a netlist file and by certain characteristics
common to terminals, as described below.

The first step in building a netlist is to label the terminals in
your design.  Figure 1 shows an example.  Each label should
be a line or rectangle running along the edge of the cell (point terminals
are not allowed).
The router will make a connection to the cell somewhere along a
terminal's length.
If the label isn't at the edge of the cell,
Magic will route recklessly across the cell to reach the terminal,
taking the shortest path between the terminal and a routing channel.
It's almost always a good idea to arrange for terminal labels to
be at cell edges.  The label must be at least as wide as the minimum width
of the routing material;  the wider you make the label, the more flexibility
you give the router to choose a good point to connect to the terminal.

\begin{figure}[ht]
   \begin{center}
      \epsfig{file=../psfigures/tut7.1.ps, width=0.5\columnwidth}
      \caption{An example of terminal labels.  Each terminal
	should be labeled with a line or rectangle along the
	edge of the cell.}
   \end{center}
\end{figure}

Terminal labels must be attached to mask material that connects
directly to one of Magic's two routing layers (Routing layers are defined
in Magic's technology file).
For example, in the SCMOS process
where the routing layers are metal1 and metal2, diffusion
may not be used as a terminal since neither of the routing
layers will connect directly to it.  On the other hand, a terminal
may be attached to diffusion-metal1 contact, since the metal1 routing layer
will connect properly to it.
Terminals can have arbitrary names, except that they should not
contain slashes (``/'') or the substring ``feedthrough'', and should not
end in ``@'', ``\$'', or ``\^{}''.
See Tutorial \#2 for a complete description of labeling conventions.

For an example of good and bad terminals, edit the cell {\bfseries tut7a}.
The cell doesn't
make any electrical sense, but contains several good and bad
terminals.
All the terminals with names like {\bfseries bad1} are incorrect or
undesirable for one of the reasons given above, and those with
names like {\bfseries good4} are acceptable.

\begin{figure}[ht]
   \begin{center}
      \epsfig{file=../psfigures/tut7.2.ps, width=0.7\columnwidth}
      \caption{The netlist menu.}
   \end{center}
\end{figure}

\begin{table}[ht]
   \begin{center}
      \begin{tabular}{|l|l|} \hline
	Button	& Action \\ \hline
	Current Text	& Left-click:  prompt for more labels \\
			& Right-click:  advance to next label \\ \hline
	Placer		& Left-click:  place label \\
			& Right-click:  change label text position \\ \hline
	Pumps		& Left-click:  decrement number \\
			& Right-click:  increment number \\ \hline
	Find		& Search under box, highlight labels \\
			& matching current text \\ \hline
	Current Netlist	& Left-click:  prompt for new netlist name \\
			& Right-click:  use edit cell name as netlist name \\ \hline
	Verify		& Check that wiring matches netlist (same as \\
			& typing {\bfseries :verify} command) \\ \hline
	Print		& Print names of all terminals in selected net \\
			& (same as typing {\bfseries :print} command) \\ \hline
	Terms		& Place feedback areas on screen to identify all terminals \\
			& in current netlist (same as {\bfseries :showterms} command) \\
				\hline
	Cleanup		& Check current netlist for missing labels and nets \\
			& with less than two terminals (same as typing \\ \hline
			& {\bfseries :cleanup} command) \\
	No Net		& Delete selected net (same as {\bfseries :dnet} command) \\
				\hline
	Show		& Highlight paint connected to material under box \\
			& (same as typing {\bfseries :shownet} command) \\ \hline
      \end{tabular}
      \caption{A summary of all the netlist menu button actions.}
   \end{center}
\end{table}

If you create two or more terminal labels with the same name in the same cell
the router will assume that they are electrically equivalent (connected
together within the cell).
Because of this, when routing the net it will feel free to connect to
whichever one of the terminals is most convenient, and ignore the others.
In some cases the router may take advantage of electrically equivalent
terminals by using {\itshape feed throughs}: entering a cell at one terminal to make
one connection, and exiting through an equivalent terminal on the way to make
another connection for the same net.

\section{Menu for Label Editing}

Magic provides a special menu facility to assist you in placing terminal labels
and editing netlists.  To make the menu appear, invoke the Magic command

\starti
   \ii {\bfseries :specialopen netlist}
\endi

A new window will appear in the lower-left corner of the screen,
containing several rectangular areas on a purple background.  Each
of the rectangular areas is called a {\itshape button}.  Clicking
mouse buttons inside the menu buttons will invoke various
commands to edit labels and netlists.
Figure 2 shows a diagram of the netlist menu and Table I summarizes
the meaning of button clicks in various menu items.
The netlist menu can be grown, shrunk, and moved just like any other
window;  see ``Magic Tutorial \#5: Multiple Windows'' for details.
It also has its own private set of commands.  To see what commands
you can type in the netlist menu, move the cursor over the menu and
type

\starti
   \ii {\bfseries :help}
\endi

You shouldn't need to type commands in the netlist menu very often,
since almost everything you'll need to do can be done using
the menu.  See Section 9 for a description of a few of the commands you
can type;  the complete set is described in the manual
page {\itshape magic(1)}.  One of the best uses for the commands is so
that you can define macros for them and avoid having to go back and
forth to the menu;  look up the {\bfseries :send} command in the man page
to see how to do this.
The top half of the
menu is for placing labels and the bottom half is for editing
netlists.  This section describes the
label facilities, and Section 4 describes the netlist facilities.

The label menu makes it easy for you to enter lots
of labels, particularly when there are many labels that are the
same except for a number, e.g. {\bfseries bus1}, {\bfseries bus2}, {\bfseries bus3},
etc.  There are four sections to the label menu:  the current text,
the placer, two pumps, and the {\bfseries Find} button.  To place labels,
first click the left mouse button over the current text rectangle.
Then type one or more labels on the keyboard, one per
line.  You can use this mechanism to enter several labels at once.
Type return twice to signal the end of
the list.  At this point, the first of the labels you typed will
appear in the current text rectangle.

To place a label, position the box over the area you want to label,
then click the left mouse button inside one of the squares of the
placer area.  A label will be created with the current text.
Where you click in the placer determines where the label text
will appear relative to the label box:  for example, clicking the left-center
square causes the text to be centered just to the left of the box.
You can place many copies of the same label by moving the box and
clicking the placer area again.  You can
re-orient the text of a label by clicking the right mouse button
inside the placer area.  For example, if you would like to
move a label's text so that it appears centered above the label,
place the box over the label and right-click the top-center placer
square.

If you entered several labels at once, only the first appears in
the current text area.  However, you can advance to the next label
by right-clicking inside the current text area.  In this way you
can place a long series of labels entirely with the mouse.  Try
using this mechanism to add labels to {\bfseries tut7a}.

The two small buttons underneath the right side of the current
text area are called pumps.  To see how these work, enter a label
name containing a number into the current text area, for example,
{\bfseries bus1}.  When you do this, the ``1'' appears in the left
pump.  Right-clicking the pump causes the number to increment,
and left-clicking the pump causes the number to decrement.  This
makes it easy for you to enter a series of numbered signal names.
If a name has two numbers in it, the second number will appear in
the second pump, and it can be incremented or decremented too.
Try using the pumps to place a series of numbered names.

The last entry in the label portion of the menu is the {\bfseries Find}
button.  This can be used to locate a label by searching for
a given pattern.  If you click the {\bfseries Find} button, Magic
will use the current text as a pattern and
search the area underneath the box for a label whose name
contains the pattern.  Pattern-matching is done in the same
way as in {\itshape csh}, using the special characters ``*'',
``?'', ``\\'', ``['', and ``]''.  Try this on {\bfseries tut7a}:
enter ``good*'' into the current text area, place the box around
the whole cell, then click on the ``Find'' button.  For each of
the good labels, a feedback area will be created with white
stripes to highlight the area.  The {\bfseries :feedback find} command
can be used to step through the areas, and {\bfseries :feedback clear}
will erase the feedback information from the screen.  The {\bfseries :feedback}
command has many of the same options as {\bfseries :drc} for getting
information about feedback areas;  see the Magic manual page for
details, or type {\bfseries :feedback help} for a synopsis of the options.


\section{Netlist Editing}

After placing terminal labels, the next step is to specify the connections
between them; this is called netlist editing.
The bottom half of the netlist menu is used for editing netlists.
The first thing you must do is to specify the netlist you want
to edit.  Do this by clicking in the current netlist box.  If
you left-click, Magic will prompt you for the netlist name and
you can type it at the keyboard.  If you right-click, Magic will
use the name of the edit cell as the current netlist name.  In
either case, Magic will read the netlist from disk if it exists
and will create a new netlist if there isn't currently a netlist
file with the given name.  Netlist
files are stored on disk with a ``.net'' extension, which is
added by Magic when it reads and writes files.  You can
change the current netlist by clicking the current
netlist button again.  Startup
Magic on the cell {\bfseries tut7b}, open the netlist
menu, and set the current netlist to {\bfseries tut7b}.  Then
expand the subcells in {\bfseries tut7b} so that you can see
their terminals.

\begin{table}[ht]
   \begin{center}
      \begin{tabular}{|l|l|} \hline
	Button	& Action \\ \hline
	Left	& Select net, using nearest terminal to cursor. \\ \hline
	Right	& Toggle nearest terminal into or out of \\
		& current net. \\ \hline
	Middle	& Find nearest terminal, join its net with the \\
		& current net. \\ \hline
      \end{tabular}
      \caption{The actions of the mouse buttons when the terminal tool is in use.}
   \end{center}
\end{table}

Netlist editing is done with the netlist tool.  If you haven't
already read ``Tutorial \#3: Advanced Painting (Wiring and Plowing)'',
you should read it now, up through Section 2.1.  Tutorial \#3
explained how to change the current tool by using the space macro
or by typing {\bfseries :tool}.  Switch tools to the netlist tool (the
cursor will appear as a thick square).

When the netlist tool is in use the left, right, and middle
buttons invoke select, toggle, and join operations respectively
(see Table II).
To see how they work, move the cursor over the terminal
{\bfseries right4} in the top subcell of {\bfseries tut7b} and click
the left mouse button (you may have to zoom in a bit to see the
labels;  terminals are numbered in clockwise order:  {\bfseries right4}
is the fourth terminal from the top on the right side).  This
causes the net containing that
terminal to be selected.  Three hollow white squares will appear
over the layout, marking the terminals that are supposed
to be wired together into {\bfseries right4}'s net.  Left-click
over the {\bfseries left3} terminal in the same subcell to select its net,
then select the {\bfseries right4} net again.

The right button is used to toggle terminals into or out of the
current net.  If you right-click over a terminal that is in the
current net, then it is removed from the current net.  If you
right-click over a terminal that isn't in the current net, it
is added to the current net.  A single terminal can only be in
one net at a time, so if a terminal is already in a net when
you toggle it into another net then Magic will
remove it from the old net.  Toggle the terminal {\bfseries top4}
in the bottom cell out of, then back into, the net containing
{\bfseries right4}.  Now toggle {\bfseries left3} in the bottom cell
into this net.  Magic warns you because it had to remove {\bfseries left3}
from another net in order to add it to {\bfseries right4}'s net.  Type
{\bfseries u} to undo this change, then left-click on {\bfseries left3} to
make sure it got restored to its old net by the undo.  All of
the netlist-editing operations are undo-able.

The middle button is used to merge two nets together.  If you
middle-click over a terminal, all the terminals in its net are
added to the current net.  Play around with the three buttons
to edit the netlist {\bfseries tut7b}.

Note:  the router does not make connections to terminals in the
top level cell.
It only works with terminals in subcells, or sub-subcells, etc.
Because of this, the netlist editor does not permit you to select
terminals in the top level cell.
If you click over such a terminal Magic prints an error message
and refuses to make the selection.

If you left-click over a terminal that is not currently in a net,
Magic creates a new net automatically.  If you didn't
really want to make a new net, you have several choices.  Either
you can toggle the terminal out of its own net, you can undo the
select operation, or you can click the {\bfseries No Net} button in
the netlist menu (you can do this even while the cursor is
in the square shape).  The {\bfseries No Net} button removes all terminals
from the current net and destroys the net.  It's a bad idea to
leave single-net terminals in the netlist:  the router will treat
them as errors.

There are two ways to save netlists on disk;  these are similar
to the ways you can save layout cells.  If you type

\starti
   \ii {\bfseries :savenetlist }[{\itshape name}]
\endi

with the cursor over the netlist menu,
the current netlist will be saved on disk in the file {\itshape name}.{\bfseries net}.
If no {\itshape name} is typed, the name of the current netlist is used.
If you type the command

\starti
   \ii {\bfseries :writeall}
\endi

then Magic will step through all the netlists that have been
modified since they were last written, asking you if
you'd like them to be written out.  If you try to leave Magic
without saving all the modified netlists, Magic will warn you
and give you a chance to write them out.

If you make changes to a netlist and then decide you don't want them,
you can use the {\bfseries :flush} netlist command to throw away
all of the changes and re-read the netlist from its disk file.
If you create netlists using a text editor or some other program,
you can use {\bfseries :flush} after you've modified the netlist file
in order to make sure that Magic is using the most up-to-date
version.

The {\bfseries Print} button in the netlist menu will print out on
the text screen the names of all the terminals in the current
net.  Try this for some of the nets in {\bfseries tut7b}.
The official name of a terminal looks
a lot like a Unix file name, consisting of a bunch of fields
separated by slashes.  Each field except the last is the
id of a subcell, and the last field is the name of the terminal.
These hierarchical names provide unique names for each terminal,
even if the same terminal name is re-used in different cells or
if there are multiple copies of the same cell.

The {\bfseries Verify} button will check the paint of the edit cell
to be sure it implements the connections specified in the
current netlist.  Feedback areas are created to show
nets that are incomplete or nets that are shorted together.

The {\bfseries Terms} button will cause Magic to generate a feedback
area over each of the terminals in the current netlist, so
that you can see which terminals are included in the netlist.
If you type the command {\bfseries :feedback clear} in a layout
window then the feedback will be erased.

The {\bfseries Cleanup} button is there as a convenience to help
you cleanup your netlists.  If you click on it, Magic will
scan through the current netlist to make sure it is reasonable.
{\bfseries Cleanup} looks for two error conditions:  terminal names
that don't correspond to any labels in the design, and nets
that don't have at least two terminals.  When it finds either
of these conditions it prints a message and gives you the
chance to either delete the offending terminal (if you type
{\bfseries dterm}), delete the offending net ({\bfseries dnet}), skip the
current problem without modifying the netlist and continue
looking for other problems ({\bfseries skip}), or abort the {\bfseries Cleanup}
command without making any more changes ({\bfseries abort}).

The {\bfseries Show} button provides an additional mechanism for displaying
the paint in the net.  If you place the box over a piece
of paint and click on {\bfseries Show}, Magic will highlight all of the
paint in the net under the box.  This is similar to pointing at the net and
typing {\bfseries s} three times to select the net, except that {\bfseries Show}
doesn't select the net (it uses a different mechanism to highlight it),
and {\bfseries Show} will trace through all cells, expanded or not (the
selection mechanism only considers paint in expanded cells).  Once you've
used {\bfseries Show} to highlight a net, the only way to make the highlighting
go away is to place the box over empty space and invoke {\bfseries Show} again.
{\bfseries Show} is an old command that pre-dates the selection interface,
but we've left it in Magic because some people find it useful.


\section{Netlist Files}

Netlists are stored on disk in ordinary text files.
You are welcome to edit those files by hand or to
write programs that generate the netlists automatically.
For example, a netlist might be generated by a schematic
editor or by a high-level simulator.  See the manual page
{\itshape net(5)} for a description of netlist file format.


\section{Running the Router}

Once you've created a netlist, it is relatively easy to invoke
the router.  First, place the box around the area you'd like
Magic to consider for routing.  No terminals outside this area
will be considered, and Magic will not generate any paint more than
a few units outside this area (Magic may use the next routing
grid line outside the area).  Load {\bfseries tut7d}, {\bfseries :flush} the
netlist if you made any changes to it, set the box to the bounding
box of the cell, and then invoke the router using the command:

\starti
   \ii {\bfseries :route}
\endi

When the command completes, the netlist should be routed.
Click the {\bfseries Verify} netlist button to make sure the connections
were made correctly.  Try deleting a piece from one of the
wires and verify again.  Feedback areas should appear to
indicate where the routing was incorrect.  Use the {\bfseries :feedback}
command to step through the areas and, eventually, to delete
the feedback ({\bfseries :feedback help} gives a synopsis of the command
options).

If the router is unable to complete the connections, it will
report errors to you.
Errors may be reported in several ways.  For some
errors, such as non-existent terminal names, messages will
be printed.  For other errors, cross-hatched feedback
areas will be created.  Most of the feedback areas have
messages similar to ``Net shifter/bit[0]/phi1: Can't make
bottom connection.''  To see the message associated with a feedback
area, place the box over the feedback area and type {\bfseries :feedback why}.
In this case the message means that for some
reason the router was unable to connect the specified net (named
by one of its terminals) within one of the routing channel.  The
terms ``bottom'', ``top'', etc. may be misnomers because Magic
sometimes rotates channels before routing:  the names refer to the
direction at the time the channel was routed, not the direction in
the circuit.  However, the location of the feedback area indicates
where the connection was supposed to have been made.

You've probably noticed by now that the router sometimes
generates unnecessary wiring, such as inserting extra
jogs and U-shapes in wires (look next to  {\bfseries right3} in
the top cell).  These jogs are particularly noticeable in small examples.
However, the router actually does {\itshape better} on larger
examples:  there will still be a bit of extra wire, but it's
negligible in comparison to the total wire length on a large
chip.  
Some of this wire is necessary and important: 
it helps the router to avoid several problem situations that would cause
it to fail on more difficult examples.
However, you can use the {\bfseries straighten} command described
in ``Magic Tutorial \#3: Advanced Painting (Wiring and Plowing)''
to remove unnecessary jogs.
Please don't judge the
router by its behavior on small examples.  On the other hand, if
it does awful things on big examples, we'd like to know about it.

All of the wires placed by the router are of the same width,
so the router won't be very useful for power and ground wiring.

When using the Magic router,
you can wire power and ground by hand before
running the router.  The router will be able to work around
your hand-placed connections to make the connections in the
netlist.  If there are certain key signals that you want to
wire carefully by hand, you can do this too;  the router will
work around them.  Signals that you route by hand should not
be in the netlist.  {\bfseries Tutorial7b} has an example of ``hand
routing'' in the form of a piece of metal in the middle of
the circuit.  Undo the routing, and try modifying the metal
and/or adding more hand
routing of your own to see how it affects the routing.

The Magic router has a number of options useful for
getting information about the routing and setting routing parameters.  
You need to invoke the {\bfseries route} command once for each option you
want to specify; then type {\bfseries :route} with no options to
start up the router with whatever parameters you've set.  The {\bfseries viamin},
option which invokes a routing post-pass is, of course, 
invoked AFTER routing.
Type {\bfseries :route netlist} {\itshape file} to specify a netlist for the routing
without having to open up the netlist menu.
The {\bfseries metal} option lets you toggle metal maximization on and off;
if metal maximization is turned on, the router converts routing
from the alternate routing layer (``poly'') to the
preferred routing layer (``metal'') wherever possible.
The {\bfseries vias} option controls metal maximization by specifying how many
grid units of ``metal'' conversion make it worthwhile to place vias;
setting this to 5 means that metal maximization will add extra vias only
if 5 or more grid units of ``poly'' can be converted to ``metal''.
View the current technology's router parameters with the {\bfseries tech} option.
The {\bfseries jog}, {\bfseries obstacle}, and {\bfseries steady} options let you view and
change parameters to control the channel router (this feature is for
advanced users).
The {\bfseries viamin} option invokes a via minimization algorithm
which reduces the number of vias in a routed layout.
This can be used as a post-processing step to improve the quality
of the routing.  This may be useful even when using another router
to do the actual routing.  Finally, show all parameter values 
with the {\bfseries settings} option.
The options and their actions are summarized in Table III.


\begin{table}[ht]
   \begin{center}
      \begin{tabular}{|l|l|} \hline
	Option	& Action \\ \hline
	{\bfseries end} &
		Print the channel router end constant \\
	{\bfseries end}{\itshape  real}	&
		Set the channel router end constant \\ \hline
	{\bfseries help} &
		Print a summary of the router options \\ \hline
	{\bfseries jog}	&
		Print the channel router minimum jog length \\
	{\bfseries jog} {\itshape int} &
		Set the minimum jog length, measured in grid units \\ \hline
	{\bfseries metal} &
		Toggle metal maximization on or off \\ \hline
	{\bfseries netlist} &
		Print the name of the current net list \\
	{\bfseries netlist} {\itshape file} &
		Set the current net list \\ \hline
	{\bfseries obstacle} &
		Print the channel router obstacle constant \\
	{\bfseries obstacle} {\itshape real} &
		Set the obstacle constant \\ \hline
	{\bfseries settings} &
		Print a list of all router parameters \\ \hline
	{\bfseries steady} &
		Print the channel router steady net constant \\
	{\bfseries steady} {\itshape int} &
		Set the steady net constant, measured in grid units \\ \hline
	{\bfseries tech} &
		Print router technology information \\ \hline
	{\bfseries vias} &
		Print the metal maximization via limit \\
	{\bfseries vias} {\itshape int} &
		Set the via limit \\ \hline
	{\bfseries viamin} &
		Minimize vias in a routed layout. \\ \hline
      \end{tabular}
   \end{center}
   \caption{A summary of all of Magic router options.}
\end{table}


\section{How the Router Works}

In order to make the router produce the best possible results, it
helps to know a little bit about how it works.
The router runs in three stages, called {\itshape channel definition},
{\itshape global routing}, and {\itshape channel routing}.  In the channel
definition phase, Magic divides the area of the edit cell
into rectangular routing areas called channels.  The channels
cover all the space under the box except the areas occupied by
subcells.
All of Magic's routing goes in the channel areas, except that
stems (Section 8.2) may extend over subcells.

To see the channel structure that Magic chose, place
the box in {\bfseries tut7d} as if you were going to route, then type the command

\starti
   \ii {\bfseries :channel}
\endi

in the layout window.
Magic will compute the channel structure
and display it on the screen as a collection of feedback areas.
The channel structure is displayed as white rectangles.
Type {\bfseries :feedback clear} when you're through looking at them.

The second phase of routing is global routing.  In the global
routing phase, Magic considers each net in turn and chooses
the sequence of channels the net must pass through in order
to connect its terminals.  The {\itshape crossing points} (places
where the net crosses from one channel to another) are chosen
at this point, but not the exact path through each channel.

In the third phase, each channel is considered separately.
All the nets passing through that channel are examined at once,
and the exact path of each net is decided.  Once the routing
paths have been determined, paint is added to the edit cell
to implement the routing.

The router is grid-based:  all wires are placed on
a uniform grid.  For the standard nMOS process the grid spacing
is 7 units, and for the standard SCMOS process it is 8 units.
If you type {\bfseries :grid 8} after routing {\bfseries tut7b}, you'll
see that all of the routing lines up with its lower and left
sides on grid lines.  Fortunately, you don't have to make
your cell terminals line up on even grid boundaries.  During
the routing Magic generates {\itshape stems} that connect your
terminals up to grid lines at the edges of channels.  Notice
that there's space left by Magic between the subcells and
the channels;  this space is used by the stem generator.


\section{What to do When the Router Fails}

Don't be surprised if the router is unable to make all the connections
the first time you try it on a large circuit.  Unless you have
extra routing space in your chip, you may have to make slight
re-arrangements to help the router out.  The paragraphs below describe
things you can do to make life easier for the router.  This section
is not very well developed, so we'd like to hear about
techniques you use to improve routability.  If you discover new techniques,
send us mail and we'll add them to this section.

\subsection{Channel Structure}

One of the first things to check when the router fails is the
channel structure.  If using the Magic router, type {\bfseries :channel} to look at
the channels.
One common mistake is to have some of the desired
routing area covered by subcells;  Magic only runs wires where
there are no subcells.  Check to be sure that there are channels
everywhere that you're expecting wires to run.  If you place cells too close
together, there may not be enough room to have a channel
between the cells;  when this happens Magic will route willy-nilly
across the tops of cells to bring terminals out to channels, and will probably
generate shorts or design-rule violations.  To solve the problem,
move the cells farther apart.  If there are many skinny channels,
it will be difficult for the router to produce good routing.
Try to re-arrange the cell structure to line up edges of
nearby cells so that there are as few channels as possible
and they are as large as possible (before doing this you'll
probably want to get rid of the existing routing by undo-ing
or by flushing the edit cell).

\subsection{Stems}

Another problem has to do with the stem generator.  Stems are the
pieces of wiring that connect terminals up to grid points on the
edges of channels.  The current stem generation code doesn't know about
connectivity or design rules.
It simply finds the nearest routing grid point and wires out
to that point, without considering any other terminals.  If a
terminal is not on the edge of the cell, the stem runs straight
across the cell to the nearest channel, without any consideration
for other material in the cell.  If two
terminals are too close together, Magic may decide to route them
both to the same grid point.  When this happens, you have two
choices.  Either you can move the cell so that the terminals
have different nearest grid points (for example, you can line
its terminals up with the grid lines), or if this doesn't work
you'll have to modify the cell to make the terminals farther
apart.

The place where stems cause the most trouble is in PLAs, many of
which have been optimized to space the outputs as closely together
as possible.  In some cases the outputs are closer together than
the routing grid, which is an impossible situation for the stem
generator.  In this case, we think the best approach is to change
the PLA templates to space the outputs farther apart.  Either space
them exactly the same as the router grid (in which case you can
line the PLAs up before routing so the terminals are already on
the grid), or space the outputs at least 1.5 grid units apart so the stem
generator won't have troubles.  Having tightly-spaced PLA outputs
is false economy: it makes it more difficult to design the PLAs
and results in awful routing problems.  Even if Magic could
river-route out from tightly-spaced terminals to grid lines (which
it can't), it would require $N^2$ space to route out
$N$ lines;  it takes less area to stretch the PLA.

\subsection{Obstacles}

The router tends to have special difficulties with
obstacles running along the edges of channels.  When you've placed
a power wire or other hand-routing along the edge of a channel,
the channel router will often run material under your wiring in
the other routing layer, thereby blocking both routing layers
and making it impossible to complete the routing.  Where this
occurs, you can increase the chances of successful routing by
moving the hand-routing away from the channel edges.  It's
especially important to keep hand-routing away from terminals.
The stem generator will not pay any attention to hand-routing
when it generates stems (it just makes a bee-line for the nearest
grid point), so it may accidentally short a terminal to nearby
hand-routing.

\begin{figure}[ht]
   \begin{center}
       \epsfig{file=../psfigures/tut7.3.ps, width=0.4\columnwidth}
       \caption{When placing hand routing, it is best to place
	wires with their left and bottom edges along grid lines, and
	contacts centered on the wires.  In this fashion, the hand routing
	will block as few routing grid lines as possible.}
   \end{center}
\end{figure}

When placing hand-routing, you can get better routing results
by following the advice illustrated in Figure 3.  First, display
the routing grid.  For example, if the router is using a 8-unit
grid (which is true for the standard SCMOS technology), type
{\bfseries :grid 8}.  Then place all your hand routing with its left
and bottom edges along the grid lines.  Because of the way the
routing tools work, this approach results in the least possible
amount of lost routing space.

\section{More Netlist Commands}

In addition to the netlist menu buttons and commands described
in Section 4, there are a number of other netlist commands you
can invoke by typing in the netlist window.  Many of these
commands are textual equivalents of the menu buttons.  However,
they allow you to deal with terminals by typing the hierarchical
name of the terminal rather than by pointing to it.  If you
don't know where a terminal is, or if you have deleted a label
from your design so that there's nothing to point to, you'll
have to use the textual commands.  Commands that don't just
duplicate menu buttons are described below; see the
{\itshape magic(1)} manual page for details on the others.

The netlist command

\starti
   \ii {\bfseries :extract}
\endi

will generate a net from existing wiring.  It looks under the
box for paint, then traces out all the material in the edit cell
that is connected electrically to that paint.  Wherever the
material touches subcells it looks for terminals in the subcells,
and all the terminals it finds are placed into a new net.  Warning:
there is also an {\bfseries extract} command for layout windows, and it
is totally different from the {\bfseries extract} command in netlist
windows.  Make sure you've got the cursor over the netlist window
when you invoke this command!

The netlist editor provides two commands for ripping up existing
routing (or other material).  They are

\starti
   \ii {\bfseries :ripup} \\
   \ii {\bfseries :ripup netlist}
\endi

The first command starts by finding any paint in the edit cell
that lies underneath the box.  It then works outward from that
paint to find all paint in the edit cell that is electrically
connected to the starting paint.  All of this paint is erased.
({\bfseries :ripup} isn't really necessary, since the same effect can
be achieved by selecting all the paint in the net and deleting
the selection;  it's a hangover from olden days when there was
no selection).
The second form of the command, {\bfseries :ripup netlist}, is similar
to the first except that it starts from each of the terminals
in the current netlist instead of the box.  Any paint in
the edit cell that is electrically connected to a terminal
is erased.  The {\bfseries :ripup netlist} command may be useful to
ripup existing routing before rerouting.

The command

\starti
   \ii {\bfseries :trace} [{\itshape name}]
\endi

provides an additional facility for examining
router feedback.  It highlights all paint connected
to each terminal in the net containing {\itshape name},
much as the {\bfseries Show} menu button does for paint
connected to anything under the box.  The net to be highlighted
may be specified by naming one of its terminals, for example,
{\bfseries :trace shifter/bit[0]/phi1}.
Use the trace command in conjunction with the nets specified in
router feedback to see the partially completed wiring for a net.
Where no net is specified, the {\bfseries :trace} command highlights the
currently selected net.

\end{document}
