%----------------------------------------------------------------------------
% Magic tutorial number 5
%----------------------------------------------------------------------------

\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 \#5: Multiple Windows}

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

\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 Robert N. Mayo} \\
  \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
   \> :center :closewindow, :openwindow, :over, :specialopen, :under,
	:windowpositions
\endi

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

\starti
   \> o, O, ``,''
\endi

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

A window is a rectangular viewport.
You can think of it as a magnifying glass that may be moved around
on your chip.
Magic initially displays a single window on the screen.  
This tutorial will show you how
to create new windows and how to move old ones around.
Multiple windows allow you
to view several portions of a circuit at the same time, or even
portions of different circuits.  

Some operations are easier with multiple
windows.  For example, let's say that you want to paint a very long line,
say 3 units by 800 units.  With a single window it is hard to align
the box accurately since the magnification is not great enough.
With multiple windows, one window can show the big
picture while other windows show magnified views of the areas where the
box needs to be aligned.  The box can then be positioned accurately
in these magnified windows.

\section{Manipulating Windows}

\subsection{Opening and Closing Windows}

Initially Magic displays one large window.  The 

\starti
   \ii {\bfseries :openwindow }[{\itshape cellname}]
\endi

command opens another window and loads the given cell.  To give
this a try, start up Magic with the command {\bfseries magic tut5a}.
Then point anywhere in a Magic window and type the command
{\bfseries :openwindow tut5b} (make sure you're pointing to a
Magic window).  A new window will appear and it will
contain the cell {\bfseries tut5b}.  If you don't
give a {\itshape cellname} argument to {\bfseries :openwindow}, it will
open a new window on the cell containing the box, and will zoom
in on the box.  The macro {\bfseries o} is predefined to {\bfseries :openwindow}.
Try this
out by placing the box around an area of {\bfseries tut5b} and then
typing {\bfseries o}.  Another window will appear.  You now have
three windows, all of which display pieces of layout.  There
are other kinds of windows in Magic besides layout windows:  you'll
learn about them later.  Magic doesn't care how many windows
you have (within reason) nor how they overlap.

To get rid of a window, point to it and type

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

or use the macro {\bfseries O}.
Point to a portion of the original window and close it.  

\subsection{Resizing and Moving Windows}

If you have been experimenting with Magic while reading this you
will have noticed that windows opened by {\bfseries :openwindow} are all 
the same size.  If you'd prefer a different arrangement you can
resize your windows or move them around on the screen.  The techniques
used for this are different, however, depending on what kind of
display you're using.  If you are using a workstation, then you are also
running a window system such as X11 or SunView.  In this case Magic's 
windows are moved and resized just like the other windows you have displayed,
and you can skip the rest of this section.

For displays like the AED family, which don't have a built-in window
package, Magic implements its own window manager.  To re-arrange
windows on the screen you
can use techniques similar to those you
learned for moving the box for painting operations.
Point somewhere in the border area of a window, except for the lower left
corner, and press and hold the right button.  The
cursor will change to a shape like this:

\begin{center}
   \begin{tabular}{c|c|}\hline
	\hspace*{0.1in} & \hspace*{0.1in} \\ \hline
	\hspace*{0.1in} & \hspace*{0.1in} \\
   \end{tabular}
\end{center}

This indicates that you have hold of the upper right corner of the
window.  Point to a new location for this corner and release the
button.  The window will change shape so that the corner moves.
Now point to the border area and press and hold the left button.
The cursor will now look like:

\begin{center}
   \begin{tabular}{|c|c|}\hline
	\hspace*{0.1in} & \hspace*{0.1in} \\ \hline
	\hspace*{0.1in} & \hspace*{0.1in} \\ \hline
   \end{tabular}
\end{center}

This indicates that you have hold of the entire window by its lower left
window.  Move the cursor and release the button.  The window will move so that
its lower left corner is where you pointed.

The other button commands for positioning the box by any of its corners
also work for windows.  Just remember to point to the border of a window
before pushing the buttons.

The middle button can be used to grow a window up to full-screen size.
To try this, click the middle button over the caption of the window.
The window will now fill the entire screen.  Click in the caption again
and the window will shrink back to its former size.

\subsection{Shuffling Windows}

By now you know how to open, close, and resize windows.  This is sufficient
for most purposes, but sometimes you want to look at a window that is covered
up by another window.  The {\bfseries :underneath} and {\bfseries :over} commands help
with this.

The {\bfseries :underneath} command moves the window that you are pointing at 
underneath all of the other windows.  The {\bfseries :over} command moves the
window on top of the rest.  Create a few windows that overlap and then
use these commands to move them around.  You'll see that overlapping windows
behave just like sheets of paper:  the ones on top obscure portions of
the ones underneath.

\subsection{Scrolling Windows}

