545 lines
22 KiB
TeX
545 lines
22 KiB
TeX
|
|
%----------------------------------------------------------------------------
|
||
|
|
% Magic tutorial number 3
|
||
|
|
%----------------------------------------------------------------------------
|
||
|
|
|
||
|
|
\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 \#3: Advanced Painting (Wiring and Plowing)}
|
||
|
|
|
||
|
|
%----------------------------------------------------------------------------
|
||
|
|
|
||
|
|
\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} \\
|
||
|
|
{\itshape Walter Scott} \\
|
||
|
|
\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
|
||
|
|
\endi
|
||
|
|
|
||
|
|
{\noindent\bfseries\large Commands introduced in this tutorial:}
|
||
|
|
\starti
|
||
|
|
\> :array, :corner, :fill, :flush, :plow, :straighten, :tool, :wire
|
||
|
|
\endi
|
||
|
|
|
||
|
|
{\noindent\bfseries\large Macros introduced in this tutorial:}
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\> $<$space$>$
|
||
|
|
\endi
|
||
|
|
|
||
|
|
\vspace*{0.5in}
|
||
|
|
\section{Introduction}
|
||
|
|
|
||
|
|
Tutorial \#2 showed you the basic facilities for placing paint and
|
||
|
|
labels, selecting, and manipulating the things that are
|
||
|
|
selected. This tutorial describes two additional facilities for
|
||
|
|
manipulating paint: wiring and plowing. These commands aren't
|
||
|
|
absolutely necessary, since you can achieve the same effect with
|
||
|
|
the simpler commands of Tutorial \#2; however, wiring and plowing
|
||
|
|
allow you to perform certain kinds of manipulations much more quickly
|
||
|
|
than you could otherwise. Wiring is described in Section 2; it
|
||
|
|
allows you to place wires by pointing at the ends of legs rather
|
||
|
|
than by positioning the box, and also provides for convenient contact
|
||
|
|
placement. Plowing is the subject of Section 3. It allows you to
|
||
|
|
re-arrange pieces of your circuit without having to worry about
|
||
|
|
design-rule violations being created: plowing automatically moves
|
||
|
|
things out of the way to avoid trouble.
|
||
|
|
|
||
|
|
\section{Wiring}
|
||
|
|
|
||
|
|
The box-and-painting paradigm described in Tutorial \#2 is sufficient
|
||
|
|
to create any possible layout, but it's relatively inefficient
|
||
|
|
since three keystrokes are required to paint each new area: two
|
||
|
|
button clicks to position the box and one more to paint the material.
|
||
|
|
This section describes a different painting mechanism based on
|
||
|
|
{\itshape wires}. At any given time, there is a current wiring material
|
||
|
|
and wire thickness. With the wiring interface you can create a new
|
||
|
|
area of material with a single button click: this paints a straight-line
|
||
|
|
segment of the current material and width
|
||
|
|
between the end of the previous wire segment and the cursor location.
|
||
|
|
Each additional button click adds an additional segment. The wiring
|
||
|
|
interface also makes it easy for you to place contacts.
|
||
|
|
\section{Tools}
|
||
|
|
|
||
|
|
Before learning about wiring, you'll need to learn about tools.
|
||
|
|
Until now, when you've pressed mouse buttons in layout windows the
|
||
|
|
buttons have caused the box to change or material to be painted.
|
||
|
|
The truth is that buttons can mean different things at different times.
|
||
|
|
The meaning of the mouse buttons depends on the {\itshape current tool}.
|
||
|
|
Each tool is identified by a particular cursor shape and a
|
||
|
|
particular interpretation of the mouse buttons. Initially, the current
|
||
|
|
tool is the box tool; when the box tool is active the cursor has
|
||
|
|
the shape of a crosshair. To get information about the current tool,
|
||
|
|
you can type the long command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :tool info}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
This command prints out the name of the current tool and the meaning
|
||
|
|
of the buttons. Run Magic on the cell {\bfseries tut3a} and type {\bfseries :tool info}.
|
||
|
|
|
||
|
|
The {\bfseries :tool} command can also be used to switch tools. Try this
|
||
|
|
out by typing the command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :tool}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
Magic will print out a message telling you that you're using the
|
||
|
|
wiring tool, and the cursor will change to an arrow shape. Use
|
||
|
|
the {\bfseries :tool info} command to see what the buttons mean now. You'll
|
||
|
|
be using the wiring tool for most of the rest of this section. The
|
||
|
|
macro `` '' (space) corresponds to {\bfseries :tool}. Try typing the space key
|
||
|
|
a few times: Magic will cycle circularly through all of the
|
||
|
|
available tools. There are three tools in Magic right now: the
|
||
|
|
box tool, which you already know about, the wiring tool, which
|
||
|
|
you'll learn about in this tutorial, and the netlist tool, which has a square
|
||
|
|
cursor shape and is used for netlist editing. ``Tutorial \#7:
|
||
|
|
Netlists and Routing'' will show you how to use the netlist tool.
|
||
|
|
|
||
|
|
The current tool affects only the meanings of the mouse
|
||
|
|
buttons. It does not change the meanings of the long commands
|
||
|
|
or macros. This means, for example, that you can still use
|
||
|
|
all the selection commands while the wiring tool is active.
|
||
|
|
Switch tools to the wiring tool, point
|
||
|
|
at some paint in {\bfseries tut3a}, and type the {\bfseries s} macro.
|
||
|
|
A chunk gets selected just as it does with the box tool.
|
||
|
|
|
||
|
|
\section{Basic Wiring}
|
||
|
|
|
||
|
|
There are three basic wiring commands: selecting the wiring material,
|
||
|
|
adding a leg, and adding a contact. This section describes the
|
||
|
|
first two commands. At this point you should be editing the
|
||
|
|
cell {\bfseries tut3a} with the wiring tool active. The first step
|
||
|
|
in wiring is to pick the material and width to use for wires.
|
||
|
|
This can be done in two ways. The easiest way is to find a piece
|
||
|
|
of material of the right type and width, point to it with the
|
||
|
|
cursor, and click the left mouse button. Try this in {\bfseries tut3a}
|
||
|
|
by pointing to the label {\bfseries 1} and left-clicking. Magic prints out
|
||
|
|
the material and width that it chose, selects a square of that
|
||
|
|
material and width around the cursor, and places the box around
|
||
|
|
the square. Try pointing to various places in {\bfseries tut3a} and
|
||
|
|
left-clicking.
|
||
|
|
|
||
|
|
Once you've selected the wiring material, the right
|
||
|
|
button paints legs of a wire. Left-click on label {\bfseries 1} to
|
||
|
|
select the red material, then move the cursor over label
|
||
|
|
{\bfseries 2} and right-click. This will paint a red wire between
|
||
|
|
{\bfseries 1} and {\bfseries 2}. The new wire leg is selected so that you
|
||
|
|
can modify it with selection commands, and the box is placed
|
||
|
|
over the tip of the leg to show you the starting point for the
|
||
|
|
next wire leg. Add more legs to the wire by right-clicking
|
||
|
|
at {\bfseries 3} and then {\bfseries 4}. Use the mouse buttons to paint
|
||
|
|
another wire in blue from {\bfseries 5} to {\bfseries 6} to {\bfseries 7}.
|
||
|
|
|
||
|
|
Each leg of a wire must be either horizontal or vertical. If you
|
||
|
|
move the cursor diagonally, Magic will still paint a horizontal
|
||
|
|
or vertical line (whichever results in the longest new wire leg).
|
||
|
|
To see how this works, left-click on {\bfseries 8} in {\bfseries tut3a},
|
||
|
|
then right-click on {\bfseries 9}. You'll get a horizontal leg. Now
|
||
|
|
undo the new leg and right-click on {\bfseries 10}. This time you'll
|
||
|
|
get a vertical leg. You can force Magic to paint the next
|
||
|
|
leg in a particular direction with the commands
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :wire horizontal} \\
|
||
|
|
\ii {\bfseries :wire vertical}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
Try out this feature by left-clicking on {\bfseries 8} in {\bfseries tut3a},
|
||
|
|
moving the cursor over {\bfseries 10}, and typing {\bfseries :wire ho}
|
||
|
|
(abbreviations work for {\bfseries :wire} command options just as
|
||
|
|
they do elsewhere in Magic). This command will generate a
|
||
|
|
short horizontal leg instead of a longer vertical one.
|
||
|
|
|
||
|
|
\section{Contacts}
|
||
|
|
|
||
|
|
When the wiring tool is active, the middle mouse button places
|
||
|
|
contacts. Undo all of your changes to {\bfseries tut3a} by typing
|
||
|
|
the command {\bfseries :flush} and answering {\bfseries yes} to the
|
||
|
|
question Magic asks. This throws away all of the changes made to the
|
||
|
|
cell and re-loads it from disk. Draw a red wire leg from
|
||
|
|
{\bfseries 1} to {\bfseries 2}. Now move the cursor over the blue area and
|
||
|
|
click the middle mouse button. This has several effects. It
|
||
|
|
places a contact at the end of the current wire leg, selects the
|
||
|
|
contact, and moves the box over the selection. In addition, it changes
|
||
|
|
the wiring material and thickness to match the material you
|
||
|
|
middle-clicked. Move the cursor over {\bfseries 3} and right-click
|
||
|
|
to paint a blue leg, then make a contact to purple by middle-clicking
|
||
|
|
over the purple material. Continue by drawing a purple leg to {\bfseries 4}.
|
||
|
|
|
||
|
|
Once you've drawn the purple leg to {\bfseries 4}, move the cursor over
|
||
|
|
red material and middle-click. This time, Magic prints an error
|
||
|
|
message and treats the click just like a left-click.
|
||
|
|
Magic only knows how to make contacts between certain combinations of
|
||
|
|
layers, which are specified in the technology file
|
||
|
|
(see ``Magic Maintainer's Manual \#2: The Technology File''). For
|
||
|
|
this technology, Magic doesn't know how to make contacts directly
|
||
|
|
between purple and red.
|
||
|
|
|
||
|
|
\section{Wiring and the Box}
|
||
|
|
|
||
|
|
In the examples so far, each new wire leg appeared to be
|
||
|
|
drawn from the end of the
|
||
|
|
previous leg to the cursor position. In fact, however, the new
|
||
|
|
material was drawn from the {\itshape box} to the cursor position. Magic
|
||
|
|
automatically repositions the box on each button click to help set
|
||
|
|
things up for the next leg. Using the box as the starting point
|
||
|
|
for wire legs makes it easy to start wires in places that don't
|
||
|
|
already have material of the right type and width. Suppose that you want
|
||
|
|
to start a new wire in the middle of an empty area. You can't
|
||
|
|
left-click to get the wire started there. Instead, you can left-click
|
||
|
|
some other place where there's the right material for the wire,
|
||
|
|
type the space bar twice to get back the box tool, move the box where
|
||
|
|
you'd like the wire to start, hit the space bar once more to get back
|
||
|
|
the wiring tool, and then right-click to paint the wire. Try this
|
||
|
|
out on {\bfseries tut3a}.
|
||
|
|
|
||
|
|
When you first start wiring, you may not be able to find the right
|
||
|
|
kind of material anywhere on the screen. When this happens, you
|
||
|
|
can select the wiring material and width with the command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :wire type} {\itshape layer} {\itshape width}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
Then move the box where you'd like the wire to start, switch
|
||
|
|
to the wiring tool, and right-click to add legs.
|
||
|
|
|
||
|
|
\section{Wiring and the Selection}
|
||
|
|
|
||
|
|
Each time you paint a new wire leg or contact using the wiring
|
||
|
|
commands, Magic selects the new material just as if you had placed
|
||
|
|
the cursor over it and typed {\bfseries s}. This makes it
|
||
|
|
easy for you to adjust its position if you didn't get it right
|
||
|
|
initially. The {\bfseries :stretch} command is particularly useful
|
||
|
|
for this. In {\bfseries tut3a}, paint a wire leg in blue from {\bfseries 5}
|
||
|
|
to {\bfseries 6} (use {\bfseries :flush} to reset the cell if you've made
|
||
|
|
a lot of changes). Now type {\bfseries R} two or three times to stretch
|
||
|
|
the leg over to the right. Middle-click over purple material,
|
||
|
|
then use {\bfseries W} to stretch the contact downward.
|
||
|
|
|
||
|
|
It's often hard to position the cursor
|
||
|
|
so that a wire leg comes out right the first time, but it's usually
|
||
|
|
easy to tell whether the leg is right once it's painted. If it's
|
||
|
|
wrong, then you can use the stretching commands to shift it over
|
||
|
|
one unit at a time until it's correct.
|
||
|
|
|
||
|
|
\section{Bundles of Wires}
|
||
|
|
|
||
|
|
Magic provides two additional commands that are useful for
|
||
|
|
running {\itshape bundles} of parallel wires. The commands are:
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries fill} {\itshape direction }[{\itshape layers}] \\
|
||
|
|
\ii {\bfseries corner} {\itshape direction1 direction2 }[{\itshape layers}]
|
||
|
|
\endi
|
||
|
|
|
||
|
|
To see how they work, load the cell {\bfseries tut3b}. The
|
||
|
|
{\bfseries :fill} comand extends a whole bunch of paint in a given direction.
|
||
|
|
It finds all paint touching
|
||
|
|
one side of the box and extends that paint to the opposite
|
||
|
|
side of the box. For example, {\bfseries :fill left} will look underneath
|
||
|
|
the right edge of the box for paint, and will extend that paint
|
||
|
|
to the left side of the box. The effect is just as if all the colors
|
||
|
|
visible underneath that edge of the box constituted a paint brush;
|
||
|
|
Magic sweeps the brush across the box in the given direction.
|
||
|
|
Place the box over the label ``Fill here'' in {\bfseries tut3b} and
|
||
|
|
type {\bfseries :fill left}.
|
||
|
|
|
||
|
|
The {\bfseries :corner} command is similar to {\bfseries :fill} except that
|
||
|
|
it generates L-shaped wires that follow two sides of the box,
|
||
|
|
travelling first in {\itshape direction1} and then in {\itshape direction2}.
|
||
|
|
Place the box over the label ``Corner here'' in {\bfseries tut3b} and
|
||
|
|
type {\bfseries :corner right up}.
|
||
|
|
|
||
|
|
In both {\bfseries :fill} and {\bfseries :corner},
|
||
|
|
if {\itshape layers} isn't specified then all layers are filled.
|
||
|
|
If {\itshape layers} is given then only those layers are painted.
|
||
|
|
Experiment on {\bfseries tut3b} with the {\bfseries :fill} and {\bfseries :corner}
|
||
|
|
commands.
|
||
|
|
|
||
|
|
When you're painting bundles of wires, it would be nice if there
|
||
|
|
were a convenient way to place contacts across the whole bundle
|
||
|
|
in order to switch to a different layer. There's no single
|
||
|
|
command to do this, but you can place one contact by hand and
|
||
|
|
then use the {\bfseries :array} command to
|
||
|
|
replicate a single contact across the whole bundle.
|
||
|
|
Load the cell {\bfseries tut3c}. This contains a bundle of wires
|
||
|
|
with a single contact already painted by hand on the bottom
|
||
|
|
wire. Type {\bfseries s} with the cursor over the contact, and
|
||
|
|
type {\bfseries S} with the cursor over the stub of purple wiring
|
||
|
|
material next to it.
|
||
|
|
Now place the box over the label ``Array'' and type the command
|
||
|
|
{\bfseries :array 1 10}. This will copy the selected contact across
|
||
|
|
the whole bundle.
|
||
|
|
|
||
|
|
The syntax of the {\bfseries :array} command is
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :array} {\itshape xsize ysize}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
This command makes the selection into an array of identical elements.
|
||
|
|
{\itshape Xsize} specifies how many total instances there should be
|
||
|
|
in the x-direction when the command is finished and {\itshape ysize}
|
||
|
|
specifies how many total instances there should be in the
|
||
|
|
y-direction. In the {\bfseries tut3c} example, {\bfseries xsize} was one,
|
||
|
|
so no additional copies were created in that direction; {\bfseries ysize}
|
||
|
|
was 10, so 9 additional copies were created. The box is used to
|
||
|
|
determine how far apart the elements should be: the width of the
|
||
|
|
box determines the x-spacing and the height determines the y-spacing.
|
||
|
|
The new material always appears above and to the right of the original
|
||
|
|
copy.
|
||
|
|
|
||
|
|
In {\bfseries tut3c}, use {\bfseries :corner} to extend the purple wires and
|
||
|
|
turn them up. Then paint a contact back to blue on the leftmost
|
||
|
|
wire, add a stub of blue paint above it, and use {\bfseries :array} to
|
||
|
|
copy them across the top of the bundle. Finally,
|
||
|
|
use {\bfseries :fill} again to extend the blue bundle farther up.
|
||
|
|
|
||
|
|
\section{Plowing}
|
||
|
|
|
||
|
|
Magic contains a facility called {\itshape plowing} that you can
|
||
|
|
use to stretch and compact cells. The basic plowing command
|
||
|
|
has the syntax
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow} {\itshape direction }[{\itshape layers}]
|
||
|
|
\endi
|
||
|
|
|
||
|
|
where {\itshape direction} is a Manhattan direction like {\bfseries left} and
|
||
|
|
{\itshape layers} is an optional, comma-separated list of mask layers.
|
||
|
|
The plow command
|
||
|
|
treats one side of the box as if it were a plow, and shoves
|
||
|
|
the plow over to the other side of the box. For example,
|
||
|
|
{\bfseries :plow up} treats the bottom side of the box as a plow,
|
||
|
|
and moves the plow to the top of the box.
|
||
|
|
|
||
|
|
As the plow moves,
|
||
|
|
every edge in its path is pushed ahead of it (if {\itshape layers}
|
||
|
|
is specified, then only edges on those layers are moved).
|
||
|
|
Each edge that is pushed by the plow pushes other edges ahead
|
||
|
|
of it in a way that preserves design rules, connectivity,
|
||
|
|
and transistor and contact sizes. This means that material
|
||
|
|
ahead of the plow gets compacted down to the minimum spacing
|
||
|
|
permitted by the design rules, and material that crossed the
|
||
|
|
plow's original position gets stretched behind the plow.
|
||
|
|
|
||
|
|
You can compact a cell by placing a large plow off to one side of
|
||
|
|
the cell and plowing across the whole cell. You can open up
|
||
|
|
space in the middle of a cell by dragging a small plow across
|
||
|
|
the area where you want more space.
|
||
|
|
|
||
|
|
To try out plowing, edit
|
||
|
|
the cell {\bfseries tut3d}, place the box over the rectangle
|
||
|
|
that's labelled ``Plow here'', and try plowing in various
|
||
|
|
directions. Also, try plowing only certain layers.
|
||
|
|
For example, with the box over the ``Plow here'' label,
|
||
|
|
try
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow right metal2}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
Nothing happens. This is because there are no metal2
|
||
|
|
{\itshape edges} in the path of the plow. If instead you had
|
||
|
|
typed
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow right metal1}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
only the metal would have been plowed to the right.
|
||
|
|
|
||
|
|
In addition to plowing with the box, you can plow the
|
||
|
|
selection. The command to do this has the following
|
||
|
|
syntax:
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow selection }[{\itshape direction }[{\itshape distance}]]
|
||
|
|
\endi
|
||
|
|
|
||
|
|
This is very similar to the {\bfseries :stretch} command: it
|
||
|
|
picks up the selection and the box and moves both so that
|
||
|
|
the lower-left corner of the box is at the cursor location.
|
||
|
|
Unlike the {\bfseries :stretch} command, though, {\bfseries :plow selection}
|
||
|
|
insures that design rule correctness and connectivity are
|
||
|
|
preserved.
|
||
|
|
|
||
|
|
Load the cell {\bfseries tut3e} and
|
||
|
|
use {\bfseries a} to select the area underneath the label that
|
||
|
|
says ``select me''.
|
||
|
|
Then point with the cursor to the
|
||
|
|
point labelled ``point here'' and type {\bfseries :plow selection}.
|
||
|
|
Practice selecting things and plowing them.
|
||
|
|
Like the {\bfseries :stretch} command, there is also a longer
|
||
|
|
form of {\bfseries :plow selection}. For example, {\bfseries :plow selection down 5}
|
||
|
|
will plow the selection and the box down 10 units.
|
||
|
|
|
||
|
|
Selecting a cell and plowing it is a good way to move the cell.
|
||
|
|
Load {\bfseries tut3f} and select the cell {\bfseries tut3e}.
|
||
|
|
Point to the label ``point here'' and plow the selection with
|
||
|
|
{\bfseries :plow selection}.
|
||
|
|
Notice that all connections to the cell have remained attached.
|
||
|
|
The cell you select must be in the edit cell, however.
|
||
|
|
|
||
|
|
The plowing operation is implemented in a way that tries to
|
||
|
|
keep your design as compact as possible. To do this, it
|
||
|
|
inserts jogs in wires around the plow. In many cases, though,
|
||
|
|
the additional jogs are more trouble than they're worth. To
|
||
|
|
reduce the number of jogs inserted by plowing, type the
|
||
|
|
command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow nojogs}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
From now on, Magic will insert as few jogs as possible when
|
||
|
|
plowing, even if this means moving more material. You
|
||
|
|
can re-enable jog insertion with the command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow jogs}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
Load the cell
|
||
|
|
{\bfseries tut3d} again and try plowing it both with and without jog insertion.
|
||
|
|
|
||
|
|
There is another way to reduce the number of jogs introduced
|
||
|
|
by plowing.
|
||
|
|
Instead of avoiding jogs in the
|
||
|
|
first place, plowing can introduce them freely but clean them
|
||
|
|
up as much as possible afterward.
|
||
|
|
This results in more dense
|
||
|
|
layouts, but possibly more jogs than if you had enabled
|
||
|
|
{\bfseries :plow nojogs}.
|
||
|
|
To take advantage of this second method
|
||
|
|
for jog reduction, re-enable jog insertion ({\bfseries :plow jogs})
|
||
|
|
and enable jog cleanup with the command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow straighten}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
From now on, Magic will attempt to straighten out jogs after
|
||
|
|
each plow operation. To disable straightening, use the
|
||
|
|
command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow nostraighten}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
It might seem pointless to disable jog introduction
|
||
|
|
with {\bfseries :plow nojogs} at the same time
|
||
|
|
straightening is enabled with {\bfseries :plow straighten}.
|
||
|
|
While it is true that {\bfseries :plow nojogs} won't introduce
|
||
|
|
any new jogs for {\bfseries :plow straighten} to clean up,
|
||
|
|
plowing will straighten out any existing jogs after
|
||
|
|
each operation.
|
||
|
|
|
||
|
|
In fact, there is a separate command that is sometimes
|
||
|
|
useful for cleaning up layouts with many jogs, namely
|
||
|
|
the command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :straighten} {\itshape direction}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
where {\itshape direction} is a Manhattan direction, e.g., {\bfseries up},
|
||
|
|
{\bfseries down}, {\bfseries right}, or {\bfseries left}. This command
|
||
|
|
will start from one side of the box and pull jogs toward
|
||
|
|
that side to straighten them.
|
||
|
|
Load the cell {\bfseries tut3g},
|
||
|
|
place the box over the label ``put box here'',
|
||
|
|
and type {\bfseries :straighten left}. Undo the last command
|
||
|
|
and type {\bfseries :straighten right} instead. Play around
|
||
|
|
with the {\bfseries :straighten} command.
|
||
|
|
|
||
|
|
There is one more feature of plowing that is sometimes useful.
|
||
|
|
If you are working on a large cell and want to make sure that
|
||
|
|
plowing never affects any geometry outside of a certain area,
|
||
|
|
you can place a {\itshape boundary} around the area you want to
|
||
|
|
affect with the command
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow boundary}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
The box is used to specify the area you want to affect.
|
||
|
|
After this command, subsequent plows will only affect the
|
||
|
|
area inside this boundary.
|
||
|
|
|
||
|
|
Load the cell {\bfseries tut3h} place the box over the label
|
||
|
|
``put boundary here'', and type {\bfseries :plow boundary}.
|
||
|
|
Now move the box away. You will see the boundary
|
||
|
|
highlighted with dotted lines. Now place the box
|
||
|
|
over the area labelled ``put plow here'' and plow up.
|
||
|
|
This plow would cause geometry
|
||
|
|
outside of the boundary to be affected, so Magic
|
||
|
|
reduces the plow distance enough to prevent
|
||
|
|
this and warns you of this fact.
|
||
|
|
Now undo the last plow and remove the boundary with
|
||
|
|
|
||
|
|
\starti
|
||
|
|
\ii {\bfseries :plow noboundary}
|
||
|
|
\endi
|
||
|
|
|
||
|
|
Put the box over the ``put plow here'' label and plow up again.
|
||
|
|
This time there was no boundary to stop the plow, so everything
|
||
|
|
was moved as far as the height of the box. Experiment with placing
|
||
|
|
the boundary around an area of this cell and plowing.
|
||
|
|
|
||
|
|
\end{document}
|