File: asis_ug_9.html

package info (click to toggle)
asis 2008-5
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 9,724 kB
  • ctags: 615
  • sloc: ada: 95,867; makefile: 259; xml: 19
file content (345 lines) | stat: -rw-r--r-- 18,151 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
<HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- Created on May, 22  2008 by texi2html 1.64-gnat-1 -->
<!-- 
Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
            Karl Berry  <karl@freefriends.org>
            Olaf Bachmann <obachman@mathematik.uni-kl.de>
            and many others.
Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
 
-->
<HEAD>
<TITLE>ASIS-for-GNAT User's Guide: How to Build Efficient ASIS Applications</TITLE>
<META NAME="description" CONTENT="ASIS-for-GNAT User's Guide: How to Build Efficient ASIS Applications">
<META NAME="keywords" CONTENT="ASIS-for-GNAT User's Guide: How to Build Efficient ASIS Applications">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="texi2html 1.64-gnat-1">

</HEAD>

<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">

<A NAME="SEC46"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_8.html#SEC45"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC47"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug.html#SEC_Top"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_15.html#SEC56">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H1> 8. How to Build Efficient ASIS Applications </H1>
<!--docid::SEC46::-->
<P>

This chapter identifies some potential performance issues with ASIS applications
and offers some advice on how to address these issues.
</P><P>

<BLOCKQUOTE><TABLE BORDER=0 CELLSPACING=0> 
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="asis_ug_9.html#SEC47">8.1 Tree Swapping as a Performance Issue</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="asis_ug_9.html#SEC48">8.2 Queries That Can Cause Tree Swapping</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="asis_ug_9.html#SEC49">8.3 How to Avoid Unnecessary Tree Swapping</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
<TR><TD ALIGN="left" VALIGN="TOP"><A HREF="asis_ug_9.html#SEC50">8.4 Using <CODE>gnatmake</CODE> to Create Tree Files</A></TD><TD>&nbsp;&nbsp;</TD><TD ALIGN="left" VALIGN="TOP"></TD></TR>
</TABLE></BLOCKQUOTE>
<P>

<A NAME="Tree Swapping as a Performance Issue"></A>
<HR SIZE="6">
<A NAME="SEC47"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC48"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_15.html#SEC56">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 8.1 Tree Swapping as a Performance Issue </H2>
<!--docid::SEC47::-->
<P>

If an ASIS <CODE>Context</CODE> comprises more then one tree, then ASIS may need to switch
between different trees during an ASIS application run. Switching between
trees may require ASIS to repeatedly read in the same set of trees, and this may slow
down an application considerably.
</P><P>

Basically, there are two causes for tree swapping:
</P><P>