Some of the windows have thick bars on the left and bottom borders.
These are called {\itshape scroll bars}, and the slugs within them
are called {\itshape elevators}.  The size and position of an elevator
indicates how much of the layout (or whatever is in the window)
is currently visible.
If an elevator fills its scroll bar, then all of the layout is visible
in that window.  If an elevator fills only a portion of the scroll bar, 
then only that portion of the layout is visible.  The position of the elevator
indicates which part is visible---if it is near the bottom, 
you are viewing the bottom part of the layout; 
if it is near the top, you are viewing the top part of the layout.
There are scroll bars for both the vertical direction (the left scroll bar)
and the horizontal direction (the bottom scroll bar).

Besides indicating how much is visible, the scroll bars can be used to
change the view of the window.  Clicking the middle mouse button in a
scroll bar moves the elevator to that position.  For example, if you
are viewing the lower half of a chip (elevator near the bottom) and you
click the middle button near the top of the scroll bar, the elevator will
move up to that position and you will be viewing the top part of your chip.
The little squares with arrows in them at the ends of the scroll bars
will scroll the view by one screenful when the middle button is clicked
on them.  They are useful when you want to move exactly one screenful.
The {\bfseries :scroll} command can also be used to scroll the view
(though we don't think it's as easy to use as the scroll bars).  See
the man page for information on it.

If you only want to make a small adjustment in a window's view, you
can use the command

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

It will move the view in the window so that the point that used to
be underneath the cursor is now in the middle of the window.  The
macro {\bfseries ,} is predefined to {\bfseries :center}.

The bull's-eye in the lower left corner of a window is used to zoom the
view in and out.  Clicking the left mouse button zooms the view out
by a factor of 2, and clicking the right mouse button zooms in by a factor
of 2.  Clicking the middle button here makes everything in the window
visible and is equivalent to the {\bfseries :view} command.

\subsection{Saving Window Configurations}

After setting up a bunch of windows you may want to save the configuration
(for example, you may be partial to a set of 3 non-overlapping windows).
To do this, type:

\starti
   \ii {\bfseries :windowpositions} {\itshape filename}
\endi

A set of commands will be written to the file.  This file can be used
with the {\bfseries :source} command to recreate the window configuration
later. (However, this only works well if you stay on the same kind
of display;  if you create a file under X11 and then {\bfseries :source}
it under SunView, you might not get the same positions since the coordinate
systems may vary.)

\section{How Commands Work Inside of Windows}

Each window has a caption at the top.   Here is an example:

\starti
   \ii {\bfseries mychip EDITING shiftcell}
\endi

This indicates that the window contains the root cell {\bfseries mychip}, and that
a subcell of it called {\bfseries shiftcell} is being edited.  You may 
remember from the Tutorial \#4 that at any given
time Magic is editing exactly one cell.
If the edit cell is in another window then the caption on
this window will read:

\starti
   \ii {\bfseries mychip [NOT BEING EDITED]}
\endi

Let's do an example to see how commands are executed within windows.
Close any layout windows that you may have on the screen and open two new
windows, each containing the cell {\bfseries tut5a}.  (Use the {\bfseries :closewindow}
and {\bfseries :openwindow tut5a} commands to do this.)
Try moving the box around in one of the windows.  Notice
that the box also moves in the other window.  
Windows containing the same root cell are equivalent as far as
the box is concerned: if it appears in one it will appear in all,
and it can be manipulated from them interchangeably.
If you change {\bfseries tut5a} by painting or erasing portions of it you will
see the changes in both windows.
This is because both
windows are looking at the same thing:  the cell {\bfseries tut5a}.
Go ahead and try some painting and erasing until you feel comfortable
with it.  Try positioning one corner of the box in one window and another
corner in another window.  You'll find it doesn't matter which window
you point to, all Magic knows is that you are pointing to {\bfseries tut5a}.

These windows are independent in some respects, however.  
For example, you may scroll one window around
without affecting the other window.  Use the scrollbars
to give this a try.  You can also expand and unexpand cells
independently in different windows.

We have seen how Magic behaves when both windows view a single cell.
What happens when windows view different cells?  To try this
out load {\bfseries tut5b} into one of the windows 
(point to a window and type {\bfseries :load tut5b}).
You will see the captions on the windows change---only one
window contains the cell currently being edited.  The box cannot
be positioned by placing one corner in one window and another corner
in the other window because that doesn't really make sense (try it).
However, the selection commands work between windows:  you can select
information in one window and then copy it into another (this
only works if the window
you're copying into contains the edit cell;  if not, you'll have
to use the {\bfseries :edit} command first).

The operation of many Magic commands is dependent upon which window you
are pointing at.  If you are used to using Magic with only one window
you may, at first, forget to point to the window that you want the
operation performed upon.  For instance, if there are several windows
on the screen you will have to point to one before executing a
command like {\bfseries :grid}---otherwise you may not affect the window
that you intended!

\section{Special Windows}