<UL>
<LI>
<EM>Processing of semantically independent units.</EM> Suppose in <CODE>Context</CODE> <CODE>Cont</CODE> we have
 units <CODE>P</CODE> and <CODE>Q</CODE> that do not depend on each other, and <CODE>Cont</CODE> does
 not contain any third unit depending on both <CODE>P</CODE> and <CODE>Q</CODE>. This
 means that <CODE>P</CODE> and <CODE>Q</CODE> cannot be represented by the same tree. To
 obtain information about <CODE>P</CODE>, ASIS needs to access the tree <TT>`p.adt'</TT>,
 and to get some information about <CODE>Q</CODE>, ASIS needs
 <TT>`q.adt'</TT>. Therefore, if an application retrieves some information from
 <CODE>P</CODE>, and then starts processing <CODE>Q</CODE>, ASIS has to read
 <TT>`q.adt'</TT>.
<P>

<LI>
<EM>Processing of information from dependent units.</EM>
A unit <CODE>U</CODE> may be present not only in the tree created for <CODE>U</CODE>, but also in
all the trees created for units which semantically depend upon <CODE>U</CODE>.
Suppose we have a library procedure <CODE>Proc</CODE> depending on a
 library package <CODE>Pack</CODE>, and in the set of trees making up our <CODE>Context</CODE> we
 have trees <TT>`pack.adt'</TT> and <TT>`proc.adt'</TT>. Suppose we have some
 <CODE>Element</CODE> representing a component of <CODE>Pack</CODE>, when <TT>`pack.adt'</TT> was
 accessed by ASIS, and suppose that because of some other actions undertaken
 by an application ASIS changed the tree being accessed to <TT>`proc.adt'</TT>.
 Suppose that now the application wants to do something with the <CODE>Element</CODE>
 representing some component of <CODE>Pack</CODE> and obtained from <TT>`pack.adt'</TT>. Even
 though the unit <CODE>Pack</CODE> is represented by the currently accessed tree
 <TT>`proc.adt'</TT>, ASIS has to switch back to <TT>`pack.adt'</TT>, because all the
 references into the tree structure kept as a part of the value of this
 <CODE>Element</CODE> are valid only for <TT>`pack.adt'</TT>.
</UL>
<P>

<A NAME="Queries That Can Cause Tree Swapping"></A>
<HR SIZE="6">
<A NAME="SEC48"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC47"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC49"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC49"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_15.html#SEC56">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 8.2 Queries That Can Cause Tree Swapping </H2>
<!--docid::SEC48::-->
<P>

In ASIS-for-GNAT, tree swapping can currently take place only when
processing queries defined in:
</P><P>

<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=+0><pre>Asis.Elements
Asis.Declarations
Asis.Definitions
Asis.Statements
Asis.Clauses
Asis.Expressions
Asis.Text
</FONT></pre></td></tr></table></P><P>

but not for those queries in the above packages that return enumeration or boolean results.
</P><P>

For any instantiation of <CODE>Asis.Iterator.Traverse_Element</CODE>,
<A NAME="IDX150"></A>
the traversal itself
can cause at most one tree read to get the tree appropriate for processing the
<CODE>Element</CODE> to be traversed, but procedures provided as actuals for
<CODE>Pre_Operation</CODE> and <CODE>Post_Operation</CODE> may cause additional tree
swappings.
</P><P>

<A NAME="How to Avoid Unnecessary Tree Swapping"></A>
<HR SIZE="6">
<A NAME="SEC49"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC48"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC50"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC50"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_15.html#SEC56">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 8.3 How to Avoid Unnecessary Tree Swapping </H2>
<!--docid::SEC49::-->
<P>

To speed up your application, try to avoid unnecessary tree swapping. The
following guidelines may help:
</P><P>

<UL>
<LI>
 Try to minimize the set of tree files processed by your application. In
 particular, try to avoid having separate trees created for subunits.
<P>

 Minimizing the set of tree files processed by the application also cuts
 down the time needed for opening a <CODE>Context</CODE>. Try to use <CODE>gnatmake</CODE> to create
 a suitable set of tree files covering an Ada program for processing by
 an ASIS application.
</P><P>

<LI>
 Choose the <CODE>Context</CODE> definition appropriate to your application. For
 example, use "one tree" <CODE>Context</CODE> (<SAMP>`-C1'</SAMP>) for applications that are limited
 to processing single units (such as a pretty printer or <CODE>gnatstub</CODE>). By
 processing the tree file created for this unit, ASIS can get all the
 syntactic and semantic information about this unit. Using the "one tree" <CODE>Context</CODE>
 definition, an application has only one tree file to read when
 opening a <CODE>Context</CODE>, and no other tree file will be read during the
 application run. An "N-trees" <CODE>Context</CODE> is a natural extension of "one tree"
 <CODE>Context</CODE> for applications that know in advance which units will be
 processed, but opening a <CODE>Context</CODE> takes longer, and ASIS may switch among
 different tree files during an application run. Use "all trees" <CODE>Context</CODE>
 only for applications which are not targeted at processing a specific
 unit or a specific set of units, but are supposed to process all the
 available units, or when an application has to process a large
 system consisting of a many units. When using an
 application based on an "all trees" <CODE>Context</CODE>, use the approach for creating
 tree files described above to minimize a set of tree files to be
 processed.
<P>

<LI>
 In your ASIS application, try to avoid switching between processing units or
 sets of units with no dependencies among them; such a switching will
 cause tree swapping.
<P>

<LI>
 If you are going to analyze a library unit having both a spec and a body,
 start by obtaining an <CODE>Element</CODE> from the body of this unit. This will set
 the tree created for the body as the tree accessed by ASIS, and this tree
 will allow both the spec and the body of this unit to be processed
 without tree swapping.
<P>