In addition to providing multiple windows on different areas of
a layout, Magic provides several special types of windows that
display things other than layouts.  For example, there are special
window types to edit netlists and to
adjust the colors displayed on the screen.  One of the
special window types is described in the section below;
others are
described in the other tutorials.
The 

\starti
   \ii {\bfseries :specialopen} {\itshape type }[{\itshape args}]
\endi

command is used to create these
sorts of windows.  The {\itshape type} argument tells what sort of window
you want, and {\itshape args} describe what you want loaded into that window.
The {\bfseries :openwindow} {\itshape cellname} command is really just short for the
command {\bfseries :specialopen layout} {\itshape cellname}.

Each different type of window (layout, color, etc.) has its own
command set.  If you type {\bfseries :help} in different window types,
you'll see that the commands are different.  Some of the commands,
such as those to manipulate windows, are valid in all windows, but
for other commands you must make sure you're pointing to the right
kind of window or the command may be misinterpreted.  For example,
the {\bfseries :extract} command means one thing in a layout window and
something totally different in a netlist window.

\section{Color Editing}

Special windows of type {\bfseries color} are used to edit the red, green,
and blue intensities of the colors displayed on the screen.  To
create a color editing window, invoke the command

\starti
   \ii {\bfseries :specialopen color }[{\itshape number}]
\endi

{\itshape Number} is optional;  if present, it gives the octal value of
the color number whose intensities are to be edited.  If {\itshape number}
isn't given, 0 is used.  Try opening a color window on color 0.

A color editing window contains 6 ``color bars'', 12 ``color pumps''
(one on each side of each bar), plus a large rectangle at the top
of the window that displays a swatch of the color being edited
(called the ``current color'' from now on).
The color bars display the components of the current color in
two different ways.  The three bars on the left display the
current color in terms of its red, green, and blue intensities
(these intensities are the values actually sent to the display).
The three bars on the right display the current color in terms
of hue, saturation, and value.  Hue selects a color of
the spectrum.  Saturation indicates how diluted the color is
(high saturation corresponds to a pure color, low saturation
corresponds to a color that is diluted with gray, and a saturation
of 0 results in gray regardless of hue).  Value
indicates the overall brightness (a value of 0 corresponds to black,
regardless of hue or saturation).

There are several ways to modify the current color.  First, try
pressing any mouse button while the cursor is over one of the
color bars.  The length of the bar, and the current color,
will be modified to reflect the mouse position.  The color map
in the display is also changed, so the colors will change everywhere
on the screen that the current color is displayed.  Color 0, which
you should currently be editing, is the background color.  You
can also modify the current color by pressing a button while the
cursor is over one of the ``color pumps'' next to the bars.  If
you button a pump with ``+'' in it, the value of the bar next
to it will be incremented slightly, and if you button the ``-''
pump, the bar will be decremented slightly.  The left button causes
a change of about 1\% in the value of the bar, and the right button
will pump the bar up or down by about 5\%.  Try adjusting the bars
by buttoning the bars and the pumps.

If you press a button while the cursor is over the current color
box at the top of the window, one of two things will happen.
In either case, nothing happens until you release the button.
Before releasing the button, move the cursor so it is over a
different color somewhere on the screen.  If you pressed the
left button, then when the button is released the color underneath
the cursor becomes the new current color, and all future editing
operations will affect this color.  Try using this feature to
modify the color used for window borders.  If you pressed the right
button, then when the button is released
the value of the current color is copied from whatever color is
present underneath the cursor.

There are only a few commands you can type in color windows, aside from
those that are valid in all windows.  The command

\starti
   \ii {\bfseries :color }[{\itshape number}]
\endi

will change the current color to {\itshape number}.  If no {\itshape number}
is given, this command will print out the current color and its
red, green, and blue intensities.  The command

\starti
   \ii {\bfseries :save }[{\itshape techStyle displayStyle monitorType}]
\endi

will save the current color map in a file named
{\itshape techStyle}.{\itshape displayStyle}.{\itshape monitorType}{\bfseries .cmap},
where {\itshape techStyle} is the type of technology (e.g., {\bfseries mos}),
{\itshape displayStyle} is the kind of display specified by
a {\bfseries styletype} in the {\bfseries style} section of a technology file 
(e.g., {\bfseries 7bit}), and {\itshape monitorType} is the type of
the current monitor (e.g., {\bfseries std}).
If no arguments are given,
the current technology style, display style, and monitor type
are used.
The command

\starti
   \ii {\bfseries :load }[{\itshape techStyle displayStyle monitorType}]
\endi

will load the color map from the file named
{\itshape techStyle}.{\itshape displayStyle}.{\itshape monitorType}{\bfseries .cmap}
as above.
If no arguments are given,
the current technology style, display style, and monitor type
are used.  When loading color
maps, Magic looks first in the current directory, then in the
system library.

\end{document}