<LI>
 To see a "tree swapping profile" of your application use the <SAMP>`-dt'</SAMP> debug flag
 when initializing ASIS (<CODE>Asis.Implementation.Initialize ("-dt")</CODE>).
<A NAME="IDX151"></A>
 The
 information returned may give you some hints on
 how to avoid tree swapping.
</UL>
<P>

<A NAME="Using gnatmake to Create Tree Files"></A>
<HR SIZE="6">
<A NAME="SEC50"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC49"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_15.html#SEC56">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 8.4 Using <CODE>gnatmake</CODE> to Create Tree Files </H2>
<!--docid::SEC50::-->
<P>

To create a suitable set of tree files, you may use <CODE>gnatmake</CODE>. GNAT
creates an <TT>`ALI'</TT> file for every successful compilation, whether or not
code has been generated. Therefore, it is possible to run <CODE>gnatmake</CODE> with
the <SAMP>`-gnatc'</SAMP> and <SAMP>`-gnatt'</SAMP> options;
<A NAME="IDX152"></A>
<A NAME="IDX153"></A>
this will create the set of
tree files for all the compilation units needed in the resulting program.
Below we will use
<CODE>gnatmake</CODE> to create a set of tree files for a complete Ada program
(partition). You may adapt this approach to an incomplete program or to a
partition without a main subprogram, applying <CODE>gnatmake</CODE> to some of its
components.
</P><P>

Using <CODE>gnatmake</CODE> for creating tree files has another advantage: it will
keep tree files consistent among themselves and with the sources.
</P><P>

There are two different ways to use <CODE>gnatmake</CODE> to create a set of tree
files.
</P><P>

First, suppose you have object, <TT>`ALI'</TT> and tree files for your program in the same
directory, and <TT>`main_subprogram.adb'</TT> contains the body of the main
subprogram. If you run <CODE>gnatmake</CODE> as
</P><P>

<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=+0><pre>$ gnatmake -f -c ... main_subprogram.adb -cargs -gnatc -gnatt
</FONT></pre></td></tr></table></P><P>

or simply as
</P><P>

<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=+0><pre>$ gnatmake -f -c -gnatc -gnatt ... main_subprogram.adb
</FONT></pre></td></tr></table></P><P>

this will create the trees representing the full program for which
<CODE>main_subprogram</CODE> is the main procedure. The trees will be created "from scratch";
that is, if some tree files already exist, they will be recreated. This is
because <CODE>gnatmake</CODE> is being called with the <SAMP>`-f'</SAMP> option
(which means "force recompilation").
Usng <CODE>gnatmake</CODE> without the <SAMP>`-f'</SAMP> option for creating tree files is not reliable
if your tree files are in the same directory as the object files, because
object and tree files "share" the same set of <TT>`ALI'</TT> files.
If the
object files exist and are consistent with the <TT>`ALI'</TT> and source
files, the source will not be recompiled for creating a tree file unless the <SAMP>`-f'</SAMP>
option is set.
</P><P>

A different approach is to combine the tree files and the associated <TT>`ALI'</TT> files
in a separate directory, and to use this directory only for keeping the tree
files and maintaining their consistency with source files. Thus, the object
files and their associated <TT>`ALI'</TT> files should be in another directory.
In this case, by invoking <CODE>gnatmake</CODE> through:
</P><P>

<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=+0><pre>$ gnatmake -c ... main_subprogram.adb -cargs -gnatc -gnatt
</FONT></pre></td></tr></table></P><P>

or simply:
</P><P>

<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=+0><pre>$ gnatmake -c -gnatc -gnatt ... main_subprogram.adb
</FONT></pre></td></tr></table></P><P>

(that is, without forcing recompilation) you will still obtain a full and
consistent set of tree files representing your program, but in this case the
existing tree files will be reused.
</P><P>

See the next chapter for specific details related to Ada compilation units
belonging to precompiled Ada libraries.
</P><P>

<A NAME="Processing an Ada Library by an ASIS-Based Tool"></A>
<HR SIZE="6">
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_9.html#SEC46"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_10.html#SEC51"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_15.html#SEC56">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="asis_ug_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<BR>  
<FONT SIZE="-1">
This document was generated
by <I>Mail Server</I> on <I>May, 22  2008</I>
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html/"><I>texi2html</I></A>

</BODY>
</HTML>